[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