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:
parent
141373f0ba
commit
7ab07b05e9
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user