mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Merge pull request #4038 from AWAS666/dragdropwebsearch
Enable reordering of websearches with drap and drop
This commit is contained in:
commit
01bbb54054
2 changed files with 83 additions and 2 deletions
|
|
@ -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}}">
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
|
|
|
|||
|
|
@ -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 @@ namespace Flow.Launcher.Plugin.WebSearch
|
|||
{
|
||||
private readonly Settings _settings;
|
||||
private readonly PluginInitContext _context;
|
||||
private Point _dragStartPoint;
|
||||
|
||||
public SettingsControl(PluginInitContext context, SettingsViewModel viewModel)
|
||||
{
|
||||
|
|
@ -163,5 +167,78 @@ namespace Flow.Launcher.Plugin.WebSearch
|
|||
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))
|
||||
{
|
||||
var listView = (ListView)sender;
|
||||
ListViewItem listViewItem = FindAncestor<ListViewItem>((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;
|
||||
var listView = (ListView)sender;
|
||||
var target = GetNearestContainer(e.OriginalSource);
|
||||
|
||||
if (target == null)
|
||||
return;
|
||||
|
||||
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);
|
||||
|
||||
if (removedIdx == targetIdx)
|
||||
return;
|
||||
|
||||
items.Move(removedIdx, targetIdx);
|
||||
}
|
||||
}
|
||||
|
||||
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<T>(DependencyObject current) where T : DependencyObject
|
||||
{
|
||||
while (current != null)
|
||||
{
|
||||
if (current is T)
|
||||
return (T)current;
|
||||
current = VisualTreeHelper.GetParent(current);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue