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/io.github.ellie_commons.jorts.flathub.yml b/io.github.ellie_commons.jorts.flathub.yml index 2e402a77..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 @@ -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 0e784d76..3aadc9db 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' 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 diff --git a/src/Application.vala b/src/Application.vala index 118cf306..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,31 +98,18 @@ 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"}); - 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"}); - - + 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 (); 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 = ( @@ -153,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!"); @@ -178,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;} } @@ -194,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!"); @@ -223,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/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/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 2b0eda4b..5e62d6cf 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, save_all}, + }; + 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"}); } /*************************************************/ @@ -40,7 +60,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 { @@ -81,7 +101,6 @@ public class Jorts.NoteManager : Object { /* LETSGO */ open_notes.add (note); - note.changed.connect (save_all); note.show (); note.present (); @@ -95,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 (); @@ -117,7 +135,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 () { @@ -126,7 +144,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 +177,9 @@ public class Jorts.NoteManager : Object { } } } + + public void action_new () { + debug ("New Note"); + create_note (); + } } diff --git a/src/Services/ZoomController.vala b/src/Services/ZoomController.vala index f125a03b..bb5f5903 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; @@ -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- */ @@ -44,7 +69,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 +77,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 +88,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 (); @@ -90,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) { @@ -119,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; } } 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/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/NoteView.vala b/src/Views/NoteView.vala index 60cff3f1..c53a899e 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; @@ -17,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;} @@ -32,7 +28,48 @@ 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"; + 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 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}, + }; + 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"}); + + + + orientation = VERTICAL; spacing = 0; @@ -52,14 +89,17 @@ }; actionbar = new Jorts.ActionBar (); + emoji_button = actionbar.emoji_button; emojichooser_popover = actionbar.emojichooser_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 */ @@ -67,8 +107,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); } @@ -81,16 +121,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; + NoteData.latest_mono = 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_mono () {monospace = !monospace;} } diff --git a/src/Views/PreferencesView.vala b/src/Views/PreferencesView.vala index 9418ab9e..bda43133 100644 --- a/src/Views/PreferencesView.vala +++ b/src/Views/PreferencesView.vala @@ -5,47 +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 = 0; - margin_top = Constants.SPACING_DOUBLE; - margin_bottom = Constants.SPACING_DOUBLE; - margin_start = Constants.SPACING_DOUBLE; - margin_end = Constants.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 -#if FLATHUB - var settings_spacing = Constants.SPACING_STANDARD; -#else - var settings_spacing = Constants.SPACING_STANDARD + Constants.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, - 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, @@ -54,20 +47,24 @@ 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); - Application.gsettings.bind (Constants.KEY_LIST, + Application.gsettings.bind (KEY_LIST, list_entry, "text", SettingsBindFlags.DEFAULT); - settingsbox.append (lists_box); @@ -80,7 +77,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 +90,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); @@ -102,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 }; @@ -131,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, @@ -146,8 +143,6 @@ /*************************************************/ // Bar at the bottom var actionbar = new Gtk.CenterBox () { - margin_start = Constants.SPACING_STANDARD, - margin_end = Constants.SPACING_STANDARD, valign = Gtk.Align.END, hexpand = true, vexpand = false @@ -155,7 +150,7 @@ // Monies? var support_button = new Gtk.LinkButton.with_label ( - Jorts.Constants.DONATE_LINK, + DONATE_LINK, _("Support us!") ); actionbar.start_widget = support_button; @@ -171,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); } } diff --git a/src/Widgets/ActionBar.vala b/src/Widgets/ActionBar.vala index 7d92e2b1..ec1d4cb0 100644 --- a/src/Widgets/ActionBar.vala +++ b/src/Widgets/ActionBar.vala @@ -17,72 +17,80 @@ 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 = NoteManager.ACTION_PREFIX + NoteManager.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 (Constants.STYLE_THEMEDBUTTON); + 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") - ) + ), + has_frame = false }; - delete_item.add_css_class (Constants.STYLE_THEMEDBUTTON); - delete_item.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_DELETE; + delete_item.add_css_class (STYLE_THEMEDBUTTON); /* **** RIGHT **** */ list_button = new Gtk.Button () { + action_name = TextView.ACTION_PREFIX + TextView.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") - ) + ), + has_frame = false }; - list_button.add_css_class (Constants.STYLE_THEMEDBUTTON); - list_button.action_name = StickyNoteWindow.ACTION_PREFIX + StickyNoteWindow.ACTION_TOGGLE_LIST; + list_button.add_css_class (STYLE_THEMEDBUTTON); 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") - ) + ), + has_frame = false }; - emoji_button.add_css_class (Constants.STYLE_THEMEDBUTTON); - emoji_button.popover = emojichooser_popover; + emoji_button.add_css_class (STYLE_THEMEDBUTTON); + 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") - ) + ), + has_frame = false, + direction = Gtk.ArrowType.UP }; - 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,8 +114,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,8 +122,8 @@ * StickyNoteWindow will decide itself whether to show immediately or not */ public void reveal_bind () { - Application.gsettings.bind (Constants.KEY_HIDEBAR, - this.actionbar, "revealed", + Application.gsettings.bind (KEY_HIDEBAR, + actionbar, "revealed", SettingsBindFlags.INVERT_BOOLEAN); } @@ -131,7 +138,10 @@ ); } + /** + * If user leaves list prefix blank, then they dont need the button. + */ 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/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/Popover.vala b/src/Widgets/Popover.vala index e158a3a9..4d41471d 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; @@ -26,36 +29,33 @@ 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 { - 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.w, 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.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.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.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); + } /****************/ - public Popover (Jorts.StickyNoteWindow window) { + construct { position = Gtk.PositionType.TOP; 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_DOUBLE, + margin_bottom = SPACING_DOUBLE }; color_box = new Jorts.ColorBox (); @@ -70,20 +70,16 @@ 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 - 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); } /** @@ -91,11 +87,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/ColorBox.vala b/src/Widgets/PopoverWidgets/ColorBox.vala index f6776840..a5ef4068 100644 --- a/src/Widgets/PopoverWidgets/ColorBox.vala +++ b/src/Widgets/PopoverWidgets/ColorBox.vala @@ -24,10 +24,10 @@ public class Jorts.ColorBox : Gtk.Box { public ColorBox () { orientation = Gtk.Orientation.HORIZONTAL; accessible_role = Gtk.AccessibleRole.LIST; - + homogeneous = true; spacing = 1; - margin_start = 10; - margin_end = 10; + margin_start = SPACING_DOUBLE; + margin_end = SPACING_DOUBLE; var blueberry_button = new ColorPill (Themes.BLUEBERRY); diff --git a/src/Widgets/PopoverWidgets/MonospaceBox.vala b/src/Widgets/PopoverWidgets/MonospaceBox.vala index 90735ae2..cf6da7da 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 = NoteView.ACTION_PREFIX + NoteView.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 = NoteView.ACTION_PREFIX + NoteView.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); } } diff --git a/src/Widgets/PopoverWidgets/ZoomBox.vala b/src/Widgets/PopoverWidgets/ZoomBox.vala index 33b01d2c..138e0c55 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 = ZoomController.ACTION_PREFIX + ZoomController.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 = ZoomController.ACTION_PREFIX + ZoomController.ACTION_ZOOM_DEFAULT, tooltip_markup = Granite.markup_accel_tooltip ( { "equal", "0", "KP_0" }, _("Default zoom level") @@ -51,32 +51,16 @@ public class Jorts.ZoomBox : Gtk.Box { }; var zoom_in_button = new Gtk.Button.from_icon_name ("zoom-in-symbolic") { + 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); 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..119e9699 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,52 @@ public class Jorts.TextView : Granite.HyperTextView { }; construct { + wrap_mode = Gtk.WrapMode.WORD_CHAR; 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; - 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 (Constants.KEY_LIST); - Application.gsettings.changed[Constants.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_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_pref); + section.append_item (menuitem_quit); + 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 +88,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 +219,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 b1c3faa7..05247099 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,40 +22,20 @@ 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_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_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}, + { ACTION_DELETE, action_delete} }; public StickyNoteWindow (Jorts.Application app, NoteData data) { @@ -65,6 +46,7 @@ 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); @@ -78,33 +60,25 @@ 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"); - - - - - /*****************************************/ - /* 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); + insert_action_group ("textview", textview.actions); + insert_action_group ("zoom_controller", zoom_controller.actions); - popover = new Jorts.Popover (this); - view.menu_button.popover = popover; + // 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 @@ -126,7 +100,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.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 @@ -134,16 +107,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 */ /********************************************/ @@ -158,11 +128,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); } /** @@ -173,7 +143,7 @@ public class Jorts.StickyNoteWindow : Gtk.ApplicationWindow { #if DEVEL title += _(" (Development)"); #endif - changed (); + has_changed (); } /** @@ -206,25 +176,17 @@ 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; - popover.monospace = data.monospace; + view.monospace = data.monospace; } - 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 ();} + 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 ();} }