[Xfce4-commits] [apps/xfdashboard] 01/01: Adding support to animate actor when it was shown for the first time

noreply at xfce.org noreply at xfce.org
Tue Mar 24 06:59:57 CET 2020


This is an automated email from the git hooks/post-receive script.

n   o   m   a   d       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/xfdashboard.

commit 7cd6b31daf608dba73d06a713e3606069dc94640
Author: Stephan Haller <nomad at froevel.de>
Date:   Tue Mar 24 06:58:47 2020 +0100

    Adding support to animate actor when it was shown for the first time
---
 data/themes/xfdashboard/animations.xml |  8 +++
 libxfdashboard/actor.c                 | 89 +++++++++++++++++++++++++++++-----
 libxfdashboard/theme-animation.c       |  8 ++-
 3 files changed, 93 insertions(+), 12 deletions(-)

diff --git a/data/themes/xfdashboard/animations.xml b/data/themes/xfdashboard/animations.xml
index 049b5b3..d049f70 100644
--- a/data/themes/xfdashboard/animations.xml
+++ b/data/themes/xfdashboard/animations.xml
@@ -14,4 +14,12 @@
 			</apply>
 		</timeline>
 	</trigger>
+
+	<trigger id="application-startup" sender="XfdashboardStageInterface" signal="created">
+		<timeline delay="0" duration="500" mode="linear">
+			<apply>
+				<property name="opacity" from="0" to="255" />
+			</apply>
+		</timeline>
+	</trigger>
 </animations>
diff --git a/libxfdashboard/actor.c b/libxfdashboard/actor.c
index 43a97fe..bf70284 100644
--- a/libxfdashboard/actor.c
+++ b/libxfdashboard/actor.c
@@ -50,17 +50,22 @@ void xfdashboard_actor_base_class_finalize(XfdashboardActorClass *klass);
 struct _XfdashboardActorPrivate
 {
 	/* Properties related */
-	gboolean		canFocus;
-	gchar			*effects;
+	gboolean				canFocus;
+	gchar					*effects;
 
-	gchar			*styleClasses;
-	gchar			*stylePseudoClasses;
+	gchar					*styleClasses;
+	gchar					*stylePseudoClasses;
 
 	/* Instance related */
-	GHashTable		*lastThemeStyleSet;
-	gboolean		forceStyleRevalidation;
-	gboolean		isFirstParent;
-	GSList			*animations;
+	GHashTable				*lastThemeStyleSet;
+	gboolean				forceStyleRevalidation;
+
+	gboolean				isFirstParent;
+
+	gboolean				firstTimeMapped;
+	XfdashboardAnimation	*firstTimeMappedAnimation;
+
+	GSList					*animations;
 };
 
 /* Properties */
@@ -181,19 +186,73 @@ static gboolean _xfdashboard_actor_hashtable_is_duplicate_key(gpointer inKey,
 	return(g_hash_table_lookup_extended(otherHashtable, inKey, NULL, NULL));
 }
 
+/* 'created' animation has completed */
+static void _xfdashboard_actor_first_time_created_animation_done(XfdashboardAnimation *inAnimation,
+																	gpointer inUserData)
+{
+	XfdashboardActor				*self;
+	XfdashboardActorPrivate			*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_ANIMATION(inAnimation));
+	g_return_if_fail(XFDASHBOARD_IS_ACTOR(inUserData));
+
+	self=XFDASHBOARD_ACTOR(inUserData);
+	priv=self->priv;
+
+	/* Mark completed first-time animation as removed */
+	priv->firstTimeMappedAnimation=NULL;
+}
+
 /* Actor was mapped or unmapped */
 static void _xfdashboard_actor_on_mapped_changed(GObject *inObject,
 													GParamSpec *inSpec,
 													gpointer inUserData)
 {
-	XfdashboardActor		*self;
+	XfdashboardActor			*self;
+	XfdashboardActorPrivate		*priv;
 
 	g_return_if_fail(XFDASHBOARD_IS_ACTOR(inObject));
 
 	self=XFDASHBOARD_ACTOR(inObject);
+	priv=self->priv;
 
-	/* Invalide styling to get it recomputed */
-	xfdashboard_stylable_invalidate(XFDASHBOARD_STYLABLE(self));
+	/* If actor was mapped, invalidate styling and check for first-time animation */
+	if(clutter_actor_is_mapped(CLUTTER_ACTOR(self)))
+	{
+		/* Invalide styling to get it recomputed if actor was mapped */
+		xfdashboard_stylable_invalidate(XFDASHBOARD_STYLABLE(self));
+
+		/* If actor was mapped for the first time then check if an animation
+		 * should be created and run.
+		 */
+		if(!priv->firstTimeMapped)
+		{
+			g_assert(!priv->firstTimeMappedAnimation);
+
+			/* Lookup animation for create signal and if any found (i.e. has an ID),
+			 * run it.
+			 */
+			priv->firstTimeMappedAnimation=xfdashboard_animation_new(XFDASHBOARD_ACTOR(self), "created");
+			if(!xfdashboard_animation_get_id(priv->firstTimeMappedAnimation))
+			{
+				/* Empty or invalid animation, so release allocated resources and return */
+				g_object_unref(priv->firstTimeMappedAnimation);
+				priv->firstTimeMappedAnimation=NULL;
+
+				return;
+			}
+
+			/* Start animation */
+			xfdashboard_animation_run(priv->firstTimeMappedAnimation, _xfdashboard_actor_first_time_created_animation_done, self);
+			XFDASHBOARD_DEBUG(self, ANIMATION,
+									"Found and starting animation '%s' for created signal at actor %s",
+									xfdashboard_animation_get_id(priv->firstTimeMappedAnimation),
+									G_OBJECT_TYPE_NAME(self));
+
+			/* Set flag that first-time visible happened at this actor */
+			priv->firstTimeMapped=TRUE;
+		}
+	}
 }
 
 /* Actor was (re)named */
@@ -1143,6 +1202,12 @@ static void _xfdashboard_actor_dispose(GObject *inObject)
 		priv->lastThemeStyleSet=NULL;
 	}
 
+	if(priv->firstTimeMappedAnimation)
+	{
+		g_object_unref(priv->firstTimeMappedAnimation);
+		priv->firstTimeMappedAnimation=NULL;
+	}
+
 	if(priv->animations)
 	{
 		g_slist_free_full(priv->animations, (GDestroyNotify)_xfdashboard_actor_animation_entry_free);
@@ -1306,6 +1371,8 @@ void xfdashboard_actor_init(XfdashboardActor *self)
 	priv->stylePseudoClasses=NULL;
 	priv->lastThemeStyleSet=NULL;
 	priv->isFirstParent=TRUE;
+	priv->firstTimeMapped=FALSE;
+	priv->firstTimeMappedAnimation=NULL;
 	priv->animations=NULL;
 
 	/* Connect signals */
diff --git a/libxfdashboard/theme-animation.c b/libxfdashboard/theme-animation.c
index 4203d8d..01d1bd4 100644
--- a/libxfdashboard/theme-animation.c
+++ b/libxfdashboard/theme-animation.c
@@ -1857,9 +1857,15 @@ XfdashboardAnimation* xfdashboard_theme_animation_create(XfdashboardThemeAnimati
 
 				/* Check if actor has property to animate */
 				propertySpec=g_object_class_find_property(G_OBJECT_GET_CLASS(actor), propertyTargetSpec->name);
+				if(!propertySpec && CLUTTER_IS_ANIMATABLE(actor))
+				{
+					propertySpec=clutter_animatable_find_property(CLUTTER_ANIMATABLE(actor), propertyTargetSpec->name);
+				}
+
 				if(!propertySpec)
 				{
-					g_warning(_("Cannot create animation for non-existing property '%s' at actor of type '%s'"),
+					g_warning(_("Cannot create animation '%s' for non-existing property '%s' at actor of type '%s'"),
+								spec->id,
 								propertyTargetSpec->name,
 								G_OBJECT_TYPE_NAME(actor));
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list