@@ -407,6 +407,7 @@ struct SelectToolData {
407407 auto_panning : AutoPanning ,
408408 dragging_guide_id : Option < GuideId > ,
409409 dragging_guide_direction : Option < GuideDirection > ,
410+ guide_drag_start_position : Option < f64 > ,
410411 drag_start_center : ViewportPosition ,
411412}
412413
@@ -1093,11 +1094,15 @@ impl Fsm for SelectToolFsmState {
10931094 // tool_data.snap_manager.add_all_document_handles(document, input, &[], &[], &[]);
10941095
10951096 state
1096- }
1097- // Check if clicking on a guide line - handle before transform cage interactions
1098- else if let Some ( ( guide_id, direction) ) = hit_test_guide ( document, input. mouse . position ) {
1097+ } else if let Some ( ( guide_id, direction) ) = hit_test_guide ( document, input. mouse . position ) {
10991098 tool_data. dragging_guide_id = Some ( guide_id) ;
11001099 tool_data. dragging_guide_direction = Some ( direction) ;
1100+
1101+ let original_position = match direction {
1102+ GuideDirection :: Horizontal => document. horizontal_guides . iter ( ) . find ( |g| g. id == guide_id) . map ( |g| g. position ) ,
1103+ GuideDirection :: Vertical => document. vertical_guides . iter ( ) . find ( |g| g. id == guide_id) . map ( |g| g. position ) ,
1104+ } ;
1105+ tool_data. guide_drag_start_position = original_position;
11011106 SelectToolFsmState :: DraggingGuide { guide_id, direction }
11021107 }
11031108 // Dragging one (or two, forming a corner) of the transform cage bounding box edges
@@ -1194,48 +1199,51 @@ impl Fsm for SelectToolFsmState {
11941199 ( SelectToolFsmState :: DraggingGuide { .. } , SelectToolMessage :: Abort ) => {
11951200 tool_data. dragging_guide_id = None ;
11961201 tool_data. dragging_guide_direction = None ;
1202+ tool_data. guide_drag_start_position = None ;
11971203 let selection = tool_data. nested_selection_behavior ;
11981204 SelectToolFsmState :: Ready { selection }
11991205 }
12001206 // Guide dragging - pointer move
12011207 ( SelectToolFsmState :: DraggingGuide { guide_id, direction } , SelectToolMessage :: PointerMove { .. } ) => {
12021208 tool_data. drag_current = input. mouse . position ;
12031209
1204- let transform = document. metadata ( ) . document_to_viewport ;
1205- // Converts viewport to document
1206- let new_position = match direction {
1207- GuideDirection :: Horizontal => ( input. mouse . position . y - transform. translation . y ) / transform. matrix2 . y_axis . y ,
1208- GuideDirection :: Vertical => ( input. mouse . position . x - transform. translation . x ) / transform. matrix2 . x_axis . x ,
1210+ // MoveGuide expects viewport coordinates and does the conversion internally
1211+ let viewport_position = match direction {
1212+ GuideDirection :: Horizontal => input. mouse . position . y ,
1213+ GuideDirection :: Vertical => input. mouse . position . x ,
12091214 } ;
12101215
1211- responses. add ( DocumentMessage :: MoveGuide { id : guide_id, position : new_position } ) ;
1216+ responses. add ( DocumentMessage :: MoveGuide {
1217+ id : guide_id,
1218+ position : viewport_position,
1219+ } ) ;
12121220
12131221 SelectToolFsmState :: DraggingGuide { guide_id, direction }
12141222 }
12151223 ( SelectToolFsmState :: DraggingGuide { guide_id, direction } , SelectToolMessage :: DragStop { .. } ) => {
12161224 tool_data. drag_current = input. mouse . position ;
12171225
1218- let transform = document. metadata ( ) . document_to_viewport ;
1219- let final_position = match direction {
1220- GuideDirection :: Horizontal => ( input. mouse . position . y - transform. translation . y ) / transform. matrix2 . y_axis . y ,
1221- GuideDirection :: Vertical => ( input. mouse . position . x - transform. translation . x ) / transform. matrix2 . x_axis . x ,
1222- } ;
1223-
12241226 // Checks if dragged outside viewport - deletes the guide
12251227 let viewport_size = viewport. size ( ) . into_dvec2 ( ) ;
12261228 let outside_viewport = input. mouse . position . x < 0.0 || input. mouse . position . y < 0.0 || input. mouse . position . x > viewport_size. x || input. mouse . position . y > viewport_size. y ;
12271229
12281230 if outside_viewport {
12291231 responses. add ( DocumentMessage :: DeleteGuide { id : guide_id } ) ;
12301232 } else {
1233+ // MoveGuide expects viewport coordinates and does the conversion internally
1234+ let viewport_position = match direction {
1235+ GuideDirection :: Horizontal => input. mouse . position . y ,
1236+ GuideDirection :: Vertical => input. mouse . position . x ,
1237+ } ;
12311238 responses. add ( DocumentMessage :: MoveGuide {
12321239 id : guide_id,
1233- position : final_position ,
1240+ position : viewport_position ,
12341241 } ) ;
12351242 }
12361243
12371244 tool_data. dragging_guide_id = None ;
12381245 tool_data. dragging_guide_direction = None ;
1246+ tool_data. guide_drag_start_position = None ;
12391247 let selection = tool_data. nested_selection_behavior ;
12401248 SelectToolFsmState :: Ready { selection }
12411249 }
0 commit comments