From 14eb40dd0bf0bfa131a48d63217b45ffce83eba1 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yair100@users.noreply.github.com> Date: Mon, 9 Mar 2026 20:37:57 -0400 Subject: [PATCH] Feature: Added drag and drop for sidebar items --- src/Files.App.Controls/Sidebar/SidebarItem.cs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Files.App.Controls/Sidebar/SidebarItem.cs b/src/Files.App.Controls/Sidebar/SidebarItem.cs index d70909888508..ddd0a3df3dc5 100644 --- a/src/Files.App.Controls/Sidebar/SidebarItem.cs +++ b/src/Files.App.Controls/Sidebar/SidebarItem.cs @@ -6,7 +6,9 @@ using Microsoft.UI.Xaml.Automation; using Microsoft.UI.Xaml.Automation.Peers; using System.Collections.Specialized; +using System.IO; using Windows.ApplicationModel.DataTransfer; +using Windows.Storage; namespace Files.App.Controls { @@ -90,6 +92,7 @@ public void HandleItemChange() HookupItemChangeListener(null, Item); UpdateExpansionState(); ReevaluateSelection(); + CanDrag = Item?.GetType().GetProperty("Path")?.GetValue(Item) is string path && Path.IsPathRooted(path); } private void HookupOwners() @@ -137,7 +140,30 @@ private void HookupItemChangeListener(ISidebarItemModel? oldItem, ISidebarItemMo private void SidebarItem_DragStarting(UIElement sender, DragStartingEventArgs args) { - args.Data.SetData(StandardDataFormats.Text, Text?.ToString() ?? string.Empty); + if (Item?.GetType().GetProperty("Path")?.GetValue(Item) is not string dragPath || !Path.IsPathRooted(dragPath)) + return; + + args.Data.SetData(StandardDataFormats.Text, dragPath); + args.Data.RequestedOperation = DataPackageOperation.Move | DataPackageOperation.Copy | DataPackageOperation.Link; + args.Data.SetDataProvider(StandardDataFormats.StorageItems, async request => + { + var deferral = request.GetDeferral(); + try + { + if (Directory.Exists(dragPath)) + { + var folder = await StorageFolder.GetFolderFromPathAsync(dragPath); + request.SetData(new IStorageItem[] { folder }); + } + } + catch + { + } + finally + { + deferral.Complete(); + } + }); } private void SetFlyoutOpen(bool isOpen = true)