aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiquel Lionel <lionel@les-miquelots.net>2023-10-13 00:05:26 +0200
committerMiquel Lionel <lionel@les-miquelots.net>2023-10-18 01:37:45 +0200
commit1c4d47f35274d560ee9eb855d7f1c45dd4dd140c (patch)
tree75a62a5828459d6f1481bee0f5701901edf6a655
parent86b101900c28a09ebc6bcbf212f9969f70ce51b7 (diff)
downloaddino-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.vala19
-rw-r--r--main/data/gtk/help-overlay.ui18
-rw-r--r--main/data/settings_dialog.ui13
-rw-r--r--main/src/ui/application.vala33
-rw-r--r--main/src/ui/settings_dialog.vala6
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">&lt;ctrl&gt;plus</property>
+ <property name="title" translatable="yes">Increase text size</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="accelerator">&lt;ctrl&gt;minus</property>
+ <property name="title" translatable="yes">Lower text size</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="accelerator">&lt;ctrl&gt;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(); });
}
}