[gtk/wip/chergert/switcher-orientable] stackswitcher: implement GtkOrientable
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/switcher-orientable] stackswitcher: implement GtkOrientable
- Date: Fri, 28 May 2021 18:50:52 +0000 (UTC)
commit fda18339de7b4cf33c6f969c289a94a153d5a953
Author: Christian Hergert <chergert redhat com>
Date: Fri May 28 11:50:25 2021 -0700
stackswitcher: implement GtkOrientable
In GTK 3, GtkStackSwitcher implemented GtkOrientable via the parent GtkBox
type. In GTK 4, that was changed to inherit from GtkWidget and lost this
interface implementation.
This adds that back, along with a note in the documentation that the
interface was added in GTK 4.4.
Fixes #3988
gtk/gtkstackswitcher.c | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkstackswitcher.c b/gtk/gtkstackswitcher.c
index c738babf65..102c7271b5 100644
--- a/gtk/gtkstackswitcher.c
+++ b/gtk/gtkstackswitcher.c
@@ -26,6 +26,7 @@
#include "gtkimage.h"
#include "gtkintl.h"
#include "gtklabel.h"
+#include "gtkorientable.h"
#include "gtkprivate.h"
#include "gtkselectionmodel.h"
#include "gtktogglebutton.h"
@@ -62,6 +63,12 @@
*
* `GtkStackSwitcher` uses the %GTK_ACCESSIBLE_ROLE_TAB_LIST role
* and uses the %GTK_ACCESSIBLE_ROLE_TAB for its buttons.
+ *
+ * # Orientable
+ *
+ * Since GTK 4.4, `GtkStackSwitcher` implements `GtkOrientable` allowing
+ * the stack switcher to be made vertical with
+ * `gtk_orientable_set_orientation()`.
*/
#define TIMEOUT_EXPAND 500
@@ -75,6 +82,7 @@ struct _GtkStackSwitcher
GtkStack *stack;
GtkSelectionModel *pages;
GHashTable *buttons;
+ GtkOrientation orientation;
};
struct _GtkStackSwitcherClass
@@ -84,15 +92,18 @@ struct _GtkStackSwitcherClass
enum {
PROP_0,
- PROP_STACK
+ PROP_STACK,
+ PROP_ORIENTATION
};
-G_DEFINE_TYPE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_WIDGET)
+G_DEFINE_TYPE_WITH_CODE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_WIDGET,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL))
static void
gtk_stack_switcher_init (GtkStackSwitcher *switcher)
{
switcher->buttons = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL);
+ switcher->orientation = GTK_ORIENTATION_HORIZONTAL;
gtk_widget_add_css_class (GTK_WIDGET (switcher), "linked");
}
@@ -216,7 +227,7 @@ gtk_stack_switcher_switch_timeout (gpointer data)
return G_SOURCE_REMOVE;
}
-static void
+static void
gtk_stack_switcher_drag_enter (GtkDropControllerMotion *motion,
double x,
double y,
@@ -442,9 +453,14 @@ gtk_stack_switcher_get_property (GObject *object,
GParamSpec *pspec)
{
GtkStackSwitcher *switcher = GTK_STACK_SWITCHER (object);
+ GtkLayoutManager *box_layout = gtk_widget_get_layout_manager (GTK_WIDGET (switcher));
switch (prop_id)
{
+ case PROP_ORIENTATION:
+ g_value_set_enum (value, gtk_orientable_get_orientation (GTK_ORIENTABLE (box_layout)));
+ break;
+
case PROP_STACK:
g_value_set_object (value, switcher->stack);
break;
@@ -462,9 +478,24 @@ gtk_stack_switcher_set_property (GObject *object,
GParamSpec *pspec)
{
GtkStackSwitcher *switcher = GTK_STACK_SWITCHER (object);
+ GtkLayoutManager *box_layout = gtk_widget_get_layout_manager (GTK_WIDGET (switcher));
switch (prop_id)
{
+ case PROP_ORIENTATION:
+ {
+ GtkOrientation orientation = g_value_get_enum (value);
+ if (switcher->orientation != orientation)
+ {
+ switcher->orientation = orientation;
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (box_layout),
+ switcher->orientation);
+ gtk_widget_update_orientation (GTK_WIDGET (switcher), switcher->orientation);
+ g_object_notify (object, "orientation");
+ }
+ }
+ break;
+
case PROP_STACK:
gtk_stack_switcher_set_stack (switcher, g_value_get_object (value));
break;
@@ -520,6 +551,8 @@ gtk_stack_switcher_class_init (GtkStackSwitcherClass *class)
GTK_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
+ g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation");
+
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
gtk_widget_class_set_css_name (widget_class, I_("stackswitcher"));
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TAB_LIST);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]