[mutter] clutter/timeline: Add way to associate a timeline to an actor
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter/timeline: Add way to associate a timeline to an actor
- Date: Thu, 2 Jul 2020 20:52:24 +0000 (UTC)
commit 203c20d7ad376fd030d37e422c0613bd92cfbfc9
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Fri Apr 17 09:00:18 2020 +0200
clutter/timeline: Add way to associate a timeline to an actor
The association is inactive, as in it doesn't do anything yet, but it
will later be used to determine what frame clock should be driving the
timeline by looking at what stage view the actor is currently on.
This also adapts sub types (ClutterPropertyTransition) to have
constuctors that takes an actor just as the new ClutterTimeline
constructor.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285
clutter/clutter/clutter-property-transition.c | 20 +++++
clutter/clutter/clutter-property-transition.h | 4 +
clutter/clutter/clutter-timeline.c | 106 +++++++++++++++++++++++++-
clutter/clutter/clutter-timeline.h | 11 +++
4 files changed, 140 insertions(+), 1 deletion(-)
---
diff --git a/clutter/clutter/clutter-property-transition.c b/clutter/clutter/clutter-property-transition.c
index d18acf39ed..f8c96761d8 100644
--- a/clutter/clutter/clutter-property-transition.c
+++ b/clutter/clutter/clutter-property-transition.c
@@ -278,6 +278,26 @@ clutter_property_transition_init (ClutterPropertyTransition *self)
self->priv = clutter_property_transition_get_instance_private (self);
}
+/**
+ * clutter_property_transition_new_for_actor:
+ * @actor: a #ClutterActor
+ * @property_name: (allow-none): a property of @animatable, or %NULL
+ *
+ * Creates a new #ClutterPropertyTransition.
+ *
+ * Return value: (transfer full): the newly created #ClutterPropertyTransition.
+ * Use g_object_unref() when done
+ */
+ClutterTransition *
+clutter_property_transition_new_for_actor (ClutterActor *actor,
+ const char *property_name)
+{
+ return g_object_new (CLUTTER_TYPE_PROPERTY_TRANSITION,
+ "actor", actor,
+ "property-name", property_name,
+ NULL);
+}
+
/**
* clutter_property_transition_new:
* @property_name: (allow-none): a property of @animatable, or %NULL
diff --git a/clutter/clutter/clutter-property-transition.h b/clutter/clutter/clutter-property-transition.h
index 0a37668766..e148390abd 100644
--- a/clutter/clutter/clutter-property-transition.h
+++ b/clutter/clutter/clutter-property-transition.h
@@ -79,7 +79,11 @@ CLUTTER_EXPORT
GType clutter_property_transition_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
+ClutterTransition * clutter_property_transition_new_for_actor (ClutterActor *actor,
+ const char
*property_name);
+
ClutterTransition * clutter_property_transition_new (const char
*property_name);
+
CLUTTER_EXPORT
void clutter_property_transition_set_property_name (ClutterPropertyTransition
*transition,
const char
*property_name);
diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c
index dea89bb385..9bf0e0e063 100644
--- a/clutter/clutter/clutter-timeline.c
+++ b/clutter/clutter/clutter-timeline.c
@@ -113,6 +113,9 @@ struct _ClutterTimelinePrivate
ClutterFrameClock *frame_clock;
+ ClutterActor *actor;
+ gulong actor_destroy_handler_id;
+
guint delay_id;
/* The total length in milliseconds of this timeline */
@@ -174,6 +177,7 @@ enum
{
PROP_0,
+ PROP_ACTOR,
PROP_DELAY,
PROP_DURATION,
PROP_DIRECTION,
@@ -292,6 +296,60 @@ clutter_timeline_add_marker_internal (ClutterTimeline *timeline,
g_hash_table_insert (priv->markers_by_name, marker->name, marker);
}
+static void
+on_actor_destroyed (ClutterActor *actor,
+ ClutterTimeline *timeline)
+{
+ ClutterTimelinePrivate *priv = timeline->priv;
+
+ priv->actor = NULL;
+}
+
+/**
+ * clutter_timeline_get_actor:
+ * @timeline: a #ClutterTimeline
+ *
+ * Get the actor the timeline is associated with.
+ *
+ * Returns: (transfer none): the associated #ClutterActor
+ */
+ClutterActor *
+clutter_timeline_get_actor (ClutterTimeline *timeline)
+{
+ ClutterTimelinePrivate *priv = timeline->priv;
+
+ return priv->actor;
+}
+
+/**
+ * clutter_timeline_set_actor:
+ * @timeline: a #ClutterTimeline
+ * @actor: (nullable): a #ClutterActor
+ *
+ * Set the actor the timeline is associated with.
+ */
+void
+clutter_timeline_set_actor (ClutterTimeline *timeline,
+ ClutterActor *actor)
+{
+ ClutterTimelinePrivate *priv = timeline->priv;
+
+ if (priv->actor)
+ {
+ g_clear_signal_handler (&priv->actor_destroy_handler_id, priv->actor);
+ }
+
+ priv->actor = actor;
+
+ if (priv->actor)
+ {
+ priv->actor_destroy_handler_id =
+ g_signal_connect (priv->actor, "destroy",
+ G_CALLBACK (on_actor_destroyed),
+ timeline);
+ }
+}
+
/* Scriptable */
typedef struct _ParseClosure {
ClutterTimeline *timeline;
@@ -433,6 +491,10 @@ clutter_timeline_set_property (GObject *object,
switch (prop_id)
{
+ case PROP_ACTOR:
+ clutter_timeline_set_actor (timeline, g_value_get_object (value));
+ break;
+
case PROP_DELAY:
clutter_timeline_set_delay (timeline, g_value_get_uint (value));
break;
@@ -478,6 +540,10 @@ clutter_timeline_get_property (GObject *object,
switch (prop_id)
{
+ case PROP_ACTOR:
+ g_value_set_object (value, priv->actor);
+ break;
+
case PROP_DELAY:
g_value_set_uint (value, priv->delay);
break;
@@ -575,6 +641,12 @@ clutter_timeline_dispose (GObject *object)
clutter_timeline_cancel_delay (self);
+ if (priv->actor)
+ {
+ g_clear_signal_handler (&priv->actor_destroy_handler_id, priv->actor);
+ priv->actor = NULL;
+ }
+
if (priv->progress_notify != NULL)
{
priv->progress_notify (priv->progress_data);
@@ -591,6 +663,18 @@ clutter_timeline_class_init (ClutterTimelineClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ /**
+ * ClutterTimeline::actor:
+ *
+ * The actor the timeline is associated with. This will determine what frame
+ * clock will drive it.
+ */
+ obj_props[PROP_ACTOR] =
+ g_param_spec_object ("actor",
+ P_("Actor"),
+ P_("Associated ClutterActor"),
+ CLUTTER_TYPE_ACTOR,
+ G_PARAM_CONSTRUCT | CLUTTER_PARAM_READWRITE);
/**
* ClutterTimeline:delay:
*
@@ -1398,12 +1482,32 @@ clutter_timeline_new (guint duration_ms)
NULL);
}
+/**
+ * clutter_timeline_new_for_actor:
+ * @actor: The #ClutterActor the timeline is associated with
+ * @duration_ms: Duration of the timeline in milliseconds
+ *
+ * Creates a new #ClutterTimeline with a duration of @duration milli seconds.
+ *
+ * Return value: the newly created #ClutterTimeline instance. Use
+ * g_object_unref() when done using it
+ */
+ClutterTimeline *
+clutter_timeline_new_for_actor (ClutterActor *actor,
+ unsigned int duration_ms)
+{
+ return g_object_new (CLUTTER_TYPE_TIMELINE,
+ "duration", duration_ms,
+ "actor", actor,
+ NULL);
+}
+
/**
* clutter_timeline_new_for_frame_clock:
* @frame_clock: The #ClutterFrameClock the timeline is driven by
* @duration_ms: Duration of the timeline in milliseconds
*
- * Creates a new #ClutterTimeline with a duration of @duration milli seconds.
+ * Creates a new #ClutterTimeline with a duration of @duration_ms milli seconds.
*
* Return value: the newly created #ClutterTimeline instance. Use
* g_object_unref() when done using it
diff --git a/clutter/clutter/clutter-timeline.h b/clutter/clutter/clutter-timeline.h
index 265c15318e..fd5895a447 100644
--- a/clutter/clutter/clutter-timeline.h
+++ b/clutter/clutter/clutter-timeline.h
@@ -121,10 +121,21 @@ GType clutter_timeline_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterTimeline * clutter_timeline_new (guint
duration_ms);
+CLUTTER_EXPORT
+ClutterTimeline * clutter_timeline_new_for_actor (ClutterActor
*actor,
+ unsigned int
duration_ms);
+
CLUTTER_EXPORT
ClutterTimeline * clutter_timeline_new_for_frame_clock (ClutterFrameClock
*frame_clock,
unsigned int
duration_ms);
+CLUTTER_EXPORT
+ClutterActor * clutter_timeline_get_actor (ClutterTimeline
*timeline);
+
+CLUTTER_EXPORT
+void clutter_timeline_set_actor (ClutterTimeline
*timeline,
+ ClutterActor
*actor);
+
CLUTTER_EXPORT
guint clutter_timeline_get_duration (ClutterTimeline
*timeline);
CLUTTER_EXPORT
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]