Skip to content

Commit a93ee8c

Browse files
committed
Refactor more tools to use state that is passed along
1 parent 2245c65 commit a93ee8c

File tree

5 files changed

+38
-60
lines changed

5 files changed

+38
-60
lines changed

core/editor/src/input/input_mapper.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,32 +132,44 @@ impl Default for Mapping {
132132
entry! {action=RectangleMessage::Abort, key_down=Rmb},
133133
entry! {action=RectangleMessage::Abort, key_down=KeyEscape},
134134
entry! {action=RectangleMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, message=InputMapperMessage::PointerMove},
135+
entry! {action=RectangleMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyAlt},
136+
entry! {action=RectangleMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyAlt},
137+
entry! {action=RectangleMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyShift},
138+
entry! {action=RectangleMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyShift},
135139
// Ellipse
136140
entry! {action=EllipseMessage::DragStart, key_down=Lmb},
137141
entry! {action=EllipseMessage::DragStop, key_up=Lmb},
138142
entry! {action=EllipseMessage::Abort, key_down=Rmb},
139143
entry! {action=EllipseMessage::Abort, key_down=KeyEscape},
140144
entry! {action=EllipseMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, message=InputMapperMessage::PointerMove},
145+
entry! {action=EllipseMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyAlt},
146+
entry! {action=EllipseMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyAlt},
147+
entry! {action=EllipseMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyShift},
148+
entry! {action=EllipseMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyShift},
141149
// Shape
142150
entry! {action=ShapeMessage::DragStart, key_down=Lmb},
143151
entry! {action=ShapeMessage::DragStop, key_up=Lmb},
144152
entry! {action=ShapeMessage::Abort, key_down=Rmb},
145153
entry! {action=ShapeMessage::Abort, key_down=KeyEscape},
146154
entry! {action=ShapeMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, message=InputMapperMessage::PointerMove},
155+
entry! {action=ShapeMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyAlt},
156+
entry! {action=ShapeMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyAlt},
157+
entry! {action=ShapeMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_down=KeyShift},
158+
entry! {action=ShapeMessage::Resize{center: KeyAlt, lock_ratio: KeyShift}, key_up=KeyShift},
147159
// Line
148-
entry! {action=LineMessage::Center, key_down=KeyAlt},
149-
entry! {action=LineMessage::UnCenter, key_up=KeyAlt},
150-
entry! {action=LineMessage::MouseMove, message=InputMapperMessage::PointerMove},
160+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, message=InputMapperMessage::PointerMove},
161+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_down=KeyAlt},
162+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_up=KeyAlt},
163+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_down=KeyShift},
164+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_up=KeyShift},
165+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_down=KeyControl},
166+
entry! {action=LineMessage::Redraw{center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift}, key_up=KeyControl},
151167
entry! {action=LineMessage::DragStart, key_down=Lmb},
152168
entry! {action=LineMessage::DragStop, key_up=Lmb},
153169
entry! {action=LineMessage::Abort, key_down=Rmb},
154170
entry! {action=LineMessage::Abort, key_down=KeyEscape},
155-
entry! {action=LineMessage::LockAngle, key_down=KeyControl},
156-
entry! {action=LineMessage::UnlockAngle, key_up=KeyControl},
157-
entry! {action=LineMessage::SnapToAngle, key_down=KeyShift},
158-
entry! {action=LineMessage::UnSnapToAngle, key_up=KeyShift},
159171
// Pen
160-
entry! {action=PenMessage::MouseMove, message=InputMapperMessage::PointerMove},
172+
entry! {action=PenMessage::PointerMove, message=InputMapperMessage::PointerMove},
161173
entry! {action=PenMessage::DragStart, key_down=Lmb},
162174
entry! {action=PenMessage::DragStop, key_up=Lmb},
163175
entry! {action=PenMessage::Confirm, key_down=Rmb},

core/editor/src/tool/tools/ellipse.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ impl Fsm for EllipseToolFsmState {
9090
(state, Resize { center, lock_ratio }) => {
9191
if let Some(message) = shape_data.calculate_transform(center, lock_ratio, input) {
9292
responses.push_back(message);
93-
log::debug!("dragging");
9493
}
9594

9695
state

core/editor/src/tool/tools/line.rs

Lines changed: 11 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::consts::LINE_ROTATE_SNAP_ANGLE;
2+
use crate::input::keyboard::Key;
23
use crate::input::{mouse::ViewportPosition, InputPreprocessor};
34
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
45
use crate::{document::DocumentMessageHandler, message_prelude::*};
@@ -18,14 +19,8 @@ pub struct Line {
1819
pub 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

3126
impl<'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

core/editor/src/tool/tools/pen.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub enum PenMessage {
1616
Undo,
1717
DragStart,
1818
DragStop,
19-
MouseMove,
19+
PointerMove,
2020
Confirm,
2121
Abort,
2222
}
@@ -35,7 +35,7 @@ impl<'a> MessageHandler<ToolMessage, ToolActionHandlerData<'a>> for Pen {
3535
use PenToolFsmState::*;
3636
match self.fsm_state {
3737
Ready => actions!(PenMessageDiscriminant; Undo, DragStart, DragStop, Confirm, Abort),
38-
Dragging => actions!(PenMessageDiscriminant; DragStop, MouseMove, Confirm, Abort),
38+
Dragging => actions!(PenMessageDiscriminant; DragStop, PointerMove, Confirm, Abort),
3939
}
4040
}
4141
}
@@ -92,7 +92,7 @@ impl Fsm for PenToolFsmState {
9292

9393
Dragging
9494
}
95-
(Dragging, MouseMove) => {
95+
(Dragging, PointerMove) => {
9696
data.next_point = pos;
9797

9898
responses.extend(make_operation(data, tool_data, true));

core/editor/src/tool/tools/resize.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ impl Resize {
1515
let stop = ipp.mouse.position.as_f64();
1616

1717
let mut size = stop - start;
18-
if ipp.keyboard.get(center as usize) {
18+
if ipp.keyboard.get(lock_ratio as usize) {
1919
size = size.abs().max(size.abs().yx()) * size.signum();
2020
}
21-
if ipp.keyboard.get(lock_ratio as usize) {
22-
start -= size / 2.;
21+
if ipp.keyboard.get(center as usize) {
22+
start -= size;
23+
size *= 2.;
2324
}
2425

2526
self.path.clone().map(|path| {

0 commit comments

Comments
 (0)