From 1c4d47f35274d560ee9eb855d7f1c45dd4dd140c Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Fri, 13 Oct 2023 00:05:26 +0200 Subject: Add keyboard shortcut and setting to increase text size (fixes #978) * Can zoom in / out or reset zoom levels via shortcuts * Can change zoom value via global preferences window --- main/src/ui/application.vala | 33 ++++++++++++++++++++++++++++++--- main/src/ui/settings_dialog.vala | 6 +++++- 2 files changed, 35 insertions(+), 4 deletions(-) (limited to 'main/src') 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 = {"G", null}; private const string[] KEY_COMBINATION_LOOP_CONVERSATIONS = {"Tab", null}; private const string[] KEY_COMBINATION_LOOP_CONVERSATIONS_REV = {"Tab", null}; + private const string[] KEY_COMBINATION_ZOOM_IN = {"KP_Add", "plus", null}; + private const string[] KEY_COMBINATION_ZOOM_OUT = {"KP_Subtract","minus", null}; + private const string[] KEY_COMBINATION_ZOOM_RESET = {"0", "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(); }); } } -- cgit v1.2.3-70-g09d2