8
8
using System . IO ;
9
9
using System . Linq ;
10
10
using System . Runtime . CompilerServices ;
11
+ using Windows . ApplicationModel . DataTransfer ;
11
12
using Windows . Storage ;
12
13
using Windows . UI . Core ;
13
14
using Windows . UI . Xaml ;
@@ -73,6 +74,7 @@ internal set
73
74
{
74
75
IsItemSelected = true ;
75
76
}
77
+ SetSelectedItemsOnUi ( value ) ;
76
78
NotifyPropertyChanged ( "SelectedItems" ) ;
77
79
}
78
80
}
@@ -98,6 +100,7 @@ internal set
98
100
{
99
101
IsItemSelected = true ;
100
102
}
103
+ SetSelectedItemOnUi ( value ) ;
101
104
NotifyPropertyChanged ( "SelectedItem" ) ;
102
105
}
103
106
}
@@ -119,6 +122,12 @@ public BaseLayout()
119
122
}
120
123
}
121
124
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
+
122
131
private void AppSettings_LayoutModeChangeRequested ( object sender , EventArgs e )
123
132
{
124
133
if ( App . CurrentInstance . ContentPage != null )
@@ -144,7 +153,7 @@ private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
144
153
PropertyChanged ? . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
145
154
}
146
155
147
- protected override void OnNavigatedTo ( NavigationEventArgs eventArgs )
156
+ protected override async void OnNavigatedTo ( NavigationEventArgs eventArgs )
148
157
{
149
158
base . OnNavigatedTo ( eventArgs ) ;
150
159
// Add item jumping handler
@@ -171,9 +180,9 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
171
180
App . CurrentInstance . NavigationToolbar . CanNavigateToParent = true ;
172
181
}
173
182
174
- App . CurrentInstance . ViewModel . AddItemsToCollectionAsync ( App . CurrentInstance . ViewModel . WorkingDirectory ) ;
175
- App . Clipboard_ContentChanged ( null , null ) ;
183
+ await App . CurrentInstance . ViewModel . RefreshItems ( ) ;
176
184
185
+ App . Clipboard_ContentChanged ( null , null ) ;
177
186
App . CurrentInstance . NavigationToolbar . PathControlDisplayText = parameters ;
178
187
}
179
188
@@ -273,5 +282,93 @@ protected virtual void Page_CharacterReceived(CoreWindow sender, CharacterReceiv
273
282
char letterPressed = Convert . ToChar ( args . KeyCode ) ;
274
283
App . CurrentInstance . InteractionOperations . PushJumpChar ( letterPressed ) ;
275
284
}
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
+
276
373
}
277
374
}
0 commit comments