diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-10-21 23:12:21 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-10-21 23:12:21 +0000 |
commit | 34c56c7db7c57f5db0184489d01866902e992300 (patch) | |
tree | 8707a14ac8f786ff684279be77e66946f235b751 /src/trg-preferences-dialog.c | |
parent | 3b8fd9e7274477cfad98d66e41a43417ce8d21bf (diff) |
make the execute command tree view in preferences a generic widget, the "persistent tree view"
Diffstat (limited to 'src/trg-preferences-dialog.c')
-rw-r--r-- | src/trg-preferences-dialog.c | 220 |
1 files changed, 44 insertions, 176 deletions
diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 91b36ebb..e729300 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -30,6 +30,7 @@ #include "hig.h" #include "trg-json-widgets.h" #include "trg-preferences-dialog.h" +#include "trg-persistent-tree-view.h" #include "trg-main-window.h" #include "trg-prefs.h" #include "util.h" @@ -52,9 +53,6 @@ struct _TrgPreferencesDialogPrivate { GtkWidget *profileComboBox; GtkWidget *profileNameEntry; GtkWidget *fullUpdateCheck; - GtkWidget *execDelButton; - GtkWidget *etv; - GtkTreeViewColumn *etvLabelColumn; GList *widgets; }; @@ -65,7 +63,7 @@ static void trg_pref_widget_desc_free(trg_pref_widget_desc *wd) { g_free(wd); } -static trg_pref_widget_desc* trg_pref_widget_desc_new(GtkWidget *w, gchar *key, +trg_pref_widget_desc* trg_pref_widget_desc_new(GtkWidget *w, gchar *key, int flags) { trg_pref_widget_desc *desc = g_new0(trg_pref_widget_desc, 1); desc->widget = w; @@ -98,15 +96,17 @@ static void trg_pref_widget_save(TrgPreferencesDialog *dlg, static void trg_pref_widget_save_all(TrgPreferencesDialog *dlg) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); + GList *li; if (trg_prefs_get_profile(priv->prefs) == NULL) return; - GList *li; + trg_client_configlock(priv->client); for (li = priv->widgets; li; li = g_list_next(li)) { trg_pref_widget_desc* wd = (trg_pref_widget_desc*) li->data; trg_pref_widget_save(dlg, wd); } + trg_client_configunlock(priv->client); } static void trg_preferences_dialog_set_property(GObject * object, @@ -545,200 +545,64 @@ static void trgp_double_special_dependent(GtkWidget *widget, gpointer data) { GTK_TOGGLE_BUTTON(priv->fullUpdateCheck))); } -static void exec_selection_changed(GtkTreeSelection *selection, gpointer data) { - TrgPreferencesDialogPrivate *priv = - TRG_PREFERENCES_DIALOG_GET_PRIVATE(data); - - if (gtk_tree_selection_get_selected(selection, NULL, NULL)) - gtk_widget_set_sensitive(priv->execDelButton, TRUE); - else - gtk_widget_set_sensitive(priv->execDelButton, FALSE); -} - -static void trg_etc_edited(GtkCellRendererText * renderer, gchar * path, - gchar * new_text, gint model_column, gpointer user_data) { - GtkTreeModel *model = GTK_TREE_MODEL(user_data); - GtkTreeIter iter; - - gtk_tree_model_get_iter_from_string(model, &iter, path); - gtk_list_store_set(GTK_LIST_STORE(model), &iter, model_column, new_text, -1); -} - -static void trg_etv_label_edited(GtkCellRendererText * renderer, gchar * path, - gchar * new_text, gpointer user_data) { - trg_etc_edited(renderer, path, new_text, 0, user_data); -} - -static void trg_etv_cmd_edited(GtkCellRendererText * renderer, gchar * path, - gchar * new_text, gpointer user_data) { - trg_etc_edited(renderer, path, new_text, 1, user_data); -} - -static void trg_prefs_etv_refresh(TrgPrefs *prefs, void *wdp) { - trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp; - GtkListStore *model = - GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(wd->widget))); - GtkTreeIter iter; - JsonArray *ja; - GList *ja_list, *li; - - ja = trg_prefs_get_array(prefs, wd->key, wd->flags); - gtk_list_store_clear(model); - - if (!ja) - return; - - ja_list = json_array_get_elements(ja); - - for (li = ja_list; li; li = g_list_next(li)) { - JsonNode *ja_node = (JsonNode*) li->data; - JsonObject *jobj = json_node_get_object(ja_node); - gtk_list_store_append(model, &iter); - gtk_list_store_set(model, &iter, 0, - json_object_get_string_member(jobj, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_LABEL), 1, - json_object_get_string_member(jobj, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_CMD), -1); - } - - g_list_free(ja_list); -} - -static gboolean trg_prefs_etc_save_foreachfunc(GtkTreeModel *model, - GtkTreePath *path, GtkTreeIter *iter, gpointer data) { - gchar *label, *cmd; - JsonArray *ja = (JsonArray*) data; - JsonObject *new = json_object_new(); - - gtk_tree_model_get(model, iter, 0, &label, 1, &cmd, -1); - - json_object_set_string_member(new, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_LABEL, label); - json_object_set_string_member(new, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_CMD, cmd); - - json_array_add_object_element(ja, new); - - g_free(label); - g_free(cmd); - - return FALSE; -} - -static void trg_prefs_etv_save(TrgPrefs *prefs, void *wdp) { - trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp; - JsonNode *node = trg_prefs_get_value(prefs, wd->key, JSON_NODE_ARRAY, - wd->flags | TRG_PREFS_REPLACENODE); - JsonArray *ja = json_array_new(); - GtkTreeView *tv = GTK_TREE_VIEW(wd->widget); - GtkTreeModel *model = gtk_tree_view_get_model(tv); - - gtk_tree_model_foreach(model, trg_prefs_etc_save_foreachfunc, ja); - json_node_take_array(node, ja); - trg_prefs_changed_emit_signal(prefs, wd->key); -} - -static GtkWidget *trg_prefs_execTreeView(TrgPreferencesDialog *dlg) { +static GtkWidget *trg_prefs_openExecPage(TrgPreferencesDialog *dlg) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); - GtkListStore *model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); - GtkWidget *tv = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkTreeSelection *selection; + GtkWidget *t; + TrgPersistentTreeView *ptv; + GtkListStore *model; trg_pref_widget_desc *wd; + gint row = 0; - g_object_unref(G_OBJECT(model)); - - gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(tv), TRUE); - //gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv), FALSE); - - renderer = gtk_cell_renderer_text_new(); - g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL); - g_signal_connect(renderer, "edited", - G_CALLBACK(trg_etv_label_edited), model); - column = priv->etvLabelColumn = gtk_tree_view_column_new_with_attributes( - _("Label"), renderer, "text", 0, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); - - renderer = gtk_cell_renderer_text_new(); - g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL); - g_signal_connect(renderer, "edited", - G_CALLBACK(trg_etv_cmd_edited), model); - column = gtk_tree_view_column_new_with_attributes(_("Command"), renderer, - "text", 1, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); + t = hig_workarea_create(); - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); + hig_workarea_add_section_title(t, &row, _("Remote Commands")); - g_signal_connect(G_OBJECT(selection), "changed", - G_CALLBACK(exec_selection_changed), dlg); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); - wd = trg_pref_widget_desc_new(tv, TRG_PREFS_KEY_EXEC_COMMANDS, - TRG_PREFS_PROFILE); - wd->saveFunc = &trg_prefs_etv_save; - wd->refreshFunc = &trg_prefs_etv_refresh; + ptv = trg_persistent_tree_view_new(priv->prefs, model, TRG_PREFS_KEY_EXEC_COMMANDS); + trg_persistent_tree_view_set_add_select(ptv, + trg_persistent_tree_view_add_column(ptv, 0, TRG_PREFS_SUBKEY_LABEL, _("Label"))); + trg_persistent_tree_view_add_column(ptv, 1, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_CMD, _("Command")); + wd = trg_persistent_tree_view_get_widget_desc(ptv); + trg_persistent_tree_view_build(ptv); + trg_pref_widget_refresh(dlg, wd); priv->widgets = g_list_append(priv->widgets, wd); - trg_prefs_etv_refresh(priv->prefs, wd); - - return tv; -} - -static void trg_prefs_add_exec_cb(GtkWidget *w, gpointer data) { - TrgPreferencesDialogPrivate *priv = - TRG_PREFERENCES_DIALOG_GET_PRIVATE(data); - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(priv->etv)); - GtkTreeIter iter; - GtkTreePath *path; - - gtk_list_store_append(GTK_LIST_STORE(model), &iter); - path = gtk_tree_model_get_path(model, &iter); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(priv->etv), path, - priv->etvLabelColumn, TRUE); - gtk_tree_path_free(path); -} - -static void trg_prefs_del_exec_cb(GtkWidget *w, gpointer data) { - GtkTreeView *tv = GTK_TREE_VIEW(data); - GtkTreeSelection *selection = gtk_tree_view_get_selection(tv); - GtkTreeModel *model; - GtkTreeIter iter; + gtk_table_attach(GTK_TABLE(t), GTK_WIDGET(ptv), 1, 2, row, + row + 1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0); - if (gtk_tree_selection_get_selected(selection, &model, &iter)) - gtk_list_store_remove(GTK_LIST_STORE(model), &iter); + return t; } -static GtkWidget *trg_prefs_openExecPage(TrgPreferencesDialog *dlg) { +static GtkWidget *trg_prefs_dirsPage(TrgPreferencesDialog *dlg) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); - GtkWidget *t, *hbox, *w; + GtkWidget *t; + TrgPersistentTreeView *ptv; + GtkListStore *model; + trg_pref_widget_desc *wd; gint row = 0; t = hig_workarea_create(); - //frame = gtk_frame_new("Profile name..."); + hig_workarea_add_section_title(t, &row, _("Destinations")); - hig_workarea_add_section_title(t, &row, _("Remote Commands")); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); - priv->etv = trg_prefs_execTreeView(dlg); + ptv = trg_persistent_tree_view_new(priv->prefs, model, TRG_PREFS_KEY_DESTINATIONS); + trg_persistent_tree_view_set_add_select(ptv, + trg_persistent_tree_view_add_column(ptv, 0, TRG_PREFS_SUBKEY_LABEL, _("Label"))); + trg_persistent_tree_view_add_column(ptv, 1, TRG_PREFS_KEY_DESTINATIONS_SUBKEY_DIR, _("Directory")); + wd = trg_persistent_tree_view_get_widget_desc(ptv); + trg_persistent_tree_view_build(ptv); + trg_pref_widget_refresh(dlg, wd); + priv->widgets = g_list_append(priv->widgets, wd); - gtk_table_attach(GTK_TABLE(t), my_scrolledwin_new(priv->etv), 1, 2, row, + gtk_table_attach(GTK_TABLE(t), GTK_WIDGET(ptv), 1, 2, row, row + 1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0); - row++; - - hbox = gtk_hbox_new(FALSE, 0); - w = gtk_button_new_from_stock(GTK_STOCK_ADD); - g_signal_connect(w, "clicked", G_CALLBACK(trg_prefs_add_exec_cb), dlg); - gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 4); - - w = priv->execDelButton = gtk_button_new_from_stock(GTK_STOCK_DELETE); - gtk_widget_set_sensitive(w, FALSE); - g_signal_connect(w, "clicked", G_CALLBACK(trg_prefs_del_exec_cb), priv->etv); - gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 4); - - hig_workarea_add_wide_control(t, &row, hbox); - - //gtk_container_add(GTK_CONTAINER(frame), t); - //return frame; - return t; } @@ -887,6 +751,10 @@ static GObject *trg_preferences_dialog_constructor(GType type, trg_prefs_openExecPage(TRG_PREFERENCES_DIALOG(object)), gtk_label_new(_("Remote Execute"))); + /*gtk_notebook_append_page(GTK_NOTEBOOK(notebook), + trg_prefs_dirsPage(TRG_PREFERENCES_DIALOG(object)), + gtk_label_new(_("Directories")));*/ + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), trg_prefs_desktopPage(TRG_PREFERENCES_DIALOG(object)), gtk_label_new(_("Desktop"))); |