aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc/e-activity-bar.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc/e-activity-bar.c')
-rw-r--r--widgets/misc/e-activity-bar.c107
1 files changed, 59 insertions, 48 deletions
diff --git a/widgets/misc/e-activity-bar.c b/widgets/misc/e-activity-bar.c
index 0337822adc..a86e37cbdf 100644
--- a/widgets/misc/e-activity-bar.c
+++ b/widgets/misc/e-activity-bar.c
@@ -23,12 +23,14 @@
((obj), E_TYPE_ACTIVITY_BAR, EActivityBarPrivate))
#define FEEDBACK_PERIOD 1 /* seconds */
+#define COMPLETED_ICON_NAME "emblem-default"
struct _EActivityBarPrivate {
EActivity *activity; /* weak reference */
GtkWidget *image; /* not referenced */
GtkWidget *label; /* not referenced */
GtkWidget *cancel; /* not referenced */
+ GtkWidget *spinner; /* not referenced */
/* If the user clicks the Cancel button, keep the cancelled
* EActivity object alive for a short duration so the user
@@ -47,13 +49,35 @@ G_DEFINE_TYPE (
GTK_TYPE_INFO_BAR)
static void
+activity_bar_feedback (EActivityBar *bar)
+{
+ EActivity *activity;
+ EActivityState state;
+
+ activity = e_activity_bar_get_activity (bar);
+ g_return_if_fail (E_IS_ACTIVITY (activity));
+
+ state = e_activity_get_state (activity);
+ if (state != E_ACTIVITY_CANCELLED && state != E_ACTIVITY_COMPLETED)
+ return;
+
+ if (bar->priv->timeout_id > 0)
+ g_source_remove (bar->priv->timeout_id);
+
+ /* Hold a reference on the EActivity for a short
+ * period so the activity bar stays visible. */
+ bar->priv->timeout_id = g_timeout_add_seconds_full (
+ G_PRIORITY_LOW, FEEDBACK_PERIOD, (GSourceFunc) gtk_false,
+ g_object_ref (activity), (GDestroyNotify) g_object_unref);
+}
+
+static void
activity_bar_update (EActivityBar *bar)
{
EActivity *activity;
+ EActivityState state;
GCancellable *cancellable;
const gchar *icon_name;
- gboolean cancelled;
- gboolean completed;
gboolean sensitive;
gboolean visible;
gchar *description;
@@ -66,14 +90,13 @@ activity_bar_update (EActivityBar *bar)
}
cancellable = e_activity_get_cancellable (activity);
- cancelled = g_cancellable_is_cancelled (cancellable);
- completed = e_activity_is_completed (activity);
icon_name = e_activity_get_icon_name (activity);
+ state = e_activity_get_state (activity);
description = e_activity_describe (activity);
gtk_label_set_text (GTK_LABEL (bar->priv->label), description);
- if (cancelled) {
+ if (state == E_ACTIVITY_CANCELLED) {
PangoAttribute *attr;
PangoAttrList *attr_list;
@@ -90,25 +113,27 @@ activity_bar_update (EActivityBar *bar)
gtk_label_set_attributes (
GTK_LABEL (bar->priv->label), NULL);
- if (cancelled)
+ if (state == E_ACTIVITY_COMPLETED)
+ icon_name = COMPLETED_ICON_NAME;
+
+ if (state == E_ACTIVITY_CANCELLED) {
gtk_image_set_from_stock (
GTK_IMAGE (bar->priv->image),
GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON);
- else {
- if (completed)
- icon_name = "emblem-default";
+ gtk_widget_show (bar->priv->image);
+ } else if (icon_name != NULL) {
gtk_image_set_from_icon_name (
GTK_IMAGE (bar->priv->image),
icon_name, GTK_ICON_SIZE_BUTTON);
+ gtk_widget_show (bar->priv->image);
+ } else {
+ gtk_widget_hide (bar->priv->image);
}
- visible = (icon_name != NULL);
- gtk_widget_set_visible (bar->priv->image, visible);
-
visible = (cancellable != NULL);
gtk_widget_set_visible (bar->priv->cancel, visible);
- sensitive = !cancelled && !completed;
+ sensitive = (state == E_ACTIVITY_RUNNING);
gtk_widget_set_sensitive (bar->priv->cancel, sensitive);
visible = (description != NULL && *description != '\0');
@@ -128,30 +153,16 @@ activity_bar_cancel (EActivityBar *bar)
cancellable = e_activity_get_cancellable (activity);
g_cancellable_cancel (cancellable);
-}
-
-static void
-activity_bar_feedback (EActivityBar *bar)
-{
- EActivity *activity;
-
- activity = e_activity_bar_get_activity (bar);
- g_return_if_fail (E_IS_ACTIVITY (activity));
- if (bar->priv->timeout_id > 0)
- g_source_remove (bar->priv->timeout_id);
-
- /* Hold a reference on the EActivity for a short
- * period so the activity bar stays visible. */
- bar->priv->timeout_id = g_timeout_add_seconds_full (
- G_PRIORITY_LOW, FEEDBACK_PERIOD, (GSourceFunc) gtk_false,
- g_object_ref (activity), (GDestroyNotify) g_object_unref);
+ activity_bar_update (bar);
}
static void
activity_bar_weak_notify_cb (EActivityBar *bar,
GObject *where_the_object_was)
{
+ g_return_if_fail (E_IS_ACTIVITY_BAR (bar));
+
bar->priv->activity = NULL;
e_activity_bar_set_activity (bar, NULL);
}
@@ -259,7 +270,19 @@ e_activity_bar_init (EActivityBar *bar)
widget = gtk_image_new ();
gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
bar->priv->image = widget;
- gtk_widget_show (widget);
+
+ widget = gtk_spinner_new ();
+ gtk_spinner_start (GTK_SPINNER (widget));
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ bar->priv->spinner = widget;
+
+ /* The spinner is only visible when the image is not. */
+ g_object_bind_property (
+ bar->priv->image, "visible",
+ bar->priv->spinner, "visible",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE |
+ G_BINDING_INVERT_BOOLEAN);
widget = gtk_label_new (NULL);
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
@@ -300,12 +323,8 @@ e_activity_bar_set_activity (EActivityBar *bar,
{
g_return_if_fail (E_IS_ACTIVITY_BAR (bar));
- if (activity != NULL) {
+ if (activity != NULL)
g_return_if_fail (E_IS_ACTIVITY (activity));
- g_object_weak_ref (
- G_OBJECT (activity), (GWeakNotify)
- activity_bar_weak_notify_cb, bar);
- }
if (bar->priv->timeout_id > 0) {
g_source_remove (bar->priv->timeout_id);
@@ -324,23 +343,15 @@ e_activity_bar_set_activity (EActivityBar *bar,
bar->priv->activity = activity;
if (activity != NULL) {
- g_signal_connect_swapped (
- activity, "cancelled",
- G_CALLBACK (activity_bar_feedback), bar);
+ g_object_weak_ref (
+ G_OBJECT (activity), (GWeakNotify)
+ activity_bar_weak_notify_cb, bar);
g_signal_connect_swapped (
- activity, "completed",
+ activity, "notify::state",
G_CALLBACK (activity_bar_feedback), bar);
g_signal_connect_swapped (
- activity, "cancelled",
- G_CALLBACK (activity_bar_update), bar);
-
- g_signal_connect_swapped (
- activity, "completed",
- G_CALLBACK (activity_bar_update), bar);
-
- g_signal_connect_swapped (
activity, "notify",
G_CALLBACK (activity_bar_update), bar);
}