From 8b9d21a8aa40467770847033d0f26903902e6c5d Mon Sep 17 00:00:00 2001 From: teamcons Date: Tue, 31 Mar 2026 14:37:27 +0200 Subject: [PATCH 01/21] bump platform --- io.github.elly_code.jorts.devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io.github.elly_code.jorts.devel.yml b/io.github.elly_code.jorts.devel.yml index 0e784d76..638cd35e 100644 --- a/io.github.elly_code.jorts.devel.yml +++ b/io.github.elly_code.jorts.devel.yml @@ -6,7 +6,7 @@ id: io.github.elly_code.jorts.devel base: io.elementary.BaseApp base-version: 'circe-25.08' runtime: org.gnome.Platform -runtime-version: '49' +runtime-version: '50' sdk: org.gnome.Sdk command: io.github.elly_code.jorts.devel From 8e20154b10e1a7071a6b518f130ddf4915c9115f Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 14:48:19 +0200 Subject: [PATCH 02/21] Reduce verbosity for constants, and add triple-spacing --- src/Application.vala | 2 +- src/Constants.vala | 3 ++- src/Objects/NoteData.vala | 22 +++++++++--------- src/Services/NoteManager.vala | 4 ++-- src/Services/ZoomController.vala | 8 +++---- src/Utils/Random.vala | 2 +- src/Views/PreferencesView.vala | 30 ++++++++++++------------- src/Widgets/ActionBar.vala | 16 ++++++------- src/Widgets/Popover.vala | 8 +++---- src/Widgets/PopoverWidgets/ZoomBox.vala | 26 +++++---------------- src/Widgets/TextView.vala | 12 +++++----- 11 files changed, 59 insertions(+), 74 deletions(-) diff --git a/src/Application.vala b/src/Application.vala index 118cf306..17a4944e 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -108,7 +108,7 @@ public class Jorts.Application : Gtk.Application { var granite_settings = Granite.Settings.get_default (); gtk_settings = Gtk.Settings.get_default (); gtk_settings.gtk_icon_theme_name = "elementary"; - gtk_settings.gtk_theme_name = "io.elementary.stylesheet." + Jorts.Constants.DEFAULT_THEME.to_string ().ascii_down (); + gtk_settings.gtk_theme_name = "io.elementary.stylesheet." + DEFAULT_THEME.to_string ().ascii_down (); // Also follow dark if system is dark lIke mY sOul. gtk_settings.gtk_application_prefer_dark_theme = ( diff --git a/src/Constants.vala b/src/Constants.vala index ddd5418e..35251c2e 100644 --- a/src/Constants.vala +++ b/src/Constants.vala @@ -9,7 +9,7 @@ /** * I just dump all my constants here */ -namespace Jorts.Constants { +namespace Jorts { /*************************************************/ const string DONATE_LINK = "https://ko-fi.com/teamcons/tip"; @@ -40,6 +40,7 @@ namespace Jorts.Constants { const int SPACING_STANDARD = 5; const int SPACING_DOUBLE = 10; + const int SPACING_TRIPLE = 15; // Autocomplete save me const string KEY_SCRIBBLY = "scribbly-mode-active"; diff --git a/src/Objects/NoteData.vala b/src/Objects/NoteData.vala index fd833535..5cbf0a6f 100644 --- a/src/Objects/NoteData.vala +++ b/src/Objects/NoteData.vala @@ -13,9 +13,9 @@ public class Jorts.NoteData : Object { // Will determine properties (or lack thereof) for any new note - public static Jorts.Themes latest_theme = Jorts.Constants.DEFAULT_THEME; - public static int latest_zoom = Jorts.Constants.DEFAULT_ZOOM; - public static bool latest_mono = Jorts.Constants.DEFAULT_MONO; + public static Jorts.Themes latest_theme = DEFAULT_THEME; + public static int latest_zoom = DEFAULT_ZOOM; + public static bool latest_mono = DEFAULT_MONO; public string? title; public Jorts.Themes? theme; @@ -36,8 +36,8 @@ public class Jorts.NoteData : Object { this.content = content ?? ""; this.monospace = monospace ?? latest_mono; this.zoom = zoom ?? latest_zoom; - this.width = width ?? Jorts.Constants.DEFAULT_WIDTH; - this.height = height ?? Jorts.Constants.DEFAULT_HEIGHT; + this.width = width ?? DEFAULT_WIDTH; + this.height = height ?? DEFAULT_HEIGHT; } /*************************************************/ @@ -48,15 +48,15 @@ public class Jorts.NoteData : Object { title = node.get_string_member_with_default ("title", (_("Forgot title!"))); theme = (Jorts.Themes)node.get_int_member_with_default ("color", Jorts.Themes.random_theme ()); content = node.get_string_member_with_default ("content",""); - monospace = node.get_boolean_member_with_default ("monospace", Jorts.Constants.DEFAULT_MONO); - zoom = (int)node.get_int_member_with_default ("zoom", Jorts.Constants.DEFAULT_ZOOM); + monospace = node.get_boolean_member_with_default ("monospace", DEFAULT_MONO); + zoom = (int)node.get_int_member_with_default ("zoom", DEFAULT_ZOOM); // Make sure the values are nothing crazy - if (zoom < Jorts.Constants.ZOOM_MIN) { zoom = Jorts.Constants.ZOOM_MIN;} - else if (zoom > Jorts.Constants.ZOOM_MAX) { zoom = Jorts.Constants.ZOOM_MAX;} + if (zoom < ZOOM_MIN) { zoom = ZOOM_MIN;} + else if (zoom > ZOOM_MAX) { zoom = ZOOM_MAX;} - width = (int)node.get_int_member_with_default ("width", Jorts.Constants.DEFAULT_WIDTH); - height = (int)node.get_int_member_with_default ("height", Jorts.Constants.DEFAULT_HEIGHT); + width = (int)node.get_int_member_with_default ("width", DEFAULT_WIDTH); + height = (int)node.get_int_member_with_default ("height", DEFAULT_HEIGHT); } /*************************************************/ diff --git a/src/Services/NoteManager.vala b/src/Services/NoteManager.vala index 2b0eda4b..6aa5cb15 100644 --- a/src/Services/NoteManager.vala +++ b/src/Services/NoteManager.vala @@ -40,7 +40,7 @@ public class Jorts.NoteManager : Object { if (loaded_data.get_length () == 0) { var note_data = new NoteData (); - note_data.theme = Constants.DEFAULT_THEME; + note_data.theme = DEFAULT_THEME; create_note (note_data); } else { @@ -117,7 +117,7 @@ public class Jorts.NoteManager : Object { GLib.Source.remove (debounce_timer_id); } - debounce_timer_id = Timeout.add (Jorts.Constants.DEBOUNCE, debounce_handler); + debounce_timer_id = Timeout.add (DEBOUNCE, debounce_handler); } public bool debounce_handler () { diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index f125a03b..898e2a08 100644 --- a/src/Services/ZoomController.vala +++ b/src/Services/ZoomController.vala @@ -44,7 +44,7 @@ public class Jorts.ZoomController : Object { * Wrapper to check an increase doesnt go above limit */ public void zoom_in () { - if ((_old_zoom + 20) <= Jorts.Constants.ZOOM_MAX) { + if ((_old_zoom + 20) <= ZOOM_MAX) { zoom = _old_zoom + 20; } else { Gdk.Display.get_default ().beep (); @@ -52,8 +52,8 @@ public class Jorts.ZoomController : Object { } public void zoom_default () { - if (_old_zoom != Jorts.Constants.DEFAULT_ZOOM ) { - zoom = Jorts.Constants.DEFAULT_ZOOM; + if (_old_zoom != DEFAULT_ZOOM ) { + zoom = DEFAULT_ZOOM; } else { Gdk.Display.get_default ().beep (); } @@ -63,7 +63,7 @@ public class Jorts.ZoomController : Object { * Wrapper to check an increase doesnt go below limit */ public void zoom_out () { - if ((_old_zoom - 20) >= Jorts.Constants.ZOOM_MIN) { + if ((_old_zoom - 20) >= ZOOM_MIN) { zoom = _old_zoom - 20; } else { Gdk.Display.get_default ().beep (); diff --git a/src/Utils/Random.vala b/src/Utils/Random.vala index 5518c68d..062a55ec 100644 --- a/src/Utils/Random.vala +++ b/src/Utils/Random.vala @@ -86,7 +86,7 @@ namespace Jorts.Utils { */ public string random_emote (string? skip_emote = null) { Gee.ArrayList allemotes = new Gee.ArrayList (); - allemotes.add_all_array (Jorts.Constants.EMOTES); + allemotes.add_all_array (EMOTES); if (skip_emote != null) { allemotes.remove (skip_emote); diff --git a/src/Views/PreferencesView.vala b/src/Views/PreferencesView.vala index 9418ab9e..f68b24b4 100644 --- a/src/Views/PreferencesView.vala +++ b/src/Views/PreferencesView.vala @@ -13,10 +13,10 @@ construct { orientation = VERTICAL; spacing = 0; - margin_top = Constants.SPACING_DOUBLE; - margin_bottom = Constants.SPACING_DOUBLE; - margin_start = Constants.SPACING_DOUBLE; - margin_end = Constants.SPACING_DOUBLE; + margin_top = SPACING_DOUBLE; + margin_bottom = SPACING_DOUBLE; + margin_start = SPACING_DOUBLE; + margin_end = SPACING_DOUBLE; var overlay = new Gtk.Overlay (); append (overlay); @@ -26,14 +26,14 @@ // the box with all the settings #if FLATHUB - var settings_spacing = Constants.SPACING_STANDARD; + var settings_spacing = SPACING_STANDARD; #else - var settings_spacing = Constants.SPACING_STANDARD + Constants.SPACING_DOUBLE; + var settings_spacing = SPACING_STANDARD + SPACING_DOUBLE; #endif var settingsbox = new Gtk.Box (VERTICAL, settings_spacing) { - margin_top = Constants.SPACING_STANDARD, - margin_start = Constants.SPACING_STANDARD, - margin_end = Constants.SPACING_STANDARD, + margin_top = SPACING_STANDARD, + margin_start = SPACING_STANDARD, + margin_end = SPACING_STANDARD, hexpand = true, vexpand = true, valign = Gtk.Align.START @@ -63,7 +63,7 @@ lists_box.append (list_label); lists_box.append (list_entry); - Application.gsettings.bind (Constants.KEY_LIST, + Application.gsettings.bind (KEY_LIST, list_entry, "text", SettingsBindFlags.DEFAULT); @@ -80,7 +80,7 @@ var scribbly_box = new Jorts.SettingsSwitch ( _("Scribble mode"), _("Scribble text of unfocused notes (Ctrl+H)"), - Constants.KEY_SCRIBBLY); + KEY_SCRIBBLY); settingsbox.append (scribbly_box); @@ -93,7 +93,7 @@ ///TRANSLATORS: Instead of bottom bar you can also use "Action bar" or "button bar" _("Hide bottom bar"), _("Keyboard shortcuts will still function (Ctrl+T)"), - Constants.KEY_HIDEBAR); + KEY_HIDEBAR); settingsbox.append (hidebar_box); @@ -146,8 +146,8 @@ /*************************************************/ // Bar at the bottom var actionbar = new Gtk.CenterBox () { - margin_start = Constants.SPACING_STANDARD, - margin_end = Constants.SPACING_STANDARD, + margin_start = SPACING_STANDARD, + margin_end = SPACING_STANDARD, valign = Gtk.Align.END, hexpand = true, vexpand = false @@ -155,7 +155,7 @@ // Monies? var support_button = new Gtk.LinkButton.with_label ( - Jorts.Constants.DONATE_LINK, + DONATE_LINK, _("Support us!") ); actionbar.start_widget = support_button; diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index 7d92e2b1..bce6f911 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -31,7 +31,7 @@ ) }; new_item.action_name = Application.ACTION_PREFIX + Application.ACTION_NEW; - new_item.add_css_class (Constants.STYLE_THEMEDBUTTON); + new_item.add_css_class (STYLE_THEMEDBUTTON); var delete_item = new Gtk.Button () { icon_name = "edit-delete-symbolic", @@ -42,7 +42,7 @@ _("Delete sticky note") ) }; - delete_item.add_css_class (Constants.STYLE_THEMEDBUTTON); + delete_item.add_css_class (STYLE_THEMEDBUTTON); delete_item.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE; /* **** RIGHT **** */ @@ -55,7 +55,7 @@ _("Toggle list") ) }; - list_button.add_css_class (Constants.STYLE_THEMEDBUTTON); + list_button.add_css_class (STYLE_THEMEDBUTTON); list_button.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_LIST; emojichooser_popover = new Gtk.EmojiChooser (); @@ -69,7 +69,7 @@ _("Insert emoji") ) }; - emoji_button.add_css_class (Constants.STYLE_THEMEDBUTTON); + emoji_button.add_css_class (STYLE_THEMEDBUTTON); emoji_button.popover = emojichooser_popover; menu_button = new Gtk.MenuButton () { @@ -82,7 +82,7 @@ ) }; menu_button.direction = Gtk.ArrowType.UP; - menu_button.add_css_class (Constants.STYLE_THEMEDBUTTON); + menu_button.add_css_class (STYLE_THEMEDBUTTON); /* **** Widget **** */ actionbar = new Gtk.ActionBar () { @@ -106,7 +106,7 @@ // Hide the list button if user has specified no list item symbol on_prefix_changed (); - Application.gsettings.changed[Constants.KEY_LIST].connect (on_prefix_changed); + Application.gsettings.changed[KEY_LIST].connect (on_prefix_changed); } @@ -115,7 +115,7 @@ * StickyNoteWindow will decide itself whether to show immediately or not */ public void reveal_bind () { - Application.gsettings.bind (Constants.KEY_HIDEBAR, + Application.gsettings.bind (KEY_HIDEBAR, this.actionbar, "revealed", SettingsBindFlags.INVERT_BOOLEAN); } @@ -132,6 +132,6 @@ } private void on_prefix_changed () { - list_button.visible = (Application.gsettings.get_string (Constants.KEY_LIST) != ""); + list_button.visible = (Application.gsettings.get_string (KEY_LIST) != ""); } } diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index e158a3a9..ce7529f9 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -53,9 +53,9 @@ public class Jorts.Popover : Gtk.Popover { halign = Gtk.Align.END; parent_window = window; - var view = new Gtk.Box (VERTICAL, 12) { - margin_top = 12, - margin_bottom = 12 + var view = new Gtk.Box (VERTICAL, SPACING_TRIPLE) { + margin_top = SPACING_TRIPLE, + margin_bottom = SPACING_TRIPLE }; color_box = new Jorts.ColorBox (); @@ -71,7 +71,7 @@ public class Jorts.Popover : Gtk.Popover { // Propagate settings changes to the higher level color_box.theme_changed.connect ((theme) => {theme_changed (theme);}); monospace_box.monospace_changed.connect (on_monospace_changed); - font_size_box.zoom_changed.connect ((zoomtype) => {zoom_changed (zoomtype);}); + //font_size_box.zoom_changed.connect ((zoomtype) => {zoom_changed (zoomtype);}); // Allow scrolling shenanigans from popover var keypress_controller = new Gtk.EventControllerKey (); diff --git a/src/Widgets/PopoverWidgets/ZoomBox.vala b/src/Widgets/PopoverWidgets/ZoomBox.vala index 33b01d2c..ab2aa261 100644 --- a/src/Widgets/PopoverWidgets/ZoomBox.vala +++ b/src/Widgets/PopoverWidgets/ZoomBox.vala @@ -26,17 +26,16 @@ public class Jorts.ZoomBox : Gtk.Box { } } - public signal void zoom_changed (Jorts.ZoomType zoomtype); - construct { orientation = Gtk.Orientation.HORIZONTAL; homogeneous = true; hexpand = true; - margin_start = 10; - margin_end = 10; + margin_start = SPACING_DOUBLE; + margin_end = SPACING_DOUBLE; ///TRANSLATORS: These are displayed on small linked buttons in a menu. User can click them to change zoom var zoom_out_button = new Gtk.Button.from_icon_name ("zoom-out-symbolic") { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_OUT, tooltip_markup = Granite.markup_accel_tooltip ( {"minus", "KP_Subtract"}, _("Zoom out") @@ -44,6 +43,7 @@ public class Jorts.ZoomBox : Gtk.Box { }; zoom_default_button = new Gtk.Button () { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_DEFAULT, tooltip_markup = Granite.markup_accel_tooltip ( { "equal", "0", "KP_0" }, _("Default zoom level") @@ -51,6 +51,7 @@ public class Jorts.ZoomBox : Gtk.Box { }; var zoom_in_button = new Gtk.Button.from_icon_name ("zoom-in-symbolic") { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_IN, tooltip_markup = Granite.markup_accel_tooltip ( {"plus", "KP_Add"}, _("Zoom in") @@ -61,22 +62,5 @@ public class Jorts.ZoomBox : Gtk.Box { append (zoom_default_button); append (zoom_in_button); add_css_class (Granite.STYLE_CLASS_LINKED); - - // Emit a signal when a button is toggled that will be picked by StickyNoteWindow - zoom_out_button.clicked.connect (zoom_out); - zoom_default_button.clicked.connect (zoom_default); - zoom_in_button.clicked.connect (zoom_in); - } - - private void zoom_out () { - zoom_changed (ZoomType.ZOOM_OUT); - } - - private void zoom_default () { - zoom_changed (ZoomType.DEFAULT_ZOOM); - } - - private void zoom_in () { - zoom_changed (ZoomType.ZOOM_IN); } } diff --git a/src/Widgets/TextView.vala b/src/Widgets/TextView.vala index 63c0eae0..6f8da058 100644 --- a/src/Widgets/TextView.vala +++ b/src/Widgets/TextView.vala @@ -29,10 +29,10 @@ public class Jorts.TextView : Granite.HyperTextView { construct { buffer = new Gtk.TextBuffer (null); - bottom_margin = Constants.SPACING_DOUBLE; - left_margin = Constants.SPACING_DOUBLE; - right_margin = Constants.SPACING_DOUBLE; - top_margin = Constants.SPACING_STANDARD; + bottom_margin = SPACING_DOUBLE; + left_margin = SPACING_DOUBLE; + right_margin = SPACING_DOUBLE; + top_margin = SPACING_STANDARD; hexpand = true; vexpand = true; @@ -42,8 +42,8 @@ public class Jorts.TextView : Granite.HyperTextView { actions.add_action_entries (ACTION_ENTRIES, this); insert_action_group ("textview", actions); - list_item_start = Application.gsettings.get_string (Constants.KEY_LIST); - Application.gsettings.changed[Constants.KEY_LIST].connect (on_prefix_changed); + list_item_start = Application.gsettings.get_string (KEY_LIST); + Application.gsettings.changed[KEY_LIST].connect (on_prefix_changed); keyboard = new Gtk.EventControllerKey (); add_controller (keyboard); From 0dfa27ab7f4ee8c0e534297ffbdc03c090878129 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 15:07:50 +0200 Subject: [PATCH 03/21] move accels to window again --- src/Application.vala | 14 -------------- src/Services/ZoomController.vala | 2 +- src/Windows/StickyNoteWindow.vala | 15 +++++++++++---- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/Application.vala b/src/Application.vala index 17a4944e..4d679a05 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -90,20 +90,6 @@ public class Jorts.Application : Gtk.Application { set_accels_for_action ("app.action_show_preferences", {"P"}); set_accels_for_action ("app.action_toggle_scribbly", {"H"}); - set_accels_for_action ("win.action_delete", {"W"}); - set_accels_for_action ("win.action_zoom_out", {"minus", "KP_Subtract"}); - set_accels_for_action ("win.action_zoom_default", {"equal", "0", "KP_0"}); - set_accels_for_action ("win.action_zoom_in", {"plus", "KP_Add"}); - set_accels_for_action ("win.action_toggle_mono", {"m"}); - set_accels_for_action ("win.action_focus_title", {"L"}); - set_accels_for_action ("win.action_show_emoji", {"period"}); - set_accels_for_action ("win.action_toggle_list", {"F12"}); - set_accels_for_action ("win.action_show_menu", {"G", "O"}); - - set_accels_for_action ("textview.action_toggle_list", {"F12"}); - - - // Force the eOS icon theme, and set the blueberry as fallback, if for some reason it fails for individual notes var granite_settings = Granite.Settings.get_default (); gtk_settings = Gtk.Settings.get_default (); diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index 898e2a08..632052d8 100644 --- a/src/Services/ZoomController.vala +++ b/src/Services/ZoomController.vala @@ -14,7 +14,7 @@ public class Jorts.ZoomController : Object { private static bool is_control_key_pressed = false; - private weak Jorts.StickyNoteWindow window; + private weak Jorts.StickyNoteWindow window {get; set;} // Avoid setting this unless it is to restore a specific value, do_set_zoom does not check input private int _old_zoom; diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index b1c3faa7..e8eda04b 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -66,6 +66,16 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { actions.add_action_entries (ACTION_ENTRIES, this); insert_action_group ("win", actions); + app.set_accels_for_action (ACTION_PREFIX + ACTION_DELETE, {"W"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_OUT, {"minus", "KP_Subtract"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_DEFAULT, {"equal", "0", "KP_0"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_IN, {"plus", "KP_Add"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_MONO, {"m"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_FOCUS_TITLE, {"L"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_EMOJI, {"period"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_MENU, {"G", "O"}); + color_controller = new Jorts.ColorController (this); zoom_controller = new Jorts.ZoomController (this); scribbly_controller = new Jorts.ScribblyController (this); @@ -82,9 +92,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { title = "" + _(" - Jorts"); - - - /*****************************************/ /* HEADERBAR */ /*****************************************/ @@ -126,7 +133,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { // Save when title or text have changed view.editablelabel.changed.connect (on_editable_changed); view.textview.buffer.changed.connect (has_changed); - popover.zoom_changed.connect (zoom_controller.zoom_changed); + popover.theme_changed.connect (color_controller.on_color_changed); // Use the color theme of this sticky note when focused From 368124044c95cf81b22866142873d434769ccecd Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 15:13:41 +0200 Subject: [PATCH 04/21] use actions for monospacebox --- src/Widgets/Popover.vala | 4 +--- src/Widgets/PopoverWidgets/MonospaceBox.vala | 16 +++++----------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index ce7529f9..e37f59de 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -28,8 +28,6 @@ public class Jorts.Popover : Gtk.Popover { public int zoom { set {font_size_box.zoom = value;}} public signal void theme_changed (Jorts.Themes selected); - public signal void zoom_changed (Jorts.ZoomType zoomtype); - public signal void monospace_changed (bool if_monospace); static construct { @@ -70,7 +68,7 @@ public class Jorts.Popover : Gtk.Popover { // Propagate settings changes to the higher level color_box.theme_changed.connect ((theme) => {theme_changed (theme);}); - monospace_box.monospace_changed.connect (on_monospace_changed); + //monospace_box.monospace_changed.connect (on_monospace_changed); //font_size_box.zoom_changed.connect ((zoomtype) => {zoom_changed (zoomtype);}); // Allow scrolling shenanigans from popover diff --git a/src/Widgets/PopoverWidgets/MonospaceBox.vala b/src/Widgets/PopoverWidgets/MonospaceBox.vala index 90735ae2..b9417796 100644 --- a/src/Widgets/PopoverWidgets/MonospaceBox.vala +++ b/src/Widgets/PopoverWidgets/MonospaceBox.vala @@ -19,17 +19,16 @@ public class Jorts.MonospaceBox : Gtk.Box { set { mono_monospace_toggle.active = value;} } - public signal void monospace_changed (bool monospace); - construct { orientation = Gtk.Orientation.HORIZONTAL; homogeneous = true; hexpand = true; - margin_start = 10; - margin_end = 10; + margin_start = SPACING_DOUBLE; + margin_end = SPACING_DOUBLE; ///TRANSLATORS: Both Default and Monospace are togglable buttons, synchronized with each other var mono_default_toggle = new Gtk.ToggleButton () { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_MONO, child = new Gtk.Label (_("Default")), tooltip_markup = Granite.markup_accel_tooltip ( {"m"}, @@ -39,8 +38,9 @@ public class Jorts.MonospaceBox : Gtk.Box { }; mono_monospace_toggle = new Gtk.ToggleButton () { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_MONO, child = new Gtk.Label (_("Monospace")), - tooltip_markup = Granite.markup_accel_tooltip ( + tooltip_markup = Granite.markup_accel_tooltip ( {"m"}, _("Use monospaced font") ) @@ -57,11 +57,5 @@ public class Jorts.MonospaceBox : Gtk.Box { "active", GLib.BindingFlags.BIDIRECTIONAL | GLib.BindingFlags.INVERT_BOOLEAN ); - - mono_monospace_toggle.notify["active"].connect (on_monospace_changed); - } - - public void on_monospace_changed () { - monospace_changed (mono_monospace_toggle.active); } } From 2ec8429f4277c63896f47e9199a46c772095a236 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 16:04:07 +0200 Subject: [PATCH 05/21] delegate more into the actual view object via actions --- src/Views/NoteView.vala | 46 +++++++++++++++++--- src/Widgets/ActionBar.vala | 2 +- src/Widgets/Popover.vala | 30 ++++++------- src/Widgets/PopoverWidgets/MonospaceBox.vala | 4 +- src/Windows/StickyNoteWindow.vala | 36 +++++---------- 5 files changed, 68 insertions(+), 50 deletions(-) diff --git a/src/Views/NoteView.vala b/src/Views/NoteView.vala index 60cff3f1..f8bbbb22 100644 --- a/src/Views/NoteView.vala +++ b/src/Views/NoteView.vala @@ -10,6 +10,7 @@ public Jorts.EditableLabel editablelabel; public Jorts.TextView textview; public Jorts.ActionBar actionbar; + public Jorts.Popover popover; public Gtk.MenuButton emoji_button; public Gtk.EmojiChooser emojichooser_popover; @@ -32,7 +33,37 @@ set { textview.text = value;} } + public SimpleActionGroup actions { get; construct; } + public const string ACTION_PREFIX = "noteview."; + public const string ACTION_FOCUS_TITLE = "action_focus_title"; + public const string ACTION_SHOW_EMOJI = "action_show_emoji"; + public const string ACTION_SHOW_MENU = "action_show_menu"; + public const string ACTION_TOGGLE_MONO = "action_toggle_mono"; + public const string ACTION_TOGGLE_LIST = "action_toggle_list"; + + public static Gee.MultiMap action_accelerators; + + private const GLib.ActionEntry[] ACTION_ENTRIES = { + { ACTION_FOCUS_TITLE, action_focus_title}, + { ACTION_SHOW_EMOJI, action_show_emoji}, + { ACTION_SHOW_MENU, action_show_menu}, + { ACTION_TOGGLE_MONO, action_toggle_mono}, + { ACTION_TOGGLE_LIST, action_toggle_list}, + }; + construct { + actions = new SimpleActionGroup (); + actions.add_action_entries (ACTION_ENTRIES, this); + + // Translation view + unowned var app = ((Gtk.Application) GLib.Application.get_default ()); + app.set_accels_for_action (ACTION_PREFIX + ACTION_FOCUS_TITLE, {"L"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_EMOJI, {"period"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_MENU, {"G", "O"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_MONO, {"m"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); + + orientation = VERTICAL; spacing = 0; @@ -55,6 +86,9 @@ emoji_button = actionbar.emoji_button; emojichooser_popover = actionbar.emojichooser_popover; menu_button = actionbar.menu_button; + popover = new Jorts.Popover (); + + menu_button.popover = popover; append (headerbar); append (scrolled); @@ -81,16 +115,18 @@ private void on_emoji_picked (string emoji) { debug ("Emote picked!"); textview.buffer.insert_at_cursor (emoji, -1); - textview.grab_focus (); + set_focus_child (textview); } private void mono_set (bool if_mono) { editablelabel.monospace = if_mono; textview.monospace = if_mono; + popover.monospace = if_mono; } - public void action_focus_title () {editablelabel.editing = true;} - public void action_show_emoji () {emoji_button.activate ();} - public void action_show_menu () {menu_button.activate ();} - public void action_toggle_list () {textview.toggle_list ();} + private void action_focus_title () {editablelabel.editing = true;} + private void action_show_emoji () {emoji_button.activate ();} + private void action_show_menu () {menu_button.activate ();} + private void action_toggle_list () {textview.toggle_list ();} + private void action_toggle_mono () {monospace = !monospace;} } diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index bce6f911..0b0abf5d 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -56,7 +56,7 @@ ) }; list_button.add_css_class (STYLE_THEMEDBUTTON); - list_button.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_LIST; + list_button.action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_LIST; emojichooser_popover = new Gtk.EmojiChooser (); diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index e37f59de..426ce622 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -10,7 +10,10 @@ * Contains a setting for color, one for monospace font, one for zoom */ public class Jorts.Popover : Gtk.Popover { - private weak Jorts.StickyNoteWindow parent_window; + + public Gtk.EventControllerKey keypress_controller; + public Gtk.EventControllerScroll scroll_controller; + private Jorts.ColorBox color_box; private Jorts.MonospaceBox monospace_box; private Jorts.ZoomBox font_size_box; @@ -36,20 +39,19 @@ public class Jorts.Popover : Gtk.Popover { add_binding_action(48, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_DEFAULT, null); add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_OUT, null); - add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, Application.ACTION_PREFIX + Application.ACTION_NEW, null); - add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); - add_binding_action(Gdk.Key.m, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_MONO, null); - add_binding_action(Gdk.Key.g, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_SHOW_MENU, null); - add_binding_action(Gdk.Key.o, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_SHOW_MENU, null); - add_binding_action(Gdk.Key.l, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_FOCUS_TITLE, null); + add_binding_action(Gdk.Key.n, Gdk.ModifierType.CONTROL_MASK, Application.ACTION_PREFIX + Application.ACTION_NEW, null); + add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); + add_binding_action(Gdk.Key.m, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_MONO, null); + add_binding_action(Gdk.Key.g, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_SHOW_MENU, null); + add_binding_action(Gdk.Key.o, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_SHOW_MENU, null); + add_binding_action(Gdk.Key.l, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_FOCUS_TITLE, null); } /****************/ - public Popover (Jorts.StickyNoteWindow window) { + construct { position = Gtk.PositionType.TOP; halign = Gtk.Align.END; - parent_window = window; var view = new Gtk.Box (VERTICAL, SPACING_TRIPLE) { margin_top = SPACING_TRIPLE, @@ -72,16 +74,13 @@ public class Jorts.Popover : Gtk.Popover { //font_size_box.zoom_changed.connect ((zoomtype) => {zoom_changed (zoomtype);}); // Allow scrolling shenanigans from popover - var keypress_controller = new Gtk.EventControllerKey (); - var scroll_controller = new Gtk.EventControllerScroll (VERTICAL) { + keypress_controller = new Gtk.EventControllerKey (); + scroll_controller = new Gtk.EventControllerScroll (VERTICAL) { propagation_phase = Gtk.PropagationPhase.CAPTURE }; ((Gtk.Widget)this).add_controller (keypress_controller); ((Gtk.Widget)this).add_controller (scroll_controller); - scroll_controller.scroll.connect (window.zoom_controller.on_scroll); - keypress_controller.key_pressed.connect (window.zoom_controller.on_key_press_event); - keypress_controller.key_released.connect (window.zoom_controller.on_key_release_event); } /** @@ -90,10 +89,7 @@ public class Jorts.Popover : Gtk.Popover { private void on_monospace_changed (bool monospace) { debug ("Updating monospace to %s".printf (monospace.to_string ())); - parent_window.view.monospace = monospace; monospace_box.monospace = monospace; Jorts.NoteData.latest_mono = monospace; - - parent_window.changed (); } } diff --git a/src/Widgets/PopoverWidgets/MonospaceBox.vala b/src/Widgets/PopoverWidgets/MonospaceBox.vala index b9417796..cf6da7da 100644 --- a/src/Widgets/PopoverWidgets/MonospaceBox.vala +++ b/src/Widgets/PopoverWidgets/MonospaceBox.vala @@ -28,7 +28,7 @@ public class Jorts.MonospaceBox : Gtk.Box { ///TRANSLATORS: Both Default and Monospace are togglable buttons, synchronized with each other var mono_default_toggle = new Gtk.ToggleButton () { - action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_MONO, + action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_MONO, child = new Gtk.Label (_("Default")), tooltip_markup = Granite.markup_accel_tooltip ( {"m"}, @@ -38,7 +38,7 @@ public class Jorts.MonospaceBox : Gtk.Box { }; mono_monospace_toggle = new Gtk.ToggleButton () { - action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_MONO, + action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_MONO, child = new Gtk.Label (_("Monospace")), tooltip_markup = Granite.markup_accel_tooltip ( {"m"}, diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index e8eda04b..65080c02 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -33,28 +33,18 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { private Gtk.EventControllerScroll scroll_controller; public const string ACTION_PREFIX = "win."; - public const string ACTION_SHOW_EMOJI = "action_show_emoji"; - public const string ACTION_SHOW_MENU = "action_show_menu"; - public const string ACTION_FOCUS_TITLE = "action_focus_title"; + public const string ACTION_DELETE = "action_delete"; public const string ACTION_ZOOM_OUT = "action_zoom_out"; public const string ACTION_ZOOM_DEFAULT = "action_zoom_default"; public const string ACTION_ZOOM_IN = "action_zoom_in"; - public const string ACTION_TOGGLE_MONO = "action_toggle_mono"; - public const string ACTION_DELETE = "action_delete"; - public const string ACTION_TOGGLE_LIST = "action_toggle_list"; public static Gee.MultiMap action_accelerators; private const GLib.ActionEntry[] ACTION_ENTRIES = { { ACTION_DELETE, action_delete}, - { ACTION_SHOW_EMOJI, action_show_emoji}, - { ACTION_SHOW_MENU, action_show_menu}, - { ACTION_FOCUS_TITLE, action_focus_title}, { ACTION_ZOOM_OUT, action_zoom_out}, { ACTION_ZOOM_DEFAULT, action_zoom_default}, { ACTION_ZOOM_IN, action_zoom_in}, - { ACTION_TOGGLE_MONO, action_toggle_mono}, - { ACTION_TOGGLE_LIST, action_toggle_list}, }; public StickyNoteWindow (Jorts.Application app, NoteData data) { @@ -70,11 +60,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_OUT, {"minus", "KP_Subtract"}); app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_DEFAULT, {"equal", "0", "KP_0"}); app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_IN, {"plus", "KP_Add"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_MONO, {"m"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_FOCUS_TITLE, {"L"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_EMOJI, {"period"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_MENU, {"G", "O"}); + color_controller = new Jorts.ColorController (this); zoom_controller = new Jorts.ZoomController (this); @@ -88,7 +74,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { ((Gtk.Widget)this).add_controller (keypress_controller); ((Gtk.Widget)this).add_controller (scroll_controller); - add_css_class ("rounded"); title = "" + _(" - Jorts"); @@ -102,8 +87,15 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { view = new NoteView (); textview = view.textview; - popover = new Jorts.Popover (this); - view.menu_button.popover = popover; + insert_action_group ("noteview", view.actions); + + + + popover = view.popover; + view.popover.scroll_controller.scroll.connect (zoom_controller.on_scroll); + view.popover.keypress_controller.key_pressed.connect (zoom_controller.on_key_press_event); + view.popover.keypress_controller.key_released.connect (zoom_controller.on_key_release_event); + set_child (view); set_focus (view); @@ -224,13 +216,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { private void has_changed () {changed ();} - private void action_focus_title () {view.action_focus_title ();} - private void action_show_emoji () {view.action_show_emoji ();} - private void action_show_menu () {view.action_show_menu ();} private void action_delete () {((Jorts.Application)this.application).manager.delete_note (this); this.destroy ();} - private void action_toggle_mono () {popover.monospace = !popover.monospace;} - private void action_toggle_list () {view.action_toggle_list ();} - private void action_zoom_out () {zoom_controller.zoom_out ();} private void action_zoom_default () {zoom_controller.zoom_default ();} private void action_zoom_in () {zoom_controller.zoom_in ();} From 0acbec9101eee3049b140b474af7cf7c03490be3 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 16:14:38 +0200 Subject: [PATCH 06/21] some more touchups --- src/Views/NoteView.vala | 17 +++++++---- src/Windows/StickyNoteWindow.vala | 50 ++++++++++--------------------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/Views/NoteView.vala b/src/Views/NoteView.vala index f8bbbb22..e9e62f97 100644 --- a/src/Views/NoteView.vala +++ b/src/Views/NoteView.vala @@ -18,11 +18,6 @@ public Gtk.ScrolledWindow scrolled; - public bool monospace { - get { return textview.monospace;} - set { mono_set (value);} - } - public string title { owned get { return editablelabel.text;} set { editablelabel.text = value;} @@ -33,6 +28,18 @@ set { textview.text = value;} } + public bool monospace { + get { return textview.monospace;} + set { mono_set (value);} + } + + public Themes color { + get { return popover.color;} + set { popover.color = value;} + } + + public signal void changed (); + public SimpleActionGroup actions { get; construct; } public const string ACTION_PREFIX = "noteview."; public const string ACTION_FOCUS_TITLE = "action_focus_title"; diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index 65080c02..cfd9fb2c 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -14,6 +14,7 @@ * Reports to the NoteManager for saving */ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { + public Jorts.NoteView view; public Popover popover; public TextView textview; @@ -21,17 +22,15 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { private Jorts.ColorController color_controller; public Jorts.ZoomController zoom_controller; private Jorts.ScribblyController scribbly_controller; + private Gtk.EventControllerKey keypress_controller; + private Gtk.EventControllerScroll scroll_controller; public NoteData data { - owned get { return packaged ();} - set { load_data (value);} + owned get {return packaged ();} + set {load_data (value);} } public signal void changed (); - - private Gtk.EventControllerKey keypress_controller; - private Gtk.EventControllerScroll scroll_controller; - public const string ACTION_PREFIX = "win."; public const string ACTION_DELETE = "action_delete"; public const string ACTION_ZOOM_OUT = "action_zoom_out"; @@ -76,34 +75,21 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { title = "" + _(" - Jorts"); - - /*****************************************/ - /* HEADERBAR */ - /*****************************************/ - - // No + // The view has its own titlebar titlebar = new Gtk.Grid () {visible = false}; view = new NoteView (); textview = view.textview; - insert_action_group ("noteview", view.actions); - - + // Have shortcuts keep working with the popover open. popover = view.popover; view.popover.scroll_controller.scroll.connect (zoom_controller.on_scroll); view.popover.keypress_controller.key_pressed.connect (zoom_controller.on_key_press_event); view.popover.keypress_controller.key_released.connect (zoom_controller.on_key_release_event); - set_child (view); set_focus (view); - - /****************************************/ - /* LOADING */ - /****************************************/ - load_data (data); #if DEVEL @@ -133,16 +119,13 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { // Respect animation settings for showing ui elements if (Application.gtk_settings.gtk_enable_animations && (!Application.gsettings.get_boolean ("hide-bar"))) { - show.connect_after (delayed_show); + show.connect_after (delayed_show); } else { bind_hidebar (); } - - } - /********************************************/ /* METHODS */ /********************************************/ @@ -157,11 +140,11 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { } private void bind_hidebar () { - Application.gsettings.bind ( - "hide-bar", - view.actionbar.actionbar, - "revealed", - SettingsBindFlags.INVERT_BOOLEAN); + Application.gsettings.bind ( + "hide-bar", + view.actionbar.actionbar, + "revealed", + SettingsBindFlags.INVERT_BOOLEAN); } /** @@ -205,9 +188,9 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { debug ("Loading noteData…"); set_default_size (data.width, data.height); - view.editablelabel.text = data.title; - title = view.editablelabel.text + _(" - Jorts"); - view.textview.buffer.text = data.content; + view.title = data.title; + title = view.title + _(" - Jorts"); + view.content = data.content; color_controller.theme = data.theme; zoom_controller.zoom = data.zoom; @@ -215,7 +198,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { } private void has_changed () {changed ();} - private void action_delete () {((Jorts.Application)this.application).manager.delete_note (this); this.destroy ();} private void action_zoom_out () {zoom_controller.zoom_out ();} private void action_zoom_default () {zoom_controller.zoom_default ();} From 40bb2f4b76488f894097825c6f3e4b8cee2a762c Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 20:06:28 +0200 Subject: [PATCH 07/21] touchups --- src/Views/NoteView.vala | 13 ++++++---- src/Widgets/ActionBar.vala | 40 +++++++++++++++++-------------- src/Widgets/Popover.vala | 9 +++---- src/Windows/StickyNoteWindow.vala | 3 +-- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/Views/NoteView.vala b/src/Views/NoteView.vala index e9e62f97..b33d8180 100644 --- a/src/Views/NoteView.vala +++ b/src/Views/NoteView.vala @@ -71,6 +71,8 @@ app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); + + orientation = VERTICAL; spacing = 0; @@ -90,17 +92,17 @@ }; actionbar = new Jorts.ActionBar (); + emoji_button = actionbar.emoji_button; emojichooser_popover = actionbar.emojichooser_popover; - menu_button = actionbar.menu_button; - popover = new Jorts.Popover (); - menu_button.popover = popover; + menu_button = actionbar.menu_button; + popover = (Jorts.Popover)menu_button.popover; append (headerbar); append (scrolled); append (actionbar); - //set_focus_child (textview); + /***************************************************/ /* CONNECTS AND BINDS */ @@ -108,8 +110,8 @@ emojichooser_popover.show.connect (randomize_emote_button); emojichooser_popover.emoji_picked.connect (on_emoji_picked); - //Application.gsettings.bind ("hide-bar", actionbar, "revealed", SettingsBindFlags.INVERT_BOOLEAN); + //Application.gsettings.bind ("hide-bar", actionbar, "revealed", SettingsBindFlags.INVERT_BOOLEAN); //textview.bind_property ("on_list_item", actionbar.list_button, "active", GLib.BindingFlags.DEFAULT); } @@ -129,6 +131,7 @@ editablelabel.monospace = if_mono; textview.monospace = if_mono; popover.monospace = if_mono; + NoteData.latest_mono = if_mono; } private void action_focus_title () {editablelabel.editing = true;} diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index 0b0abf5d..2c78cc11 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -17,71 +17,75 @@ public Gtk.EmojiChooser emojichooser_popover; public Gtk.MenuButton menu_button; public Gtk.WindowHandle handle; + public Jorts.Popover popover; + + const int ICON_SIZE = 32; construct { /* **** LEFT **** */ var new_item = new Gtk.Button () { + action_name = Application.ACTION_PREFIX + Application.ACTION_NEW, icon_name = "list-add-symbolic", - width_request = 32, - height_request = 32, + width_request = ICON_SIZE, + height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"n"}, _("New sticky note") ) }; - new_item.action_name = Application.ACTION_PREFIX + Application.ACTION_NEW; new_item.add_css_class (STYLE_THEMEDBUTTON); var delete_item = new Gtk.Button () { + action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, icon_name = "edit-delete-symbolic", - width_request = 32, - height_request = 32, + width_request = ICON_SIZE, + height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"w"}, _("Delete sticky note") ) }; delete_item.add_css_class (STYLE_THEMEDBUTTON); - delete_item.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE; /* **** RIGHT **** */ list_button = new Gtk.Button () { + action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_LIST, icon_name = "view-list-symbolic", - width_request = 32, - height_request = 32, + width_request = ICON_SIZE, + height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"F12"}, _("Toggle list") ) }; list_button.add_css_class (STYLE_THEMEDBUTTON); - list_button.action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_LIST; emojichooser_popover = new Gtk.EmojiChooser (); - emoji_button = new Gtk.MenuButton () { + popover = emojichooser_popover, icon_name = Jorts.Utils.random_emote (), - width_request = 32, - height_request = 32, + width_request = ICON_SIZE, + height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"period"}, _("Insert emoji") ) }; emoji_button.add_css_class (STYLE_THEMEDBUTTON); - emoji_button.popover = emojichooser_popover; + popover = new Jorts.Popover (); menu_button = new Gtk.MenuButton () { + popover = popover, icon_name = "open-menu-symbolic", - width_request = 32, - height_request = 32, + width_request = ICON_SIZE, + height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"g", "o"}, _("Preferences for this sticky note") - ) + ), + direction = Gtk.ArrowType.UP }; - menu_button.direction = Gtk.ArrowType.UP; menu_button.add_css_class (STYLE_THEMEDBUTTON); /* **** Widget **** */ @@ -116,7 +120,7 @@ */ public void reveal_bind () { Application.gsettings.bind (KEY_HIDEBAR, - this.actionbar, "revealed", + actionbar, "revealed", SettingsBindFlags.INVERT_BOOLEAN); } diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index 426ce622..f04c243f 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -29,7 +29,6 @@ public class Jorts.Popover : Gtk.Popover { } public int zoom { set {font_size_box.zoom = value;}} - public signal void theme_changed (Jorts.Themes selected); static construct @@ -54,8 +53,8 @@ public class Jorts.Popover : Gtk.Popover { halign = Gtk.Align.END; var view = new Gtk.Box (VERTICAL, SPACING_TRIPLE) { - margin_top = SPACING_TRIPLE, - margin_bottom = SPACING_TRIPLE + margin_top = SPACING_DOUBLE, + margin_bottom = SPACING_DOUBLE }; color_box = new Jorts.ColorBox (); @@ -70,8 +69,7 @@ public class Jorts.Popover : Gtk.Popover { // Propagate settings changes to the higher level color_box.theme_changed.connect ((theme) => {theme_changed (theme);}); - //monospace_box.monospace_changed.connect (on_monospace_changed); - //font_size_box.zoom_changed.connect ((zoomtype) => {zoom_changed (zoomtype);}); + // Allow scrolling shenanigans from popover keypress_controller = new Gtk.EventControllerKey (); @@ -88,7 +86,6 @@ public class Jorts.Popover : Gtk.Popover { */ private void on_monospace_changed (bool monospace) { debug ("Updating monospace to %s".printf (monospace.to_string ())); - monospace_box.monospace = monospace; Jorts.NoteData.latest_mono = monospace; } diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index cfd9fb2c..2615c1fc 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -111,7 +111,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { // Save when title or text have changed view.editablelabel.changed.connect (on_editable_changed); view.textview.buffer.changed.connect (has_changed); - popover.theme_changed.connect (color_controller.on_color_changed); // Use the color theme of this sticky note when focused @@ -194,7 +193,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { color_controller.theme = data.theme; zoom_controller.zoom = data.zoom; - popover.monospace = data.monospace; + view.monospace = data.monospace; } private void has_changed () {changed ();} From b48eca94ef4adb8140b99ad1ff6b55f51b0a00d3 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 20:38:17 +0200 Subject: [PATCH 08/21] move toggle list in textview --- src/Views/NoteView.vala | 4 -- src/Views/PreferencesView.vala | 9 +---- src/Widgets/ActionBar.vala | 16 +++++--- src/Widgets/TextView.vala | 62 +++++++++++++++++-------------- src/Windows/StickyNoteWindow.vala | 1 + 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/src/Views/NoteView.vala b/src/Views/NoteView.vala index b33d8180..c53a899e 100644 --- a/src/Views/NoteView.vala +++ b/src/Views/NoteView.vala @@ -46,7 +46,6 @@ public const string ACTION_SHOW_EMOJI = "action_show_emoji"; public const string ACTION_SHOW_MENU = "action_show_menu"; public const string ACTION_TOGGLE_MONO = "action_toggle_mono"; - public const string ACTION_TOGGLE_LIST = "action_toggle_list"; public static Gee.MultiMap action_accelerators; @@ -55,7 +54,6 @@ { ACTION_SHOW_EMOJI, action_show_emoji}, { ACTION_SHOW_MENU, action_show_menu}, { ACTION_TOGGLE_MONO, action_toggle_mono}, - { ACTION_TOGGLE_LIST, action_toggle_list}, }; construct { @@ -68,7 +66,6 @@ app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_EMOJI, {"period"}); app.set_accels_for_action (ACTION_PREFIX + ACTION_SHOW_MENU, {"G", "O"}); app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_MONO, {"m"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); @@ -137,6 +134,5 @@ private void action_focus_title () {editablelabel.editing = true;} private void action_show_emoji () {emoji_button.activate ();} private void action_show_menu () {menu_button.activate ();} - private void action_toggle_list () {textview.toggle_list ();} private void action_toggle_mono () {monospace = !monospace;} } diff --git a/src/Views/PreferencesView.vala b/src/Views/PreferencesView.vala index f68b24b4..551d2c0c 100644 --- a/src/Views/PreferencesView.vala +++ b/src/Views/PreferencesView.vala @@ -12,7 +12,7 @@ construct { orientation = VERTICAL; - spacing = 0; + spacing = SPACING_DOUBLE; margin_top = SPACING_DOUBLE; margin_bottom = SPACING_DOUBLE; margin_start = SPACING_DOUBLE; @@ -25,12 +25,7 @@ overlay.add_overlay (toast); // the box with all the settings -#if FLATHUB - var settings_spacing = SPACING_STANDARD; -#else - var settings_spacing = SPACING_STANDARD + SPACING_DOUBLE; -#endif - var settingsbox = new Gtk.Box (VERTICAL, settings_spacing) { + var settingsbox = new Gtk.Box (VERTICAL, SPACING_DOUBLE) { margin_top = SPACING_STANDARD, margin_start = SPACING_STANDARD, margin_end = SPACING_STANDARD, diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index 2c78cc11..b1112c8b 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -44,20 +44,22 @@ tooltip_markup = Granite.markup_accel_tooltip ( {"w"}, _("Delete sticky note") - ) + ), + has_frame = false }; delete_item.add_css_class (STYLE_THEMEDBUTTON); /* **** RIGHT **** */ list_button = new Gtk.Button () { - action_name = NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_LIST, + action_name = TextView.ACTION_PREFIX + TextView.ACTION_TOGGLE_LIST, icon_name = "view-list-symbolic", width_request = ICON_SIZE, height_request = ICON_SIZE, tooltip_markup = Granite.markup_accel_tooltip ( {"F12"}, _("Toggle list") - ) + ), + has_frame = false }; list_button.add_css_class (STYLE_THEMEDBUTTON); @@ -70,7 +72,8 @@ tooltip_markup = Granite.markup_accel_tooltip ( {"period"}, _("Insert emoji") - ) + ), + has_frame = false }; emoji_button.add_css_class (STYLE_THEMEDBUTTON); @@ -84,6 +87,7 @@ {"g", "o"}, _("Preferences for this sticky note") ), + has_frame = false, direction = Gtk.ArrowType.UP }; menu_button.add_css_class (STYLE_THEMEDBUTTON); @@ -111,7 +115,6 @@ // Hide the list button if user has specified no list item symbol on_prefix_changed (); Application.gsettings.changed[KEY_LIST].connect (on_prefix_changed); - } /** @@ -135,6 +138,9 @@ ); } + /** + * If user leaves list prefix blank, then they dont need the button. + */ private void on_prefix_changed () { list_button.visible = (Application.gsettings.get_string (KEY_LIST) != ""); } diff --git a/src/Widgets/TextView.vala b/src/Widgets/TextView.vala index 6f8da058..cfed33b4 100644 --- a/src/Widgets/TextView.vala +++ b/src/Widgets/TextView.vala @@ -12,7 +12,7 @@ public class Jorts.TextView : Granite.HyperTextView { private Gtk.EventControllerKey keyboard; - private string list_item_start; + public string list_item_start {get; set;} public bool on_list_item {public get; private set;} public string text { @@ -20,6 +20,7 @@ public class Jorts.TextView : Granite.HyperTextView { set {buffer.text = value;} } + public SimpleActionGroup actions {get; construct;} public const string ACTION_PREFIX = "textview."; public const string ACTION_TOGGLE_LIST = "action_toggle_list"; @@ -28,40 +29,50 @@ public class Jorts.TextView : Granite.HyperTextView { }; construct { + wrap_mode = Gtk.WrapMode.WORD_CHAR; buffer = new Gtk.TextBuffer (null); - bottom_margin = SPACING_DOUBLE; - left_margin = SPACING_DOUBLE; - right_margin = SPACING_DOUBLE; - top_margin = SPACING_STANDARD; - + bottom_margin = SPACING_DOUBLE; + left_margin = SPACING_DOUBLE; + right_margin = SPACING_DOUBLE; + top_margin = SPACING_STANDARD; hexpand = true; vexpand = true; - wrap_mode = Gtk.WrapMode.WORD_CHAR; - var actions = new SimpleActionGroup (); + + /***************************************************/ + /* Actions and controllers */ + /***************************************************/ + + + // Action stuff + actions = new SimpleActionGroup (); actions.add_action_entries (ACTION_ENTRIES, this); insert_action_group ("textview", actions); - list_item_start = Application.gsettings.get_string (KEY_LIST); - Application.gsettings.changed[KEY_LIST].connect (on_prefix_changed); + unowned var app = ((Gtk.Application) GLib.Application.get_default ()); + app.set_accels_for_action (ACTION_PREFIX + ACTION_TOGGLE_LIST, {"F12"}); keyboard = new Gtk.EventControllerKey (); - add_controller (keyboard); keyboard.key_pressed.connect (on_key_pressed); + add_controller (keyboard); - //TODO: Buggy. Clicking anywhere brings it out of whack - // on_cursor_changed (); - // move_cursor.connect_after (on_cursor_changed); + // Alternate way to access preferences + var menuitem = new GLib.MenuItem (_("Show Preferences"), Application.ACTION_PREFIX + Application.ACTION_SHOW_PREFERENCES); + var extra = new GLib.Menu (); + var section = new GLib.Menu (); + section.append_item (menuitem); + extra.append_section (null, section); + extra_menu = extra; - // var menuitem = new GLib.MenuItem (_("Toggle list"), TextView.ACTION_PREFIX + TextView.ACTION_TOGGLE_LIST); - // var extra = new GLib.Menu (); - // var section = new GLib.Menu (); - // section.append_item (menuitem); - // extra.append_section (null, section); + /***************************************************/ + /* CONNECTS AND BINDS */ + /***************************************************/ - // this.extra_menu = extra; + Application.gsettings.bind (KEY_LIST, + this, "list-item-start", + GLib.SettingsBindFlags.DEFAULT); } public void toggle_list () { @@ -75,12 +86,11 @@ public class Jorts.TextView : Granite.HyperTextView { var selected_is_list = this.is_list (first_line, last_line, list_item_start); buffer.begin_user_action (); - if (selected_is_list) - { - this.remove_list (first_line, last_line); + if (selected_is_list) { + remove_list (first_line, last_line); } else { - this.set_list (first_line, last_line); + set_list (first_line, last_line); } buffer.end_user_action (); @@ -207,10 +217,6 @@ public class Jorts.TextView : Granite.HyperTextView { return false; } - private void on_prefix_changed () { - list_item_start = Application.gsettings.get_string ("list-item-start"); - } - /* private void on_cursor_changed () { Gtk.TextIter start, end; buffer.get_selection_bounds (out start, out end); diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index 2615c1fc..32a545ea 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -81,6 +81,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { view = new NoteView (); textview = view.textview; insert_action_group ("noteview", view.actions); + insert_action_group ("textview", textview.actions); // Have shortcuts keep working with the popover open. popover = view.popover; From 26af624967377abcf9a3450cebaa9e17f3f8dcf3 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 20:40:32 +0200 Subject: [PATCH 09/21] fill in binding actions --- src/Widgets/Popover.vala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index f04c243f..1fff2b55 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -39,13 +39,14 @@ public class Jorts.Popover : Gtk.Popover { add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_OUT, null); add_binding_action(Gdk.Key.n, Gdk.ModifierType.CONTROL_MASK, Application.ACTION_PREFIX + Application.ACTION_NEW, null); - add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); - add_binding_action(Gdk.Key.m, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_MONO, null); + add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); + add_binding_action(Gdk.Key.l, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_FOCUS_TITLE, null); add_binding_action(Gdk.Key.g, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_SHOW_MENU, null); add_binding_action(Gdk.Key.o, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_SHOW_MENU, null); - add_binding_action(Gdk.Key.l, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_FOCUS_TITLE, null); - } + add_binding_action(Gdk.Key.m, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_TOGGLE_MONO, null); + add_binding_action(Gdk.Key.F12, Gdk.ModifierType.SHIFT_MASK, TextView.ACTION_PREFIX + TextView.ACTION_TOGGLE_LIST, null); + } /****************/ construct { From 7f25527b84a70fa706736ebb81d1324d9358b546 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 21:11:01 +0200 Subject: [PATCH 10/21] solve spacing issues --- src/Views/PreferencesView.vala | 62 ++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/Views/PreferencesView.vala b/src/Views/PreferencesView.vala index 551d2c0c..bda43133 100644 --- a/src/Views/PreferencesView.vala +++ b/src/Views/PreferencesView.vala @@ -5,42 +5,40 @@ * 2025-2026 Stella & Charlie (teamcons.carrd.co) */ - public class Jorts.PreferencesView : Gtk.Box { + public class Jorts.PreferencesView : Granite.Bin { //public Gtk.Button reset_button; private Granite.Toast toast; public Gtk.Button close_button; construct { - orientation = VERTICAL; - spacing = SPACING_DOUBLE; - margin_top = SPACING_DOUBLE; - margin_bottom = SPACING_DOUBLE; - margin_start = SPACING_DOUBLE; - margin_end = SPACING_DOUBLE; - var overlay = new Gtk.Overlay (); - append (overlay); + child = overlay; - toast = new Granite.Toast (_("Request to system sent")); - overlay.add_overlay (toast); + toast = new Granite.Toast (_("Request to system sent")); + overlay.add_overlay (toast); - // the box with all the settings - var settingsbox = new Gtk.Box (VERTICAL, SPACING_DOUBLE) { - margin_top = SPACING_STANDARD, - margin_start = SPACING_STANDARD, - margin_end = SPACING_STANDARD, - hexpand = true, - vexpand = true, - valign = Gtk.Align.START - }; + var prefview = new Gtk.Box (Gtk.Orientation.VERTICAL, SPACING_TRIPLE) { + margin_start = SPACING_TRIPLE, + margin_end = SPACING_TRIPLE, + margin_top = SPACING_DOUBLE, + margin_bottom = SPACING_DOUBLE, + hexpand = true, + vexpand = true + }; + overlay.child = prefview; + + // the box with all the settings + var settingsbox = new Gtk.Box (VERTICAL, SPACING_DOUBLE) { + hexpand = true, + vexpand = true, + valign = Gtk.Align.START + }; /***************************************/ /* lists */ /***************************************/ - var lists_box = new Gtk.Box (HORIZONTAL, 5); - var list_entry = new Gtk.Entry () { halign = Gtk.Align.END, hexpand = false, @@ -49,12 +47,17 @@ max_width_chars = 6 }; + list_entry.secondary_icon_name = "view-refresh-symbolic"; + list_entry.secondary_icon_tooltip_text = _("Reset to default"); + list_entry.icon_press.connect (on_reset_prefix); + var list_label = new Granite.HeaderLabel (_("List item prefix")) { mnemonic_widget = list_entry, secondary_text = _("If left empty, the list button will be hidden"), hexpand = true }; + var lists_box = new Gtk.Box (HORIZONTAL, SPACING_STANDARD); lists_box.append (list_label); lists_box.append (list_entry); @@ -62,7 +65,6 @@ list_entry, "text", SettingsBindFlags.DEFAULT); - settingsbox.append (lists_box); @@ -97,7 +99,7 @@ /* Autostart Request */ /****************************************************/ #if !WINDOWS - var both_buttons = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 5) { + var both_buttons = new Gtk.Box (Gtk.Orientation.HORIZONTAL, SPACING_STANDARD) { halign = Gtk.Align.FILL }; @@ -126,7 +128,7 @@ both_buttons.append (set_autostart); both_buttons.append (remove_autostart); - var autostart_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 5); + var autostart_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, SPACING_STANDARD); var autostart_label = new Granite.HeaderLabel (_("Automatically start Jorts")) { mnemonic_widget = both_buttons, @@ -141,8 +143,6 @@ /*************************************************/ // Bar at the bottom var actionbar = new Gtk.CenterBox () { - margin_start = SPACING_STANDARD, - margin_end = SPACING_STANDARD, valign = Gtk.Align.END, hexpand = true, vexpand = false @@ -166,7 +166,11 @@ actionbar.end_widget = close_button; - append (settingsbox); - append (actionbar); + prefview.append (settingsbox); + prefview.append (actionbar); + } + + private void on_reset_prefix (Gtk.EntryIconPosition icon_pos) { + Application.gsettings.reset (KEY_LIST); } } From 7826ae220cd38102d1d0894307a258a1d03f08ca Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 1 Apr 2026 21:15:39 +0200 Subject: [PATCH 11/21] remove some spaghetti code --- src/Widgets/EditableLabel.vala | 19 ++++++++----------- src/Widgets/PopoverWidgets/ColorBox.vala | 4 ++-- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/Widgets/EditableLabel.vala b/src/Widgets/EditableLabel.vala index c8e854ff..09cd11f0 100644 --- a/src/Widgets/EditableLabel.vala +++ b/src/Widgets/EditableLabel.vala @@ -14,18 +14,18 @@ public class Jorts.EditableLabel : Granite.Bin { public signal void changed (); public string text { - owned get { return editablelabel.text;} - set { editablelabel.text = value;} + owned get {return editablelabel.text;} + set {editablelabel.text = value;} } public bool editing { - get { return editablelabel.editing;} - set { editablelabel.editing = value;} + get {return editablelabel.editing;} + set {editablelabel.editing = value;} } public bool monospace { - get { return "monospace" in this.css_classes;} - set { mono_set (value);} + get {return "monospace" in this.css_classes;} + set {mono_set (value);} } construct { @@ -52,11 +52,8 @@ public class Jorts.EditableLabel : Granite.Bin { private void mono_set (bool if_mono) { if (if_mono) { this.add_css_class ("monospace"); - - } else { - if ("monospace" in this.css_classes) { - this.remove_css_class ("monospace"); - } + return; } + remove_css_class ("monospace"); } } diff --git a/src/Widgets/PopoverWidgets/ColorBox.vala b/src/Widgets/PopoverWidgets/ColorBox.vala index f6776840..02136aeb 100644 --- a/src/Widgets/PopoverWidgets/ColorBox.vala +++ b/src/Widgets/PopoverWidgets/ColorBox.vala @@ -26,8 +26,8 @@ public class Jorts.ColorBox : Gtk.Box { accessible_role = Gtk.AccessibleRole.LIST; spacing = 1; - margin_start = 10; - margin_end = 10; + margin_start = SPACING_DOUBLE; + margin_end = SPACING_DOUBLE; var blueberry_button = new ColorPill (Themes.BLUEBERRY); From 0201668e0645e7a5f16641ec54b3f00908e9d419 Mon Sep 17 00:00:00 2001 From: teamcons Date: Thu, 2 Apr 2026 13:59:31 +0200 Subject: [PATCH 12/21] move zoom actions into zoom controller --- data/Application.css | 90 ++++++++++++------------ src/Services/ZoomController.vala | 25 +++++++ src/Utils/Libportal.vala | 4 +- src/Widgets/Popover.vala | 8 +-- src/Widgets/PopoverWidgets/ColorBox.vala | 2 +- src/Widgets/PopoverWidgets/ZoomBox.vala | 8 +-- src/Windows/StickyNoteWindow.vala | 10 +-- 7 files changed, 84 insertions(+), 63 deletions(-) diff --git a/data/Application.css b/data/Application.css index ca0206f8..e1104f72 100644 --- a/data/Application.css +++ b/data/Application.css @@ -77,65 +77,65 @@ window.scribbly editablelabel { } /* Font zooms */ -window.s20 textview.view {font-size: 40%;} -window.s20 editablelabel {font-size: 25%;} -window.s20 editablelabel.editing {font-size: 20%;} +.s20 textview.view {font-size: 40%;} +.s20 editablelabel {font-size: 25%;} +.s20 editablelabel.editing {font-size: 20%;} -window.s40 textview.view {font-size: 60%;} -window.s40 editablelabel {font-size: 45%;} -window.s40 editablelabel.editing {font-size: 40%;} +.s40 textview.view {font-size: 60%;} +.s40 editablelabel {font-size: 45%;} +.s40 editablelabel.editing {font-size: 40%;} -window.s60 textview.view {font-size: 80%;} -window.s60 editablelabel {font-size: 65%;} -window.s60 editablelabel.editing {font-size: 60%;} +.s60 textview.view {font-size: 80%;} +.s60 editablelabel {font-size: 65%;} +.s60 editablelabel.editing {font-size: 60%;} -window.s80 textview.view {font-size: 100%;} -window.s80 editablelabel {font-size: 85%;} -window.s80 editablelabel.editing {font-size: 80%;} +.s80 textview.view {font-size: 100%;} +.s80 editablelabel {font-size: 85%;} +.s80 editablelabel.editing {font-size: 80%;} -window.s100 textview.view {font-size: 120%;} -window.s100 editablelabel {font-size: 105%;} -window.s100 editablelabel.editing {font-size: 100%;} +.s100 textview.view {font-size: 120%;} +.s100 editablelabel {font-size: 105%;} +.s100 editablelabel.editing {font-size: 100%;} -window.s120 textview.view {font-size: 140%;} -window.s120 editablelabel {font-size: 125%;} -window.s120 editablelabel.editing {font-size: 120%;} +.s120 textview.view {font-size: 140%;} +.s120 editablelabel {font-size: 125%;} +.s120 editablelabel.editing {font-size: 120%;} -window.s140 textview.view {font-size: 160%;} -window.s140 editablelabel {font-size: 145%;} -window.s140 editablelabel.editing {font-size: 140%;} +.s140 textview.view {font-size: 160%;} +.s140 editablelabel {font-size: 145%;} +.s140 editablelabel.editing {font-size: 140%;} -window.s160 textview.view {font-size: 180%;} -window.s160 editablelabel {font-size: 165%;} -window.s160 editablelabel.editing {font-size: 160%;} +.s160 textview.view {font-size: 180%;} +.s160 editablelabel {font-size: 165%;} +.s160 editablelabel.editing {font-size: 160%;} -window.s180 textview.view {font-size: 200%;} -window.s180 editablelabel {font-size: 185%;} -window.s180 editablelabel.editing {font-size: 180%;} +.s180 textview.view {font-size: 200%;} +.s180 editablelabel {font-size: 185%;} +.s180 editablelabel.editing {font-size: 180%;} -window.s200 textview.view {font-size: 220%;} -window.s200 editablelabel {font-size: 205%;} -window.s200 editablelabel.editing {font-size: 200%;} +.s200 textview.view {font-size: 220%;} +.s200 editablelabel {font-size: 205%;} +.s200 editablelabel.editing {font-size: 200%;} -window.s220 textview.view {font-size: 240%;} -window.s220 editablelabel {font-size: 225%;} -window.s220 editablelabel.editing {font-size: 220%;} +.s220 textview.view {font-size: 240%;} +.s220 editablelabel {font-size: 225%;} +.s220 editablelabel.editing {font-size: 220%;} -window.s240 textview.view {font-size: 260%;} -window.s240 editablelabel {font-size: 245%;} -window.s240 editablelabel.editing {font-size: 240%;} +.s240 textview.view {font-size: 260%;} +.s240 editablelabel {font-size: 245%;} +.s240 editablelabel.editing {font-size: 240%;} -window.s260 textview.view {font-size: 280%;} -window.s260 editablelabel {font-size: 265%;} -window.s260 editablelabel.editing {font-size: 260%;} +.s260 textview.view {font-size: 280%;} +.s260 editablelabel {font-size: 265%;} +.s260 editablelabel.editing {font-size: 260%;} -window.s280 textview.view {font-size: 300%;} -window.s280 editablelabel {font-size: 285%;} -window.s280 editablelabel.editing {font-size: 280%;} +.s280 textview.view {font-size: 300%;} +.s280 editablelabel {font-size: 285%;} +.s280 editablelabel.editing {font-size: 280%;} -window.s300 textview.view {font-size: 320%;} -window.s300 editablelabel {font-size: 305%;} -window.s300 editablelabel.editing {font-size: 300%;} +.s300 textview.view {font-size: 320%;} +.s300 editablelabel {font-size: 305%;} +.s300 editablelabel.editing {font-size: 300%;} /* ANIMATION */ diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index 632052d8..511bd4c7 100644 --- a/src/Services/ZoomController.vala +++ b/src/Services/ZoomController.vala @@ -23,10 +23,35 @@ public class Jorts.ZoomController : Object { set {do_set_zoom (value);} } + public SimpleActionGroup actions { get; construct; } + public const string ACTION_PREFIX = "zoom_controller."; + public const string ACTION_ZOOM_OUT = "action_zoom_out"; + public const string ACTION_ZOOM_DEFAULT = "action_zoom_default"; + public const string ACTION_ZOOM_IN = "action_zoom_in"; + + public static Gee.MultiMap action_accelerators; + + private const GLib.ActionEntry[] ACTION_ENTRIES = { + { ACTION_ZOOM_OUT, zoom_out}, + { ACTION_ZOOM_DEFAULT, zoom_default}, + { ACTION_ZOOM_IN, zoom_in} + }; + + public ZoomController (Jorts.StickyNoteWindow window) { this.window = window; } + construct { + actions = new SimpleActionGroup (); + actions.add_action_entries (ACTION_ENTRIES, this); + + unowned var app = ((Gtk.Application) GLib.Application.get_default ()); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_OUT, {"minus", "KP_Subtract"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_DEFAULT, {"equal", "0", "KP_0"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_IN, {"plus", "KP_Add"}); + } + /** * Handler. Wraps a zoom enum into the correct function- */ diff --git a/src/Utils/Libportal.vala b/src/Utils/Libportal.vala index d74f7de2..04965f08 100644 --- a/src/Utils/Libportal.vala +++ b/src/Utils/Libportal.vala @@ -9,7 +9,7 @@ namespace Jorts.Utils { public void autostart_remove () { Xdp.Portal portal = new Xdp.Portal (); GenericArray cmd = new GenericArray (); - cmd.add ("io.github.elly_code.jorts"); + cmd.add (APP_ID); portal.request_background.begin ( null, @@ -22,7 +22,7 @@ namespace Jorts.Utils { public void autostart_set () { Xdp.Portal portal = new Xdp.Portal (); GenericArray cmd = new GenericArray (); - cmd.add ("io.github.elly_code.jorts"); + cmd.add (APP_ID); portal.request_background.begin ( null, diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index 1fff2b55..6e8889e4 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -33,10 +33,10 @@ public class Jorts.Popover : Gtk.Popover { static construct { - add_binding_action(Gdk.Key.plus, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_IN, null); - add_binding_action(Gdk.Key.equal, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_DEFAULT, null); - add_binding_action(48, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_DEFAULT, null); - add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_OUT, null); + add_binding_action(Gdk.Key.plus, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_IN, null); + add_binding_action(Gdk.Key.equal, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_DEFAULT, null); + add_binding_action(48, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_DEFAULT, null); + add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_OUT, null); add_binding_action(Gdk.Key.n, Gdk.ModifierType.CONTROL_MASK, Application.ACTION_PREFIX + Application.ACTION_NEW, null); add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); diff --git a/src/Widgets/PopoverWidgets/ColorBox.vala b/src/Widgets/PopoverWidgets/ColorBox.vala index 02136aeb..a5ef4068 100644 --- a/src/Widgets/PopoverWidgets/ColorBox.vala +++ b/src/Widgets/PopoverWidgets/ColorBox.vala @@ -24,7 +24,7 @@ public class Jorts.ColorBox : Gtk.Box { public ColorBox () { orientation = Gtk.Orientation.HORIZONTAL; accessible_role = Gtk.AccessibleRole.LIST; - + homogeneous = true; spacing = 1; margin_start = SPACING_DOUBLE; margin_end = SPACING_DOUBLE; diff --git a/src/Widgets/PopoverWidgets/ZoomBox.vala b/src/Widgets/PopoverWidgets/ZoomBox.vala index ab2aa261..138e0c55 100644 --- a/src/Widgets/PopoverWidgets/ZoomBox.vala +++ b/src/Widgets/PopoverWidgets/ZoomBox.vala @@ -35,7 +35,7 @@ public class Jorts.ZoomBox : Gtk.Box { ///TRANSLATORS: These are displayed on small linked buttons in a menu. User can click them to change zoom var zoom_out_button = new Gtk.Button.from_icon_name ("zoom-out-symbolic") { - action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_OUT, + action_name = ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_OUT, tooltip_markup = Granite.markup_accel_tooltip ( {"minus", "KP_Subtract"}, _("Zoom out") @@ -43,7 +43,7 @@ public class Jorts.ZoomBox : Gtk.Box { }; zoom_default_button = new Gtk.Button () { - action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_DEFAULT, + action_name = ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_DEFAULT, tooltip_markup = Granite.markup_accel_tooltip ( { "equal", "0", "KP_0" }, _("Default zoom level") @@ -51,12 +51,12 @@ public class Jorts.ZoomBox : Gtk.Box { }; var zoom_in_button = new Gtk.Button.from_icon_name ("zoom-in-symbolic") { - action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_ZOOM_IN, + action_name = ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_IN, tooltip_markup = Granite.markup_accel_tooltip ( {"plus", "KP_Add"}, _("Zoom in") ) - }; + }; append (zoom_out_button); append (zoom_default_button); diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index 32a545ea..5b65c983 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -40,10 +40,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { public static Gee.MultiMap action_accelerators; private const GLib.ActionEntry[] ACTION_ENTRIES = { - { ACTION_DELETE, action_delete}, - { ACTION_ZOOM_OUT, action_zoom_out}, - { ACTION_ZOOM_DEFAULT, action_zoom_default}, - { ACTION_ZOOM_IN, action_zoom_in}, + { ACTION_DELETE, action_delete} }; public StickyNoteWindow (Jorts.Application app, NoteData data) { @@ -56,9 +53,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { insert_action_group ("win", actions); app.set_accels_for_action (ACTION_PREFIX + ACTION_DELETE, {"W"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_OUT, {"minus", "KP_Subtract"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_DEFAULT, {"equal", "0", "KP_0"}); - app.set_accels_for_action (ACTION_PREFIX + ACTION_ZOOM_IN, {"plus", "KP_Add"}); + color_controller = new Jorts.ColorController (this); @@ -82,6 +77,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { textview = view.textview; insert_action_group ("noteview", view.actions); insert_action_group ("textview", textview.actions); + insert_action_group ("zoom_controller", zoom_controller.actions); // Have shortcuts keep working with the popover open. popover = view.popover; From 2a379b9a55735c8ca77730b6f46a824886d65568 Mon Sep 17 00:00:00 2001 From: teamcons Date: Thu, 2 Apr 2026 14:00:30 +0200 Subject: [PATCH 13/21] remove unused --- src/Windows/StickyNoteWindow.vala | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index 5b65c983..a9e12286 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -33,9 +33,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { public signal void changed (); public const string ACTION_PREFIX = "win."; public const string ACTION_DELETE = "action_delete"; - public const string ACTION_ZOOM_OUT = "action_zoom_out"; - public const string ACTION_ZOOM_DEFAULT = "action_zoom_default"; - public const string ACTION_ZOOM_IN = "action_zoom_in"; public static Gee.MultiMap action_accelerators; @@ -195,7 +192,4 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { private void has_changed () {changed ();} private void action_delete () {((Jorts.Application)this.application).manager.delete_note (this); this.destroy ();} - private void action_zoom_out () {zoom_controller.zoom_out ();} - private void action_zoom_default () {zoom_controller.zoom_default ();} - private void action_zoom_in () {zoom_controller.zoom_in ();} } From 348797a872c01c5782f8820436659a7487ae4dce Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 12:26:56 +0200 Subject: [PATCH 14/21] Add quit to the textview --- src/Widgets/TextView.vala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Widgets/TextView.vala b/src/Widgets/TextView.vala index cfed33b4..119e9699 100644 --- a/src/Widgets/TextView.vala +++ b/src/Widgets/TextView.vala @@ -57,11 +57,13 @@ public class Jorts.TextView : Granite.HyperTextView { add_controller (keyboard); // Alternate way to access preferences - var menuitem = new GLib.MenuItem (_("Show Preferences"), Application.ACTION_PREFIX + Application.ACTION_SHOW_PREFERENCES); + var menuitem_pref = new GLib.MenuItem (_("Show Preferences"), Application.ACTION_PREFIX + Application.ACTION_SHOW_PREFERENCES); + var menuitem_quit = new GLib.MenuItem (_("Quit Jorts"), Application.ACTION_PREFIX + Application.ACTION_QUIT); var extra = new GLib.Menu (); var section = new GLib.Menu (); - section.append_item (menuitem); + section.append_item (menuitem_pref); + section.append_item (menuitem_quit); extra.append_section (null, section); extra_menu = extra; From 3fb5ec3f51fb9b7ce11a004b289de4d9372a9f45 Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 12:27:26 +0200 Subject: [PATCH 15/21] set appid domain later --- meson.build | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index 9f4c5f32..122cbb05 100644 --- a/meson.build +++ b/meson.build @@ -1,15 +1,13 @@ # Name our project project( - 'io.github.elly_code.jorts', + 'jorts', 'vala', 'c', version: '4.0.2' ) app_name = 'Jorts' - - -correct_app_id = 'io.github.elly_code.jorts' -legacy_app_id = 'io.github.ellie_commons.jorts' +correct_app_id = 'io.github.elly_code.' + meson.project_name() +legacy_app_id = 'io.github.ellie_commons.' + meson.project_name() if get_option('legacy-rdnn') app_id = legacy_app_id From edee942d920b225cd805cdf23e78316b8d84e7fb Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 12:56:32 +0200 Subject: [PATCH 16/21] use actions for NoteManager --- src/Application.vala | 62 +++++++++++++------------------ src/Services/NoteManager.vala | 27 +++++++++++++- src/Widgets/ActionBar.vala | 2 +- src/Widgets/Popover.vala | 2 +- src/Windows/StickyNoteWindow.vala | 4 +- 5 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/Application.vala b/src/Application.vala index 4d679a05..c30f19e2 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -44,7 +44,7 @@ public class Jorts.Application : Gtk.Application { public static GLib.Settings gsettings; public static Gtk.Settings gtk_settings; - public Jorts.NoteManager manager; + public Jorts.NoteManager note_manager; public static Jorts.PreferenceWindow? preferences; // Used for commandline option handling @@ -53,7 +53,6 @@ public class Jorts.Application : Gtk.Application { public const string ACTION_PREFIX = "app."; public const string ACTION_QUIT = "action_quit"; - public const string ACTION_NEW = "action_new"; public const string ACTION_TOGGLE_SCRIBBLY = "action_toggle_scribbly"; public const string ACTION_TOGGLE_ACTIONBAR = "action_toggle_actionbar"; public const string ACTION_SHOW_PREFERENCES = "action_show_preferences"; @@ -63,11 +62,9 @@ public class Jorts.Application : Gtk.Application { private const GLib.ActionEntry[] ACTION_ENTRIES = { { ACTION_QUIT, quit}, - { ACTION_NEW, action_new }, { ACTION_TOGGLE_SCRIBBLY, action_toggle_scribbly}, { ACTION_TOGGLE_ACTIONBAR, action_toggle_actionbar}, { ACTION_SHOW_PREFERENCES, action_show_preferences}, - { ACTION_SAVE, action_save}, }; public Application () { @@ -75,6 +72,23 @@ public class Jorts.Application : Gtk.Application { application_id: APP_ID); } + + /*************************************************/ + static construct { + gsettings = new GLib.Settings (APP_ID); + } + + /*************************************************/ + construct { + // The localization thingamabob + Intl.setlocale (LocaleCategory.ALL, ""); + Intl.bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + Intl.textdomain (GETTEXT_PACKAGE); + } + + + /*************************************************/ public override void startup () { debug ("Jorts Startup…"); @@ -84,12 +98,13 @@ public class Jorts.Application : Gtk.Application { add_action_entries (ACTION_ENTRIES, this); set_accels_for_action ("app.action_quit", {"Q"}); - set_accels_for_action ("app.action_new", {"N"}); - set_accels_for_action ("app.action_save", {"S"}); set_accels_for_action ("app.action_toggle_actionbar", {"T"}); set_accels_for_action ("app.action_show_preferences", {"P"}); set_accels_for_action ("app.action_toggle_scribbly", {"H"}); + note_manager = new Jorts.NoteManager (this); + add_action_entries (NoteManager.ACTION_ENTRIES, note_manager); + // Force the eOS icon theme, and set the blueberry as fallback, if for some reason it fails for individual notes var granite_settings = Granite.Settings.get_default (); gtk_settings = Gtk.Settings.get_default (); @@ -139,23 +154,6 @@ Please wait while the app remembers all the things... ); } - /*************************************************/ - static construct { - gsettings = new GLib.Settings (APP_ID); - } - - /*************************************************/ - construct { - // The localization thingamabob - Intl.setlocale (LocaleCategory.ALL, ""); - Intl.bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - Intl.textdomain (GETTEXT_PACKAGE); - - //add_main_option_entries (CMD_OPTION_ENTRIES); - manager = new Jorts.NoteManager (this); - } - // Clicked: Either show all windows, or rebuild from storage protected override void activate () { debug ("[JORTS] Jorts, activate!"); @@ -164,15 +162,15 @@ Please wait while the app remembers all the things... //GLib.Environment.set_variable ("LANGUAGE", "pt_br", true); /* Either we show all sticky notes, or we load everything lol */ - if (manager.open_notes.size > 0) { - foreach (var window in manager.open_notes) { + if (note_manager.open_notes.size > 0) { + foreach (var window in note_manager.open_notes) { if (window.visible) {window.present ();} } } else { - manager.init (); + note_manager.init (); } - if (new_note) {manager.create_note (); new_note = false;} + if (new_note) {note_manager.create_note (); new_note = false;} if (show_pref) {action_show_preferences (); show_pref = false;} } @@ -180,11 +178,6 @@ Please wait while the app remembers all the things... return new Application ().run (args); } - private void action_new () { - debug ("New Note"); - manager.create_note (); - } - private void action_show_preferences () { debug ("Showing preferences!"); @@ -209,11 +202,6 @@ Please wait while the app remembers all the things... gsettings.set_boolean ("hide-bar", !current); } - private void action_save () { - debug ("Saving..."); - manager.save_all (); - } - // checked upon window closing to make sure we do not linger in the background public void check_if_quit () { debug ("Windows open: %s".printf (get_windows ().length ().to_string ())); diff --git a/src/Services/NoteManager.vala b/src/Services/NoteManager.vala index 6aa5cb15..9ea000c2 100644 --- a/src/Services/NoteManager.vala +++ b/src/Services/NoteManager.vala @@ -18,6 +18,18 @@ public class Jorts.NoteManager : Object { private static uint debounce_timer_id; + public SimpleActionGroup actions { get; construct; } + public const string ACTION_PREFIX = "app."; + public const string ACTION_NEW = "action_new"; + public const string ACTION_SAVE = "action_save"; + + public static Gee.MultiMap action_accelerators; + + public const GLib.ActionEntry[] ACTION_ENTRIES = { + {ACTION_NEW, action_new}, + {ACTION_SAVE, immediately_save}, + }; + public NoteManager (Jorts.Application app) { this.application = app; } @@ -25,6 +37,14 @@ public class Jorts.NoteManager : Object { construct { open_notes = new Gee.ArrayList (); storage = new Jorts.Storage (); + + actions = new SimpleActionGroup (); + actions.add_action_entries (ACTION_ENTRIES, this); + + // Translation view + unowned var app = ((Gtk.Application) GLib.Application.get_default ()); + app.set_accels_for_action (ACTION_PREFIX + ACTION_NEW, {"N"}); + app.set_accels_for_action (ACTION_PREFIX + ACTION_SAVE, {"S"}); } /*************************************************/ @@ -126,7 +146,7 @@ public class Jorts.NoteManager : Object { return GLib.Source.REMOVE; } - private void immediately_save () { + public void immediately_save () { var array = new Json.Array (); foreach (Jorts.StickyNoteWindow note in open_notes) { @@ -159,4 +179,9 @@ public class Jorts.NoteManager : Object { } } } + + public void action_new () { + debug ("New Note"); + create_note (); + } } diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index b1112c8b..ec1d4cb0 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -25,7 +25,7 @@ /* **** LEFT **** */ var new_item = new Gtk.Button () { - action_name = Application.ACTION_PREFIX + Application.ACTION_NEW, + action_name = NoteManager.ACTION_PREFIX + NoteManager.ACTION_NEW, icon_name = "list-add-symbolic", width_request = ICON_SIZE, height_request = ICON_SIZE, diff --git a/src/Widgets/Popover.vala b/src/Widgets/Popover.vala index 6e8889e4..4d41471d 100644 --- a/src/Widgets/Popover.vala +++ b/src/Widgets/Popover.vala @@ -38,7 +38,7 @@ public class Jorts.Popover : Gtk.Popover { add_binding_action(48, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_DEFAULT, null); add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_OUT, null); - add_binding_action(Gdk.Key.n, Gdk.ModifierType.CONTROL_MASK, Application.ACTION_PREFIX + Application.ACTION_NEW, null); + add_binding_action(Gdk.Key.n, Gdk.ModifierType.CONTROL_MASK, NoteManager.ACTION_PREFIX + NoteManager.ACTION_NEW, null); add_binding_action(Gdk.Key.w, Gdk.ModifierType.CONTROL_MASK, StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE, null); add_binding_action(Gdk.Key.l, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_FOCUS_TITLE, null); add_binding_action(Gdk.Key.g, Gdk.ModifierType.CONTROL_MASK, NoteView.ACTION_PREFIX + NoteView.ACTION_SHOW_MENU, null); diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index a9e12286..e2c9b4ce 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -48,11 +48,9 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { var actions = new SimpleActionGroup (); actions.add_action_entries (ACTION_ENTRIES, this); insert_action_group ("win", actions); - app.set_accels_for_action (ACTION_PREFIX + ACTION_DELETE, {"W"}); - color_controller = new Jorts.ColorController (this); zoom_controller = new Jorts.ZoomController (this); scribbly_controller = new Jorts.ScribblyController (this); @@ -191,5 +189,5 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { } private void has_changed () {changed ();} - private void action_delete () {((Jorts.Application)this.application).manager.delete_note (this); this.destroy ();} + private void action_delete () {((Jorts.Application)this.application).note_manager.delete_note (this); this.destroy ();} } From f7a060e79201b79ae0ed1ad9b2529061c1fd8d8d Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 13:07:39 +0200 Subject: [PATCH 17/21] dont cleanup licence --- io.github.ellie_commons.jorts.flathub.yml | 1 - io.github.elly_code.jorts.devel.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/io.github.ellie_commons.jorts.flathub.yml b/io.github.ellie_commons.jorts.flathub.yml index 2e402a77..b931db33 100644 --- a/io.github.ellie_commons.jorts.flathub.yml +++ b/io.github.ellie_commons.jorts.flathub.yml @@ -17,7 +17,6 @@ cleanup: - '/include' - '/lib/pkgconfig' - '/man' - - '/share/doc' - '/share/gtk-doc' - '/share/man' - '/share/pkgconfig' diff --git a/io.github.elly_code.jorts.devel.yml b/io.github.elly_code.jorts.devel.yml index 638cd35e..7f99a0fe 100644 --- a/io.github.elly_code.jorts.devel.yml +++ b/io.github.elly_code.jorts.devel.yml @@ -23,7 +23,6 @@ cleanup: - '/include' - '/lib/pkgconfig' - '/man' - - '/share/doc' - '/share/gtk-doc' - '/share/man' - '/share/pkgconfig' From 4d3224aae4b85dc6f353efc081c8335d15eb0a6d Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 13:09:10 +0200 Subject: [PATCH 18/21] handle saving via action instead of signal --- src/Services/NoteManager.vala | 2 +- src/Windows/StickyNoteWindow.vala | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Services/NoteManager.vala b/src/Services/NoteManager.vala index 9ea000c2..dddeb3f2 100644 --- a/src/Services/NoteManager.vala +++ b/src/Services/NoteManager.vala @@ -27,7 +27,7 @@ public class Jorts.NoteManager : Object { public const GLib.ActionEntry[] ACTION_ENTRIES = { {ACTION_NEW, action_new}, - {ACTION_SAVE, immediately_save}, + {ACTION_SAVE, save_all}, }; public NoteManager (Jorts.Application app) { diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index e2c9b4ce..528f8a08 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -30,12 +30,10 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { set {load_data (value);} } - public signal void changed (); public const string ACTION_PREFIX = "win."; public const string ACTION_DELETE = "action_delete"; public static Gee.MultiMap action_accelerators; - private const GLib.ActionEntry[] ACTION_ENTRIES = { { ACTION_DELETE, action_delete} }; @@ -50,7 +48,6 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { insert_action_group ("win", actions); app.set_accels_for_action (ACTION_PREFIX + ACTION_DELETE, {"W"}); - color_controller = new Jorts.ColorController (this); zoom_controller = new Jorts.ZoomController (this); scribbly_controller = new Jorts.ScribblyController (this); @@ -188,6 +185,8 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { view.monospace = data.monospace; } - private void has_changed () {changed ();} + private void has_changed () { + application.activate_action (NoteManager.ACTION_SAVE, null); + } private void action_delete () {((Jorts.Application)this.application).note_manager.delete_note (this); this.destroy ();} } From c60a1d838bbf39a4edb790e02514e685aa74a009 Mon Sep 17 00:00:00 2001 From: teamcons Date: Mon, 6 Apr 2026 13:11:31 +0200 Subject: [PATCH 19/21] remove old signal --- src/Services/ColorController.vala | 2 +- src/Services/NoteManager.vala | 2 -- src/Services/ZoomController.vala | 2 +- src/Windows/StickyNoteWindow.vala | 4 ++-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Services/ColorController.vala b/src/Services/ColorController.vala index 5eca0e22..96a889b2 100644 --- a/src/Services/ColorController.vala +++ b/src/Services/ColorController.vala @@ -47,7 +47,7 @@ public class Jorts.ColorController : Object { Application.gtk_settings.gtk_theme_name = stylesheet; // Cleanup; - window.changed (); + window.has_changed (); } /** diff --git a/src/Services/NoteManager.vala b/src/Services/NoteManager.vala index dddeb3f2..5e62d6cf 100644 --- a/src/Services/NoteManager.vala +++ b/src/Services/NoteManager.vala @@ -101,7 +101,6 @@ public class Jorts.NoteManager : Object { /* LETSGO */ open_notes.add (note); - note.changed.connect (save_all); note.show (); note.present (); @@ -115,7 +114,6 @@ public class Jorts.NoteManager : Object { debug ("Removing a note…"); open_notes.remove (note); - note.changed.disconnect (save_all); application.remove_window ((Gtk.Window)note); note.close (); diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index 511bd4c7..97aa3e87 100644 --- a/src/Services/ZoomController.vala +++ b/src/Services/ZoomController.vala @@ -115,7 +115,7 @@ public class Jorts.ZoomController : Object { // Keep it for next new notes NoteData.latest_zoom = zoom; - window.changed (); + window.has_changed (); } public bool on_key_press_event (uint keyval, uint keycode, Gdk.ModifierType state) { diff --git a/src/Windows/StickyNoteWindow.vala b/src/Windows/StickyNoteWindow.vala index 528f8a08..05247099 100644 --- a/src/Windows/StickyNoteWindow.vala +++ b/src/Windows/StickyNoteWindow.vala @@ -143,7 +143,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { #if DEVEL title += _(" (Development)"); #endif - changed (); + has_changed (); } /** @@ -185,7 +185,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { view.monospace = data.monospace; } - private void has_changed () { + public void has_changed () { application.activate_action (NoteManager.ACTION_SAVE, null); } private void action_delete () {((Jorts.Application)this.application).note_manager.delete_note (this); this.destroy ();} From b5c645c77ed31536b4237a72c0ea3c28d224393b Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 8 Apr 2026 17:01:13 +0200 Subject: [PATCH 20/21] rollback platform --- io.github.ellie_commons.jorts.flathub.yml | 2 +- io.github.elly_code.jorts.devel.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/io.github.ellie_commons.jorts.flathub.yml b/io.github.ellie_commons.jorts.flathub.yml index b931db33..f83287a9 100644 --- a/io.github.ellie_commons.jorts.flathub.yml +++ b/io.github.ellie_commons.jorts.flathub.yml @@ -3,7 +3,7 @@ id: io.github.ellie_commons.jorts base: io.elementary.BaseApp base-version: 'circe-25.08' runtime: org.gnome.Platform -runtime-version: '50beta' +runtime-version: '49' sdk: org.gnome.Sdk command: io.github.ellie_commons.jorts diff --git a/io.github.elly_code.jorts.devel.yml b/io.github.elly_code.jorts.devel.yml index 7f99a0fe..3aadc9db 100644 --- a/io.github.elly_code.jorts.devel.yml +++ b/io.github.elly_code.jorts.devel.yml @@ -6,7 +6,7 @@ id: io.github.elly_code.jorts.devel base: io.elementary.BaseApp base-version: 'circe-25.08' runtime: org.gnome.Platform -runtime-version: '50' +runtime-version: '49' sdk: org.gnome.Sdk command: io.github.elly_code.jorts.devel From 271bb5ab71480b0cfa70309ac8e6a140de39adf1 Mon Sep 17 00:00:00 2001 From: teamcons Date: Wed, 8 Apr 2026 17:01:29 +0200 Subject: [PATCH 21/21] avoid ctrl+scroll propagating --- src/Services/ZoomController.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index 97aa3e87..bb5f5903 100644 --- a/src/Services/ZoomController.vala +++ b/src/Services/ZoomController.vala @@ -144,6 +144,6 @@ public class Jorts.ZoomController : Object { zoom_changed (ZoomType.from_delta (dy)); debug ("Go! Zoooommmmm"); - return Gdk.EVENT_PROPAGATE; + return Gdk.EVENT_STOP; } }