Kaynağa Gözat

avalonia: Added selection of multiple documents in SubmitDocsView; added merge button without implementatino.

Kenric Nugteren 1 ay önce
ebeveyn
işleme
7a02b76a8e

+ 13 - 4
PRS.Avalonia/PRS.Avalonia/Modules/SubmitDocs/SubmitDocsView.axaml

@@ -9,6 +9,9 @@
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="PRS.Avalonia.Modules.SubmitDocsView"
              x:DataType="local:SubmitDocsViewModel">
+	<UserControl.Resources>
+        <converters:BooleanToColorConverter x:Key="BoolToColourConverter" True="LightGray" False="White"/>
+	</UserControl.Resources>
 	<listView:PrsListView Repository="{Binding Documents}"
 						  RefreshVisible="True"
 						  Margin="{StaticResource PrsControlSpacing}"
@@ -16,17 +19,23 @@
 		<listView:PrsListView.ItemTemplate>
 			<DataTemplate DataType="prs:DataEntryDocumentShell">
 				<Button Classes="Standard"
-						CommandParameter="{Binding}"
-						Command="{Binding $parent[local:SubmitDocsView].((local:SubmitDocsViewModel)DataContext).ClickCommand}"
+						Tag="{Binding}"
+						Gestures.IsHoldingEnabled="True"
+						Gestures.IsHoldWithMouseEnabled="True"
+						Holding="Button_Holding"
+						Click="Button_Click"
 						HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
 					<Button.Styles>
 						<Style Selector="Button.Standard">
-							<Setter Property="Background" Value="White"/>
+							<Setter Property="Background" Value="{Binding IsSelected, Converter={StaticResource BoolToColourConverter}}"/>
 							<Setter Property="Padding" Value="0"/>
 							<Setter Property="Margin" Value="0,0,0,2"/>
 						</Style>
+						<Style Selector="Button /template/ ContentPresenter#PART_ContentPresenter">
+                            <Setter Property="(Gestures.IsHoldWithMouseEnabled)" Value="True"/>
+						</Style>
 					</Button.Styles>
-					<Grid Height="150">
+					<Grid Height="150" IsHitTestVisible="False">
 						<Grid.ColumnDefinitions>
 							<ColumnDefinition Width="150"/>
 							<ColumnDefinition Width="0.75"/>

+ 28 - 0
PRS.Avalonia/PRS.Avalonia/Modules/SubmitDocs/SubmitDocsView.axaml.cs

@@ -1,5 +1,7 @@
 using Avalonia;
 using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Interactivity;
 using Avalonia.Markup.Xaml;
 
 namespace PRS.Avalonia.Modules;
@@ -10,4 +12,30 @@ public partial class SubmitDocsView : UserControl
     {
         InitializeComponent();
     }
+
+    private Button? _heldButton;
+
+    private void Button_Holding(object? sender, HoldingRoutedEventArgs e)
+    {
+        if (sender is not Button button || button.Tag is not DataEntryDocumentShell shell) return;
+
+        if(e.HoldingState == HoldingState.Started)
+        {
+            _heldButton = button;
+            (DataContext as SubmitDocsViewModel)?.HoldCommand.Execute(shell);
+        }
+    }
+
+    private void Button_Click(object? sender, RoutedEventArgs e)
+    {
+        if (sender is not Button button || button.Tag is not DataEntryDocumentShell shell) return;
+
+        if(button == _heldButton)
+        {
+            // Disable the click event if we held the button.
+            _heldButton = null;
+            return;
+        }
+        (DataContext as SubmitDocsViewModel)?.ClickCommand.Execute(shell);
+    }
 }

+ 59 - 5
PRS.Avalonia/PRS.Avalonia/Modules/SubmitDocs/SubmitDocsViewModel.cs

@@ -26,6 +26,12 @@ public partial class SubmitDocsViewModel : ModuleViewModel
 
     [ObservableProperty]
     private DataEntryTagModel _tags;
+
+    [ObservableProperty]
+    private bool _isSelecting = false;
+
+    private AvaloniaMenuItem AddButton;
+    private AvaloniaMenuItem MergeButton;
     
     public SubmitDocsViewModel()
     {
@@ -38,7 +44,7 @@ public partial class SubmitDocsViewModel : ModuleViewModel
             () => new Filter<DataEntryTag>().All(),
             () => DefaultCacheFileName<DataEntryTagShell>());
 
-        PrimaryMenu.Add(new AvaloniaMenuItem(Images.plus, () =>
+        AddButton = new AvaloniaMenuItem(Images.plus, () =>
         {
             var menu = new CoreMenu<IImage>();
 
@@ -46,11 +52,41 @@ public partial class SubmitDocsViewModel : ModuleViewModel
             menu.AddItem("Browse Library", BrowseLibrary);
 
             return menu;
-        }));
+        });
+        MergeButton = new AvaloniaMenuItem(Images.lines, () =>
+        {
+            var menu = new CoreMenu<IImage>();
+            menu.AddItem("Merge Documents", MergeDocuments);
+            menu.AddItem("Clear Selection", ClearSelection);
+            return menu;
+        })
+        {
+            IsVisible = false
+        };
+        PrimaryMenu.Add(AddButton);
+        PrimaryMenu.Add(MergeButton);
 
         ProgressVisible = true;
     }
 
+    private Task<bool> ClearSelection()
+    {
+        IsSelecting = false;
+        Documents.SelectNone();
+        return Task.FromResult(true);
+    }
+
+    partial void OnIsSelectingChanged(bool value)
+    {
+        AddButton.IsVisible = !value;
+        MergeButton.IsVisible = value;
+    }
+
+    private async Task<bool> MergeDocuments()
+    {
+        throw new NotImplementedException();
+    }
+
     protected override async Task<TimeSpan> OnRefresh()
     {
         await Task.WhenAll(Documents.RefreshAsync(false), Tags.RefreshAsync(false));
@@ -63,10 +99,28 @@ public partial class SubmitDocsViewModel : ModuleViewModel
     [RelayCommand]
     private void Click(DataEntryDocumentShell shell)
     {
-        Navigation.Navigate<SubmitDocsEditorViewModel>(model =>
+        if (IsSelecting)
         {
-            model.DataEntryDocument = shell;
-        });
+            shell.IsSelected = !shell.IsSelected;
+            if(!Documents.Items.Any(x => x.IsSelected))
+            {
+                IsSelecting = false;
+            }
+        }
+        else
+        {
+            Navigation.Navigate<SubmitDocsEditorViewModel>(model =>
+            {
+                model.DataEntryDocument = shell;
+            });
+        }
+    }
+
+    [RelayCommand]
+    private void Hold(DataEntryDocumentShell shell)
+    {
+        IsSelecting = true;
+        shell.IsSelected = true;
     }
 
     private async Task<bool> AddImage<T, TOptions>(TOptions options)