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;
}
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));

View File

@ -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

View File

@ -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

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 *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

View File

@ -238,23 +238,26 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
</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>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox8">
<property name="visible">True</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
@ -265,19 +268,6 @@
<child>
<widget class="GtkHBox" id="hbox20">
<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>
<widget class="GtkVBox" id="info_box">
<property name="visible">True</property>
@ -292,46 +282,11 @@
<property name="position">0</property>
</packing>
</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>
<packing>
<property name="expand">False</property>
<property name="padding">5</property>
<property name="position">1</property>
<property name="position">0</property>
</packing>
</child>
</widget>