diff --git a/src/adw-view-switcher-bar.c b/src/adw-view-switcher-bar.c index 3ca913d2c5c7d43216045001e4eb2d2e2e81d029..1e61035c4f8a1eb5980ce6501e3ad19ff8078436 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 6f8c3c5ac1b170d4d77603e6d18401b97048ab30..0a84299432fd74073679657acc4bd983aae8f0e8 100644 --- a/src/adw-view-switcher-bar.ui +++ b/src/adw-view-switcher-bar.ui @@ -6,6 +6,7 @@ + 10 10 narrow diff --git a/src/adw-view-switcher.c b/src/adw-view-switcher.c index 12fd343535dd4f03285c62c5d9ab22e108bdefd1..c2e6fd486bb1021ee709f38f23bf412eeede61ae 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);