Browse Source

avalonia: added OptionSelectorView

Kenric Nugteren 1 month ago
parent
commit
49d9c8bf85

+ 38 - 0
InABox.Avalonia/Components/OptionSelector/OptionSelectorView.axaml

@@ -0,0 +1,38 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+			 xmlns:components="using:InABox.Avalonia.Components"
+             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+             x:Class="InABox.Avalonia.Components.OptionSelectorView"
+			 x:DataType="components:OptionSelectorViewModel">
+	<Grid>
+		<Grid.RowDefinitions>
+			<RowDefinition Height="Auto"/>
+			<RowDefinition Height="Auto"/>
+			<RowDefinition Height="Auto"/>
+		</Grid.RowDefinitions>
+		<Grid.ColumnDefinitions>
+			<ColumnDefinition Width="*"/>
+		</Grid.ColumnDefinitions>
+		<Label Grid.Row="0"
+			   FontSize="{StaticResource PrsFontSizeLarge}"
+			   Content="{Binding Title}"/>
+		<ItemsControl Grid.Row="1" ItemsSource="{Binding Options}">
+			<ItemsControl.ItemTemplate>
+				<DataTemplate>
+					<Button Classes="Transparent"
+							Content="{Binding}"
+							CommandParameter="{Binding}"
+							Padding="10"
+							Command="{Binding $parent[components:OptionSelectorView].((components:OptionSelectorViewModel)DataContext).SelectCommand}"
+							HorizontalContentAlignment="Left"/>
+				</DataTemplate>
+			</ItemsControl.ItemTemplate>
+		</ItemsControl>
+		<DockPanel Grid.Row="2" LastChildFill="False">
+			<Button Content="Cancel" DockPanel.Dock="Right" Command="{Binding CancelCommand}"
+					Classes="Standard"/>
+		</DockPanel>
+	</Grid>
+</UserControl>

+ 13 - 0
InABox.Avalonia/Components/OptionSelector/OptionSelectorView.axaml.cs

@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace InABox.Avalonia.Components;
+
+public partial class OptionSelectorView : UserControl
+{
+    public OptionSelectorView()
+    {
+        InitializeComponent();
+    }
+}

+ 48 - 0
InABox.Avalonia/Components/OptionSelector/OptionSelectorViewModel.cs

@@ -0,0 +1,48 @@
+using Avalonia.Layout;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace InABox.Avalonia.Components;
+
+public partial class OptionSelectorViewModel : BasePopupViewModel<string>, IAlignedPopup
+{
+    [ObservableProperty]
+    private string _title = "Select Option";
+
+    [ObservableProperty]
+    private ObservableCollection<string> _options = new();
+
+    public HorizontalAlignment HorizontalAlignment => HorizontalAlignment.Stretch;
+
+    public VerticalAlignment VerticalAlignment => VerticalAlignment.Center;
+
+    [RelayCommand]
+    private void Cancel()
+    {
+        Close(null);
+    }
+
+    [RelayCommand]
+    private void Select(string option)
+    {
+        Close(option);
+    }
+}
+
+public static class OptionSelector
+{
+    public static async Task<string?> Execute(string title, params string[] options)
+    {
+        return await Navigation.Popup<OptionSelectorViewModel, string?>(model =>
+        {
+            model.Title = title;
+            model.Options = new(options);
+        });
+    }
+}

+ 7 - 0
InABox.Avalonia/Navigation/Navigation.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Diagnostics.Tracing;
+using Avalonia.Layout;
 using CommunityToolkit.Mvvm.ComponentModel;
 using DialogHostAvalonia;
 using InABox.Avalonia.Components;
@@ -32,6 +33,12 @@ public interface IDualFunctionViewModel : IPopupViewModel, IViewModelBase
     bool IsPopup { get; set; }
 }
 
+public interface IAlignedPopup
+{
+    HorizontalAlignment HorizontalAlignment { get; }
+    VerticalAlignment VerticalAlignment { get; }
+}
+
 public interface IPopupViewModel<TResult> : IPopupViewModel
 {
     TResult? GetResult();

+ 0 - 1
InABox.Avalonia/Theme/Classes/Button.axaml

@@ -43,7 +43,6 @@
         <Setter Property="BorderBrush" Value="Transparent" />
         <Setter Property="BorderThickness" Value="0" />
         <Setter Property="Background" Value="Transparent" />
-        <Setter Property="Foreground" Value="Transparent" />
     </Style>
 
 </Styles>