gtk-ui: show status "waiting" with a progress spinner
This commit is contained in:
parent
e6a69ce45a
commit
1944d14256
|
@ -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));
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue