summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Borges <felipeborges@gnome.org>2017-02-09 20:01:40 +0100
committerFelipe Borges <felipeborges@gnome.org>2017-02-13 11:58:42 +0100
commitb8983f906f217729b2e335a42e74107b7a06e79d (patch)
treeeea4cea77b8aa278e4c95f2ac4ea69406b87ca1b
parentbce05cb8bd2a0e0b071f5f3842086f0bf173f47b (diff)
downloadgnome-control-center-b8983f906f217729b2e335a42e74107b7a06e79d.tar.gz
user-accounts: Animate the Carousel Arrow
https://bugzilla.gnome.org/show_bug.cgi?id=778405
-rw-r--r--panels/user-accounts/data/carousel.css3
-rw-r--r--panels/user-accounts/um-carousel.c26
2 files changed, 25 insertions, 4 deletions
diff --git a/panels/user-accounts/data/carousel.css b/panels/user-accounts/data/carousel.css
index 6dd847909..738562cee 100644
--- a/panels/user-accounts/data/carousel.css
+++ b/panels/user-accounts/data/carousel.css
@@ -12,6 +12,9 @@
.carousel-arrow {
border-bottom-color: @borders;
margin-bottom: -1px;
+ animation-duration: 200ms;
+ animation-timing-function: ease-in-out;
+ animation-fill-mode: forwards;
}
.carousel-inner-arrow {
diff --git a/panels/user-accounts/um-carousel.c b/panels/user-accounts/um-carousel.c
index 722d91036..6dc115f42 100644
--- a/panels/user-accounts/um-carousel.c
+++ b/panels/user-accounts/um-carousel.c
@@ -60,6 +60,7 @@ struct _UmCarousel {
UmCarouselItem *selected_item;
GtkWidget *last_box;
GtkWidget *arrow;
+ gint arrow_start_x;
/* Widgets */
GtkStack *stack;
@@ -121,9 +122,13 @@ um_carousel_move_arrow (UmCarousel *self)
gtk_style_context_remove_provider (context, self->provider);
g_clear_object (&self->provider);
- css = g_strdup_printf ("* {\n"
- " margin-left: %dpx;\n"
- "}\n", end_x);
+ css = g_strdup_printf ("@keyframes arrow_keyframes-%d {\n"
+ " from { margin-left: %dpx; }\n"
+ " to { margin-left: %dpx; }\n"
+ "}\n"
+ "* {\n"
+ " animation-name: arrow_keyframes-%d;\n"
+ "}\n", end_x, self->arrow_start_x, end_x, end_x);
self->provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (self->provider), css, -1, NULL);
@@ -187,6 +192,9 @@ on_item_toggled (UmCarouselItem *item,
{
UmCarousel *self = UM_CAROUSEL (user_data);
+ if (self->selected_item != NULL)
+ self->arrow_start_x = um_carousel_item_get_x (self->selected_item, self);
+
self->selected_item = item;
g_signal_emit (user_data, signals[ITEM_ACTIVATED], 0, item);
@@ -342,6 +350,16 @@ um_carousel_class_init (UmCarouselClass *klass)
}
static void
+on_size_allocate (UmCarousel *self)
+{
+ if (self->selected_item == NULL)
+ return;
+
+ self->arrow_start_x = um_carousel_item_get_x (self->selected_item, self);
+ um_carousel_move_arrow (self);
+}
+
+static void
um_carousel_init (UmCarousel *self)
{
GtkStyleProvider *provider;
@@ -358,5 +376,5 @@ um_carousel_init (UmCarousel *self)
g_object_unref (provider);
- g_signal_connect_swapped (self->stack, "size-allocate", G_CALLBACK (um_carousel_move_arrow), self);
+ g_signal_connect_swapped (self->stack, "size-allocate", G_CALLBACK (on_size_allocate), self);
}