Skip to content

Commit 32763c8

Browse files
committed
another failed attempt
1 parent 19a6f16 commit 32763c8

File tree

5 files changed

+104
-13
lines changed

5 files changed

+104
-13
lines changed

crates/rnote-engine/src/engine/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,22 @@ impl Engine {
525525
)
526526
}
527527

528+
/// Change the pen or earser style.
529+
pub fn change_pen_eraser_style(&mut self, mode: PenMode, new_style: PenStyle) -> WidgetFlags {
530+
self.penholder.change_style_single_mode(
531+
mode,
532+
new_style,
533+
&mut EngineViewMut {
534+
tasks_tx: self.engine_tasks_tx(),
535+
pens_config: &mut self.pens_config,
536+
document: &mut self.document,
537+
store: &mut self.store,
538+
camera: &mut self.camera,
539+
audioplayer: &mut self.audioplayer,
540+
},
541+
)
542+
}
543+
528544
/// Change the pen style (temporary) override.
529545
pub fn change_pen_style_override(
530546
&mut self,

crates/rnote-engine/src/pens/penholder.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,21 @@ impl PenHolder {
167167
widget_flags
168168
}
169169

170+
/// Change the pen or eraser style.
171+
pub fn change_style_single_mode(
172+
&mut self,
173+
mode: PenMode,
174+
new_style: PenStyle,
175+
engine_view: &mut EngineViewMut,
176+
) -> WidgetFlags {
177+
let widget_flags = self.change_style_pen_eraser_int(new_style, mode, engine_view);
178+
// When the style is changed externally, the toggle mode / internal states are reset
179+
self.toggle_pen_style = None;
180+
self.prev_shortcut_key = None;
181+
182+
widget_flags
183+
}
184+
170185
/// Change the style override.
171186
pub fn change_style_override(
172187
&mut self,
@@ -357,6 +372,29 @@ impl PenHolder {
357372
widget_flags
358373
}
359374

375+
/// Internal method for changing the pen/eraser style, without some of the side effects that are happening in the public
376+
/// method.
377+
fn change_style_pen_eraser_int(
378+
&mut self,
379+
new_style: PenStyle,
380+
mode: PenMode,
381+
engine_view: &mut EngineViewMut,
382+
) -> WidgetFlags {
383+
let mut widget_flags = WidgetFlags::default();
384+
385+
if self.pen_mode_state.get_style(mode) != new_style {
386+
// Deselecting when changing the style
387+
let all_strokes = engine_view.store.selection_keys_as_rendered();
388+
engine_view.store.set_selected_keys(&all_strokes, false);
389+
390+
self.pen_mode_state.set_style_single_mode(mode, new_style);
391+
widget_flags |= self.reinstall_pen_current_style(engine_view);
392+
widget_flags.refresh_ui = true;
393+
}
394+
395+
widget_flags
396+
}
397+
360398
/// Handles the pen event in the global scope if the current pen has not handled it.
361399
///
362400
/// Used to implement things like nudging the view, react to pressed buttons that weren't handled by th pen, ..

crates/rnote-engine/src/pens/penmode.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::CloneConfig;
2-
use std::cell::RefCell;
32

43
// Imports
54
use super::PenStyle;

crates/rnote-ui/src/appwindow/actions.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use p2d::bounding_volume::BoundingVolume;
1010
use rnote_compose::penevent::ShortcutKey;
1111
use rnote_compose::SplitOrder;
1212
use rnote_engine::engine::StrokeContent;
13+
use rnote_engine::pens::PenMode;
1314
use rnote_engine::pens::PenStyle;
1415
use rnote_engine::strokes::resize::{ImageSizeOption, Resize};
1516
use rnote_engine::{Camera, Engine};
@@ -91,6 +92,11 @@ impl RnAppWindow {
9192
&String::from("brush").to_variant(),
9293
);
9394
self.add_action(&action_pen_style);
95+
let action_change_pen_styles = gio::SimpleAction::new(
96+
"pen-styles",
97+
Some(&<(String, String)>::static_variant_type()),
98+
);
99+
self.add_action(&action_change_pen_styles);
94100
let action_undo_stroke = gio::SimpleAction::new("undo", None);
95101
self.add_action(&action_undo_stroke);
96102
let action_redo_stroke = gio::SimpleAction::new("redo", None);
@@ -340,7 +346,7 @@ impl RnAppWindow {
340346
// display a popup that can unlock the pen tool
341347
appwindow.overlays().dispatch_toast_w_button_singleton(
342348
&gettext("Tool Locked"),
343-
&gettext("Unlock"), //padlock symbol ?
349+
&gettext("Unlock"),
344350
clone!(@weak canvas, @weak appwindow => move |_reload_toast | {
345351
canvas.engine_mut().penholder.pen_mode_state_mut().unlock_pen(active_pen);
346352
appwindow.sidebar().settings_panel().set_lock_state(active_pen,false);
@@ -360,6 +366,32 @@ impl RnAppWindow {
360366
}}),
361367
);
362368

369+
// action to change pen or eraser style (activated from the settings panel)
370+
action_change_pen_styles.connect_activate(
371+
clone!(@weak self as appwindow => move |_action,target| {
372+
let (pen_type_str,tool_str) = target.unwrap().get::<(String,String)>().unwrap();
373+
374+
let pen_mode = match pen_type_str.as_str() {
375+
"pen" => PenMode::Pen,
376+
"eraser" => PenMode::Eraser,
377+
_ => PenMode::Pen
378+
};
379+
380+
let pen_style = match PenStyle::from_str(tool_str.as_str()) {
381+
Ok(s) => s,
382+
Err(e) => {
383+
tracing::error!("Activated pen-style action with invalid target, Err: {e:}");
384+
return;
385+
}
386+
};
387+
let canvas = appwindow.active_tab_wrapper().canvas();
388+
389+
let mut widget_flags = canvas.engine_mut().change_pen_eraser_style(pen_mode,pen_style);
390+
widget_flags |= canvas.engine_mut().change_pen_style_override(None);
391+
appwindow.handle_widget_flags(widget_flags, &canvas);
392+
}),
393+
);
394+
363395
// Tab actions
364396
action_active_tab_move_left.connect_activate(
365397
clone!(@weak self as appwindow => move |_, _| {

crates/rnote-ui/src/settingspanel/mod.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -909,18 +909,24 @@ impl RnSettingsPanel {
909909
let lock_pen = imp.lock_pen_mode.get();
910910
let lock_eraser = imp.lock_eraser_mode.get();
911911

912-
imp.lock_pen_mode.connect_local("action-changed",false, clone!(@weak lock_pen, @weak appwindow => @default-return None, move |_values| {
913-
let action = lock_pen.action();
914-
// BorrowMut with this ...
915-
appwindow.active_tab_wrapper().canvas().engine_mut().penholder.pen_mode_state_mut().set_style_single_mode(PenMode::Pen, action);
916-
None
917-
}));
912+
imp.lock_pen_mode.connect_local(
913+
"action-changed",
914+
false,
915+
clone!(@weak lock_pen, @weak appwindow => @default-return None, move |_values| {
916+
let action = lock_pen.action();
917+
adw::prelude::ActionGroupExt::activate_action(&appwindow, "pen-styles", Some(&("pen",action.to_string()).to_variant()));
918+
None
919+
}),
920+
);
918921

919-
imp.lock_eraser_mode.connect_local("action-changed",false, clone!(@weak lock_pen, @weak appwindow => @default-return None, move |_values| {
920-
let action = lock_eraser.action();
921-
appwindow.active_tab_wrapper().canvas().engine_mut().penholder.pen_mode_state_mut().set_style_single_mode(PenMode::Eraser, action);
922-
None
923-
}));
922+
// imp.lock_eraser_mode.connect_local(
923+
// "action-changed",
924+
// false,
925+
// clone!(@weak lock_eraser, @weak appwindow => @default-return None, move |_values| {
926+
// let action = lock_eraser.action();
927+
// adw::prelude::ActionGroupExt::activate_action(&appwindow, "pen-styles", Some(&("eraser",action.to_string()).to_variant()));
928+
// None
929+
// }));
924930
}
925931

926932
fn revert_format(&self, appwindow: &RnAppWindow) {

0 commit comments

Comments
 (0)