clutter-actor: Expose layout manager properties to transitions

ClutterActor allows using properties of actions, constraints and effects
in transitions. Extend that functionality to allow the same for the actor's
layout manager.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/716
This commit is contained in:
Florian Müllner 2019-07-26 12:48:36 +02:00
parent 141373f0ba
commit 7ab07b05e9

View File

@ -433,7 +433,7 @@
* *
* #ClutterActor allows accessing properties of #ClutterAction, * #ClutterActor allows accessing properties of #ClutterAction,
* #ClutterEffect, and #ClutterConstraint instances associated to an actor * #ClutterEffect, and #ClutterConstraint instances associated to an actor
* instance for animation purposes. * instance for animation purposes, as well as its #ClutterLayoutManager.
* *
* In order to access a specific #ClutterAction or a #ClutterConstraint * In order to access a specific #ClutterAction or a #ClutterConstraint
* property it is necessary to set the #ClutterActorMeta:name property on the * property it is necessary to set the #ClutterActorMeta:name property on the
@ -457,6 +457,13 @@
* on the `origin` actor, and in its initial state is overlapping the actor * on the `origin` actor, and in its initial state is overlapping the actor
* to which is bound to. * to which is bound to.
* *
* As the actor has only one #ClutterLayoutManager, the syntax for accessing its
* properties is simpler:
*
* |[
* @layout.<property-name>
* ]|
*
* |[<!-- language="C" --> * |[<!-- language="C" -->
* constraint = clutter_bind_constraint_new (origin, CLUTTER_BIND_X, 0.0); * constraint = clutter_bind_constraint_new (origin, CLUTTER_BIND_X, 0.0);
* clutter_actor_meta_set_name (CLUTTER_ACTOR_META (constraint), "bind-x"); * clutter_actor_meta_set_name (CLUTTER_ACTOR_META (constraint), "bind-x");
@ -14919,6 +14926,30 @@ clutter_scriptable_iface_init (ClutterScriptableIface *iface)
iface->set_custom_property = clutter_actor_set_custom_property; iface->set_custom_property = clutter_actor_set_custom_property;
} }
static gboolean
get_layout_from_animation_property (ClutterActor *actor,
const gchar *name,
gchar **name_p)
{
g_auto (GStrv) tokens = NULL;
if (!g_str_has_prefix (name, "@layout"))
return FALSE;
tokens = g_strsplit (name, ".", -1);
if (tokens == NULL || g_strv_length (tokens) != 2)
{
CLUTTER_NOTE (ANIMATION, "Invalid property name '%s'",
name + 1);
return FALSE;
}
if (name_p != NULL)
*name_p = g_strdup (tokens[1]);
return TRUE;
}
static ClutterActorMeta * static ClutterActorMeta *
get_meta_from_animation_property (ClutterActor *actor, get_meta_from_animation_property (ClutterActor *actor,
const gchar *name, const gchar *name,
@ -14981,19 +15012,32 @@ static GParamSpec *
clutter_actor_find_property (ClutterAnimatable *animatable, clutter_actor_find_property (ClutterAnimatable *animatable,
const gchar *property_name) const gchar *property_name)
{ {
ClutterActor *actor = CLUTTER_ACTOR (animatable);
ClutterActorMeta *meta = NULL; ClutterActorMeta *meta = NULL;
GObjectClass *klass = NULL; GObjectClass *klass = NULL;
GParamSpec *pspec = NULL; GParamSpec *pspec = NULL;
gchar *p_name = NULL; gchar *p_name = NULL;
gboolean use_layout;
meta = get_meta_from_animation_property (CLUTTER_ACTOR (animatable), use_layout = get_layout_from_animation_property (actor,
property_name, property_name,
&p_name); &p_name);
if (!use_layout)
meta = get_meta_from_animation_property (actor,
property_name,
&p_name);
if (meta != NULL) if (meta != NULL)
{ {
klass = G_OBJECT_GET_CLASS (meta); klass = G_OBJECT_GET_CLASS (meta);
pspec = g_object_class_find_property (klass, p_name);
}
else if (use_layout)
{
klass = G_OBJECT_GET_CLASS (actor->priv->layout_manager);
pspec = g_object_class_find_property (klass, p_name); pspec = g_object_class_find_property (klass, p_name);
} }
else else
@ -15013,15 +15057,24 @@ clutter_actor_get_initial_state (ClutterAnimatable *animatable,
const gchar *property_name, const gchar *property_name,
GValue *initial) GValue *initial)
{ {
ClutterActor *actor = CLUTTER_ACTOR (animatable);
ClutterActorMeta *meta = NULL; ClutterActorMeta *meta = NULL;
gchar *p_name = NULL; gchar *p_name = NULL;
gboolean use_layout;
meta = get_meta_from_animation_property (CLUTTER_ACTOR (animatable), use_layout = get_layout_from_animation_property (actor,
property_name, property_name,
&p_name); &p_name);
if (!use_layout)
meta = get_meta_from_animation_property (actor,
property_name,
&p_name);
if (meta != NULL) if (meta != NULL)
g_object_get_property (G_OBJECT (meta), p_name, initial); g_object_get_property (G_OBJECT (meta), p_name, initial);
else if (use_layout)
g_object_get_property (G_OBJECT (actor->priv->layout_manager), p_name, initial);
else else
g_object_get_property (G_OBJECT (animatable), property_name, initial); g_object_get_property (G_OBJECT (animatable), property_name, initial);
@ -15174,12 +15227,21 @@ clutter_actor_set_final_state (ClutterAnimatable *animatable,
ClutterActor *actor = CLUTTER_ACTOR (animatable); ClutterActor *actor = CLUTTER_ACTOR (animatable);
ClutterActorMeta *meta = NULL; ClutterActorMeta *meta = NULL;
gchar *p_name = NULL; gchar *p_name = NULL;
gboolean use_layout;
use_layout = get_layout_from_animation_property (actor,
property_name,
&p_name);
if (!use_layout)
meta = get_meta_from_animation_property (actor,
property_name,
&p_name);
meta = get_meta_from_animation_property (actor,
property_name,
&p_name);
if (meta != NULL) if (meta != NULL)
g_object_set_property (G_OBJECT (meta), p_name, final); g_object_set_property (G_OBJECT (meta), p_name, final);
else if (use_layout)
g_object_set_property (G_OBJECT (actor->priv->layout_manager), p_name, final);
else else
{ {
GObjectClass *obj_class = G_OBJECT_GET_CLASS (animatable); GObjectClass *obj_class = G_OBJECT_GET_CLASS (animatable);