gtk-ui: show status "waiting" with a progress spinner

This commit is contained in:
Jussi Kukkonen 2010-01-28 17:17:39 +02:00 committed by Patrick Ohly
parent e6a69ce45a
commit 1944d14256
6 changed files with 54 additions and 167 deletions

View File

@ -211,6 +211,10 @@ syncevo_session_status_from_string (const char *status_str)
status = SYNCEVO_STATUS_UNKNOWN; status = SYNCEVO_STATUS_UNKNOWN;
} }
if (status_str && strstr (status_str, ";waiting")) {
status |= SYNCEVO_STATUS_WAITING;
}
return status; 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) syncevo_source_status_from_string (const char *status_str)
{ {
SyncevoSourceStatus status; SyncevoSessionStatus status;
if (!status_str) { if (!status_str) {
status = SYNCEVO_SOURCE_UNKNOWN; status = SYNCEVO_STATUS_UNKNOWN;
} else if (g_str_has_prefix (status_str, "idle")) { } 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")) { } 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")) { } else if (g_str_has_prefix (status_str, "done")) {
status = SYNCEVO_SOURCE_DONE; status = SYNCEVO_STATUS_DONE;
} else { } else {
status = SYNCEVO_SOURCE_UNKNOWN; status = SYNCEVO_STATUS_UNKNOWN;
} }
/* check modifiers */ /* check modifiers */
if (status_str && strstr (status_str, ";waiting")) { if (status_str && strstr (status_str, ";waiting")) {
status |= SYNCEVO_SOURCE_WAITING; status |= SYNCEVO_STATUS_WAITING;
} }
return status; return status;
@ -281,7 +285,7 @@ syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses,
const char *mode_str; const char *mode_str;
const char *status_str; const char *status_str;
SyncevoSyncMode mode; SyncevoSyncMode mode;
SyncevoSourceStatus status; SyncevoSessionStatus status;
guint error_code; guint error_code;
mode_str = g_value_get_string (g_value_array_get_nth (source_status, 0)); mode_str = g_value_get_string (g_value_array_get_nth (source_status, 0));

View File

@ -40,28 +40,20 @@ typedef enum {
SYNCEVO_SYNC_ONE_WAY_FROM_SERVER, SYNCEVO_SYNC_ONE_WAY_FROM_SERVER,
} SyncevoSyncMode; } SyncevoSyncMode;
/* SyncevoSessionStatus is a bitfield, although most value are exclusive */
typedef enum { typedef enum {
SYNCEVO_STATUS_UNKNOWN, SYNCEVO_STATUS_UNKNOWN = 0,
SYNCEVO_STATUS_QUEUEING, SYNCEVO_STATUS_QUEUEING = 1 << 0,
SYNCEVO_STATUS_IDLE, SYNCEVO_STATUS_IDLE = 1 << 1,
SYNCEVO_STATUS_RUNNING, SYNCEVO_STATUS_RUNNING = 1 << 2,
SYNCEVO_STATUS_ABORTING, SYNCEVO_STATUS_ABORTING = 1 << 3,
SYNCEVO_STATUS_SUSPENDING, SYNCEVO_STATUS_SUSPENDING = 1 << 4,
SYNCEVO_STATUS_DONE, SYNCEVO_STATUS_DONE = 1 << 5,
} 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,
/* the ones below are modifiers */ /* the ones below are modifiers */
SYNCEVO_SOURCE_WAITING = 1 << 3, SYNCEVO_STATUS_WAITING = 1 << 6
} SyncevoSourceStatus; } SyncevoSessionStatus;
typedef enum { typedef enum {
SYNCEVO_PHASE_NONE, SYNCEVO_PHASE_NONE,
@ -126,7 +118,7 @@ SyncevoSessionStatus syncevo_session_status_from_string (const char *status_str)
typedef void (*SourceStatusFunc) (char *name, typedef void (*SourceStatusFunc) (char *name,
SyncevoSyncMode mode, SyncevoSyncMode mode,
SyncevoSourceStatus status, SyncevoSessionStatus status,
guint error_code, guint error_code,
gpointer user_data); gpointer user_data);
void void

View File

@ -24,6 +24,7 @@ themercdir = $(datadir)/syncevolution/
themerc_DATA = \ themerc_DATA = \
close.png close_hover.png settings.png settings_hover.png \ close.png close_hover.png settings.png settings_hover.png \
sync-generic.png \ sync-generic.png \
sync-spinner.gif \
sync-ui.rc sync-ui.rc
desktopdir = $(datadir)/applications desktopdir = $(datadir)/applications

BIN
src/gtk-ui/sync-spinner.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -83,6 +83,7 @@ struct _app_data {
GtkWidget *offline_label; GtkWidget *offline_label;
GtkWidget *progress; GtkWidget *progress;
GtkWidget *sync_status_label; GtkWidget *sync_status_label;
GtkWidget *spinner_image;
GtkWidget *sync_btn; GtkWidget *sync_btn;
GtkWidget *change_service_btn; GtkWidget *change_service_btn;
GtkWidget *emergency_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 static void
reload_config (app_data *data, const char *server) 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->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_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->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->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")); 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 static void
set_running_session_status (app_data *data, SyncevoSessionStatus status) set_running_session_status (app_data *data, SyncevoSessionStatus status)
{ {
switch (status) { if (status & SYNCEVO_STATUS_QUEUEING) {
case SYNCEVO_STATUS_QUEUEING:
g_warning ("Running session is queued, this shouldn't happen..."); g_warning ("Running session is queued, this shouldn't happen...");
break; } else if (status & SYNCEVO_STATUS_IDLE) {
case SYNCEVO_STATUS_IDLE:
set_app_state (data, SYNC_UI_STATE_SERVER_OK); set_app_state (data, SYNC_UI_STATE_SERVER_OK);
break; } else if (status & SYNCEVO_STATUS_DONE) {
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:
gtk_label_set_text (GTK_LABEL (data->sync_status_label), gtk_label_set_text (GTK_LABEL (data->sync_status_label),
_("Sync complete")); _("Sync complete"));
set_app_state (data, SYNC_UI_STATE_SERVER_OK); set_app_state (data, SYNC_UI_STATE_SERVER_OK);
set_sync_progress (data, 1.0, ""); set_sync_progress (data, 1.0, "");
} else if (status & SYNCEVO_STATUS_RUNNING ||
break; status & SYNCEVO_STATUS_SUSPENDING ||
default: status & SYNCEVO_STATUS_ABORTING) {
g_warning ("unknown session status %d used!", status); set_app_state (data, SYNC_UI_STATE_SYNCING);
}
}
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);
} }
if (status & SYNCEVO_SOURCE_WAITING) { if (status & SYNCEVO_STATUS_WAITING) {
g_free (waiting_source); gtk_widget_show (data->spinner_image);
waiting_source = g_strdup (name); } else {
/* TODO: start spinner */ gtk_widget_hide (data->spinner_image);
} else if (waiting_source && strcmp (waiting_source, name) == 0) {
g_free (waiting_source);
waiting_source = NULL;
/* TODO: stop spinner */
} }
} }
@ -1806,10 +1745,6 @@ running_session_status_changed_cb (SyncevoSession *session,
app_data *data) app_data *data)
{ {
set_running_session_status (data, status); set_running_session_status (data, status);
syncevo_source_statuses_foreach (source_statuses,
(SourceStatusFunc)update_source_status,
data);
} }
static void static void

View File

@ -238,23 +238,26 @@
</widget> </widget>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property> <property name="padding">6</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<widget class="GtkImage" id="spinner_image">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget> </widget>
<packing> <packing>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<widget class="GtkHBox" id="hbox8">
<property name="visible">True</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget> </widget>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -265,19 +268,6 @@
<child> <child>
<widget class="GtkHBox" id="hbox20"> <widget class="GtkHBox" id="hbox20">
<property name="visible">True</property> <property name="visible">True</property>
<child>
<widget class="GtkVBox" id="vbox19">
<property name="height_request">30</property>
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child> <child>
<widget class="GtkVBox" id="info_box"> <widget class="GtkVBox" id="info_box">
<property name="visible">True</property> <property name="visible">True</property>
@ -292,46 +282,11 @@
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<widget class="GtkHBox" id="errors_box">
<property name="spacing">5</property>
<child>
<widget class="GtkImage" id="error_img">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="stock">gtk-dialog-error</property>
<property name="icon-size">5</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="error_box">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget> </widget>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="padding">5</property> <property name="padding">5</property>
<property name="position">1</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
</widget> </widget>