st/box-layout: Add orientation property

Using "vertical: false" to express "horizontal" has always been a
bit awkward. While we have stuck to the existing property for a long
time, transitioning to an `orientation` property like in GTK and
Clutter seems better.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3614>
This commit is contained in:
Florian Müllner 2025-01-24 13:48:59 +01:00
parent b01d429266
commit 01541929eb
2 changed files with 69 additions and 8 deletions

View File

@ -58,6 +58,7 @@
enum { enum {
PROP_0, PROP_0,
PROP_ORIENTATION,
PROP_VERTICAL, PROP_VERTICAL,
N_PROPS N_PROPS
@ -85,6 +86,11 @@ st_box_layout_get_property (GObject *object,
switch (property_id) switch (property_id)
{ {
case PROP_ORIENTATION:
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (object));
orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout));
g_value_set_enum (value, orientation);
break;
case PROP_VERTICAL: case PROP_VERTICAL:
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (object)); layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (object));
orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)); orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout));
@ -106,6 +112,9 @@ st_box_layout_set_property (GObject *object,
switch (property_id) switch (property_id)
{ {
case PROP_ORIENTATION:
st_box_layout_set_orientation (box, g_value_get_enum (value));
break;
case PROP_VERTICAL: case PROP_VERTICAL:
st_box_layout_set_vertical (box, g_value_get_boolean (value)); st_box_layout_set_vertical (box, g_value_get_boolean (value));
break; break;
@ -136,6 +145,7 @@ on_layout_orientation_changed (GObject *object,
gpointer user_data) gpointer user_data)
{ {
GObject *box = user_data; GObject *box = user_data;
g_object_notify_by_pspec (box, props[PROP_ORIENTATION]);
g_object_notify_by_pspec (box, props[PROP_VERTICAL]); g_object_notify_by_pspec (box, props[PROP_VERTICAL]);
} }
@ -166,6 +176,18 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
widget_class->style_changed = st_box_layout_style_changed; widget_class->style_changed = st_box_layout_style_changed;
/**
* StBoxLayout:orientation:
*
* The orientation of the #StBoxLayout, either horizontal or
* vertical
*/
props[PROP_ORIENTATION] =
g_param_spec_enum ("orientation", NULL, NULL,
CLUTTER_TYPE_ORIENTATION,
CLUTTER_ORIENTATION_HORIZONTAL,
ST_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
/** /**
* StBoxLayout:vertical: * StBoxLayout:vertical:
* *
@ -204,6 +226,47 @@ st_box_layout_new (void)
return g_object_new (ST_TYPE_BOX_LAYOUT, NULL); return g_object_new (ST_TYPE_BOX_LAYOUT, NULL);
} }
/**
* st_box_layout_set_orientation:
* @box: A #StBoxLayout
* @orientation: the orientation of the #StBoxLayout
*
* Set the value of the #StBoxLayout:orientation property
*/
void
st_box_layout_set_orientation (StBoxLayout *box,
ClutterOrientation orientation)
{
ClutterLayoutManager *layout;
g_return_if_fail (ST_IS_BOX_LAYOUT (box));
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box));
if (clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)) != orientation)
clutter_box_layout_set_orientation (CLUTTER_BOX_LAYOUT (layout), orientation);
}
/**
* st_box_layout_get_orientation:
* @box: A #StBoxLayout
*
* Get the value of the #StBoxLayout:orientation property.
*
* Returns: the orientation
*/
ClutterOrientation
st_box_layout_get_orientation (StBoxLayout *box)
{
ClutterLayoutManager *layout;
g_return_val_if_fail (ST_IS_BOX_LAYOUT (box),
CLUTTER_ORIENTATION_HORIZONTAL);
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box));
return clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout));
}
/** /**
* st_box_layout_set_vertical: * st_box_layout_set_vertical:
* @box: A #StBoxLayout * @box: A #StBoxLayout
@ -215,17 +278,13 @@ void
st_box_layout_set_vertical (StBoxLayout *box, st_box_layout_set_vertical (StBoxLayout *box,
gboolean vertical) gboolean vertical)
{ {
ClutterLayoutManager *layout;
ClutterOrientation orientation; ClutterOrientation orientation;
g_return_if_fail (ST_IS_BOX_LAYOUT (box)); g_return_if_fail (ST_IS_BOX_LAYOUT (box));
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box));
orientation = vertical ? CLUTTER_ORIENTATION_VERTICAL orientation = vertical ? CLUTTER_ORIENTATION_VERTICAL
: CLUTTER_ORIENTATION_HORIZONTAL; : CLUTTER_ORIENTATION_HORIZONTAL;
st_box_layout_set_orientation (box, orientation);
if (clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)) != orientation)
clutter_box_layout_set_orientation (CLUTTER_BOX_LAYOUT (layout), orientation);
} }
/** /**
@ -239,12 +298,10 @@ st_box_layout_set_vertical (StBoxLayout *box,
gboolean gboolean
st_box_layout_get_vertical (StBoxLayout *box) st_box_layout_get_vertical (StBoxLayout *box)
{ {
ClutterLayoutManager *layout;
ClutterOrientation orientation; ClutterOrientation orientation;
g_return_val_if_fail (ST_IS_BOX_LAYOUT (box), FALSE); g_return_val_if_fail (ST_IS_BOX_LAYOUT (box), FALSE);
layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box)); orientation = st_box_layout_get_orientation (box);
orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout));
return orientation == CLUTTER_ORIENTATION_VERTICAL; return orientation == CLUTTER_ORIENTATION_VERTICAL;
} }

View File

@ -45,6 +45,10 @@ struct _StBoxLayout
StWidget *st_box_layout_new (void); StWidget *st_box_layout_new (void);
ClutterOrientation st_box_layout_get_orientation (StBoxLayout *box);
void st_box_layout_set_orientation (StBoxLayout *box,
ClutterOrientation orientation);
void st_box_layout_set_vertical (StBoxLayout *box, void st_box_layout_set_vertical (StBoxLayout *box,
gboolean vertical); gboolean vertical);
gboolean st_box_layout_get_vertical (StBoxLayout *box); gboolean st_box_layout_get_vertical (StBoxLayout *box);