11use crate :: consts:: LINE_ROTATE_SNAP_ANGLE ;
2+ use crate :: input:: keyboard:: Key ;
23use crate :: input:: { mouse:: ViewportPosition , InputPreprocessor } ;
34use crate :: tool:: { DocumentToolData , Fsm , ToolActionHandlerData } ;
45use crate :: { document:: DocumentMessageHandler , message_prelude:: * } ;
@@ -18,14 +19,8 @@ pub struct Line {
1819pub enum LineMessage {
1920 DragStart ,
2021 DragStop ,
21- MouseMove ,
22+ Redraw { center : Key , lock_angle : Key , snap_angle : Key } ,
2223 Abort ,
23- Center ,
24- UnCenter ,
25- LockAngle ,
26- UnlockAngle ,
27- SnapToAngle ,
28- UnSnapToAngle ,
2924}
3025
3126impl < ' a > MessageHandler < ToolMessage , ToolActionHandlerData < ' a > > for Line {
@@ -35,8 +30,8 @@ impl<'a> MessageHandler<ToolMessage, ToolActionHandlerData<'a>> for Line {
3530 fn actions ( & self ) -> ActionList {
3631 use LineToolFsmState :: * ;
3732 match self . fsm_state {
38- Ready => actions ! ( LineMessageDiscriminant ; DragStart , Center , UnCenter , LockAngle , UnlockAngle , SnapToAngle , UnSnapToAngle ) ,
39- Dragging => actions ! ( LineMessageDiscriminant ; DragStop , MouseMove , Abort , Center , UnCenter , LockAngle , UnlockAngle , SnapToAngle , UnSnapToAngle ) ,
33+ Ready => actions ! ( LineMessageDiscriminant ; DragStart ) ,
34+ Dragging => actions ! ( LineMessageDiscriminant ; DragStop , Redraw , Abort ) ,
4035 }
4136 }
4237}
@@ -57,9 +52,6 @@ struct LineToolData {
5752 drag_start : ViewportPosition ,
5853 drag_current : ViewportPosition ,
5954 angle : f64 ,
60- snap_angle : bool ,
61- lock_angle : bool ,
62- center_around_cursor : bool ,
6355 path : Option < Vec < LayerId > > ,
6456}
6557
@@ -97,10 +89,11 @@ impl Fsm for LineToolFsmState {
9789
9890 Dragging
9991 }
100- ( Dragging , MouseMove ) => {
92+ ( Dragging , Redraw { center , snap_angle , lock_angle } ) => {
10193 data. drag_current = input. mouse . position ;
10294
103- responses. push_back ( generate_transform ( data) ) ;
95+ let values: Vec < _ > = [ lock_angle, snap_angle, center] . into_iter ( ) . map ( |k| input. keyboard . get ( * k as usize ) ) . collect ( ) ;
96+ responses. push_back ( generate_transform ( data, values[ 0 ] , values[ 1 ] , values[ 2 ] ) ) ;
10497
10598 Dragging
10699 }
@@ -122,20 +115,6 @@ impl Fsm for LineToolFsmState {
122115 data. path = None ;
123116 Ready
124117 }
125- ( Ready , LockAngle ) => update_state_no_op ( & mut data. lock_angle , true , Ready ) ,
126- ( Ready , UnlockAngle ) => update_state_no_op ( & mut data. lock_angle , false , Ready ) ,
127- ( Dragging , LockAngle ) => update_state ( |data| & mut data. lock_angle , true , data, responses, Dragging ) ,
128- ( Dragging , UnlockAngle ) => update_state ( |data| & mut data. lock_angle , false , data, responses, Dragging ) ,
129-
130- ( Ready , SnapToAngle ) => update_state_no_op ( & mut data. snap_angle , true , Ready ) ,
131- ( Ready , UnSnapToAngle ) => update_state_no_op ( & mut data. snap_angle , false , Ready ) ,
132- ( Dragging , SnapToAngle ) => update_state ( |data| & mut data. snap_angle , true , data, responses, Dragging ) ,
133- ( Dragging , UnSnapToAngle ) => update_state ( |data| & mut data. snap_angle , false , data, responses, Dragging ) ,
134-
135- ( Ready , Center ) => update_state_no_op ( & mut data. center_around_cursor , true , Ready ) ,
136- ( Ready , UnCenter ) => update_state_no_op ( & mut data. center_around_cursor , false , Ready ) ,
137- ( Dragging , Center ) => update_state ( |data| & mut data. center_around_cursor , true , data, responses, Dragging ) ,
138- ( Dragging , UnCenter ) => update_state ( |data| & mut data. center_around_cursor , false , data, responses, Dragging ) ,
139118 _ => self ,
140119 }
141120 } else {
@@ -144,32 +123,19 @@ impl Fsm for LineToolFsmState {
144123 }
145124}
146125
147- fn update_state_no_op ( state : & mut bool , value : bool , new_state : LineToolFsmState ) -> LineToolFsmState {
148- * state = value;
149- new_state
150- }
151-
152- fn update_state ( state : fn ( & mut LineToolData ) -> & mut bool , value : bool , data : & mut LineToolData , responses : & mut VecDeque < Message > , new_state : LineToolFsmState ) -> LineToolFsmState {
153- * ( state ( data) ) = value;
154-
155- responses. push_back ( generate_transform ( data) ) ;
156-
157- new_state
158- }
159-
160- fn generate_transform ( data : & mut LineToolData ) -> Message {
126+ fn generate_transform ( data : & mut LineToolData , lock : bool , snap : bool , center : bool ) -> Message {
161127 let mut start = data. drag_start . as_f64 ( ) ;
162128 let stop = data. drag_current . as_f64 ( ) ;
163129
164130 let mut dir = stop - start;
165131
166132 let mut angle = f64:: atan2 ( dir. x , dir. y ) ;
167133
168- if data . lock_angle {
134+ if lock {
169135 angle = data. angle
170136 } ;
171137
172- if data . snap_angle {
138+ if snap {
173139 let snap_resolution = LINE_ROTATE_SNAP_ANGLE ;
174140 angle = ( angle * snap_resolution / PI ) . round ( ) / snap_resolution * PI ;
175141 }
@@ -178,7 +144,7 @@ fn generate_transform(data: &mut LineToolData) -> Message {
178144
179145 dir = DVec2 :: new ( f64:: sin ( angle) , f64:: cos ( angle) ) * dir. length ( ) ;
180146
181- if data . center_around_cursor {
147+ if center {
182148 start -= dir / 2. ;
183149 }
184150
0 commit comments