diff options
author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2007-01-13 13:05:17 +0000 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2007-01-13 13:05:17 +0000 |
commit | f70403b0a5f74e13907262e668653eef29803754 (patch) | |
tree | 498345255df4283ba01b9f27a477005183cf11e5 /hardinfo2/syncmanager.c | |
parent | b1d1223551baa57174020af62c58016deca90096 (diff) |
Started working on SyncManager (GUI only; does not work currently, needs backend).
Diffstat (limited to 'hardinfo2/syncmanager.c')
-rw-r--r-- | hardinfo2/syncmanager.c | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/hardinfo2/syncmanager.c b/hardinfo2/syncmanager.c new file mode 100644 index 00000000..0767f926 --- /dev/null +++ b/hardinfo2/syncmanager.c @@ -0,0 +1,337 @@ +#include "syncmanager.h" +#include "iconcache.h" +#include "hardinfo.h" + +typedef struct _SyncDialog SyncDialog; +typedef struct _SyncNetArea SyncNetArea; +typedef struct _SyncNetAction SyncNetAction; + +struct _SyncNetArea { + GtkWidget *vbox; +}; + +struct _SyncNetAction { + gchar *name; + gboolean (*do_action)(SyncDialog *sd); +}; + +struct _SyncDialog { + GtkWidget *dialog; + GtkWidget *label; + + GtkWidget *button_sync; + GtkWidget *button_cancel; + GtkWidget *button_close; + + GtkWidget *scroll_box; + + SyncNetArea *sna; +}; + +static GSList *entries = NULL; + +#define LABEL_SYNC_DEFAULT "<big><b>Synchronize with Central Database</b></big>\n" \ + "The following information may be synchronized " \ + "with the HardInfo central database. <i>No information " \ + "that ultimately identify this computer will be " \ + "sent.</i>" +#define LABEL_SYNC_SYNCING "<big><b>Synchronizing</b></big>\n" \ + "This may take some time." + +static SyncDialog *sync_dialog_new(void); +static void sync_dialog_destroy(SyncDialog *sd); +static void sync_dialog_start_sync(SyncDialog *sd); + +static SyncNetArea *sync_dialog_netarea_new(void); +static void sync_dialog_netarea_destroy(SyncNetArea *sna); +static void sync_dialog_netarea_show(SyncDialog *sd); +static void sync_dialog_netarea_hide(SyncDialog *sd); +static void sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction *sna, + gint n); + +void sync_manager_add_entry(SyncEntry *entry) +{ + entries = g_slist_prepend(entries, entry); +} + +void sync_manager_show(void) +{ + SyncDialog *sd = sync_dialog_new(); + + if (gtk_dialog_run(GTK_DIALOG(sd->dialog)) == GTK_RESPONSE_ACCEPT) { + sync_dialog_start_sync(sd); + } + + sync_dialog_destroy(sd); +} + +static gboolean _action_wait(SyncDialog *sd) +{ + nonblock_sleep(1000); + return TRUE; +} + +static gboolean _action_wait_fail(SyncDialog *sd) +{ + nonblock_sleep(2000); + return FALSE; +} + +static void sync_dialog_start_sync(SyncDialog *sd) +{ + SyncNetAction actions[] = { + { "Contacting HardInfo central database", _action_wait }, + { "Sending benchmark results (1/3)", _action_wait }, + { "Sending benchmark results (2/3)", _action_wait }, + { "Sending benchmark results (3/3)", _action_wait }, + { "Receiving benchmark results", _action_wait }, + { "This should fail!", _action_wait_fail }, + { "Sync finished", NULL }, + }; + + gtk_widget_hide(sd->button_sync); + gtk_widget_set_sensitive(sd->button_cancel, FALSE); + sync_dialog_netarea_show(sd); + + sync_dialog_netarea_start_actions(sd, actions, G_N_ELEMENTS(actions)); + + gtk_widget_hide(sd->button_cancel); + gtk_widget_show(sd->button_close); + + /* wait for the user to close the dialog */ + gtk_main(); +} + +static void sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) +{ + gint i; + GtkWidget **labels; + GtkWidget **icons; + GdkPixbuf *done_icon = icon_cache_get_pixbuf("status-done.png"); + GdkPixbuf *curr_icon = icon_cache_get_pixbuf("status-curr.png"); + + labels = g_new0(GtkWidget *, n); + icons = g_new0(GtkWidget *, n); + + for (i = 0; i < n; i++) { + GtkWidget *hbox; + + hbox = gtk_hbox_new(FALSE, 5); + + labels[i] = gtk_label_new(sna[i].name); + icons[i] = gtk_image_new(); + + gtk_widget_set_size_request(icons[i], + gdk_pixbuf_get_width(done_icon), + gdk_pixbuf_get_height(done_icon)); + + gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); + gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); + + gtk_box_pack_start(GTK_BOX(hbox), icons[i], FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); + + gtk_widget_show_all(hbox); + } + + while (gtk_events_pending()) + gtk_main_iteration(); + + for (i = 0; i < n; i++) { + gchar *bold; + + bold = g_strdup_printf("<b>%s</b>", sna[i].name); + gtk_label_set_markup(GTK_LABEL(labels[i]), bold); + g_free(bold); + + gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), curr_icon); + + if (sna[i].do_action && !sna[i].do_action(sd)) { + gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), + icon_cache_get_pixbuf("dialog-error.png")); + g_warning("Failed while performing \"%s\". Please file a bug report " \ + "if this problem persists. (Use the Help\342\206\222Report" \ + " bug option.)", sna[i].name); + break; + } + + gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), done_icon); + gtk_label_set_markup(GTK_LABEL(labels[i]), sna[i].name); + } + + g_free(labels); + g_free(icons); +} + +static SyncNetArea *sync_dialog_netarea_new(void) +{ + SyncNetArea *sna = g_new0(SyncNetArea, 1); + + sna->vbox = gtk_vbox_new(FALSE, 0); + + gtk_container_set_border_width(GTK_CONTAINER(sna->vbox), 10); + + gtk_widget_show_all(sna->vbox); + gtk_widget_hide(sna->vbox); + + return sna; +} + +static void sync_dialog_netarea_destroy(SyncNetArea *sna) +{ + g_return_if_fail(sna != NULL); + + gtk_widget_destroy(sna->vbox); + g_free(sna); +} + +static void sync_dialog_netarea_show(SyncDialog *sd) +{ + g_return_if_fail(sd && sd->sna); + + gtk_widget_hide(GTK_WIDGET(sd->scroll_box)); + gtk_widget_show(GTK_WIDGET(sd->sna->vbox)); + + gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_SYNCING); + gtk_window_set_default_size(GTK_WINDOW(sd->dialog), 0, 0); + gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); +} + +static void sync_dialog_netarea_hide(SyncDialog *sd) +{ + g_return_if_fail(sd && sd->sna); + + gtk_widget_show(GTK_WIDGET(sd->scroll_box)); + gtk_widget_hide(GTK_WIDGET(sd->sna->vbox)); + + gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_DEFAULT); + gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); +} + +static SyncDialog *sync_dialog_new(void) +{ + SyncDialog *sd; + GtkWidget *dialog; + GtkWidget *dialog1_vbox; + GtkWidget *scrolledwindow2; +// GtkWidget *treeview2; + GtkWidget *dialog1_action_area; + GtkWidget *button8; + GtkWidget *button7; + GtkWidget *button6; + GtkWidget *label; + GtkWidget *hbox; + +// GtkTreeViewColumn *column; +// GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle; + + sd = g_new0(SyncDialog, 1); + sd->sna = sync_dialog_netarea_new(); + + dialog = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(dialog), "SyncManager"); + gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); + gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); +// gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_type_hint(GTK_WINDOW(dialog), + GDK_WINDOW_TYPE_HINT_DIALOG); + + dialog1_vbox = GTK_DIALOG(dialog)->vbox; + gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); + gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); + gtk_widget_show(dialog1_vbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(LABEL_SYNC_DEFAULT); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + gtk_box_pack_start(GTK_BOX(hbox), + icon_cache_get_image("syncmanager.png"), + FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); + gtk_widget_show_all(hbox); + + gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, 0); + + scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow2); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, 0); + gtk_widget_set_size_request(scrolledwindow2, -1, 200); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scrolledwindow2), GTK_SHADOW_IN); +/* + treeview2 = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); + gtk_widget_show(treeview2); + gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); + + cr_toggle = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); + g_signal_connect(cr_toggle, "toggled", G_CALLBACK(report_dialog_sel_toggle), sd); + gtk_tree_view_column_add_attribute(column, cr_toggle, "active", + TREE_COL_SEL); + + cr_pbuf = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); + gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", + TREE_COL_PBUF); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + TREE_COL_NAME); + */ + + dialog1_action_area = GTK_DIALOG(dialog)->action_area; + gtk_widget_show(dialog1_action_area); + gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), + GTK_BUTTONBOX_END); + + button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_widget_show(button8); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, + GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); + + button7 = gtk_button_new_with_mnemonic("_Synchronize"); + gtk_widget_show(button7); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); + + button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(G_OBJECT(button6), "clicked", (GCallback)gtk_main_quit, NULL); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); + + sd->dialog = dialog; + sd->button_sync = button7; + sd->button_cancel = button8; + sd->button_close = button6; + sd->scroll_box = scrolledwindow2; + sd->label = label; + //gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2)); + //set_all_active(sd, TRUE); + + return sd; +} + +static void sync_dialog_destroy(SyncDialog *sd) +{ + gtk_widget_destroy(sd->dialog); + sync_dialog_netarea_destroy(sd->sna); + g_free(sd); +} |