From 34b6c151a26910b95c6aaf7b4f005d82bbdbfef7 Mon Sep 17 00:00:00 2001 From: keschler Date: Wed, 27 Aug 2025 15:43:01 +0200 Subject: [PATCH 1/2] Added text formatting shortcuts for Bold, Italic and Underline --- crates/rnote-ui/data/ui/shortcuts.ui | 18 +++++++ crates/rnote-ui/src/appwindow/actions.rs | 68 ++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/crates/rnote-ui/data/ui/shortcuts.ui b/crates/rnote-ui/data/ui/shortcuts.ui index 2b7e2ac840..8dc05fa7fa 100644 --- a/crates/rnote-ui/data/ui/shortcuts.ui +++ b/crates/rnote-ui/data/ui/shortcuts.ui @@ -213,9 +213,27 @@ Import File + <ctrl><shift>i + + + + + Bold + <ctrl>b + + + + + Italic <ctrl>i + + + Underline + <ctrl>u + + Drawing diff --git a/crates/rnote-ui/src/appwindow/actions.rs b/crates/rnote-ui/src/appwindow/actions.rs index 740ca2245e..b7af19ca95 100644 --- a/crates/rnote-ui/src/appwindow/actions.rs +++ b/crates/rnote-ui/src/appwindow/actions.rs @@ -12,6 +12,7 @@ use rnote_compose::SplitOrder; use rnote_compose::penevent::ShortcutKey; use rnote_engine::engine::StrokeContent; use rnote_engine::ext::GraphenePointExt; +use rnote_engine::strokes::textstroke::TextAttribute; use rnote_engine::strokes::resize::{ImageSizeOption, Resize}; use rnote_engine::{Camera, Engine}; use std::path::PathBuf; @@ -107,6 +108,12 @@ impl RnAppWindow { self.add_action(&action_export_doc_pages); let action_export_selection = gio::SimpleAction::new("export-selection", None); self.add_action(&action_export_selection); + let action_text_bold = gio::SimpleAction::new("text-bold", None); + self.add_action(&action_text_bold); + let action_text_italic = gio::SimpleAction::new("text-italic", None); + self.add_action(&action_text_italic); + let action_text_underline = gio::SimpleAction::new("text-underline", None); + self.add_action(&action_text_underline); let action_clipboard_copy = gio::SimpleAction::new("clipboard-copy", None); self.add_action(&action_clipboard_copy); let action_clipboard_cut = gio::SimpleAction::new("clipboard-cut", None); @@ -463,7 +470,56 @@ impl RnAppWindow { appwindow.handle_widget_flags(widget_flags, &canvas); } )); + // Text Bold + action_text_bold.connect_activate(clone!( + #[weak(rename_to=appwindow)] + self, + move |_, _| { + let Some(canvas) = appwindow.active_tab_canvas() else { + return; + }; + let widget_flags = + canvas + .engine_mut() + .text_selection_toggle_attribute(TextAttribute::FontWeight( + piet::FontWeight::BOLD.to_raw(), + )); + appwindow.handle_widget_flags(widget_flags, &canvas) + } + )); + // Text Italic + action_text_italic.connect_activate(clone!( + #[weak(rename_to=appwindow)] + self, + move |_, _| { + let Some(canvas) = appwindow.active_tab_canvas() else { + return; + }; + let widget_flags = + canvas + .engine_mut() + .text_selection_toggle_attribute(TextAttribute::Style( + rnote_engine::strokes::textstroke::FontStyle::Italic, + )); + appwindow.handle_widget_flags(widget_flags, &canvas); + } + )); + + // Text Underline + action_text_underline.connect_activate(clone!( + #[weak(rename_to=appwindow)] + self, + move |_, _| { + let Some(canvas) = appwindow.active_tab_canvas() else { + return; + }; + let widget_flags = canvas + .engine_mut() + .text_selection_toggle_attribute(TextAttribute::Underline(true)); + appwindow.handle_widget_flags(widget_flags, &canvas); + } + )); // Clear doc action_clear_doc.connect_activate(clone!( #[weak(rename_to=appwindow)] @@ -1006,7 +1062,7 @@ impl RnAppWindow { app.set_accels_for_action("win.save-doc-as", &["s"]); app.set_accels_for_action("win.new-tab", &["t"]); app.set_accels_for_action("win.snap-positions", &["p"]); - app.set_accels_for_action("win.clear-doc", &["l"]); + app.set_accels_for_action("win.clear-doc", &["l"]); app.set_accels_for_action("win.print-doc", &["p"]); app.set_accels_for_action("win.add-page-to-doc", &["a"]); app.set_accels_for_action("win.remove-page-from-doc", &["r"]); @@ -1016,19 +1072,25 @@ impl RnAppWindow { ); app.set_accels_for_action("win.zoom-reset", &["0", "KP_0"]); app.set_accels_for_action("win.zoom-out", &["minus", "KP_Subtract"]); - app.set_accels_for_action("win.import-file", &["i"]); + app.set_accels_for_action("win.import-file", &["i"]); app.set_accels_for_action("win.undo", &["z"]); app.set_accels_for_action("win.redo", &["z"]); app.set_accels_for_action("win.clipboard-copy", &["c"]); app.set_accels_for_action("win.clipboard-cut", &["x"]); app.set_accels_for_action("win.clipboard-paste", &["v"]); + app.set_accels_for_action("win.text-bold", &["b"]); + app.set_accels_for_action("win.text-italic", &["i"]); + app.set_accels_for_action("win.text-underline", &["u"]); + app.set_accels_for_action("win.text-align-start", &["l"]); + app.set_accels_for_action("win.text-align-center", &["e"]); + app.set_accels_for_action("win.text-align-end", &["r"]); + app.set_accels_for_action("win.text-align-fill", &["j"]); app.set_accels_for_action("win.pen-style::brush", &["1", "KP_1"]); app.set_accels_for_action("win.pen-style::shaper", &["2", "KP_2"]); app.set_accels_for_action("win.pen-style::typewriter", &["3", "KP_3"]); app.set_accels_for_action("win.pen-style::eraser", &["4", "KP_4"]); app.set_accels_for_action("win.pen-style::selector", &["5", "KP_5"]); app.set_accels_for_action("win.pen-style::tools", &["6", "KP_6"]); - // shortcuts for devel build if config::PROFILE.to_lowercase().as_str() == "devel" { app.set_accels_for_action("win.visual-debug", &["v"]); From aad1c791a6cfe19eb0c2379891a15c7398b8aa58 Mon Sep 17 00:00:00 2001 From: keschler Date: Mon, 1 Sep 2025 09:18:45 +0200 Subject: [PATCH 2/2] fmt: apply rustfmt --- crates/rnote-ui/src/appwindow/actions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rnote-ui/src/appwindow/actions.rs b/crates/rnote-ui/src/appwindow/actions.rs index b7af19ca95..1cb37d228f 100644 --- a/crates/rnote-ui/src/appwindow/actions.rs +++ b/crates/rnote-ui/src/appwindow/actions.rs @@ -12,8 +12,8 @@ use rnote_compose::SplitOrder; use rnote_compose::penevent::ShortcutKey; use rnote_engine::engine::StrokeContent; use rnote_engine::ext::GraphenePointExt; -use rnote_engine::strokes::textstroke::TextAttribute; use rnote_engine::strokes::resize::{ImageSizeOption, Resize}; +use rnote_engine::strokes::textstroke::TextAttribute; use rnote_engine::{Camera, Engine}; use std::path::PathBuf; use std::time::Instant;