From 0b8d316b4464d3ff871071e18173d62f267539e9 Mon Sep 17 00:00:00 2001 From: Alice Mikhaylenko Date: Wed, 5 Feb 2025 19:19:12 +0400 Subject: [PATCH 1/2] view-switcher: Add ::visible-clicked --- src/adw-view-switcher.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/adw-view-switcher.c b/src/adw-view-switcher.c index 12fd34353..c2e6fd486 100644 --- a/src/adw-view-switcher.c +++ b/src/adw-view-switcher.c @@ -11,6 +11,7 @@ #include "config.h" #include "adw-enums.h" +#include "adw-marshalers.h" #include "adw-view-switcher.h" #include "adw-view-switcher-button-private.h" #include "adw-widget-utils-private.h" @@ -103,6 +104,13 @@ enum { LAST_PROP, }; +enum { + SIGNAL_VISIBLE_CLICKED, + SIGNAL_LAST_SIGNAL, +}; + +static guint signals[SIGNAL_LAST_SIGNAL]; + struct _AdwViewSwitcher { GtkWidget parent_instance; @@ -122,13 +130,16 @@ G_DEFINE_FINAL_TYPE (AdwViewSwitcher, adw_view_switcher, GTK_TYPE_WIDGET) static void on_button_toggled (GtkWidget *button, - GParamSpec *pspec, AdwViewSwitcher *self) { gboolean active; guint index; active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); + + if (active && self->active_button == button) + g_signal_emit (G_OBJECT (self), signals[SIGNAL_VISIBLE_CLICKED], 0); + index = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (button), "child-index")); if (active) { @@ -216,7 +227,7 @@ add_child (AdwViewSwitcher *self, gtk_orientable_set_orientation (GTK_ORIENTABLE (button), self->policy == ADW_VIEW_SWITCHER_POLICY_WIDE ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL); - g_signal_connect (button, "notify::active", G_CALLBACK (on_button_toggled), self); + g_signal_connect (button, "toggled", G_CALLBACK (on_button_toggled), self); g_signal_connect (page, "notify", G_CALLBACK (on_page_updated), self); g_hash_table_insert (self->buttons, g_object_ref (page), button); @@ -459,6 +470,27 @@ adw_view_switcher_class_init (AdwViewSwitcherClass *klass) g_object_class_install_properties (object_class, LAST_PROP, props); + /** + * AdwViewSwitcher::visible-clicked: + * + * Emitted after the button corresponding to the visible page has been clicked. + * + * It can be used to perform actions like scrolling up. + * + * Since: 1.8 + */ + signals[SIGNAL_VISIBLE_CLICKED] = + g_signal_new ("visible-clicked", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + adw_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_signal_set_va_marshaller (signals[SIGNAL_VISIBLE_CLICKED], + G_TYPE_FROM_CLASS (klass), + adw_marshal_VOID__VOIDv); + gtk_widget_class_set_css_name (widget_class, "viewswitcher"); gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TAB_LIST); -- GitLab From 5fe269da287ced014f777dcb8cd80d0f0299f8f1 Mon Sep 17 00:00:00 2001 From: Alice Mikhaylenko Date: Wed, 5 Feb 2025 19:21:06 +0400 Subject: [PATCH 2/2] view-switcher-bar: Add ::visible-clicked --- src/adw-view-switcher-bar.c | 36 ++++++++++++++++++++++++++++++++++++ src/adw-view-switcher-bar.ui | 1 + 2 files changed, 37 insertions(+) diff --git a/src/adw-view-switcher-bar.c b/src/adw-view-switcher-bar.c index 3ca913d2c..1e61035c4 100644 --- a/src/adw-view-switcher-bar.c +++ b/src/adw-view-switcher-bar.c @@ -9,6 +9,7 @@ #include "adw-enums.h" #include "adw-breakpoint-bin-private.h" +#include "adw-marshalers.h" #include "adw-view-switcher-bar.h" /** @@ -82,6 +83,13 @@ enum { LAST_PROP, }; +enum { + SIGNAL_VISIBLE_CLICKED, + SIGNAL_LAST_SIGNAL, +}; + +static guint signals[SIGNAL_LAST_SIGNAL]; + struct _AdwViewSwitcherBar { GtkWidget parent_instance; @@ -97,6 +105,12 @@ static GParamSpec *props[LAST_PROP]; G_DEFINE_FINAL_TYPE (AdwViewSwitcherBar, adw_view_switcher_bar, GTK_TYPE_WIDGET) +static void +visible_clicked_cb (AdwViewSwitcherBar *self) +{ + g_signal_emit (G_OBJECT (self), signals[SIGNAL_VISIBLE_CLICKED], 0); +} + static void update_bar_revealed (AdwViewSwitcherBar *self) { @@ -257,6 +271,27 @@ adw_view_switcher_bar_class_init (AdwViewSwitcherBarClass *klass) g_object_class_install_properties (object_class, LAST_PROP, props); + /** + * AdwViewSwitcherBar::visible-clicked: + * + * Emitted after the button corresponding to the visible page has been clicked. + * + * It can be used to perform actions like scrolling up. + * + * Since: 1.8 + */ + signals[SIGNAL_VISIBLE_CLICKED] = + g_signal_new ("visible-clicked", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + adw_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_signal_set_va_marshaller (signals[SIGNAL_VISIBLE_CLICKED], + G_TYPE_FROM_CLASS (klass), + adw_marshal_VOID__VOIDv); + gtk_widget_class_set_css_name (widget_class, "viewswitcherbar"); gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); @@ -264,6 +299,7 @@ adw_view_switcher_bar_class_init (AdwViewSwitcherBarClass *klass) "/org/gnome/Adwaita/ui/adw-view-switcher-bar.ui"); gtk_widget_class_bind_template_child (widget_class, AdwViewSwitcherBar, action_bar); gtk_widget_class_bind_template_child (widget_class, AdwViewSwitcherBar, view_switcher); + gtk_widget_class_bind_template_callback (widget_class, visible_clicked_cb); } static void diff --git a/src/adw-view-switcher-bar.ui b/src/adw-view-switcher-bar.ui index 6f8c3c5ac..0a8429943 100644 --- a/src/adw-view-switcher-bar.ui +++ b/src/adw-view-switcher-bar.ui @@ -6,6 +6,7 @@ + 10 10 narrow -- GitLab