Skip to content

Commit 40ff82c

Browse files
author
indierusty
committed
add dropdown widget to select tool mode [Spline/Path]
1 parent 0158be3 commit 40ff82c

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

editor/src/messages/tool/tool_messages/pen_tool.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ use graphene_core::vector::{PointId, VectorModificationType};
1616
use graphene_core::Color;
1717
use graphene_std::vector::{HandleId, ManipulatorPointId, SegmentId, VectorData};
1818

19+
use std::fmt;
20+
1921
#[derive(Default)]
2022
pub struct PenTool {
2123
fsm_state: PenToolFsmState,
@@ -62,6 +64,7 @@ pub enum PenToolMessage {
6264
Redo,
6365
Undo,
6466
UpdateOptions(PenOptionsUpdate),
67+
ChangeToolMode(ToolMode),
6568
RecalculateLatestPointsPosition,
6669
RemovePreviousHandle,
6770
GRS { grab: Key, rotate: Key, scale: Key },
@@ -94,6 +97,24 @@ pub enum PenOptionsUpdate {
9497
OverlayModeType(PenOverlayMode),
9598
}
9699

100+
impl PenTool {
101+
fn tool_mode_widget(&self) -> WidgetHolder {
102+
let tool_mode_entries = [ToolMode::Path, ToolMode::Spline]
103+
.iter()
104+
.map(|mode| {
105+
MenuListEntry::new(format!("{mode:?}"))
106+
.label(mode.to_string())
107+
.on_commit(move |_| PenToolMessage::ChangeToolMode(*mode).into())
108+
})
109+
.collect();
110+
111+
DropdownInput::new(vec![tool_mode_entries])
112+
.selected_index(Some((self.tool_data.tool_mode) as u32))
113+
.tooltip("Select Spline to draw smooth curves or select Path to draw a path.")
114+
.widget_holder()
115+
}
116+
}
117+
97118
impl ToolMetadata for PenTool {
98119
fn icon_name(&self) -> String {
99120
"VectorPenTool".into()
@@ -142,6 +163,10 @@ impl LayoutHolder for PenTool {
142163

143164
widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
144165

166+
widgets.push(self.tool_mode_widget());
167+
168+
widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
169+
145170
widgets.push(
146171
RadioInput::new(vec![
147172
RadioEntryData::new("all")
@@ -263,8 +288,25 @@ enum HandleMode {
263288
ColinearEquidistant,
264289
}
265290

291+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize, specta::Type)]
292+
pub enum ToolMode {
293+
#[default]
294+
Path,
295+
Spline,
296+
}
297+
298+
impl fmt::Display for ToolMode {
299+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
300+
match self {
301+
ToolMode::Path => write!(f, "Path"),
302+
ToolMode::Spline => write!(f, "Spline"),
303+
}
304+
}
305+
}
306+
266307
#[derive(Clone, Debug, Default)]
267308
struct PenToolData {
309+
tool_mode: ToolMode,
268310
snap_manager: SnapManager,
269311
latest_points: Vec<LastPoint>,
270312
point_index: usize,
@@ -910,6 +952,10 @@ impl Fsm for PenToolFsmState {
910952

911953
let ToolMessage::Pen(event) = event else { return self };
912954
match (self, event) {
955+
(state, PenToolMessage::ChangeToolMode(mode)) => {
956+
tool_data.tool_mode = mode;
957+
state
958+
}
913959
(PenToolFsmState::PlacingAnchor | PenToolFsmState::GRSHandle, PenToolMessage::GRS { grab, rotate, scale }) => {
914960
let Some(layer) = layer else { return PenToolFsmState::PlacingAnchor };
915961

0 commit comments

Comments
 (0)