]> Dogcows Code - chaz/homebank/blobdiff - src/ui-pref.c
revert whitespace fixes
[chaz/homebank] / src / ui-pref.c
index a5c56eb6db19bbbedd5cac7f52cf9fe87dc52908..3ff2dd4877aa22562fa81f725eec83359212f11b 100644 (file)
@@ -24,6 +24,8 @@
 #include "dsp-mainwindow.h"
 #include "gtk-chart-colors.h"
 
+#include "ext.h"
+
 #include "ui-currency.h"
 
 
@@ -53,16 +55,11 @@ enum {
 
 enum
 {
-       PREF_GENERAL,
-       PREF_INTERFACE,
-       PREF_LOCALE,    //old DISPLAY
-       PREF_TXN,               //old COLUMNS
-       PREF_IMPORT,
-       PREF_REPORT,
-       PREF_BACKUP,
-       PREF_FOLDERS,
-       PREF_EURO,
-       PREF_MAX
+       EXT_COLUMN_ENABLED = 0,
+       EXT_COLUMN_LABEL,
+       EXT_COLUMN_TOOLTIP,
+       EXT_COLUMN_PLUGIN_NAME,
+       EXT_NUM_COLUMNS
 };
 
 
@@ -77,6 +74,7 @@ static gchar *pref_iconname[PREF_MAX] = {
 "prf-backup",
 "prf-folder",
 "prf-euro",                    // to be renamed
+"prf-plugins",
 //"prf_charts.svg"
 };
 
@@ -89,7 +87,8 @@ N_("Import/Export"),
 N_("Report"),
 N_("Backup"),
 N_("Folders"),
-N_("Euro minor")
+N_("Euro minor"),
+N_("Plugins")
 //
 };
 
@@ -142,6 +141,15 @@ N_("Append to Payee"),
 NULL
 };
 
+gchar *CYA_IMPORT_CSVSEPARATOR[] = {
+N_("Tab"),
+N_("Comma"),
+N_("Semicolon"),
+N_("Space"),
+NULL
+};
+
+
 
 extern gchar *CYA_CHART_COLORSCHEME[];
 extern gchar *CYA_MONTHS[];
@@ -193,6 +201,9 @@ static EuroParams euro_params[] =
 };
 
 
+static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns);
+
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
 
 
@@ -930,7 +941,7 @@ GdkRGBA rgba;
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_load_last), PREFS->loadlast);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_append_scheduled), PREFS->appendscheduled);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_do_update_currency), PREFS->do_update_currency);
-       gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_daterange_wal), PREFS->date_range_wal);
+       hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_wal), PREFS->date_range_wal);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_fiscyearday), PREFS->fisc_year_day );
        gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_fiscyearmonth), PREFS->fisc_year_month - 1);
 
@@ -958,7 +969,7 @@ GdkRGBA rgba;
        gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_gridlines), PREFS->grid_lines);
 
        // transactions
-       gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_daterange_txn), PREFS->date_range_txn);
+       hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_txn), PREFS->date_range_txn);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_datefuture_nbdays), PREFS->date_future_nbdays);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_hide_reconciled), PREFS->hidereconciled);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_show_remind), PREFS->showremind);
@@ -980,9 +991,10 @@ GdkRGBA rgba;
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifswap), PREFS->dtex_qifswap);
        gtk_entry_set_text(GTK_ENTRY(data->ST_path_import), PREFS->path_import);
        gtk_entry_set_text(GTK_ENTRY(data->ST_path_export), PREFS->path_export);
+       gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dtex_csvsep), PREFS->dtex_csvsep);
 
        // report
-       gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_daterange_rep), PREFS->date_range_rep);
+       hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_rep), PREFS->date_range_rep);
        gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_color_scheme), PREFS->report_color_scheme);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_stat_byamount), PREFS->stat_byamount);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_stat_showrate), PREFS->stat_showrate);
@@ -1030,7 +1042,7 @@ const gchar *lang;
        PREFS->loadlast  = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_load_last));
        PREFS->appendscheduled  = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_append_scheduled));
        PREFS->do_update_currency  = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_do_update_currency));
-       PREFS->date_range_wal = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_daterange_wal));
+       PREFS->date_range_wal = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_wal));
        PREFS->fisc_year_day = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_fiscyearday));
        PREFS->fisc_year_month = 1 + gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_fiscyearmonth));
 
@@ -1066,7 +1078,7 @@ const gchar *lang;
        //list_txn_colpref_get(GTK_TREE_VIEW(data->LV_opecolumns), PREFS->lst_ope_columns);
 
        // transaction 
-       PREFS->date_range_txn = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_daterange_txn));
+       PREFS->date_range_txn = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_txn));
        PREFS->date_future_nbdays  = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_datefuture_nbdays));
        PREFS->hidereconciled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_hide_reconciled));
        PREFS->showremind = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_show_remind));
@@ -1089,9 +1101,10 @@ const gchar *lang;
        PREFS->dtex_qifswap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifswap));
        ui_gtk_entry_replace_text(data->ST_path_import, &PREFS->path_import);
        ui_gtk_entry_replace_text(data->ST_path_export, &PREFS->path_export);
+       PREFS->dtex_csvsep = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dtex_csvsep)); 
 
        // report
-       PREFS->date_range_rep = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_daterange_rep));
+       PREFS->date_range_rep = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_rep));
        PREFS->report_color_scheme = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_color_scheme));
        PREFS->stat_byamount   = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_stat_byamount));
        PREFS->stat_showrate   = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_stat_showrate));
@@ -1111,6 +1124,8 @@ const gchar *lang;
        ui_gtk_entry_replace_text(data->ST_euro_groupingchar, &PREFS->minor_cur.grouping_char);
        PREFS->minor_cur.frac_digits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits));
        //PREFS->chart_legend = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_chartlegend));
+
+       list_ext_colpref_get(GTK_TREE_VIEW(data->PI_plugin_columns), &(PREFS->ext_whitelist));
 }
 
 
@@ -1130,7 +1145,7 @@ gint crow, row;
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
        
-       label = make_label_group(_("Date options"));
+       label = make_label_group(_("General options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
        
        row = 1;
@@ -1142,6 +1157,11 @@ gint crow, row;
        //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
 
+       row++;
+       widget = gtk_check_button_new_with_mnemonic (_("Sentence _case memo/payee"));
+       data->CM_dtex_ucfirst = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
+       
 
        // group :: OFX/QFX options
     group_grid = gtk_grid_new ();
@@ -1193,14 +1213,20 @@ gint crow, row;
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
        
-       label = make_label_group(_("Other options"));
+       label = make_label_group(_("CSV options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
        row = 1;
-       widget = gtk_check_button_new_with_mnemonic (_("Sentence _case memo/payee"));
-       data->CM_dtex_ucfirst = widget;
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
-       
+       label = make_label(_("(transaction import only)"), 0.0, 0.5);
+       gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 2, 1);
+
+       row++;
+       label = make_label_widget(_("Separator:"));
+       //----------------------------------------- l, r, t, b
+       gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
+       widget = make_cycle(label, CYA_IMPORT_CSVSEPARATOR);
+       data->CY_dtex_csvsep = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
 
        return content_grid;
 }
@@ -1262,7 +1288,7 @@ gint crow, row;
        label = make_label_widget(_("_Range:"));
        //----------------------------------------- l, r, t, b
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
-       widget = make_daterange(label, FALSE);
+       widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
        data->CY_daterange_rep = widget;
        //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
@@ -1617,7 +1643,7 @@ gint crow, row;
        label = make_label(_("_Range:"), 0, 0.5);
        //----------------------------------------- l, r, t, b
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
-       widget = make_daterange(label, FALSE);
+       widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
        data->CY_daterange_txn = widget;
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
 
@@ -1740,12 +1766,6 @@ gint crow, row;
 
 
 
-
-
-
-
-
-
        row++;
        //widget = gtk_check_button_new_with_mnemonic (_("Enable rows in alternating colors"));
        //data->CM_ruleshint = widget;
@@ -2001,7 +2021,7 @@ gint crow, row;
        row = 1;
        label = make_label(_("_Range:"), 0, 0.5);
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
-       widget = make_daterange(label, FALSE);
+       widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
        data->CY_daterange_wal = widget;
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
 
@@ -2009,6 +2029,201 @@ gint crow, row;
 }
 
 
+void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata);
+
+static void
+toggle_plugin(GtkCellRendererToggle *cell, gchar* path_str, gpointer data)
+{
+       GtkTreeModel *model = (GtkTreeModel*)data;
+       GtkTreeIter  iter;
+       GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+
+       const gchar* plugin;
+
+       gtk_tree_model_get_iter(model, &iter, path);
+       gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin, -1);
+
+       gboolean enabled = ext_is_plugin_loaded(plugin);
+       if (enabled) {
+               ext_unload_plugin(plugin);
+               enabled = FALSE;
+       } else {
+               enabled = (ext_load_plugin(plugin) == 0);
+               if (!enabled) {
+                       ext_run_modal(_("Plugin Error"), _("The plugin failed to load properly."), "error");
+               }
+       }
+
+       /* set new value */
+       gtk_list_store_set(GTK_LIST_STORE (model), &iter, EXT_COLUMN_ENABLED, enabled, -1);
+
+       /* clean up */
+       gtk_tree_path_free(path);
+}
+
+
+void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata)
+{
+       GtkTreeModel*   model = gtk_tree_view_get_model(treeview);
+       GtkTreeIter     iter;
+
+       if (gtk_tree_model_get_iter(model, &iter, path)) {
+               gchar* plugin_filename;
+               gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin_filename, -1);
+               ext_execute_action(plugin_filename);
+               g_free(plugin_filename);
+       }
+}
+
+static GtkWidget *defpref_page_plugins (struct defpref_data *data)
+{
+       GtkWidget *container;
+       GtkListStore *store;
+       GtkTreeIter it;
+       GtkWidget* view;
+
+       container = gtk_vbox_new(FALSE, 0);
+
+       store = gtk_list_store_new(EXT_NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+
+       gchar** plugins = ext_list_plugins();
+       gchar** plugins_it;
+       for (plugins_it = plugins; *plugins_it; ++plugins_it) {
+
+               gboolean    enabled = ext_is_plugin_loaded(*plugins_it);
+               GHashTable* metadata = ext_read_plugin_metadata(*plugins_it);
+               if (!metadata) {
+                       metadata = g_hash_table_new(g_str_hash, g_str_equal);
+               }
+
+               gchar* tmp = NULL;
+
+               // NAME
+               gchar* name = g_hash_table_lookup(metadata, "name");
+               if (!name || *name == '\0') {
+                       name = *plugins_it;
+               }
+               name = g_markup_escape_text(name, -1);
+               gchar* label = g_strdup_printf("<b>%s</b>", name);
+               gchar* tooltip = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", name);
+               g_free(name);
+
+               // VERSION
+               gchar* version = g_hash_table_lookup(metadata, "version");
+               if (version) {
+                       version = g_markup_escape_text(version, -1);
+                       tmp = label;
+                       label = g_strdup_printf("%s %s", tmp, version);
+                       g_free(tmp);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s %s", tmp, version);
+                       g_free(tmp);
+                       g_free(version);
+               }
+
+               // ABSTRACT
+               gchar* abstract = g_hash_table_lookup(metadata, "abstract");
+               if (abstract) {
+                       abstract = g_markup_escape_text(abstract, -1);
+                       tmp = label;
+                       label = g_strdup_printf("%s\n%s", tmp, abstract);
+                       g_free(tmp);
+                       g_free(abstract);
+               }
+
+               // AUTHOR
+               gchar* author = g_hash_table_lookup(metadata, "author");
+               if (author) {
+                       author = g_markup_escape_text(author, -1);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s\n%s", tmp, author);
+                       g_free(tmp);
+                       g_free(author);
+               }
+
+               // WEBSITE
+               gchar* website = g_hash_table_lookup(metadata, "website");
+               if (website) {
+                       website = g_markup_escape_text(website, -1);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("Website"), website);
+                       g_free(tmp);
+                       g_free(website);
+               }
+
+               // FILEPATH
+               tmp = ext_find_plugin(*plugins_it);
+               gchar* full = g_markup_escape_text(tmp, -1);
+               g_free(tmp);
+               tmp = tooltip;
+               tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("File"), full);
+               g_free(tmp);
+               g_free(full);
+
+               g_hash_table_unref(metadata);
+
+               gtk_list_store_append(store, &it);
+               gtk_list_store_set(store, &it,
+                               EXT_COLUMN_ENABLED,     enabled,
+                               EXT_COLUMN_LABEL,       label,
+                               EXT_COLUMN_TOOLTIP,     tooltip,
+                               EXT_COLUMN_PLUGIN_NAME, *plugins_it,
+                               -1);
+
+               g_free(label);
+               g_free(tooltip);
+       }
+       g_strfreev(plugins);
+
+       view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       g_signal_connect(view, "row-activated", (GCallback)plugin_execute_action, NULL);
+
+       gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), TRUE);
+       gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(view), EXT_COLUMN_TOOLTIP);
+
+
+       GtkTreeViewColumn   *col;
+       GtkCellRenderer     *renderer;
+
+
+       col = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(col, _("Enabled"));
+       gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_ENABLED);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
+
+       renderer = gtk_cell_renderer_toggle_new();
+       gtk_tree_view_column_pack_start(col, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(col, renderer, "active", 0);
+       g_signal_connect(renderer, "toggled", G_CALLBACK(toggle_plugin), store);
+
+       col = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(col, _("Plugin"));
+       gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_LABEL);
+       gtk_tree_view_column_set_expand(col, TRUE);
+       /*gtk_tree_view_column_set_sort_order(col, GTK_SORT_ASCENDING);*/
+       gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
+
+       renderer = gtk_cell_renderer_text_new();
+       g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+       gtk_tree_view_column_pack_start(col, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(col, renderer, "markup", EXT_COLUMN_LABEL);
+
+       data->PI_plugin_columns = view;
+
+       GtkWidget* sw = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+       gtk_container_add(GTK_CONTAINER(sw), view);
+
+       gtk_box_pack_start(GTK_BOX(container), sw, TRUE, TRUE, 0);
+
+       return(container);
+}
+
+
 static void defpref_selection(GtkTreeSelection *treeselection, gpointer user_data)
 {
 struct defpref_data *data;
@@ -2108,7 +2323,7 @@ gint result;
 
 
 // the window creation
-GtkWidget *defpref_dialog_new (void)
+GtkWidget *defpref_dialog_new (gint initial_selection)
 {
 struct defpref_data data;
 GtkWidget *window, *content, *mainvbox;
@@ -2260,6 +2475,10 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        page = defpref_page_euro(&data);
        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
 
+       //plugins
+       page = defpref_page_plugins(&data);
+       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
+
 
        //todo:should move this
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.CM_euro_enable), PREFS->euro_active);
@@ -2315,8 +2534,8 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        gtk_window_resize(GTK_WINDOW(window), 640, 256);
 
 
-       //select first row
-       GtkTreePath *path = gtk_tree_path_new_first ();
+       //select initial row
+       GtkTreePath *path = gtk_tree_path_new_from_indices(initial_selection, -1);
 
        gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_page)), path);
 
@@ -2325,6 +2544,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        gtk_tree_path_free(path);
 
        gtk_widget_show_all (window);
+       gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), initial_selection);
 
        gint result;
        gchar *old_lang;
@@ -2517,7 +2737,7 @@ gint i;
                if(i <= LST_DSPOPE_DATE) // status, date always displayed
                        continue;
 
-               //[i-1] here because lst_ope_columns[] do not store LST_DSPOPE_DATAS
+               //[i-1] here because lst_ope_columns[] do not store MODEL_TXN_POINTER
                id = ABS(PREFS->lst_ope_columns[i-1]);  
                if(id == 0) id = i;      //if we pass here, new column or weird into pref file
                visible = (PREFS->lst_ope_columns[i-1] > 0) ? TRUE : FALSE;
@@ -2565,3 +2785,32 @@ gint i;
 }
 */
 
+
+static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns)
+{
+       GtkTreeModel *model;
+       GtkTreeIter     iter;
+
+       g_list_free_full(*columns, g_free);
+       *columns = NULL;
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+
+       gboolean valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
+       while (valid) {
+               gboolean        enabled = FALSE;
+               const gchar*    name;
+
+               gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
+                       EXT_COLUMN_ENABLED,     &enabled,
+                       EXT_COLUMN_PLUGIN_NAME, &name,
+                       -1);
+
+               if (enabled) {
+                       *columns = g_list_append(*columns, g_strdup(name));
+               }
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
+       }
+}
+
This page took 0.035378 seconds and 4 git commands to generate.