diff options
author | Logan Rathbone <poprocks@gmail.com> | 2023-02-01 09:09:28 -0500 |
---|---|---|
committer | Logan Rathbone <poprocks@gmail.com> | 2023-02-01 21:00:29 -0500 |
commit | 7a80b6702a3a3f2eac26640b369c9c87ae163041 (patch) | |
tree | a4d1e3a15300294c9ebaec55ca0b470b9e971840 /src/tree.c | |
parent | e2df75b842334878f0b234eed6613544f102af48 (diff) | |
download | zenity-7a80b6702a3a3f2eac26640b369c9c87ae163041.tar.gz |
tree: Initial port to GtkColumnView
There are likely bugs.
Search functionality still needs to be implemented.
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 716 |
1 files changed, 192 insertions, 524 deletions
@@ -29,6 +29,7 @@ #include "util.h" #include "zenity.h" +#include "zenity-tree-column-view.h" #include <stdlib.h> #include <string.h> @@ -37,7 +38,8 @@ #define PRINT_HIDE_COLUMN_SEPARATOR "," -static GtkTreeView *tree_view; +static ZenityTreeColumnView *col_view; +static gboolean editable; static GSList *selected; static char *separator; static gboolean print_all_columns = FALSE; @@ -46,134 +48,53 @@ static int *hide_columns = NULL; static GIOChannel *channel; static int *zenity_tree_extract_column_indexes (char *indexes, int n_columns); -static gboolean zenity_tree_column_is_hidden (int column_index); static void zenity_tree_dialog_response (GtkWidget *widget, char *rstr, gpointer data); -static void zenity_tree_row_activated (GtkTreeView *tree_view, - GtkTreePath *tree_path, GtkTreeViewColumn *tree_col, gpointer data); - -static gboolean -zenity_tree_dialog_untoggle (GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) -{ - GValue toggle_value = G_VALUE_INIT; - - gtk_tree_model_get_value (model, iter, 0, &toggle_value); - - if (g_value_get_boolean (&toggle_value)) - gtk_list_store_set (GTK_LIST_STORE (model), iter, 0, FALSE, -1); - - return FALSE; -} - -static void -check_or_radio_label_activated_cb (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data) -{ - GtkTreeModel *model = gtk_tree_view_get_model (tree_view); - GtkTreeIter iter; - gboolean value; - - /* Because this is a radio list, we should untoggle the previous toggle so - * that we only have one selection at any given time - */ - if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "radio")) == 1) - { - gtk_tree_model_foreach (model, zenity_tree_dialog_untoggle, NULL); - } - - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, 0, &value, -1); - - value = !value; - gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, value, -1); -} +static void zenity_tree_dialog_output (void); static void -zenity_load_pixbuf (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) +show_mid_search_deprecation_warning (void) { - static GHashTable *pixbuf_cache = NULL; - GError *error = NULL; - GdkPixbuf *pixbuf; - g_autofree char *str = NULL; - - gtk_tree_model_get (tree_model, iter, 0, &str, -1); - - if (! str) - return; - - if (! pixbuf_cache) - { - pixbuf_cache = g_hash_table_new (g_str_hash, g_str_equal); - g_assert (pixbuf_cache); - } - - pixbuf = g_hash_table_lookup (pixbuf_cache, str); - - if (! pixbuf) - { - pixbuf = gdk_pixbuf_new_from_file (str, &error); - - if (! pixbuf) - g_warning ("Failed to load '%s'", str); - - g_hash_table_insert (pixbuf_cache, g_strdup (str), pixbuf); - } - - if (pixbuf) - g_object_set (cell, "pixbuf", pixbuf, NULL); + g_printerr ("Warning: --mid-search is deprecated and will be removed in a " + "future version of zenity. Ignoring.\n"); } - static gboolean -zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, - gpointer data) +zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, gpointer data) { - GtkTreeModel *model; - static GtkTreeIter iter; static int column_count = 0; static int row_count = 0; - static int n_columns; - static gboolean editable; - static gboolean toggles; static gboolean first_time = TRUE; GIOStatus status = G_IO_STATUS_NORMAL; - - /* Make sure global is properly defined */ - g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE); - - n_columns = - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); - editable = - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "editable")); - toggles = - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "toggles")); - - model = gtk_tree_view_get_model (tree_view); + int n_columns = zenity_tree_column_view_get_n_columns (col_view); + gboolean toggles = FALSE; + ZenityTreeListType list_type = zenity_tree_column_view_get_list_type (col_view); + GListStore *store = G_LIST_STORE(zenity_tree_column_view_get_model (col_view)); if (first_time) - { first_time = FALSE; - gtk_list_store_append (GTK_LIST_STORE (model), &iter); - } + + if (list_type == ZENITY_TREE_LIST_RADIO || list_type == ZENITY_TREE_LIST_CHECK) + toggles = TRUE; if ((condition & G_IO_IN) == G_IO_IN) { - g_autoptr(GString) string = NULL; + ZenityTreeRow *row = NULL; + g_autoptr(GString) gstring = g_string_new (NULL); g_autoptr(GError) error = NULL; - string = g_string_new (NULL); - while ((g_io_channel_get_flags (channel) & G_IO_FLAG_IS_READABLE) != G_IO_FLAG_IS_READABLE) ; + + row = zenity_tree_row_new (); do { + ZenityTreeItem *item; + do { if (g_io_channel_get_flags (channel) & G_IO_FLAG_IS_READABLE) { - status = g_io_channel_read_line_string (channel, - string, NULL, &error); - } else { + status = g_io_channel_read_line_string (channel, gstring, NULL, &error); + g_strchomp (gstring->str); + } + else { return FALSE; } @@ -188,9 +109,8 @@ zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, if (status != G_IO_STATUS_NORMAL) { if (error) { - g_warning ("%s: %s", - __func__, error->message); - error = NULL; + g_warning ("%s: %s", __func__, error->message); + g_clear_error (&error); } continue; } @@ -200,42 +120,32 @@ zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, /* We're starting a new row */ column_count = 0; row_count++; - gtk_list_store_append (GTK_LIST_STORE (model), &iter); } if (toggles && column_count == 0) { - if (strcmp (g_ascii_strdown ( - zenity_util_strip_newline (string->str), -1), - "true") == 0) - { - gtk_list_store_set (GTK_LIST_STORE(model), - &iter, column_count, TRUE, -1); - } - else { - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, column_count, FALSE, -1); - } + item = zenity_tree_item_new (gstring->str, gtk_check_button_new ()); } - else + else if (list_type == ZENITY_TREE_LIST_IMAGE && column_count == 0) { - gtk_list_store_set (GTK_LIST_STORE (model), - &iter, - column_count, - zenity_util_strip_newline (string->str), - -1); + item = zenity_tree_item_new (gstring->str, gtk_image_new ()); } - - if (editable) { - gtk_list_store_set (GTK_LIST_STORE(model), - &iter, n_columns, TRUE, -1); + else + { + if (editable) + item = zenity_tree_item_new (gstring->str, gtk_editable_label_new (NULL)); + else + item = zenity_tree_item_new (gstring->str, gtk_label_new (NULL)); } + zenity_tree_row_add (row, item); column_count++; - } while ((g_io_channel_get_buffer_condition (channel) & G_IO_IN) == - G_IO_IN && + } while ((g_io_channel_get_buffer_condition (channel) & G_IO_IN) == G_IO_IN && status != G_IO_STATUS_EOF); /* !do while */ + + if (row) + g_list_store_append (store, row); } if ((condition & G_IO_IN) != G_IO_IN || status == G_IO_STATUS_EOF) @@ -247,100 +157,67 @@ zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, } static void -zenity_tree_fill_entries_from_stdin (GtkTreeView *loc_tv, int n_columns, - gboolean toggles, gboolean editable) +zenity_tree_fill_entries_from_stdin (void) { - /* No reason this should fail. Sanity check. */ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - g_assert (loc_tv == tree_view); - - g_object_set_data ( - G_OBJECT (tree_view), "n_columns", GINT_TO_POINTER (n_columns)); - g_object_set_data ( - G_OBJECT (tree_view), "toggles", GINT_TO_POINTER (toggles)); - g_object_set_data ( - G_OBJECT (tree_view), "editable", GINT_TO_POINTER (editable)); - channel = g_io_channel_unix_new (0); g_io_channel_set_encoding (channel, NULL, NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); - g_io_add_watch (channel, - G_IO_IN | G_IO_HUP, zenity_tree_handle_stdin, NULL); + g_io_add_watch (channel, G_IO_IN | G_IO_HUP, zenity_tree_handle_stdin, NULL); } static void -zenity_tree_fill_entries (GtkTreeView *loc_tv, const char **args, - int n_columns, gboolean toggles, gboolean editable) +zenity_tree_fill_entries (const char **args) { - GtkTreeModel *model; - GtkTreeIter iter; - int i = 0; - - /* No reason this should fail. Sanity check. */ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - g_assert (loc_tv == tree_view); - - model = gtk_tree_view_get_model (tree_view); - - g_object_set_data ( - G_OBJECT (tree_view), "n_columns", GINT_TO_POINTER (n_columns)); + int n_columns = zenity_tree_column_view_get_n_columns (col_view); + ZenityTreeListType list_type = zenity_tree_column_view_get_list_type (col_view); + GListStore *store = G_LIST_STORE(zenity_tree_column_view_get_model (col_view)); + gboolean toggles = FALSE; - while (args[i] != NULL) { - int j; + if (list_type == ZENITY_TREE_LIST_RADIO || list_type == ZENITY_TREE_LIST_CHECK) + toggles = TRUE; - gtk_list_store_append (GTK_LIST_STORE (model), &iter); - - for (j = 0; j < n_columns; j++) { + for (int i = 0; args[i]; i+= n_columns) + { + ZenityTreeRow *row = zenity_tree_row_new (); - if (toggles && j == 0) { - if (strcmp (g_ascii_strdown ((gchar *) args[i + j], -1), - "true") == 0) - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, j, TRUE, -1); + for (int j = 0; j < n_columns; j++) + { + ZenityTreeItem *item; + const char *str = args[i + j]; + + if (toggles && j == 0) + { + item = zenity_tree_item_new (str, gtk_check_button_new ()); + } + else if (list_type == ZENITY_TREE_LIST_IMAGE && j == 0) + { + item = zenity_tree_item_new (str, gtk_image_new ()); + } + else + { + if (editable) + item = zenity_tree_item_new (str, gtk_editable_label_new ("")); else - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, j, FALSE, -1); - } else - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, j, args[i + j], -1); - } - - if (editable) { - gtk_list_store_set (GTK_LIST_STORE(model), - &iter, n_columns, TRUE, -1); + item = zenity_tree_item_new (str, gtk_label_new (NULL)); + } + zenity_tree_row_add (row, item); } - i += n_columns; + g_list_store_append (store, row); } } -static gboolean -zenity_mid_search_func (GtkTreeModel *model, int column, const char *key, - GtkTreeIter *iter, gpointer search_data) -{ - char *iter_string = NULL; - - gtk_tree_model_get (model, iter, column, &iter_string, -1); - - return !(g_strrstr (g_utf8_strdown (iter_string, -1), - g_utf8_strdown (key, -1)) != NULL); -} - static void -zenity_cell_edited_callback (GtkCellRendererText *cell, - const char *path_string, const char *new_text, gpointer data) +cv_activated_cb (ZenityTreeColumnView *cv, gpointer data) { - GtkTreeModel *model; - g_autoptr(GtkTreePath) path = NULL; - GtkTreeIter iter; - int column; + GtkWindow *parent; + ZenityData *zen_data = data; - model = GTK_TREE_MODEL (data); - path = gtk_tree_path_new_from_string (path_string); + zenity_tree_dialog_output (); + zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column")); - gtk_tree_model_get_iter (model, &iter, path); + parent = GTK_WINDOW(gtk_widget_get_native (GTK_WIDGET(col_view))); - gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, new_text, -1); + zenity_util_gapp_quit (parent, zen_data); } void @@ -349,12 +226,13 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; GObject *text; - GtkTreeViewColumn *column; - GtkListStore *model; - GType *column_types; + GListStore *store; + ZenityTreeListType list_type; GSList *tmp; - gboolean first_column = FALSE; - int i, column_index, n_columns; + int n_columns; + + if (tree_data->mid_search_DEPRECATED) + show_mid_search_deprecation_warning (); builder = zenity_util_load_ui_file ("zenity_tree_dialog", "zenity_tree_box", NULL); @@ -401,8 +279,7 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) return; } - dialog = GTK_WIDGET(gtk_builder_get_object (builder, - "zenity_tree_dialog")); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, "zenity_tree_dialog")); g_signal_connect (dialog, "response", G_CALLBACK(zenity_tree_dialog_response), data); @@ -439,243 +316,55 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) data->width, data->height); } - /* Define global tree_view. */ - tree_view = GTK_TREE_VIEW(gtk_builder_get_object (builder, - "zenity_tree_view")); + /* Create a list store */ + store = g_list_store_new (ZENITY_TREE_TYPE_ROW); - if (tree_data->radiobox || tree_data->checkbox) - { - gtk_tree_view_set_activate_on_single_click (GTK_TREE_VIEW(tree_view), - TRUE); + /* Define global col_view */ + col_view = ZENITY_TREE_COLUMN_VIEW(gtk_builder_get_object (builder, "zenity_tree_cv")); - g_signal_connect (tree_view, - "row-activated", - G_CALLBACK (check_or_radio_label_activated_cb), - data); - } - else - { - g_signal_connect (tree_view, - "row-activated", - G_CALLBACK (zenity_tree_row_activated), - data); - } - - /* Create an empty list store */ - model = g_object_new (GTK_TYPE_LIST_STORE, NULL); - - if (tree_data->editable) - column_types = g_new (GType, n_columns + 1); - else - column_types = g_new (GType, n_columns); + /* This signal will only get emitted for certain kinds of lists, but if + * applicable, it should finish the job. + */ + g_signal_connect (col_view, "activated", G_CALLBACK(cv_activated_cb), data); - for (i = 0; i < n_columns; i++) - { - /* Have the limitation that the radioboxes and checkboxes are in the - * first column */ - if (i == 0 && (tree_data->checkbox || tree_data->radiobox)) - column_types[i] = G_TYPE_BOOLEAN; - else - column_types[i] = G_TYPE_STRING; + if (tree_data->radiobox) { + list_type = ZENITY_TREE_LIST_RADIO; } - - if (tree_data->editable) - column_types[n_columns] = G_TYPE_BOOLEAN; - - if (tree_data->editable) - gtk_list_store_set_column_types (model, n_columns + 1, column_types); - else - gtk_list_store_set_column_types (model, n_columns, column_types); - - gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(model)); - - if (tree_data->radiobox || tree_data->checkbox) - { - gtk_tree_selection_set_mode ( - gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), - GTK_SELECTION_SINGLE); + else if (tree_data->checkbox) { + list_type = ZENITY_TREE_LIST_CHECK; } - else - { - if (tree_data->multi) - gtk_tree_selection_set_mode ( - gtk_tree_view_get_selection (tree_view), - GTK_SELECTION_MULTIPLE); - else - gtk_tree_selection_set_mode ( - gtk_tree_view_get_selection (tree_view), - GTK_SELECTION_SINGLE); + else if (tree_data->imagebox) { + list_type = ZENITY_TREE_LIST_IMAGE; + } + else { + list_type = ZENITY_TREE_LIST_NONE; } - column_index = 0; + editable = tree_data->editable; + g_object_set (col_view, + "list-type", list_type, + "multi", tree_data->multi, + "model", G_LIST_MODEL(store), + NULL); for (tmp = tree_data->columns; tmp; tmp = tmp->next) { - if (! first_column) - { - if (tree_data->checkbox || tree_data->radiobox) - { - GtkCellRenderer *cell_renderer; - - cell_renderer = gtk_cell_renderer_toggle_new (); - - if (tree_data->radiobox) { - g_object_set ( - G_OBJECT (cell_renderer), "radio", TRUE, NULL); - g_object_set_data ( - G_OBJECT (model), "radio", GINT_TO_POINTER (1)); - } - - column = gtk_tree_view_column_new_with_attributes ( - tmp->data, cell_renderer, "active", column_index, NULL); - } - else if (tree_data->imagebox) - { - GtkCellRenderer *cell_renderer = - gtk_cell_renderer_pixbuf_new (); - - column = gtk_tree_view_column_new_with_attributes ( - tmp->data, cell_renderer, NULL); - gtk_tree_view_column_set_cell_data_func ( - column, cell_renderer, zenity_load_pixbuf, NULL, NULL); - } - else - { - if (tree_data->editable) - { - GtkCellRenderer *cell_renderer; - - cell_renderer = gtk_cell_renderer_text_new (); - g_signal_connect (cell_renderer, "edited", - G_CALLBACK (zenity_cell_edited_callback), - gtk_tree_view_get_model (tree_view)); - - g_object_set_data (G_OBJECT (cell_renderer), - "column", - GINT_TO_POINTER (column_index)); - - column = - gtk_tree_view_column_new_with_attributes (tmp->data, - cell_renderer, - "text", - column_index, - "editable", - n_columns, - NULL); - } - else - { - column = - gtk_tree_view_column_new_with_attributes (tmp->data, - gtk_cell_renderer_text_new (), - "text", - column_index, - NULL); - } - - gtk_tree_view_column_set_sort_column_id (column, column_index); - gtk_tree_view_column_set_resizable (column, TRUE); - } - if (zenity_tree_column_is_hidden (1)) - gtk_tree_view_column_set_visible (column, FALSE); - - first_column = TRUE; - } - else - { - if (tree_data->editable) - { - GtkCellRenderer *cell_renderer; - - cell_renderer = gtk_cell_renderer_text_new (); - g_signal_connect (cell_renderer, "edited", - G_CALLBACK (zenity_cell_edited_callback), - gtk_tree_view_get_model (tree_view)); - - g_object_set_data (G_OBJECT (cell_renderer), - "column", - GINT_TO_POINTER (column_index)); - - column = gtk_tree_view_column_new_with_attributes (tmp->data, - cell_renderer, - "text", - column_index, - "editable", - n_columns, - NULL); - } - else - { - column = gtk_tree_view_column_new_with_attributes (tmp->data, - gtk_cell_renderer_text_new (), - "text", - column_index, - NULL); - } - - gtk_tree_view_column_set_sort_column_id (column, column_index); - gtk_tree_view_column_set_resizable (column, TRUE); - - if (zenity_tree_column_is_hidden (column_index + 1)) - gtk_tree_view_column_set_visible (column, FALSE); - } - - gtk_tree_view_append_column (tree_view, column); - column_index++; + zenity_tree_column_view_add_column (col_view, tmp->data); } - if (tree_data->hide_header) - gtk_tree_view_set_headers_visible (tree_view, FALSE); - - if (tree_data->radiobox || tree_data->checkbox) + if (tree_data->data && *tree_data->data) /* we have argv after opts */ { - if (tree_data->data && *tree_data->data) { - zenity_tree_fill_entries (tree_view, - tree_data->data, - n_columns, - TRUE, - tree_data->editable); - } - else { - zenity_tree_fill_entries_from_stdin (tree_view, - n_columns, - TRUE, - tree_data->editable); - } + zenity_tree_fill_entries (tree_data->data); } else { - if (tree_data->data && *tree_data->data) { - zenity_tree_fill_entries (tree_view, - tree_data->data, - n_columns, - FALSE, - tree_data->editable); - } else { - zenity_tree_fill_entries_from_stdin (tree_view, - n_columns, - FALSE, - tree_data->editable); - } + zenity_tree_fill_entries_from_stdin (); } - /* GTK will automatically pick the image column as the search column - * despite it not containing any user readable text. - * Set it to second column instead if it exists. */ - if (tree_data->imagebox && n_columns > 1) { - gtk_tree_view_set_search_column (GTK_TREE_VIEW (tree_view), - 1); - } + // FIXME - make stuff searchable zenity_util_show_dialog (dialog); - if (tree_data->mid_search) { - gtk_tree_view_set_search_equal_func (tree_view, - (GtkTreeViewSearchEqualFunc) zenity_mid_search_func, - model, - NULL); - } - if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, @@ -685,103 +374,115 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) zenity_util_gapp_main (GTK_WINDOW(dialog)); } -static void -zenity_tree_dialog_get_selected (GtkTreeModel *model, GtkTreePath *path_buf, - GtkTreeIter *iter, gpointer user_data) +static gboolean +get_row_checkbtn_toggled (ZenityTreeRow *row) { - GValue value = G_VALUE_INIT; - int n_columns, i; + ZenityTreeItem *item = zenity_tree_row_get_item (row, 0); + GtkWidget *child = zenity_tree_item_get_child (item); - n_columns = - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); - - if (print_all_columns) + if (GTK_IS_CHECK_BUTTON (child)) { - for (i = 0; i < n_columns; i++) - { - gtk_tree_model_get_value (model, iter, i, &value); - - selected = g_slist_append (selected, g_value_dup_string (&value)); - g_value_unset (&value); - } - return; + return gtk_check_button_get_active (GTK_CHECK_BUTTON(child)); } - for (i = 0; print_columns[i] != 0; i++) - { - gtk_tree_model_get_value (model, iter, print_columns[i] - 1, &value); - selected = g_slist_append (selected, g_value_dup_string (&value)); - - g_value_unset (&value); - } + return FALSE; } -static gboolean -zenity_tree_dialog_toggle_get_selected (GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer user_data) +static void +zenity_tree_dialog_get_selected (void) { - GValue toggle_value = G_VALUE_INIT; - int n_columns, i; + int n_columns = zenity_tree_column_view_get_n_columns (col_view); + GListModel *model = zenity_tree_column_view_get_model (col_view); + ZenityTreeItem *item; - n_columns = - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); + for (guint i = 0; i < g_list_model_get_n_items (model); ++i) + { + ZenityTreeRow *row; - gtk_tree_model_get_value (model, iter, 0, &toggle_value); + if (! zenity_tree_column_view_is_selected (col_view, i)) + continue; - if (g_value_get_boolean (&toggle_value)) - { - GValue value = G_VALUE_INIT; + row = g_list_model_get_item (model, i); if (print_all_columns) { - for (i = 1; i < n_columns; i++) + for (int j = 0; j < n_columns; j++) { - gtk_tree_model_get_value (model, iter, i, &value); + item = zenity_tree_row_get_item (row, j); - selected = - g_slist_append (selected, g_value_dup_string (&value)); - g_value_unset (&value); + selected = g_slist_append (selected, + g_strdup (zenity_tree_item_get_text (item))); } - g_value_unset (&toggle_value); - return FALSE; } - - for (i = 0; print_columns[i] != 0; i++) + else { - gtk_tree_model_get_value ( - model, iter, print_columns[i] - 1, &value); + for (int j = 0; print_columns[j] != 0; j++) + { + /* columns in CLI count from 1 and are allocated as 0-terminated + * arrays, so account for that here with -1. */ + item = zenity_tree_row_get_item (row, print_columns[j] - 1); - selected = g_slist_append (selected, g_value_dup_string (&value)); - g_value_unset (&value); + selected = g_slist_append (selected, + g_strdup (zenity_tree_item_get_text (item))); + } } } - g_value_unset (&toggle_value); - - return FALSE; } static void -zenity_tree_dialog_output (void) +zenity_tree_dialog_toggle_get_selected (ZenityTreeRow *row, gpointer unused) { - GtkTreeSelection *selection; - GtkTreeModel *model; + int n_columns; + ZenityTreeItem *item; - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + if (! get_row_checkbtn_toggled (row)) + return; - model = gtk_tree_view_get_model (tree_view); + n_columns = zenity_tree_column_view_get_n_columns (col_view); - if (gtk_tree_model_get_column_type (model, 0) == G_TYPE_BOOLEAN) + if (print_all_columns) { - gtk_tree_model_foreach (model, - (GtkTreeModelForeachFunc) zenity_tree_dialog_toggle_get_selected, - NULL); + /* start at 1 because we're not printing the checklist column string + */ + for (int i = 1; i < n_columns; i++) + { + item = zenity_tree_row_get_item (row, i); + + selected = g_slist_append (selected, + g_strdup (zenity_tree_item_get_text (item))); + } } else { - selection = gtk_tree_view_get_selection (tree_view); - gtk_tree_selection_selected_foreach (selection, - (GtkTreeSelectionForeachFunc) zenity_tree_dialog_get_selected, - NULL); + for (int i = 0; print_columns[i] != 0; i++) + { + /* columns in CLI count from 1 and are allocated as 0-terminated + * arrays, so account for that here with -1. */ + item = zenity_tree_row_get_item (row, print_columns[i] - 1); + + selected = g_slist_append (selected, + g_strdup (zenity_tree_item_get_text (item))); + } + } +} + +static void +zenity_tree_dialog_output (void) +{ + gboolean multi = zenity_tree_column_view_get_multi (col_view); + ZenityTreeListType list_type = zenity_tree_column_view_get_list_type (col_view); + + if (list_type == ZENITY_TREE_LIST_RADIO || list_type == ZENITY_TREE_LIST_CHECK) + { + zenity_tree_column_view_foreach_row (col_view, + (GFunc)zenity_tree_dialog_toggle_get_selected, NULL); + } + else if (multi) + { + } + else + { + zenity_tree_dialog_get_selected (); } @@ -840,39 +541,6 @@ zenity_tree_dialog_response (GtkWidget *widget, char *rstr, gpointer data) zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } -static void -zenity_tree_row_activated (GtkTreeView *loc_tv, GtkTreePath *tree_path, - GtkTreeViewColumn *tree_col, gpointer data) -{ - GtkWindow *parent; - ZenityData *zen_data = data; - - /* No reason this should fail. Sanity check. */ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - g_assert (loc_tv == tree_view); - - zenity_tree_dialog_output (); - zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - - parent = GTK_WINDOW(gtk_widget_get_native (GTK_WIDGET(tree_view))); - - zenity_util_gapp_quit (parent, zen_data); -} - -static gboolean -zenity_tree_column_is_hidden (int column_index) -{ - if (hide_columns != NULL) - { - for (int i = 0; hide_columns[i] != 0; i++) - { - if (hide_columns[i] == column_index) - return TRUE; - } - } - return FALSE; -} - static int * zenity_tree_extract_column_indexes (char *indexes, int n_columns) { |