[Xfce4-commits] <xfce4-weather-plugin:master> Scrollbox: Make adding and removing labels dynamic.

Harald Judt noreply at xfce.org
Sat Dec 15 21:22:07 CET 2012


Updating branch refs/heads/master
         to 2a25b43b5ef1c50209f33e99a4e0f52be96373bf (commit)
       from 2c24621109f5bb576d7b16d0c44157fcb062420b (commit)

commit 2a25b43b5ef1c50209f33e99a4e0f52be96373bf
Author: Harald Judt <h.judt at gmx.at>
Date:   Fri Dec 14 22:23:02 2012 +0100

    Scrollbox: Make adding and removing labels dynamic.
    
    These changes allow to alter the scrollbox labels seemingly on the fly,
    without disturbing the animation. Labels will be changed when fade-out
    is finished.

 panel-plugin/weather-scrollbox.c |   82 ++++++++++++++++++++++++++++----------
 panel-plugin/weather-scrollbox.h |   12 +++++-
 panel-plugin/weather.c           |    6 +-
 3 files changed, 75 insertions(+), 25 deletions(-)

diff --git a/panel-plugin/weather-scrollbox.c b/panel-plugin/weather-scrollbox.c
index 5d69b9c..b764101 100644
--- a/panel-plugin/weather-scrollbox.c
+++ b/panel-plugin/weather-scrollbox.c
@@ -39,6 +39,8 @@ static void gtk_scrollbox_size_request(GtkWidget *widget,
 static gboolean gtk_scrollbox_expose_event(GtkWidget *widget,
                                            GdkEventExpose *event);
 
+static void gtk_scrollbox_start_fade(GtkScrollbox *self);
+
 static gboolean gtk_scrollbox_fade_out(gpointer user_data);
 
 G_DEFINE_TYPE(GtkScrollbox, gtk_scrollbox, GTK_TYPE_DRAWING_AREA)
@@ -65,8 +67,10 @@ gtk_scrollbox_init(GtkScrollbox *self)
     GTK_WIDGET_SET_FLAGS(self, GTK_NO_WINDOW);
 
     self->labels = NULL;
+    self->labels_new = NULL;
     self->timeout_id = 0;
     self->offset = 0;
+    self->fade = FADE_UNSET;
     self->active = NULL;
     self->orientation = GTK_ORIENTATION_HORIZONTAL;
     self->fontname = NULL;
@@ -96,6 +100,11 @@ gtk_scrollbox_finalize(GObject *object)
     /* free all the labels */
     gtk_scrollbox_labels_free(self);
 
+    /* free all the new labels */
+    g_list_foreach(self->labels_new, (GFunc) g_object_unref, NULL);
+    g_list_free(self->labels_new);
+    self->labels_new = NULL;
+
     /* free everything else */
     g_free(self->fontname);
     pango_attr_list_unref(self->pattr_list);
@@ -211,12 +220,60 @@ gtk_scrollbox_expose_event(GtkWidget *widget,
 }
 
 
+void
+gtk_scrollbox_add_label(GtkScrollbox *self,
+                        const gint position,
+                        gchar *markup)
+{
+    PangoLayout *layout;
+
+    g_return_if_fail(GTK_IS_SCROLLBOX(self));
+
+    layout = gtk_widget_create_pango_layout(GTK_WIDGET(self), NULL);
+    pango_layout_set_markup(layout, markup, -1);
+    gtk_scrollbox_set_font(self, layout);
+    self->labels_new = g_list_insert(self->labels_new, layout, position);
+}
+
+
+void
+gtk_scrollbox_swap_labels(GtkScrollbox *self)
+{
+    guint len;
+    gint pos;
+
+    g_return_if_fail(GTK_IS_SCROLLBOX(self));
+
+    if (G_LIKELY(self->labels_new == NULL))
+        return;
+
+    pos = g_list_position(self->labels, self->active);
+    len = g_list_length(self->labels_new);
+
+    if (pos >= len)
+        pos = 0;
+
+    self->active = g_list_nth(self->labels_new, pos);
+    if (self->active == NULL)
+        self->active = self->labels_new;
+
+    gtk_scrollbox_labels_free(self);
+    self->labels = self->labels_new;
+    self->labels_new = NULL;
+
+    gtk_widget_queue_resize(GTK_WIDGET(self));
+    if (self->fade == FADE_UNSET)
+        gtk_scrollbox_start_fade(self);
+}
+
+
 static gboolean
 gtk_scrollbox_sleep(gpointer user_data)
 {
     GtkScrollbox *self = GTK_SCROLLBOX(user_data);
 
-    self->timeout_id = g_timeout_add(LABEL_SPEED, gtk_scrollbox_fade_out, self);
+    self->timeout_id = g_timeout_add(LABEL_SPEED,
+                                     gtk_scrollbox_fade_out, self);
     return FALSE;
 }
 
@@ -238,6 +295,7 @@ gtk_scrollbox_fade_in(gpointer user_data)
         (self->orientation == GTK_ORIENTATION_VERTICAL && self->offset < 0))
         return TRUE;
 
+    self->fade = FADE_OUT;
     self->timeout_id = g_timeout_add(LABEL_REFRESH, gtk_scrollbox_sleep, self);
     return FALSE;
 }
@@ -268,6 +326,7 @@ gtk_scrollbox_fade_out(gpointer user_data)
         else
             self->active = self->labels;
 
+        gtk_scrollbox_swap_labels(self);
         self->timeout_id = g_timeout_add(LABEL_SPEED,
                                          gtk_scrollbox_fade_in, self);
     }
@@ -283,14 +342,13 @@ gtk_scrollbox_start_fade(GtkScrollbox *self)
         self->timeout_id = 0;
     }
 
-    self->active = self->labels;
-
     if (g_list_length(self->labels) > 1) {
         if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
             self->offset = GTK_WIDGET(self)->allocation.height;
         else
             self->offset = 0;
 
+        self->fade = FADE_IN;
         self->timeout_id = g_timeout_add(LABEL_SPEED,
                                          gtk_scrollbox_fade_in,
                                          self);
@@ -300,24 +358,6 @@ gtk_scrollbox_start_fade(GtkScrollbox *self)
 
 
 void
-gtk_scrollbox_set_label(GtkScrollbox *self,
-                        const gint position,
-                        gchar *markup)
-{
-    PangoLayout *layout;
-
-    g_return_if_fail(GTK_IS_SCROLLBOX(self));
-
-    layout = gtk_widget_create_pango_layout(GTK_WIDGET(self), NULL);
-    pango_layout_set_markup(layout, markup, -1);
-    gtk_scrollbox_set_font(self, layout);
-    self->labels = g_list_insert(self->labels, layout, position);
-    gtk_widget_queue_resize(GTK_WIDGET(self));
-    gtk_scrollbox_start_fade(self);
-}
-
-
-void
 gtk_scrollbox_set_orientation(GtkScrollbox *self,
                               const GtkOrientation orientation)
 {
diff --git a/panel-plugin/weather-scrollbox.h b/panel-plugin/weather-scrollbox.h
index 33791ff..1b0d80f 100644
--- a/panel-plugin/weather-scrollbox.h
+++ b/panel-plugin/weather-scrollbox.h
@@ -37,6 +37,12 @@ GType gtk_scrollbox_get_type(void);
     (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_SCROLLBOX, GtkScrollboxClass))
 
 
+typedef enum {
+    FADE_UNSET,
+    FADE_IN,
+    FADE_OUT
+} fade_states;
+
 typedef struct _GtkScrollbox GtkScrollbox;
 typedef struct _GtkScrollboxClass GtkScrollboxClass;
 
@@ -44,10 +50,12 @@ struct _GtkScrollbox {
     GtkDrawingArea __parent__;
 
     GList *labels;
+    GList *labels_new;
     GList *active;
     guint timeout_id;
     gint offset;
     gboolean animate;
+    fade_states fade;
     GtkOrientation orientation;
     gchar *fontname;
     PangoAttrList *pattr_list;
@@ -58,10 +66,12 @@ struct _GtkScrollboxClass {
 };
 
 
-void gtk_scrollbox_set_label(GtkScrollbox *self,
+void gtk_scrollbox_add_label(GtkScrollbox *self,
                              gint position,
                              gchar *markup);
 
+void gtk_scrollbox_swap_labels(GtkScrollbox *self);
+
 void gtk_scrollbox_set_orientation(GtkScrollbox *self,
                                    GtkOrientation orientation);
 
diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c
index 7562bea..3711944 100644
--- a/panel-plugin/weather.c
+++ b/panel-plugin/weather.c
@@ -282,7 +282,6 @@ update_scrollbox(plugin_data *data)
     data_types type;
     gint i = 0, j = 0;
 
-    gtk_scrollbox_clear(GTK_SCROLLBOX(data->scrollbox));
     gtk_scrollbox_set_animate(GTK_SCROLLBOX(data->scrollbox),
                               data->scrollbox_animate);
 
@@ -300,7 +299,7 @@ update_scrollbox(plugin_data *data)
                 g_free(single);
                 j++;
             }
-            gtk_scrollbox_set_label(GTK_SCROLLBOX(data->scrollbox),
+            gtk_scrollbox_add_label(GTK_SCROLLBOX(data->scrollbox),
                                     -1, out->str);
             g_string_free(out, TRUE);
             i = i + j;
@@ -308,7 +307,7 @@ update_scrollbox(plugin_data *data)
         weather_debug("Added %u labels to scrollbox.", data->labels->len);
     } else {
         single = g_strdup(_("No Data"));
-        gtk_scrollbox_set_label(GTK_SCROLLBOX(data->scrollbox), -1, single);
+        gtk_scrollbox_add_label(GTK_SCROLLBOX(data->scrollbox), -1, single);
         g_free(single);
         weather_debug("No weather data available, set single label '%s'.",
                       _("No Data"));
@@ -316,6 +315,7 @@ update_scrollbox(plugin_data *data)
 
     /* show or hide scrollbox */
     scrollbox_set_visible(data);
+    gtk_scrollbox_swap_labels(GTK_SCROLLBOX(data->scrollbox));
 
     weather_debug("Updated scrollbox.");
 }


More information about the Xfce4-commits mailing list