11using AsyncImageLoader . Loaders ;
22using Avalonia . Controls ;
3+ using Avalonia . Input ;
34using Avalonia . Interactivity ;
5+ using Avalonia . Platform . Storage ;
6+ using Avalonia . VisualTree ;
47using FluentAvalonia . UI . Controls ;
58using SnapX . Avalonia . Models ;
69using SnapX . Avalonia . ViewModels ;
710using SnapX . Core ;
11+ using SnapX . Core . Upload ;
812using SnapX . Core . Utils ;
913using SnapX . Core . Utils . Miscellaneous ;
1014
@@ -19,8 +23,94 @@ public HomePageView(HomePageViewModel vm)
1923 DataContext = vm ;
2024 ViewModel = vm ;
2125 InitializeComponent ( ) ;
26+ AddHandler ( DragDrop . DragOverEvent , DragOver ) ;
27+ AddHandler ( DragDrop . DragEnterEvent , DragEnter ) ;
28+ AddHandler ( DragDrop . DropEvent , Drop ) ;
2229 AsyncImageLoader . ImageLoader . AsyncImageLoader = new DiskCachedWebImageLoader ( HttpClientFactory . Get ( ) , false , Path . Combine ( Core . SnapX . CacheFolder , "Images" ) ) ;
2330 }
31+
32+ private void SetupAllDraggables ( TopLevel topLevel )
33+ {
34+ foreach ( var element in topLevel . GetVisualDescendants ( ) . OfType < Control > ( ) )
35+ {
36+ if ( element . Classes . Contains ( "draggable" ) )
37+ {
38+ SetupDnd ( element , d =>
39+ {
40+ if ( element . DataContext is ListTaskTemplate task && ! string . IsNullOrEmpty ( task . task . FilePath ) )
41+ {
42+ d . Set ( DataFormats . Files , new [ ] { task . task . FilePath } ) ;
43+ }
44+ else
45+ {
46+ DebugHelper . WriteLine ( $ "Element that has draggable class doesn't have a DataContext of ListTaskTemplate") ;
47+ }
48+ } ,
49+ DragDropEffects . Copy | DragDropEffects . Move | DragDropEffects . Link ) ;
50+ }
51+ }
52+ }
53+ private void SetupDnd ( IInputElement draggable , Action < DataObject > factory , DragDropEffects effects )
54+ {
55+ draggable . PointerPressed += ( _ , e ) => DoDrag ( factory , e , effects ) ;
56+ }
57+ private async void DoDrag ( Action < DataObject > factory , PointerEventArgs e , DragDropEffects effects )
58+ {
59+ var dragData = new DataObject ( ) ;
60+ factory ( dragData ) ;
61+
62+ var result = await DragDrop . DoDragDrop ( e , dragData , effects ) ;
63+ }
64+
65+ private void DragEnter ( object ? Sender , DragEventArgs e )
66+ {
67+ // DebugHelper.WriteLine("DragEnter Event");
68+ // DebugHelper.WriteLine($"Sender: {Sender} | EventArgs: {e.GetPosition(this)}");
69+ }
70+
71+ private void DragOver ( object ? Sender , DragEventArgs e )
72+ {
73+ // DebugHelper.WriteLine("DragOver Event");
74+ // DebugHelper.WriteLine($"Sender: {Sender} | EventArgs: {e.GetPosition(this)}");
75+ }
76+
77+ private void Drop ( object ? Sender , DragEventArgs e )
78+ {
79+ DebugHelper . WriteLine ( "Drop Event" ) ;
80+ DebugHelper . WriteLine ( $ "Sender: { Sender } | EventArgs: { e . GetPosition ( this ) } ") ;
81+ if ( e . Source is Control )
82+ {
83+ e . DragEffects &= DragDropEffects . Move ;
84+ }
85+ else
86+ {
87+ e . DragEffects &= DragDropEffects . Copy ;
88+ }
89+ if ( e . Data . Contains ( DataFormats . Text ) )
90+ {
91+ UploadManager . UploadText ( e . Data . GetText ( ) ) ;
92+ }
93+ else if ( e . Data . Contains ( DataFormats . Files ) )
94+ {
95+ var files = e . Data . GetFiles ( ) ?? Array . Empty < IStorageItem > ( ) ;
96+
97+ foreach ( var item in files )
98+ {
99+ switch ( item )
100+ {
101+ case IStorageFile file :
102+ UploadManager . UploadFile ( file . Path . AbsolutePath ) ;
103+ break ;
104+ case IStorageFolder folder :
105+ UploadManager . UploadFolder ( folder . Path . AbsolutePath ) ;
106+ break ;
107+ }
108+ }
109+
110+ }
111+
112+ DebugHelper . WriteLine ( $ "{ string . Join ( ", " , e . Data . GetDataFormats ( ) ) } ") ;
113+ }
24114 public HomePageView ( ) : this ( new HomePageViewModel ( ) )
25115 {
26116 }
@@ -33,6 +123,7 @@ private void PopupFlyoutBase_OnOpening(object? Sender, EventArgs E)
33123 private void Control_OnLoaded ( object ? Sender , RoutedEventArgs E )
34124 {
35125 Task . Run ( ( ) => ViewModel . Initialize ( ) ) . ConfigureAwait ( false ) ;
126+ // SetupAllDraggables(TopLevel.GetTopLevel(this)!);
36127 }
37128
38129 private void DeleteLocallyButton_OnClick ( object ? Sender , RoutedEventArgs E )
0 commit comments