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 + + + Scroll to Top + app.scroll-page-to-top + + 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)