Explorar el Código

avalonia: added textedit popup

Kenric Nugteren hace 3 meses
padre
commit
2c1bf99899

+ 1 - 33
InABox.Avalonia/Components/DateSelector/DateSelectorViewModel.cs

@@ -9,43 +9,11 @@ using System.Threading.Tasks;
 
 namespace InABox.Avalonia.Components.DateSelector;
 
-public partial class DateSelectorViewModel : ObservableObject, IPopupViewModel<DateTime?>, IViewModelBase
+public partial class DateSelectorViewModel : BasePopupViewModel<DateTime?>
 {
     [ObservableProperty]
     private DateTime? _date;
 
-    public bool IsClosed { get; private set; }
-
-    public bool BackButtonVisible { get; set; }
-    public bool ProgressVisible { get; set; }
-    public AvaloniaMenuItemCollection PrimaryMenu { get; set; } = new();
-    public AvaloniaMenuItemCollection SecondaryMenu { get; set; } = new();
-
-
-    private DateTime? _result;
-
-    public DateTime? GetResult()
-    {
-        return _result;
-    }
-
-    public void Close(DateTime? result)
-    {
-        _result = result;
-        IsClosed = true;
-        DialogHost.GetDialogSession(null)?.Close();
-    }
-
-    public Task Activate()
-    {
-        return Task.CompletedTask;
-    }
-
-    public Task Deactivate()
-    {
-        return Task.CompletedTask;
-    }
-
     [RelayCommand]
     private void Cancel()
     {

+ 30 - 0
InABox.Avalonia/Components/TextEdit/TextEditView.axaml

@@ -0,0 +1,30 @@
+<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.TextEditView"
+			 x:DataType="components:TextEditViewModel">
+	<UserControl.Resources>
+		<components:TextEditVerticalAlignmentConverter x:Key="VerticalAlignmentConverter"/>
+	</UserControl.Resources>
+	<Grid>
+		<Grid.RowDefinitions>
+			<RowDefinition Height="*"/>
+			<RowDefinition Height="Auto"/>
+		</Grid.RowDefinitions>
+		<Grid.ColumnDefinitions>
+			<ColumnDefinition Width="Auto"/>
+			<ColumnDefinition Width="*"/>
+			<ColumnDefinition Width="Auto"/>
+		</Grid.ColumnDefinitions>
+		<TextBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"
+				 Text="{Binding Text}" AcceptsReturn="{Binding Multiline}"
+				 Margin="0,0,0,10"
+				 VerticalContentAlignment="{Binding Multiline,Converter={StaticResource VerticalAlignmentConverter}}"
+				 TextWrapping="Wrap"/>
+		<Button Grid.Row="1" Grid.Column="0" Content="Cancel" Command="{Binding CancelCommand}" Classes="Standard"/>
+		<Button Grid.Row="1" Grid.Column="2" Content="OK" Command="{Binding OKCommand}" Classes="Standard"/>
+	</Grid>
+</UserControl>

+ 41 - 0
InABox.Avalonia/Components/TextEdit/TextEditView.axaml.cs

@@ -0,0 +1,41 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Layout;
+using Avalonia.Markup.Xaml;
+using InABox.Avalonia.Converters;
+
+namespace InABox.Avalonia.Components;
+
+internal class TextEditVerticalAlignmentConverter : AbstractConverter<bool, VerticalAlignment>
+{
+    protected override VerticalAlignment Convert(bool value, object? parameter = null)
+    {
+        return value ? VerticalAlignment.Top : VerticalAlignment.Center;
+    }
+}
+
+public partial class TextEditView : UserControl
+{
+    private TextEditViewModel Model => (DataContext as TextEditViewModel)!;
+
+    public TextEditView()
+    {
+        InitializeComponent();
+    }
+
+    protected override Size MeasureOverride(Size availableSize)
+    {
+        var baseSize = base.MeasureOverride(availableSize);
+        if (Model.Multiline)
+        {
+            return new(
+                Double.IsPositiveInfinity(availableSize.Width) ? baseSize.Width : availableSize.Width,
+                Double.IsPositiveInfinity(availableSize.Height) ? baseSize.Height : availableSize.Height);
+        }
+        else
+        {
+            return baseSize.WithWidth(
+                Double.IsPositiveInfinity(availableSize.Width) ? baseSize.Width : availableSize.Width);
+        }
+    }
+}

+ 30 - 0
InABox.Avalonia/Components/TextEdit/TextEditViewModel.cs

@@ -0,0 +1,30 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace InABox.Avalonia.Components;
+
+public partial class TextEditViewModel : BasePopupViewModel<string>
+{
+    [ObservableProperty]
+    private string _text = "";
+
+    [ObservableProperty]
+    private bool _multiline = false;
+
+    [RelayCommand]
+    private void Cancel()
+    {
+        Close(null);
+    }
+
+    [RelayCommand]
+    private void OK()
+    {
+        Close(Text);
+    }
+}

+ 44 - 1
InABox.Avalonia/Navigation/Navigation.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Diagnostics.Tracing;
+using CommunityToolkit.Mvvm.ComponentModel;
 using DialogHostAvalonia;
 using InABox.Avalonia.Components;
 using InABox.Avalonia.Router;
@@ -117,4 +118,46 @@ public static class Navigation
     public static event Action<IViewModelBase, RouterDirection>? CurrentViewModelChanging;
 
     public static event Action<IViewModelBase>? CurrentViewModelChanged;
-}
+}
+
+public class BasePopupViewModel<TResult> : ObservableObject, IPopupViewModel<TResult?>, IViewModelBase
+{
+    #region IPopupViewModel
+
+    public bool IsClosed { get; private set; }
+
+    protected TResult? _result;
+
+    public TResult? GetResult()
+    {
+        return _result;
+    }
+
+    public void Close(TResult? result)
+    {
+        _result = result;
+        IsClosed = true;
+        DialogHost.GetDialogSession(null)?.Close();
+    }
+
+    #endregion
+
+    #region IViewModel
+
+    public bool BackButtonVisible { get; set; }
+    public bool ProgressVisible { get; set; }
+    public AvaloniaMenuItemCollection PrimaryMenu { get; set; } = new();
+    public AvaloniaMenuItemCollection SecondaryMenu { get; set; } = new();
+
+    public Task Activate()
+    {
+        return Task.CompletedTask;
+    }
+
+    public Task Deactivate()
+    {
+        return Task.CompletedTask;
+    }
+
+    #endregion
+}