From b9a43147dc3d137e53de16938b6c0a5771b2a76d Mon Sep 17 00:00:00 2001 From: AWAS666 Date: Thu, 9 Oct 2025 12:35:04 +0200 Subject: [PATCH 1/4] enable reordering with drap and drop on websearches --- .../SettingsControl.xaml | 4 + .../SettingsControl.xaml.cs | 79 ++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml index d1f48212b8b..152558e812b 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml @@ -52,6 +52,10 @@ MouseDoubleClick="MouseDoubleClickItem" SelectedItem="{Binding Settings.SelectedSearchSource}" SizeChanged="ListView_SizeChanged" + PreviewMouseLeftButtonDown="ListView_PreviewMouseLeftButtonDown" + PreviewMouseMove="ListView_PreviewMouseMove" + AllowDrop="True" + Drop="ListView_Drop" Style="{StaticResource {x:Static GridView.GridViewStyleKey}}"> diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs index 55fe9982470..d319e3158b3 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs @@ -1,7 +1,10 @@ -using System.Windows; -using System.Windows.Controls; +using System; using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Media; namespace Flow.Launcher.Plugin.WebSearch { @@ -12,6 +15,7 @@ public partial class SettingsControl : UserControl { private readonly Settings _settings; private readonly PluginInitContext _context; + private Point _dragStartPoint; public SettingsControl(PluginInitContext context, SettingsViewModel viewModel) { @@ -163,5 +167,76 @@ private void ListView_SizeChanged(object sender, SizeChangedEventArgs e) gView.Columns[3].Width = workingWidth * col4; gView.Columns[4].Width = workingWidth * col5; } + + private void ListView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + _dragStartPoint = e.GetPosition(null); + } + + private void ListView_PreviewMouseMove(object sender, MouseEventArgs e) + { + Point mousePos = e.GetPosition(null); + Vector diff = _dragStartPoint - mousePos; + + if (e.LeftButton == MouseButtonState.Pressed && + (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || + Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) + { + ListView listView = sender as ListView; + ListViewItem listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + + if (listViewItem == null) return; + + SearchSource item = (SearchSource)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + if (item == null) return; + + DragDrop.DoDragDrop(listViewItem, item, DragDropEffects.Move); + } + } + + private void ListView_Drop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(typeof(SearchSource))) + { + SearchSource droppedData = e.Data.GetData(typeof(SearchSource)) as SearchSource; + ListView listView = sender as ListView; + var target = GetNearestContainer(e.OriginalSource); + + if (target == null) + return; + + SearchSource targetData = (SearchSource)listView.ItemContainerGenerator.ItemFromContainer(target); + + var items = _settings.SearchSources; + int removedIdx = items.IndexOf(droppedData); + int targetIdx = items.IndexOf(targetData); + + if (removedIdx == targetIdx) + return; + + items.RemoveAt(removedIdx); + items.Insert(targetIdx, droppedData); + } + } + + private ListViewItem GetNearestContainer(object source) + { + var element = source as UIElement; + while (element != null && !(element is ListViewItem)) + element = VisualTreeHelper.GetParent(element) as UIElement; + + return element as ListViewItem; + } + + private static T FindAncestor(DependencyObject current) where T : DependencyObject + { + while (current != null) + { + if (current is T) + return (T)current; + current = VisualTreeHelper.GetParent(current); + } + return null; + } } } From 87676d2994c470128edfaa1ea54cfd47357dafa4 Mon Sep 17 00:00:00 2001 From: AWAS666 Date: Fri, 10 Oct 2025 10:06:42 +0200 Subject: [PATCH 2/4] fix: error when dragging downwards --- Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs index d319e3158b3..5eadf2187a1 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs @@ -215,7 +215,7 @@ private void ListView_Drop(object sender, DragEventArgs e) return; items.RemoveAt(removedIdx); - items.Insert(targetIdx, droppedData); + items.Insert(removedIdx < targetIdx ? targetIdx - 1 : targetIdx, droppedData); } } From 20a865f01219dae61750e874bfdb64b263b4fe1a Mon Sep 17 00:00:00 2001 From: AWAS666 Date: Fri, 10 Oct 2025 10:06:54 +0200 Subject: [PATCH 3/4] missing nullchecks and casts --- .../Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs index 5eadf2187a1..3399b1226ef 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs @@ -182,7 +182,7 @@ private void ListView_PreviewMouseMove(object sender, MouseEventArgs e) (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) { - ListView listView = sender as ListView; + var listView = (ListView)sender; ListViewItem listViewItem = FindAncestor((DependencyObject)e.OriginalSource); if (listViewItem == null) return; @@ -199,7 +199,7 @@ private void ListView_Drop(object sender, DragEventArgs e) if (e.Data.GetDataPresent(typeof(SearchSource))) { SearchSource droppedData = e.Data.GetData(typeof(SearchSource)) as SearchSource; - ListView listView = sender as ListView; + var listView = (ListView)sender; var target = GetNearestContainer(e.OriginalSource); if (target == null) @@ -207,6 +207,9 @@ private void ListView_Drop(object sender, DragEventArgs e) SearchSource targetData = (SearchSource)listView.ItemContainerGenerator.ItemFromContainer(target); + if (targetData == null) + return; + var items = _settings.SearchSources; int removedIdx = items.IndexOf(droppedData); int targetIdx = items.IndexOf(targetData); From d7dd89d7198ddfc5f4ee7068dc705fcf8c7dc960 Mon Sep 17 00:00:00 2001 From: AWAS666 Date: Fri, 10 Oct 2025 11:40:06 +0200 Subject: [PATCH 4/4] change from remove/insert to move --- Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs index 3399b1226ef..6dc766fffd0 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs @@ -217,8 +217,7 @@ private void ListView_Drop(object sender, DragEventArgs e) if (removedIdx == targetIdx) return; - items.RemoveAt(removedIdx); - items.Insert(removedIdx < targetIdx ? targetIdx - 1 : targetIdx, droppedData); + items.Move(removedIdx, targetIdx); } }