@@ -136,54 +136,62 @@ private void OnRowsSelectionChanged(object _, SelectionChangedEventArgs e)
136136 OpenCommitMessageEditor ( items [ 0 ] ) ;
137137 }
138138
139- private void OnSetupRowHeaderDragDrop ( object sender , RoutedEventArgs e )
140- {
141- if ( sender is Border border )
142- {
143- DragDrop . SetAllowDrop ( border , true ) ;
144- border . AddHandler ( DragDrop . DragOverEvent , OnRowHeaderDragOver ) ;
145- }
146- }
147-
148- private void OnRowHeaderPointerPressed ( object sender , PointerPressedEventArgs e )
139+ private async void OnRowHeaderPointerPressed ( object sender , PointerPressedEventArgs e )
149140 {
150141 if ( sender is Border { DataContext : ViewModels . InteractiveRebaseItem item } )
151142 {
152- var data = new DataObject ( ) ;
153- data . Set ( "InteractiveRebaseItem" , item ) ;
154- DragDrop . DoDragDrop ( e , data , DragDropEffects . Move | DragDropEffects . Copy | DragDropEffects . Link ) ;
143+ var data = new DataTransfer ( ) ;
144+ data . Add ( DataTransferItem . Create ( _dndItemFormat , item . Commit . SHA ) ) ;
145+ await DragDrop . DoDragDropAsync ( e , data , DragDropEffects . Move ) ;
155146 }
156147 }
157148
158149 private void OnRowHeaderDragOver ( object sender , DragEventArgs e )
159150 {
160- if ( DataContext is ViewModels . InteractiveRebase vm &&
161- e . Data . Contains ( "InteractiveRebaseItem" ) &&
162- e . Data . Get ( "InteractiveRebaseItem" ) is ViewModels . InteractiveRebaseItem src &&
163- sender is Border { DataContext : ViewModels . InteractiveRebaseItem dst } border &&
164- src != dst )
165- {
166- e . DragEffects = DragDropEffects . Move | DragDropEffects . Copy | DragDropEffects . Link ;
151+ if ( DataContext is not ViewModels . InteractiveRebase vm )
152+ return ;
167153
168- var p = e . GetPosition ( border ) ;
169- if ( p . Y > border . Bounds . Height * 0.33 && p . Y < border . Bounds . Height * 0.67 )
154+ if ( e . DataTransfer . TryGetValue ( _dndItemFormat ) is not { Length : > 6 } sha )
155+ return ;
156+
157+ ViewModels . InteractiveRebaseItem src = null ;
158+ foreach ( var item in vm . Items )
159+ {
160+ if ( item . Commit . SHA . Equals ( sha , StringComparison . Ordinal ) )
170161 {
171- var srcIdx = vm . Items . IndexOf ( src ) ;
172- var dstIdx = vm . Items . IndexOf ( dst ) ;
173- if ( srcIdx < dstIdx )
174- {
175- for ( var i = srcIdx ; i < dstIdx ; i ++ )
176- vm . MoveItemDown ( src ) ;
177- }
178- else
179- {
180- for ( var i = srcIdx ; i > dstIdx ; i -- )
181- vm . MoveItemUp ( src ) ;
182- }
162+ src = item ;
163+ break ;
183164 }
165+ }
184166
185- e . Handled = true ;
167+ if ( src == null )
168+ return ;
169+
170+ if ( sender is not Border { DataContext : ViewModels . InteractiveRebaseItem dst } border )
171+ return ;
172+
173+ if ( src == dst )
174+ return ;
175+
176+ var p = e . GetPosition ( border ) ;
177+ if ( p . Y > border . Bounds . Height * 0.33 && p . Y < border . Bounds . Height * 0.67 )
178+ {
179+ var srcIdx = vm . Items . IndexOf ( src ) ;
180+ var dstIdx = vm . Items . IndexOf ( dst ) ;
181+ if ( srcIdx < dstIdx )
182+ {
183+ for ( var i = srcIdx ; i < dstIdx ; i ++ )
184+ vm . MoveItemDown ( src ) ;
185+ }
186+ else
187+ {
188+ for ( var i = srcIdx ; i > dstIdx ; i -- )
189+ vm . MoveItemUp ( src ) ;
190+ }
186191 }
192+
193+ e . DragEffects = DragDropEffects . Move ;
194+ e . Handled = true ;
187195 }
188196
189197 private void OnButtonActionClicked ( object sender , RoutedEventArgs e )
@@ -293,5 +301,6 @@ private void ChangeItemsAction(ViewModels.InteractiveRebaseItem target, Models.I
293301 }
294302
295303 private bool _firstSelectionChangedHandled = false ;
304+ private readonly DataFormat < string > _dndItemFormat = DataFormat . CreateStringApplicationFormat ( "sourcegit-dnd-ir-item" ) ;
296305 }
297306}
0 commit comments