88using System . IO ;
99using System . Linq ;
1010using System . Runtime . CompilerServices ;
11+ using Windows . ApplicationModel . DataTransfer ;
1112using Windows . Storage ;
1213using Windows . UI . Core ;
1314using Windows . UI . Xaml ;
@@ -73,6 +74,7 @@ internal set
7374 {
7475 IsItemSelected = true ;
7576 }
77+ SetSelectedItemsOnUi ( value ) ;
7678 NotifyPropertyChanged ( "SelectedItems" ) ;
7779 }
7880 }
@@ -98,6 +100,7 @@ internal set
98100 {
99101 IsItemSelected = true ;
100102 }
103+ SetSelectedItemOnUi ( value ) ;
101104 NotifyPropertyChanged ( "SelectedItem" ) ;
102105 }
103106 }
@@ -119,6 +122,12 @@ public BaseLayout()
119122 }
120123 }
121124
125+ protected abstract void SetSelectedItemOnUi ( ListedItem selectedItem ) ;
126+
127+ protected abstract void SetSelectedItemsOnUi ( List < ListedItem > selectedItems ) ;
128+
129+ protected abstract ListedItem GetItemFromElement ( object element ) ;
130+
122131 private void AppSettings_LayoutModeChangeRequested ( object sender , EventArgs e )
123132 {
124133 if ( App . CurrentInstance . ContentPage != null )
@@ -144,7 +153,7 @@ private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
144153 PropertyChanged ? . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
145154 }
146155
147- protected override void OnNavigatedTo ( NavigationEventArgs eventArgs )
156+ protected override async void OnNavigatedTo ( NavigationEventArgs eventArgs )
148157 {
149158 base . OnNavigatedTo ( eventArgs ) ;
150159 // Add item jumping handler
@@ -171,9 +180,9 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
171180 App . CurrentInstance . NavigationToolbar . CanNavigateToParent = true ;
172181 }
173182
174- App . CurrentInstance . ViewModel . AddItemsToCollectionAsync ( App . CurrentInstance . ViewModel . WorkingDirectory ) ;
175- App . Clipboard_ContentChanged ( null , null ) ;
183+ await App . CurrentInstance . ViewModel . RefreshItems ( ) ;
176184
185+ App . Clipboard_ContentChanged ( null , null ) ;
177186 App . CurrentInstance . NavigationToolbar . PathControlDisplayText = parameters ;
178187 }
179188
@@ -273,5 +282,93 @@ protected virtual void Page_CharacterReceived(CoreWindow sender, CharacterReceiv
273282 char letterPressed = Convert . ToChar ( args . KeyCode ) ;
274283 App . CurrentInstance . InteractionOperations . PushJumpChar ( letterPressed ) ;
275284 }
285+
286+ protected async void List_DragOver ( object sender , DragEventArgs e )
287+ {
288+ if ( e . DataView . Contains ( StandardDataFormats . StorageItems ) )
289+ {
290+ IReadOnlyList < IStorageItem > draggedItems = await e . DataView . GetStorageItemsAsync ( ) ;
291+ // As long as one file doesn't already belong to this folder
292+ if ( draggedItems . Any ( draggedItem => ! Directory . GetParent ( draggedItem . Path ) . FullName . Equals ( App . CurrentInstance . ViewModel . WorkingDirectory , StringComparison . OrdinalIgnoreCase ) ) )
293+ {
294+ e . AcceptedOperation = DataPackageOperation . Copy ;
295+ e . Handled = true ;
296+ }
297+ else
298+ {
299+ e . AcceptedOperation = DataPackageOperation . None ;
300+ }
301+ }
302+ }
303+
304+ protected async void List_Drop ( object sender , DragEventArgs e )
305+ {
306+ if ( e . DataView . Contains ( StandardDataFormats . StorageItems ) )
307+ {
308+ await AssociatedInteractions . PasteItems ( e . DataView , App . CurrentInstance . ViewModel . WorkingDirectory , e . AcceptedOperation ) ;
309+ e . Handled = true ;
310+ }
311+ }
312+
313+ protected async void Item_DragStarting ( object sender , DragStartingEventArgs e )
314+ {
315+ List < IStorageItem > selectedStorageItems = new List < IStorageItem > ( ) ;
316+ foreach ( ListedItem item in App . CurrentInstance . ContentPage . SelectedItems )
317+ {
318+ if ( item . PrimaryItemAttribute == StorageItemTypes . File )
319+ selectedStorageItems . Add ( await StorageFile . GetFileFromPathAsync ( item . ItemPath ) ) ;
320+ else if ( item . PrimaryItemAttribute == StorageItemTypes . Folder )
321+ selectedStorageItems . Add ( await StorageFolder . GetFolderFromPathAsync ( item . ItemPath ) ) ;
322+ }
323+
324+ e . Data . SetStorageItems ( selectedStorageItems ) ;
325+ e . DragUI . SetContentFromDataPackage ( ) ;
326+ }
327+
328+ protected async void Item_DragOver ( object sender , DragEventArgs e )
329+ {
330+ ListedItem item = GetItemFromElement ( sender ) ;
331+ if ( e . DataView . Contains ( StandardDataFormats . StorageItems ) )
332+ {
333+ e . Handled = true ;
334+ IReadOnlyList < IStorageItem > draggedItems = await e . DataView . GetStorageItemsAsync ( ) ;
335+ // Items from the same parent folder as this folder are dragged into this folder, so we move the items instead of copy
336+ if ( draggedItems . Any ( draggedItem => Directory . GetParent ( draggedItem . Path ) . FullName == Directory . GetParent ( item . ItemPath ) . FullName ) )
337+ {
338+ e . AcceptedOperation = DataPackageOperation . Move ;
339+ }
340+ else
341+ {
342+ e . AcceptedOperation = DataPackageOperation . Copy ;
343+ }
344+ }
345+ }
346+
347+ protected async void Item_Drop ( object sender , DragEventArgs e )
348+ {
349+ e . Handled = true ;
350+ ListedItem rowItem = GetItemFromElement ( sender ) ;
351+ await App . CurrentInstance . InteractionOperations . PasteItems ( e . DataView , rowItem . ItemPath , e . AcceptedOperation ) ;
352+ }
353+
354+ protected void InitializeDrag ( UIElement element )
355+ {
356+ ListedItem item = GetItemFromElement ( element ) ;
357+ if ( item != null )
358+ {
359+ element . AllowDrop = false ;
360+ element . DragStarting -= Item_DragStarting ;
361+ element . DragStarting += Item_DragStarting ;
362+ element . DragOver -= Item_DragOver ;
363+ element . Drop -= Item_Drop ;
364+ if ( item . PrimaryItemAttribute == StorageItemTypes . Folder )
365+ {
366+ element . AllowDrop = true ;
367+ element . DragOver += Item_DragOver ;
368+ element . Drop += Item_Drop ;
369+ }
370+ }
371+ }
372+
276373 }
277374}
0 commit comments