diff --git a/data/gtk/help-overlay.ui b/data/gtk/help-overlay.ui
index 3a0b5047d..2f37b4000 100644
--- a/data/gtk/help-overlay.ui
+++ b/data/gtk/help-overlay.ui
@@ -75,6 +75,12 @@
app.scroll-page-down
+
+
+
diff --git a/src/Application.vala b/src/Application.vala
index 41908c8da..ab3c34235 100644
--- a/src/Application.vala
+++ b/src/Application.vala
@@ -78,6 +78,7 @@ namespace Tuba {
{ "back-home", back_home_activated },
{ "scroll-page-down", scroll_view_page_down },
{ "scroll-page-up", scroll_view_page_up },
+ { "scroll-page-to-top", scroll_view_page_to_top },
{ "goto-notifications", goto_notifications },
{ "open-status-url", open_status_url, "s" },
{ "answer-follow-request", answer_follow_request, "(ssb)" },
@@ -312,32 +313,69 @@ namespace Tuba {
var style_manager = Adw.StyleManager.get_default ();
ColorScheme color_scheme = (ColorScheme) settings.get_enum ("color-scheme");
style_manager.color_scheme = color_scheme.to_adwaita_scheme ();
+ enable_window_accels ();
+ enable_nav_accels ();
+ add_action_entries (APP_ENTRIES, this);
+
+ if (settings.monitor_network)
+ network_monitor.network_changed.connect (on_network_change);
+
+ if (settings.proxy != "")
+ on_proxy_change ();
+ settings.notify ["proxy"].connect (on_proxy_notify);
+
+ if (settings.analytics) app.update_analytics.begin ();
+ app.update_contributors.begin ();
+ }
+ public void enable_window_accels () {
#if DEV_MODE
set_accels_for_action ("app.dev-only-window", {"F2"});
#endif
set_accels_for_action ("app.about", {"F1"});
set_accels_for_action ("app.open-preferences", {"comma"});
set_accels_for_action ("app.compose", {"T", "N"});
- set_accels_for_action ("app.back", {"BackSpace", "KP_Left"});
- set_accels_for_action ("app.refresh", {"R", "F5"});
set_accels_for_action ("app.search", {"F"});
set_accels_for_action ("app.quit", {"Q"});
set_accels_for_action ("window.close", {"W"});
+ }
+
+ public void disable_window_accels () {
+ #if DEV_MODE
+ set_accels_for_action ("app.dev-only-window", {});
+ #endif
+ set_accels_for_action ("app.about", {});
+ set_accels_for_action ("app.open-preferences", {});
+ set_accels_for_action ("app.compose", {});
+ set_accels_for_action ("app.search", {});
+ set_accels_for_action ("app.quit", {});
+ set_accels_for_action ("window.close", {});
+ }
+
+ public void enable_nav_accels () {
+ set_accels_for_action ("app.back", {"BackSpace", "KP_Left"});
+ set_accels_for_action ("app.refresh", {"R", "F5"});
set_accels_for_action ("app.back-home", {"Home"});
set_accels_for_action ("app.scroll-page-down", {"Page_Down"});
set_accels_for_action ("app.scroll-page-up", {"Page_Up"});
- add_action_entries (APP_ENTRIES, this);
+ set_accels_for_action ("app.scroll-page-to-top", {"Home"});
+ }
- if (settings.monitor_network)
- network_monitor.network_changed.connect (on_network_change);
+ public void disable_nav_accels () {
+ set_accels_for_action ("app.back", {});
+ set_accels_for_action ("app.refresh", {});
+ set_accels_for_action ("app.back-home", {});
+ set_accels_for_action ("app.scroll-page-down", {});
+ set_accels_for_action ("app.scroll-page-up", {});
+ set_accels_for_action ("app.scroll-page-to-top", {});
+ }
- if (settings.proxy != "")
- on_proxy_change ();
- settings.notify ["proxy"].connect (on_proxy_notify);
+ public void enable_home_accel () {
+ set_accels_for_action ("app.scroll-page-to-top", {"Home"});
+ }
- if (settings.analytics) app.update_analytics.begin ();
- app.update_contributors.begin ();
+ public void disable_home_accel () {
+ set_accels_for_action ("app.scroll-page-to-top", {});
}
private void on_proxy_change (bool recover = false) {
@@ -497,6 +535,10 @@ namespace Tuba {
main_window.go_back_to_start ();
}
+ void scroll_view_page_to_top () {
+ main_window.scroll_view_to_top ();
+ }
+
void scroll_view_page_down () {
main_window.scroll_view_page ();
}
@@ -641,6 +683,11 @@ namespace Tuba {
// Static functions seem to avoid this peculiar behavior.
// dialog.translator_credits = Build.TRANSLATOR != " " ? Build.TRANSLATOR : null;
+ app.disable_window_accels ();
+ app.disable_nav_accels ();
+
+ dialog.closed.connect (on_about_closed);
+
dialog.present (main_window);
GLib.Idle.add (() => {
@@ -651,6 +698,11 @@ namespace Tuba {
});
}
+ public void on_about_closed () {
+ app.enable_window_accels ();
+ app.enable_nav_accels ();
+ }
+
public Adw.AlertDialog inform (string text, string? msg = null) {
var dlg = new Adw.AlertDialog (
text,
diff --git a/src/Dialogs/Composer/Dialog.vala b/src/Dialogs/Composer/Dialog.vala
index 06ae458dd..f4ad5ec3d 100644
--- a/src/Dialogs/Composer/Dialog.vala
+++ b/src/Dialogs/Composer/Dialog.vala
@@ -224,9 +224,15 @@ public class Tuba.Dialogs.Compose : Adw.Dialog {
stack.notify["visible-child"].connect (on_view_switched);
this.close_attempt.connect (on_exit);
+
+ app.disable_window_accels ();
+ app.disable_nav_accels ();
}
~Compose () {
+ app.enable_window_accels ();
+ app.enable_nav_accels ();
+
debug ("Destroying composer");
t_pages = {};
}
diff --git a/src/Dialogs/MainWindow.vala b/src/Dialogs/MainWindow.vala
index ed8d3d35d..1ac1c4d75 100644
--- a/src/Dialogs/MainWindow.vala
+++ b/src/Dialogs/MainWindow.vala
@@ -222,6 +222,13 @@ public class Tuba.Dialogs.MainWindow: Adw.ApplicationWindow, Saveable {
}
}
+ public void scroll_view_to_top () {
+ var c_view = navigation_view.visible_page.child as Views.Base;
+ if (c_view != null) {
+ c_view.on_scroll_to_top ();
+ }
+ }
+
// public override bool delete_event (Gdk.EventAny event) {
// window = null;
// return app.on_window_closed ();
diff --git a/src/Dialogs/NewAccount.vala b/src/Dialogs/NewAccount.vala
index 10dd85efb..998832565 100644
--- a/src/Dialogs/NewAccount.vala
+++ b/src/Dialogs/NewAccount.vala
@@ -62,10 +62,23 @@ public class Tuba.Dialogs.NewAccount: Adw.Window {
manual_auth_label.activate_link.connect (on_manual_auth);
reset ();
+
+ app.disable_window_accels ();
+ app.disable_nav_accels ();
+
+ this.close_request.connect (on_new_account_closed);
+
present ();
instance_entry.grab_focus ();
}
+ public bool on_new_account_closed () {
+ app.enable_window_accels ();
+ app.enable_nav_accels ();
+
+ return false;
+ }
+
private void add_toast (string content, uint timeout = 0) {
toast_overlay.add_toast (new Adw.Toast (content) {
timeout = timeout
diff --git a/src/Dialogs/Preferences.vala b/src/Dialogs/Preferences.vala
index a41dda501..7f8c0c88a 100644
--- a/src/Dialogs/Preferences.vala
+++ b/src/Dialogs/Preferences.vala
@@ -205,6 +205,8 @@ public class Tuba.Dialogs.Preferences : Adw.PreferencesDialog {
setup_notification_mutes ();
setup_filters ();
bind ();
+ app.disable_window_accels ();
+ app.disable_nav_accels ();
closed.connect (on_window_closed);
}
@@ -393,6 +395,9 @@ public class Tuba.Dialogs.Preferences : Adw.PreferencesDialog {
if (settings.analytics) app.update_analytics.begin ();
app.update_contributors.begin ();
+
+ app.enable_window_accels ();
+ app.enable_nav_accels ();
}
protected class AnalyticsDialog : Adw.Dialog {
diff --git a/src/Dialogs/ProfileEdit.vala b/src/Dialogs/ProfileEdit.vala
index 05fd3770e..4276e70db 100644
--- a/src/Dialogs/ProfileEdit.vala
+++ b/src/Dialogs/ProfileEdit.vala
@@ -1,6 +1,9 @@
[GtkTemplate (ui = "/dev/geopjr/Tuba/ui/dialogs/profile_edit.ui")]
public class Tuba.Dialogs.ProfileEdit : Adw.Dialog {
~ProfileEdit () {
+ app.enable_window_accels ();
+ app.enable_nav_accels ();
+
debug (@"Destroying ProfileEdit for $(profile.handle)");
}
@@ -106,6 +109,10 @@ public class Tuba.Dialogs.ProfileEdit : Adw.Dialog {
cepbtn.visible = true;
bio_row.bind_property ("expanded", cepbtn, "sensitive", GLib.BindingFlags.SYNC_CREATE);
}
+
+ app.disable_window_accels ();
+ app.disable_nav_accels ();
+
}
protected void update_style_scheme () {
diff --git a/src/Views/Base.vala b/src/Views/Base.vala
index c25c09c75..d33ffc45a 100644
--- a/src/Views/Base.vala
+++ b/src/Views/Base.vala
@@ -173,7 +173,7 @@ public class Tuba.Views.Base : Adw.BreakpointBin {
header.show_start_title_buttons = !header.show_start_title_buttons;
}
- private void on_scroll_to_top () {
+ public virtual void on_scroll_to_top () {
scrolled.scroll_child (Gtk.ScrollType.START, false);
}
diff --git a/src/Views/Lists.vala b/src/Views/Lists.vala
index d9d974750..9e9ec4d9c 100644
--- a/src/Views/Lists.vala
+++ b/src/Views/Lists.vala
@@ -216,6 +216,11 @@ public class Tuba.Views.Lists : Views.Timeline {
placeholder_text = _("New list title")
};
+ var focus_controller = new Gtk.EventControllerFocus ();
+ focus_controller.enter.connect (on_entry_focus_enter);
+ focus_controller.leave.connect (on_entry_focus_leave);
+ add_controller (focus_controller);
+
var add_action_bar = new Gtk.ActionBar () {
css_classes = { "ttl-box-no-shadow" }
};
@@ -245,6 +250,14 @@ public class Tuba.Views.Lists : Views.Timeline {
add_button.sensitive = child_entry.text.length > 0;
}
+ private void on_entry_focus_enter () {
+ app.disable_home_accel ();
+ }
+
+ private void on_entry_focus_leave () {
+ app.enable_home_accel ();
+ }
+
~Lists () {
debug ("Destroying Lists view");
}
diff --git a/src/Views/Search.vala b/src/Views/Search.vala
index 528bc261b..6f7794287 100644
--- a/src/Views/Search.vala
+++ b/src/Views/Search.vala
@@ -27,6 +27,11 @@ public class Tuba.Views.Search : Views.TabbedBase {
entry.changed.connect (on_entry_change);
entry.activate.connect (on_entry_activated);
+ var focus_controller = new Gtk.EventControllerFocus ();
+ focus_controller.enter.connect (on_entry_focus_enter);
+ focus_controller.leave.connect (on_entry_focus_leave);
+ add_controller (focus_controller);
+
var advanced_search = new Gtk.Button.from_icon_name ("tuba-funnel-symbolic") {
tooltip_text = _("Advanced Search"),
css_classes = {"flat", "circular", "entry-button"},
@@ -55,6 +60,14 @@ public class Tuba.Views.Search : Views.TabbedBase {
entry.grab_focus ();
}
+ private void on_entry_focus_enter () {
+ app.disable_home_accel ();
+ }
+
+ private void on_entry_focus_leave () {
+ app.enable_home_accel ();
+ }
+
private void on_entry_activated () {
on_entry_activate ();
}
diff --git a/src/Views/TabbedBase.vala b/src/Views/TabbedBase.vala
index 93ad097dc..f068222a3 100644
--- a/src/Views/TabbedBase.vala
+++ b/src/Views/TabbedBase.vala
@@ -157,6 +157,12 @@ public class Tuba.Views.TabbedBase : Views.Base {
base_status = null;
}
+ public override void on_scroll_to_top () {
+ var c_scrolled = stack.visible_child as Views.Base;
+ if (c_scrolled != null)
+ c_scrolled.on_scroll_to_top ();
+ }
+
public override void scroll_page (bool up = false) {
var c_scrolled = stack.visible_child as Views.Base;
if (c_scrolled != null)