From 46be53274041456ef1c76570ba21839df95009ec Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Thu, 6 Nov 2025 23:53:57 -0700 Subject: [PATCH] Improve SearchSyntaxDialog - Double-clicking a tag will paste the tage into the search bar - SearchSyntaxDialog now modeless --- .../Dialogs/SearchSyntaxDialog.axaml | 8 +++---- .../Dialogs/SearchSyntaxDialog.axaml.cs | 12 ++++++++++ .../ViewModels/MainVM.Filters.cs | 2 +- .../Views/MainWindow.axaml.cs | 23 +++++++++++++++++++ Source/LibationAvalonia/Walkthrough.cs | 7 +++--- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml index 28bba33b..e6df63ba 100644 --- a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml +++ b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml @@ -50,25 +50,25 @@ - + - + - + - + diff --git a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs index 3feecbf1..37fdcb0a 100644 --- a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs @@ -1,10 +1,14 @@ +using Avalonia; using LibationSearchEngine; +using System; using System.Linq; +#nullable enable namespace LibationAvalonia.Dialogs { public partial class SearchSyntaxDialog : DialogWindow { + public event EventHandler? TagDoubleClicked; public string StringUsage { get; } public string NumberUsage { get; } public string BoolUsage { get; } @@ -51,5 +55,13 @@ namespace LibationAvalonia.Dialogs DataContext = this; } + + private void ListBox_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + if (e.Source is StyledElement { DataContext: string tag }) + { + TagDoubleClicked?.Invoke(this, tag); + } + } } } diff --git a/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs b/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs index 2809585c..86600760 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs @@ -55,7 +55,7 @@ namespace LibationAvalonia.ViewModels public void AddQuickFilterBtn() { if (SelectedNamedFilter != null) QuickFilters.Add(SelectedNamedFilter); } public async Task FilterBtn(string filterString) => await PerformFilter(new(filterString, null)); - public async Task FilterHelpBtn() => await new LibationAvalonia.Dialogs.SearchSyntaxDialog().ShowDialog(MainWindow); + public void FilterHelpBtn() => MainWindow.ShowSearchSyntaxDialog(); public void ToggleFirstFilterIsDefault() => FirstFilterIsDefault = !FirstFilterIsDefault; public async Task EditQuickFiltersAsync() => await new LibationAvalonia.Dialogs.EditQuickFilters().ShowDialog(MainWindow); public async Task PerformFilter(QuickFilters.NamedFilter? namedFilter) diff --git a/Source/LibationAvalonia/Views/MainWindow.axaml.cs b/Source/LibationAvalonia/Views/MainWindow.axaml.cs index 8d08b264..37e9c016 100644 --- a/Source/LibationAvalonia/Views/MainWindow.axaml.cs +++ b/Source/LibationAvalonia/Views/MainWindow.axaml.cs @@ -223,5 +223,28 @@ namespace LibationAvalonia.Views } private void setProgressVisible(bool visible) => ViewModel.DownloadProgress = visible ? 0 : null; + + public SearchSyntaxDialog ShowSearchSyntaxDialog() + { + var dialog = new SearchSyntaxDialog(); + dialog.TagDoubleClicked += Dialog_TagDoubleClicked; + dialog.Closed += Dialog_Closed; + filterHelpBtn.IsEnabled = false; + dialog.Show(this); + return dialog; + + void Dialog_Closed(object sender, EventArgs e) + { + dialog.TagDoubleClicked -= Dialog_TagDoubleClicked; + filterHelpBtn.IsEnabled = true; + } + void Dialog_TagDoubleClicked(object sender, string tag) + { + var text = filterSearchTb.Text; + filterSearchTb.Text = text.Insert(Math.Min(Math.Max(0, filterSearchTb.CaretIndex), text.Length), tag); + filterSearchTb.CaretIndex += tag.Length; + filterSearchTb.Focus(); + } + } } } diff --git a/Source/LibationAvalonia/Walkthrough.cs b/Source/LibationAvalonia/Walkthrough.cs index 0c0b831a..e0eb9d2f 100644 --- a/Source/LibationAvalonia/Walkthrough.cs +++ b/Source/LibationAvalonia/Walkthrough.cs @@ -203,9 +203,10 @@ namespace LibationAvalonia await displayControlAsync(MainForm.filterHelpBtn); - var filterHelp = new SearchSyntaxDialog(); - await filterHelp.ShowDialog(MainForm); - + var searchDialog = MainForm.ShowSearchSyntaxDialog(); + var tcs = new TaskCompletionSource(); + searchDialog.Closed += (_, _) => tcs.SetResult(); + await tcs.Task; return true; }