Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,8 @@ Press <kbd>F1</kbd> for the complete in-app cheat sheet.
| Text mode | <kbd>T</kbd>, <kbd>Click</kbd> to position, type, <kbd>Enter</kbd> to finish |
| Sticky note | <kbd>N</kbd>, <kbd>Click</kbd> to place, type, <kbd>Enter</kbd> to finish |

Drag modifier mappings are configurable in `config.toml` via `[drawing]` (`drag_tool`, `shift_drag_tool`, `ctrl_drag_tool`, `ctrl_shift_drag_tool`, `tab_drag_tool`) or in the configurator Drawing tab.

</details>

<details>
Expand Down
8 changes: 8 additions & 0 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,14 @@ hit_test_linear_threshold = 400
# Undo history size (10 - 1000)
undo_stack_limit = 100

# Drag gesture tool mapping (defaults match existing behavior)
# Allowed values use kebab-case tool names, e.g. "pen", "arrow", "eraser"
drag_tool = "pen"
shift_drag_tool = "line"
ctrl_drag_tool = "rect"
ctrl_shift_drag_tool = "arrow"
tab_drag_tool = "ellipse"

# ───────────────────────────────────────────────────────────────────────────────
# Font Configuration (Pango-based text rendering)
# ───────────────────────────────────────────────────────────────────────────────
Expand Down
17 changes: 14 additions & 3 deletions configurator/src/app/update/fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ use iced::Command;

use crate::messages::Message;
use crate::models::{
ColorMode, ColorPickerId, EraserModeOption, FontStyleOption, FontWeightOption, KeybindingField,
NamedColorOption, OverrideOption, PresenterToolBehaviorOption, QuadField,
ColorMode, ColorPickerId, DragToolField, EraserModeOption, FontStyleOption, FontWeightOption,
KeybindingField, NamedColorOption, OverrideOption, PresenterToolBehaviorOption, QuadField,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption, TextField,
ToggleField, ToolbarLayoutModeOption, ToolbarOverrideField, TripletField,
ToggleField, ToolOption, ToolbarLayoutModeOption, ToolbarOverrideField, TripletField,
};
#[cfg(feature = "tablet-input")]
use crate::models::{PressureThicknessEditModeOption, PressureThicknessEntryModeOption};
Expand Down Expand Up @@ -105,6 +105,17 @@ impl ConfiguratorApp {
Command::none()
}

pub(super) fn handle_drawing_drag_tool_changed(
&mut self,
field: DragToolField,
option: ToolOption,
) -> Command<Message> {
self.status = StatusMessage::idle();
self.draft.set_drag_tool(field, option);
self.refresh_dirty_flag();
Command::none()
}

pub(super) fn handle_status_position_changed(
&mut self,
option: StatusPositionOption,
Expand Down
3 changes: 3 additions & 0 deletions configurator/src/app/update/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ impl ConfiguratorApp {
Message::ColorModeChanged(mode) => self.handle_color_mode_changed(mode),
Message::NamedColorSelected(option) => self.handle_named_color_selected(option),
Message::EraserModeChanged(option) => self.handle_eraser_mode_changed(option),
Message::DrawingDragToolChanged(field, option) => {
self.handle_drawing_drag_tool_changed(field, option)
}
Message::StatusPositionChanged(option) => self.handle_status_position_changed(option),
Message::ToolbarLayoutModeChanged(option) => {
self.handle_toolbar_layout_mode_changed(option)
Expand Down
56 changes: 55 additions & 1 deletion configurator/src/app/view/drawing/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use iced::widget::{column, pick_list, row, scrollable, text};
use iced::{Element, Length};

use crate::messages::Message;
use crate::models::{EraserModeOption, TextField, ToggleField};
use crate::models::{DragToolField, EraserModeOption, TextField, ToggleField, ToolOption};

use self::color::drawing_color_block;
use self::font::font_controls;
Expand All @@ -22,6 +22,12 @@ impl ConfiguratorApp {
Some(self.draft.drawing_default_eraser_mode),
Message::EraserModeChanged,
);
let drag_tool_pick = |field: DragToolField, selected: ToolOption| {
pick_list(ToolOption::list(), Some(selected), move |option| {
Message::DrawingDragToolChanged(field, option)
})
.width(Length::Fill)
};

let column = column![
text("Drawing Defaults").size(20),
Expand Down Expand Up @@ -66,6 +72,54 @@ impl ConfiguratorApp {
)
]
.spacing(12),
text("Drag Tool Mapping").size(16),
row![
labeled_control(
DragToolField::Drag.label(),
drag_tool_pick(DragToolField::Drag, self.draft.drawing_drag_tool).into(),
self.defaults.drawing_drag_tool.label().to_string(),
self.draft.drawing_drag_tool != self.defaults.drawing_drag_tool,
),
labeled_control(
DragToolField::ShiftDrag.label(),
drag_tool_pick(DragToolField::ShiftDrag, self.draft.drawing_shift_drag_tool)
.into(),
self.defaults.drawing_shift_drag_tool.label().to_string(),
self.draft.drawing_shift_drag_tool != self.defaults.drawing_shift_drag_tool,
)
]
.spacing(12),
row![
labeled_control(
DragToolField::CtrlDrag.label(),
drag_tool_pick(DragToolField::CtrlDrag, self.draft.drawing_ctrl_drag_tool)
.into(),
self.defaults.drawing_ctrl_drag_tool.label().to_string(),
self.draft.drawing_ctrl_drag_tool != self.defaults.drawing_ctrl_drag_tool,
),
labeled_control(
DragToolField::CtrlShiftDrag.label(),
drag_tool_pick(
DragToolField::CtrlShiftDrag,
self.draft.drawing_ctrl_shift_drag_tool,
)
.into(),
self.defaults
.drawing_ctrl_shift_drag_tool
.label()
.to_string(),
self.draft.drawing_ctrl_shift_drag_tool
!= self.defaults.drawing_ctrl_shift_drag_tool,
)
]
.spacing(12),
row![labeled_control(
DragToolField::TabDrag.label(),
drag_tool_pick(DragToolField::TabDrag, self.draft.drawing_tab_drag_tool).into(),
self.defaults.drawing_tab_drag_tool.label().to_string(),
self.draft.drawing_tab_drag_tool != self.defaults.drawing_tab_drag_tool,
)]
.spacing(12),
row![
labeled_input_with_feedback(
"Marker opacity (0.05-0.9)",
Expand Down
12 changes: 7 additions & 5 deletions configurator/src/messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ use wayscriber::config::Config;

use crate::models::{
BoardBackgroundOption, BoardItemTextField, BoardItemToggleField, ColorMode, ColorPickerId,
ColorPickerValue, EraserModeOption, FontStyleOption, FontWeightOption, KeybindingField,
KeybindingsTabId, NamedColorOption, OverrideOption, PresenterToolBehaviorOption,
PresetEraserKindOption, PresetEraserModeOption, PresetTextField, PresetToggleField, QuadField,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption, TabId, TextField,
ToggleField, ToolOption, ToolbarLayoutModeOption, ToolbarOverrideField, TripletField, UiTabId,
ColorPickerValue, DragToolField, EraserModeOption, FontStyleOption, FontWeightOption,
KeybindingField, KeybindingsTabId, NamedColorOption, OverrideOption,
PresenterToolBehaviorOption, PresetEraserKindOption, PresetEraserModeOption, PresetTextField,
PresetToggleField, QuadField, SessionCompressionOption, SessionStorageModeOption,
StatusPositionOption, TabId, TextField, ToggleField, ToolOption, ToolbarLayoutModeOption,
ToolbarOverrideField, TripletField, UiTabId,
};
#[cfg(feature = "tablet-input")]
use crate::models::{PressureThicknessEditModeOption, PressureThicknessEntryModeOption};
Expand All @@ -35,6 +36,7 @@ pub enum Message {
ColorModeChanged(ColorMode),
NamedColorSelected(NamedColorOption),
EraserModeChanged(EraserModeOption),
DrawingDragToolChanged(DragToolField, ToolOption),
StatusPositionChanged(StatusPositionOption),
ToolbarLayoutModeChanged(ToolbarLayoutModeOption),
ToolbarOverrideModeChanged(ToolbarLayoutModeOption),
Expand Down
9 changes: 8 additions & 1 deletion configurator/src/models/config/draft/from_config.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::super::super::color::{ColorInput, ColorQuadInput};
use super::super::super::fields::{
EraserModeOption, FontStyleOption, FontWeightOption, PresenterToolBehaviorOption,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption, ToolOption,
ToolbarLayoutModeOption,
};
#[cfg(feature = "tablet-input")]
Expand Down Expand Up @@ -38,6 +38,13 @@ impl ConfigDraft {
drawing_font_style: style_value,
drawing_text_background_enabled: config.drawing.text_background_enabled,
drawing_default_fill_enabled: config.drawing.default_fill_enabled,
drawing_drag_tool: ToolOption::from_tool(config.drawing.drag_tool),
drawing_shift_drag_tool: ToolOption::from_tool(config.drawing.shift_drag_tool),
drawing_ctrl_drag_tool: ToolOption::from_tool(config.drawing.ctrl_drag_tool),
drawing_ctrl_shift_drag_tool: ToolOption::from_tool(
config.drawing.ctrl_shift_drag_tool,
),
drawing_tab_drag_tool: ToolOption::from_tool(config.drawing.tab_drag_tool),
drawing_font_style_option: style_option,
drawing_font_weight_option: weight_option,

Expand Down
7 changes: 6 additions & 1 deletion configurator/src/models/config/draft/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ mod from_config;
use super::super::color::{ColorInput, ColorQuadInput};
use super::super::fields::{
EraserModeOption, FontStyleOption, FontWeightOption, PresenterToolBehaviorOption,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption,
SessionCompressionOption, SessionStorageModeOption, StatusPositionOption, ToolOption,
ToolbarLayoutModeOption,
};
#[cfg(feature = "tablet-input")]
Expand All @@ -29,6 +29,11 @@ pub struct ConfigDraft {
pub drawing_font_style: String,
pub drawing_text_background_enabled: bool,
pub drawing_default_fill_enabled: bool,
pub drawing_drag_tool: ToolOption,
pub drawing_shift_drag_tool: ToolOption,
pub drawing_ctrl_drag_tool: ToolOption,
pub drawing_ctrl_shift_drag_tool: ToolOption,
pub drawing_tab_drag_tool: ToolOption,
pub drawing_font_style_option: FontStyleOption,
pub drawing_font_weight_option: FontWeightOption,

Expand Down
14 changes: 12 additions & 2 deletions configurator/src/models/config/setters.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::super::fields::{
FontStyleOption, FontWeightOption, OverrideOption, QuadField, TextField, ToggleField,
ToolbarLayoutModeOption, ToolbarOverrideField, TripletField,
DragToolField, FontStyleOption, FontWeightOption, OverrideOption, QuadField, TextField,
ToggleField, ToolOption, ToolbarLayoutModeOption, ToolbarOverrideField, TripletField,
};
use super::draft::ConfigDraft;

Expand Down Expand Up @@ -30,6 +30,16 @@ impl ConfigDraft {
.set(field, value);
}

pub fn set_drag_tool(&mut self, field: DragToolField, value: ToolOption) {
match field {
DragToolField::Drag => self.drawing_drag_tool = value,
DragToolField::ShiftDrag => self.drawing_shift_drag_tool = value,
DragToolField::CtrlDrag => self.drawing_ctrl_drag_tool = value,
DragToolField::CtrlShiftDrag => self.drawing_ctrl_shift_drag_tool = value,
DragToolField::TabDrag => self.drawing_tab_drag_tool = value,
}
}

pub fn set_toggle(&mut self, field: ToggleField, value: bool) {
match field {
ToggleField::DrawingTextBackground => {
Expand Down
41 changes: 40 additions & 1 deletion configurator/src/models/config/tests.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use super::super::color::ColorInput;
use super::super::fields::{
FontWeightOption, QuadField, SessionStorageModeOption, TextField, ToggleField, TripletField,
FontWeightOption, QuadField, SessionStorageModeOption, TextField, ToggleField, ToolOption,
TripletField,
};
use super::super::{ColorMode, NamedColorOption};
use super::ConfigDraft;
Expand Down Expand Up @@ -131,3 +132,41 @@ fn config_draft_round_trips_presets_and_history() {
assert_eq!(round_trip.presets.slot_count, config.presets.slot_count);
assert_eq!(round_trip.presets.get_slot(1), config.presets.get_slot(1));
}

#[test]
fn config_draft_round_trips_drag_tool_mapping() {
let mut config = Config::default();
config.drawing.drag_tool = Tool::Arrow;
config.drawing.shift_drag_tool = Tool::Eraser;
config.drawing.ctrl_drag_tool = Tool::Pen;
config.drawing.ctrl_shift_drag_tool = Tool::Rect;
config.drawing.tab_drag_tool = Tool::Ellipse;

let draft = ConfigDraft::from_config(&config);
assert_eq!(draft.drawing_drag_tool, ToolOption::Arrow);
assert_eq!(draft.drawing_shift_drag_tool, ToolOption::Eraser);
assert_eq!(draft.drawing_ctrl_drag_tool, ToolOption::Pen);
assert_eq!(draft.drawing_ctrl_shift_drag_tool, ToolOption::Rect);
assert_eq!(draft.drawing_tab_drag_tool, ToolOption::Ellipse);

let round_trip = draft
.to_config(&config)
.expect("expected config to round trip");
assert_eq!(round_trip.drawing.drag_tool, config.drawing.drag_tool);
assert_eq!(
round_trip.drawing.shift_drag_tool,
config.drawing.shift_drag_tool
);
assert_eq!(
round_trip.drawing.ctrl_drag_tool,
config.drawing.ctrl_drag_tool
);
assert_eq!(
round_trip.drawing.ctrl_shift_drag_tool,
config.drawing.ctrl_shift_drag_tool
);
assert_eq!(
round_trip.drawing.tab_drag_tool,
config.drawing.tab_drag_tool
);
}
5 changes: 5 additions & 0 deletions configurator/src/models/config/to_config/drawing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ impl ConfigDraft {
config.drawing.font_style = self.drawing_font_style.clone();
config.drawing.text_background_enabled = self.drawing_text_background_enabled;
config.drawing.default_fill_enabled = self.drawing_default_fill_enabled;
config.drawing.drag_tool = self.drawing_drag_tool.to_tool();
config.drawing.shift_drag_tool = self.drawing_shift_drag_tool.to_tool();
config.drawing.ctrl_drag_tool = self.drawing_ctrl_drag_tool.to_tool();
config.drawing.ctrl_shift_drag_tool = self.drawing_ctrl_shift_drag_tool.to_tool();
config.drawing.tab_drag_tool = self.drawing_tab_drag_tool.to_tool();
parse_field(
&self.drawing_hit_test_tolerance,
"drawing.hit_test_tolerance",
Expand Down
2 changes: 1 addition & 1 deletion configurator/src/models/fields/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub use status::StatusPositionOption;
pub use toggles::{
PresetTextField, PresetToggleField, QuadField, TextField, ToggleField, TripletField,
};
pub use tool::ToolOption;
pub use tool::{DragToolField, ToolOption};
pub use toolbar::{OverrideOption, ToolbarLayoutModeOption, ToolbarOverrideField};

#[cfg(test)]
Expand Down
21 changes: 21 additions & 0 deletions configurator/src/models/fields/tool.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
use wayscriber::input::Tool;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DragToolField {
Drag,
ShiftDrag,
CtrlDrag,
CtrlShiftDrag,
TabDrag,
}

impl DragToolField {
pub fn label(self) -> &'static str {
match self {
Self::Drag => "Drag",
Self::ShiftDrag => "Shift+Drag",
Self::CtrlDrag => "Ctrl+Drag",
Self::CtrlShiftDrag => "Ctrl+Shift+Drag",
Self::TabDrag => "Tab+Drag",
}
}
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ToolOption {
Select,
Expand Down
2 changes: 1 addition & 1 deletion configurator/src/models/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub use color::{ColorMode, ColorQuadInput, ColorTripletInput, NamedColorOption};
pub use color_picker::{ColorPickerId, ColorPickerValue};
pub use config::{BoardBackgroundOption, BoardItemTextField, BoardItemToggleField, ConfigDraft};
pub use fields::{
EraserModeOption, FontStyleOption, FontWeightOption, OverrideOption,
DragToolField, EraserModeOption, FontStyleOption, FontWeightOption, OverrideOption,
PresenterToolBehaviorOption, PresetEraserKindOption, PresetEraserModeOption, PresetTextField,
PresetToggleField, QuadField, SessionCompressionOption, SessionStorageModeOption,
StatusPositionOption, TextField, ToggleField, ToolOption, ToolbarLayoutModeOption,
Expand Down
8 changes: 8 additions & 0 deletions docs/CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@ text_background_enabled = false
hit_test_tolerance = 6.0
hit_test_linear_threshold = 400
undo_stack_limit = 100

# Drag gesture tool mapping
drag_tool = "pen"
shift_drag_tool = "line"
ctrl_drag_tool = "rect"
ctrl_shift_drag_tool = "arrow"
tab_drag_tool = "ellipse"
```

**Color Options:**
Expand All @@ -86,6 +93,7 @@ undo_stack_limit = 100
- Text background: false
- Hit-test tolerance: 6.0px (linear threshold: 400)
- Undo stack limit: 100
- Drag mapping: Drag=Pen, Shift+Drag=Line, Ctrl+Drag=Rect, Ctrl+Shift+Drag=Arrow, Tab+Drag=Ellipse

### `[arrow]` - Arrow Geometry

Expand Down
Loading