diff options
author | Miquel Lionel <lionel@les-miquelots.net> | 2023-10-13 00:05:26 +0200 |
---|---|---|
committer | Miquel Lionel <lionel@les-miquelots.net> | 2023-10-18 01:37:45 +0200 |
commit | 1c4d47f35274d560ee9eb855d7f1c45dd4dd140c (patch) | |
tree | 75a62a5828459d6f1481bee0f5701901edf6a655 | |
parent | 86b101900c28a09ebc6bcbf212f9969f70ce51b7 (diff) | |
download | dino-add-kbd-shortcut-to-zoom-text.tar.gz dino-add-kbd-shortcut-to-zoom-text.zip |
Add keyboard shortcut and setting to increase text size (fixes #978)add-kbd-shortcut-to-zoom-text
* Can zoom in / out or reset zoom levels via shortcuts
* Can change zoom value via global preferences window
-rw-r--r-- | libdino/src/entity/settings.vala | 19 | ||||
-rw-r--r-- | main/data/gtk/help-overlay.ui | 18 | ||||
-rw-r--r-- | main/data/settings_dialog.ui | 13 | ||||
-rw-r--r-- | main/src/ui/application.vala | 33 | ||||
-rw-r--r-- | main/src/ui/settings_dialog.vala | 6 |
5 files changed, 84 insertions, 5 deletions
diff --git a/libdino/src/entity/settings.vala b/libdino/src/entity/settings.vala index 0b09e9b9..a488e20f 100644 --- a/libdino/src/entity/settings.vala +++ b/libdino/src/entity/settings.vala @@ -12,6 +12,7 @@ public class Settings : Object { notifications_ = col_to_bool_or_default("notifications", true); convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true); check_spelling = col_to_bool_or_default("check_spelling", true); + zoom_level = col_to_int_or_default("zoom_level", 100); } private bool col_to_bool_or_default(string key, bool def) { @@ -19,6 +20,24 @@ public class Settings : Object { return val != null ? bool.parse(val) : def; } + private int col_to_int_or_default(string key, int def) { + string? val = db.settings.select({db.settings.value}).with(db.settings.key, "=", key)[db.settings.value]; + return val != null ? int.parse(val) : def; + } + + public int zoom_level_; + public int zoom_level { + get { return zoom_level_; } + set { + if (value == zoom_level_) return; + db.settings.upsert() + .value(db.settings.key, "zoom_level", true) + .value(db.settings.value, value.to_string()) + .perform(); + zoom_level_ = value; + } + } + private bool send_typing_; public bool send_typing { get { return send_typing_; } diff --git a/main/data/gtk/help-overlay.ui b/main/data/gtk/help-overlay.ui index 17b0555c..bb3bb437 100644 --- a/main/data/gtk/help-overlay.ui +++ b/main/data/gtk/help-overlay.ui @@ -26,6 +26,24 @@ <property name="title" translatable="yes">Keyboard shortcuts</property> </object> </child> + <child> + <object class="GtkShortcutsShortcut"> + <property name="accelerator"><ctrl>plus</property> + <property name="title" translatable="yes">Increase text size</property> + </object> + </child> + <child> + <object class="GtkShortcutsShortcut"> + <property name="accelerator"><ctrl>minus</property> + <property name="title" translatable="yes">Lower text size</property> + </object> + </child> + <child> + <object class="GtkShortcutsShortcut"> + <property name="accelerator"><ctrl>0</property> + <property name="title" translatable="yes">Resets text size to default</property> + </object> + </child> </object> </child> <child> diff --git a/main/data/settings_dialog.ui b/main/data/settings_dialog.ui index a8b24135..ac7397a0 100644 --- a/main/data/settings_dialog.ui +++ b/main/data/settings_dialog.ui @@ -2,7 +2,7 @@ <interface> <template class="DinoUiSettingsDialog" parent="AdwPreferencesWindow"> <property name="default-width">500</property> - <property name="default-height">360</property> + <property name="default-height">420</property> <property name="modal">True</property> <property name="search-enabled">False</property> <child> @@ -11,6 +11,17 @@ <object class="AdwPreferencesGroup"> <child> <object class="AdwActionRow"> + <property name="title" translatable="yes">Set _Zoom Level</property> + <property name="use-underline">True</property> + <child type="suffix"> + <object class="GtkSpinButton" id="zoom_spinbutton"> + <property name="valign">center</property> + </object> + </child> + </object> + </child> + <child> + <object class="AdwActionRow"> <property name="title" translatable="yes">Send _Typing Notifications</property> <property name="use-underline">True</property> <property name="activatable-widget">typing_switch</property> diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala index 2e785224..1a2c93ff 100644 --- a/main/src/ui/application.vala +++ b/main/src/ui/application.vala @@ -10,6 +10,9 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { private const string[] KEY_COMBINATION_ADD_CONFERENCE = {"<Ctrl>G", null}; private const string[] KEY_COMBINATION_LOOP_CONVERSATIONS = {"<Ctrl>Tab", null}; private const string[] KEY_COMBINATION_LOOP_CONVERSATIONS_REV = {"<Ctrl><Shift>Tab", null}; + private const string[] KEY_COMBINATION_ZOOM_IN = {"<Ctrl>KP_Add", "<Ctrl>plus", null}; + private const string[] KEY_COMBINATION_ZOOM_OUT = {"<Ctrl>KP_Subtract","<Ctrl>minus", null}; + private const string[] KEY_COMBINATION_ZOOM_RESET = {"<Ctrl>0", "<Ctrl>KP_0", null}; private MainWindow window; public MainWindowController controller; @@ -32,10 +35,8 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { init(); Environment.set_application_name("Dino"); Window.set_default_icon_name("im.dino.Dino"); - create_actions(); add_main_option_entries(options); - startup.connect(() => { if (print_version) { print(@"Dino $(Dino.get_version())\n"); @@ -79,6 +80,7 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { if ((get_flags() & ApplicationFlags.IS_SERVICE) == ApplicationFlags.IS_SERVICE) window.hide_on_close = true; } window.present(); + Util.force_css(window, "* { font-size: " + settings.zoom_level.to_string() + "% ;} " ); }); } @@ -111,7 +113,12 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { break; } } - + + private void set_zoom(int step){ + if (step == 0) settings.zoom_level = 100; else settings.zoom_level += step; + Util.force_css(window, "* { font-size: " + settings.zoom_level.to_string() + "% ;} " ); + } + private void create_actions() { SimpleAction accounts_action = new SimpleAction("accounts", null); accounts_action.activate.connect(show_accounts_window); @@ -146,6 +153,23 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { }); add_action(deny_subscription_action); + + SimpleAction zoom_in_action = new SimpleAction("zoom_in", null); + zoom_in_action.activate.connect(() => { set_zoom(+5); } ); + add_action(zoom_in_action); + set_accels_for_action("app.zoom_in", KEY_COMBINATION_ZOOM_IN); + + SimpleAction zoom_out_action = new SimpleAction("zoom_out", null); + zoom_out_action.activate.connect(() => { set_zoom(-5); } ); + add_action(zoom_out_action); + set_accels_for_action("app.zoom_out", KEY_COMBINATION_ZOOM_OUT); + + SimpleAction zoom_reset_action = new SimpleAction("zoom_reset", null); + zoom_reset_action.activate.connect(() => { set_zoom(0); } ); + add_action(zoom_reset_action); + set_accels_for_action("app.zoom_reset", KEY_COMBINATION_ZOOM_RESET); + + SimpleAction contacts_action = new SimpleAction("add_chat", null); contacts_action.activate.connect(() => { AddChatDialog add_chat_dialog = new AddChatDialog(stream_interactor, stream_interactor.get_accounts()); @@ -244,6 +268,9 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application { private void show_settings_window() { SettingsDialog dialog = new SettingsDialog(); dialog.set_transient_for(get_active_window()); + dialog.zoom_spinbutton_config.value_changed.connect( () => { + Util.force_css(window, "* { font-size: " + settings.zoom_level.to_string() + "% ;} " ); + }); dialog.present(); } diff --git a/main/src/ui/settings_dialog.vala b/main/src/ui/settings_dialog.vala index 3635879c..c4890a86 100644 --- a/main/src/ui/settings_dialog.vala +++ b/main/src/ui/settings_dialog.vala @@ -5,13 +5,14 @@ namespace Dino.Ui { [GtkTemplate (ui = "/im/dino/Dino/settings_dialog.ui")] class SettingsDialog : Adw.PreferencesWindow { + [GtkChild] private unowned SpinButton zoom_spinbutton; [GtkChild] private unowned Switch typing_switch; [GtkChild] private unowned Switch marker_switch; [GtkChild] private unowned Switch notification_switch; [GtkChild] private unowned Switch emoji_switch; Dino.Entities.Settings settings = Dino.Application.get_default().settings; - + public Adjustment zoom_spinbutton_config; public SettingsDialog() { Object(); @@ -19,11 +20,14 @@ class SettingsDialog : Adw.PreferencesWindow { marker_switch.active = settings.send_marker; notification_switch.active = settings.notifications; emoji_switch.active = settings.convert_utf8_smileys; + zoom_spinbutton_config = new Adjustment((double) settings.zoom_level, 0.0, 300.0, 1.0, 5.0, 0.0); + zoom_spinbutton.set_adjustment(zoom_spinbutton_config); typing_switch.notify["active"].connect(() => { settings.send_typing = typing_switch.active; } ); marker_switch.notify["active"].connect(() => { settings.send_marker = marker_switch.active; } ); notification_switch.notify["active"].connect(() => { settings.notifications = notification_switch.active; } ); emoji_switch.notify["active"].connect(() => { settings.convert_utf8_smileys = emoji_switch.active; }); + zoom_spinbutton.value_changed.connect(() => { settings.zoom_level = zoom_spinbutton.get_value_as_int(); }); } } |