From 1944d1425623b9b4e8d8e5ea40d422dec3a0dadb Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Thu, 28 Jan 2010 17:17:39 +0200 Subject: [PATCH] gtk-ui: show status "waiting" with a progress spinner --- src/dbus/syncevo-dbus-types.c | 22 ++++---- src/dbus/syncevo-dbus-types.h | 32 +++++------ src/gtk-ui/Makefile.am | 1 + src/gtk-ui/sync-spinner.gif | Bin 0 -> 2150 bytes src/gtk-ui/sync-ui.c | 97 ++++++---------------------------- src/gtk-ui/ui.glade | 69 +++++------------------- 6 files changed, 54 insertions(+), 167 deletions(-) create mode 100644 src/gtk-ui/sync-spinner.gif diff --git a/src/dbus/syncevo-dbus-types.c b/src/dbus/syncevo-dbus-types.c index d610f747..edeef7c1 100644 --- a/src/dbus/syncevo-dbus-types.c +++ b/src/dbus/syncevo-dbus-types.c @@ -211,6 +211,10 @@ syncevo_session_status_from_string (const char *status_str) status = SYNCEVO_STATUS_UNKNOWN; } + if (status_str && strstr (status_str, ";waiting")) { + status |= SYNCEVO_STATUS_WAITING; + } + return status; } @@ -239,26 +243,26 @@ syncevo_sync_mode_from_string (const char *mode_str) } } -static SyncevoSourceStatus +static SyncevoSessionStatus syncevo_source_status_from_string (const char *status_str) { - SyncevoSourceStatus status; + SyncevoSessionStatus status; if (!status_str) { - status = SYNCEVO_SOURCE_UNKNOWN; + status = SYNCEVO_STATUS_UNKNOWN; } else if (g_str_has_prefix (status_str, "idle")) { - status = SYNCEVO_SOURCE_IDLE; + status = SYNCEVO_STATUS_IDLE; } else if (g_str_has_prefix (status_str, "running")) { - status = SYNCEVO_SOURCE_RUNNING; + status = SYNCEVO_STATUS_RUNNING; } else if (g_str_has_prefix (status_str, "done")) { - status = SYNCEVO_SOURCE_DONE; + status = SYNCEVO_STATUS_DONE; } else { - status = SYNCEVO_SOURCE_UNKNOWN; + status = SYNCEVO_STATUS_UNKNOWN; } /* check modifiers */ if (status_str && strstr (status_str, ";waiting")) { - status |= SYNCEVO_SOURCE_WAITING; + status |= SYNCEVO_STATUS_WAITING; } return status; @@ -281,7 +285,7 @@ syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses, const char *mode_str; const char *status_str; SyncevoSyncMode mode; - SyncevoSourceStatus status; + SyncevoSessionStatus status; guint error_code; mode_str = g_value_get_string (g_value_array_get_nth (source_status, 0)); diff --git a/src/dbus/syncevo-dbus-types.h b/src/dbus/syncevo-dbus-types.h index d138f4c7..d79374e8 100644 --- a/src/dbus/syncevo-dbus-types.h +++ b/src/dbus/syncevo-dbus-types.h @@ -40,28 +40,20 @@ typedef enum { SYNCEVO_SYNC_ONE_WAY_FROM_SERVER, } SyncevoSyncMode; +/* SyncevoSessionStatus is a bitfield, although most value are exclusive */ typedef enum { - SYNCEVO_STATUS_UNKNOWN, - SYNCEVO_STATUS_QUEUEING, - SYNCEVO_STATUS_IDLE, - SYNCEVO_STATUS_RUNNING, - SYNCEVO_STATUS_ABORTING, - SYNCEVO_STATUS_SUSPENDING, - SYNCEVO_STATUS_DONE, -} SyncevoSessionStatus; - - -/* SyncevoSourceStatus is a bitfield, but only one of four first values - * will be present */ -typedef enum { - SYNCEVO_SOURCE_UNKNOWN = 0, - SYNCEVO_SOURCE_IDLE = 1 << 0, - SYNCEVO_SOURCE_RUNNING = 1 << 1, - SYNCEVO_SOURCE_DONE = 1 << 2, + SYNCEVO_STATUS_UNKNOWN = 0, + SYNCEVO_STATUS_QUEUEING = 1 << 0, + SYNCEVO_STATUS_IDLE = 1 << 1, + SYNCEVO_STATUS_RUNNING = 1 << 2, + SYNCEVO_STATUS_ABORTING = 1 << 3, + SYNCEVO_STATUS_SUSPENDING = 1 << 4, + SYNCEVO_STATUS_DONE = 1 << 5, /* the ones below are modifiers */ - SYNCEVO_SOURCE_WAITING = 1 << 3, -} SyncevoSourceStatus; + SYNCEVO_STATUS_WAITING = 1 << 6 +} SyncevoSessionStatus; + typedef enum { SYNCEVO_PHASE_NONE, @@ -126,7 +118,7 @@ SyncevoSessionStatus syncevo_session_status_from_string (const char *status_str) typedef void (*SourceStatusFunc) (char *name, SyncevoSyncMode mode, - SyncevoSourceStatus status, + SyncevoSessionStatus status, guint error_code, gpointer user_data); void diff --git a/src/gtk-ui/Makefile.am b/src/gtk-ui/Makefile.am index 96550cb1..e791b8a2 100644 --- a/src/gtk-ui/Makefile.am +++ b/src/gtk-ui/Makefile.am @@ -24,6 +24,7 @@ themercdir = $(datadir)/syncevolution/ themerc_DATA = \ close.png close_hover.png settings.png settings_hover.png \ sync-generic.png \ + sync-spinner.gif \ sync-ui.rc desktopdir = $(datadir)/applications diff --git a/src/gtk-ui/sync-spinner.gif b/src/gtk-ui/sync-spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4bc16de03b469a3b35e54e332d18bb6b0907b3f GIT binary patch literal 2150 zcma)-eKga19LIm#WHyP!@(|fF8Ip%fZC71kVc7MQkgzFgoUhK+nn`000J{|CJ{bJw0rso8xeVpL8x8HC4f3Ydbxjq<~{!*;~h7MEnv zEG=$wH!OH5lXU%O7uYweOD(yq$771RUMV9`}t8o!a30q3YJehoi$e zkkfUtraG%`W{ABY(n$6a5>5tq2#GeV_A^v>)NXX?j5?%~9j{)RJno8|21J56ml=H~F(V3A{K&1QQO9iZzy{15yE_b=ehZoUyrP&4&cx=dE3MiFc}5_7OFxLlSvT0$hz>!jZvM+Ztu zY6jQmZg{nHpSLW^W2v0e2CLtCSc4< zMf;)%H5q~q<#h22mh`~B>H(mOp1fLRZ48_d$aRVo{BNFpf}nM2XslmW+?t~$mM zW813~v}D7BynJ7)Xf&4G09PlNV4d{SHA2cZ;{va>maIoZ-7epI^HG^_sf!FtCa$Qw z@?auOo_=>};C{%DUnG8zR2vx<0hx3Dxic#%78i$-f=^dvhpV-Q66i;JXzAVQTa_l@ zM%3h+a5EU-m(kFoWAfql)m|g?(ro-tEX##h%KY5+P~r90$+r#<5R(Hx7QcJ|8r`Th zKX_j-an5@bo*K|*swQVxllK-CM#!VfNE;C|iNPpv`NpTJIc)_aU2 zz&=z8Q_N(JMbtuit?QpZic)bsF6MN)O6@h0M4YT0>xGs<zZWp@VQOkD2SXz>C(7_~ejIbq?Ne8j5Qk440a!)ne`D zMLTIpQVpy~&5Ykrf;&4l36`n0PI>a8+L3Yfg@|*xItTWh5nmKxDrXs_5>LDT2fj;8 z;7y+dW(t2Mg6nLnBL~a8`*_0>cf9TtTw7C`o9l5)dw`u4im_W6rtVE^ zIY7vJ#QiHvs%s15t7px6k?T0!YE60?#kNlAo+9==z=hdk-gCLnL2U2nu>Bj8QG#Z+ z*i1=#)7B!2-XV;ydt!NZQ{eBZWgq2N(BVrGzH2WhNk#N9N*-2r4bSFC9JdvhF2 zvr*t{?iIHI-=yIBa&7=TbeckL%;9dnq7!+kg;r0)V4JB5>Sf3P-sl)UQKn(gtO5Xj F{ttb3Lc0I} literal 0 HcmV?d00001 diff --git a/src/gtk-ui/sync-ui.c b/src/gtk-ui/sync-ui.c index adb20a0d..7c9720fc 100644 --- a/src/gtk-ui/sync-ui.c +++ b/src/gtk-ui/sync-ui.c @@ -83,6 +83,7 @@ struct _app_data { GtkWidget *offline_label; GtkWidget *progress; GtkWidget *sync_status_label; + GtkWidget *spinner_image; GtkWidget *sync_btn; GtkWidget *change_service_btn; GtkWidget *emergency_btn; @@ -223,42 +224,6 @@ get_pretty_source_name (const char *source_name) } } -/* -static void -add_error_info (app_data *data, const char *message, const char *external_reason) -{ - GtkWidget *lbl; - GList *l, *children; - - children = gtk_container_get_children (GTK_CONTAINER (data->service_error_box)); - for (l = children; l; l = l->next) { - GtkLabel *old_lbl = GTK_LABEL (l->data); - - if (strcmp (message, gtk_label_get_text (old_lbl)) == 0) { - g_list_free (children); - return; - } - } - g_list_free (children); - - gtk_widget_show (data->errors_box); - - lbl = gtk_label_new (message); - gtk_label_set_line_wrap (GTK_LABEL (lbl), TRUE); - - gtk_widget_set_size_request (lbl, 160, -1); - gtk_widget_show (lbl); - gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (data->service_error_box), lbl, FALSE, FALSE, 0); - - if (external_reason) { - g_warning ("%s: %s", message, external_reason); - } else { - g_warning ("%s", message); - } -} -*/ - static void reload_config (app_data *data, const char *server) { @@ -869,6 +834,10 @@ init_ui (app_data *data) data->emergency_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_btn")); data->sync_btn = GTK_WIDGET (gtk_builder_get_object (builder, "sync_btn")); data->sync_status_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_status_label")); + data->spinner_image = GTK_WIDGET (gtk_builder_get_object (builder, "spinner_image")); + gtk_image_set_from_file (GTK_IMAGE (data->spinner_image), THEMEDIR "sync-spinner.gif"); + gtk_widget_set_no_show_all (data->spinner_image, TRUE); + gtk_widget_hide (data->spinner_image); data->server_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_service_label")); data->last_synced_label = GTK_WIDGET (gtk_builder_get_object (builder, "last_synced_label")); @@ -1746,55 +1715,25 @@ get_config_for_main_win_cb (SyncevoServer *server, static void set_running_session_status (app_data *data, SyncevoSessionStatus status) { - switch (status) { - case SYNCEVO_STATUS_QUEUEING: + if (status & SYNCEVO_STATUS_QUEUEING) { g_warning ("Running session is queued, this shouldn't happen..."); - break; - case SYNCEVO_STATUS_IDLE: + } else if (status & SYNCEVO_STATUS_IDLE) { set_app_state (data, SYNC_UI_STATE_SERVER_OK); - break; - case SYNCEVO_STATUS_RUNNING: - case SYNCEVO_STATUS_SUSPENDING: - case SYNCEVO_STATUS_ABORTING: - set_app_state (data, SYNC_UI_STATE_SYNCING); - break; - case SYNCEVO_STATUS_DONE: + } else if (status & SYNCEVO_STATUS_DONE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync complete")); set_app_state (data, SYNC_UI_STATE_SERVER_OK); set_sync_progress (data, 1.0, ""); - - break; - default: - g_warning ("unknown session status %d used!", status); - } -} - -static void -update_source_status (char *name, - SyncevoSyncMode mode, - SyncevoSourceStatus status, - guint error_code, - app_data *data) -{ - char *error; - static char *waiting_source = NULL; - - error = get_error_string_for_code (error_code, NULL); - if (error) { - /* TODO show sync error in UI -- but not duplicates */ - g_warning ("Source '%s' error: %s", name, error); - g_free (error); + } else if (status & SYNCEVO_STATUS_RUNNING || + status & SYNCEVO_STATUS_SUSPENDING || + status & SYNCEVO_STATUS_ABORTING) { + set_app_state (data, SYNC_UI_STATE_SYNCING); } - if (status & SYNCEVO_SOURCE_WAITING) { - g_free (waiting_source); - waiting_source = g_strdup (name); - /* TODO: start spinner */ - } else if (waiting_source && strcmp (waiting_source, name) == 0) { - g_free (waiting_source); - waiting_source = NULL; - /* TODO: stop spinner */ + if (status & SYNCEVO_STATUS_WAITING) { + gtk_widget_show (data->spinner_image); + } else { + gtk_widget_hide (data->spinner_image); } } @@ -1806,10 +1745,6 @@ running_session_status_changed_cb (SyncevoSession *session, app_data *data) { set_running_session_status (data, status); - - syncevo_source_statuses_foreach (source_statuses, - (SourceStatusFunc)update_source_status, - data); } static void diff --git a/src/gtk-ui/ui.glade b/src/gtk-ui/ui.glade index 96eae5ac..85d97899 100644 --- a/src/gtk-ui/ui.glade +++ b/src/gtk-ui/ui.glade @@ -238,23 +238,26 @@ False + False 6 0 + + + True + gtk-missing-image + + + False + 1 + + 0 - - - True - - - 1 - - False @@ -265,19 +268,6 @@ True - - - 30 - True - vertical - - - - - - 0 - - True @@ -292,46 +282,11 @@ 0 - - - 5 - - - True - 0 - 0 - gtk-dialog-error - 5 - - - False - False - 0 - - - - - True - vertical - - - - - - 1 - - - - - False - 1 - - False 5 - 1 + 0