brandizzi icon

Selecting a line in a Gtk+ tree view - ok

brandizzi | PRO | 07/18/12 02:11:44 PM UTC | 0 ⭐ | 716 👁️ | Never ⏰ | []
C |

2.97 KB

|

None

|

0 👍

/

0 👎

#include <gtk/gtk.h>
#include <stdbool.h>
 
void on_cursor_changed(GtkTreeView *tree_view, gpointer data);
 
int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
 
    // Creating visual elements
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL),
        *tree_view = gtk_tree_view_new();
    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(
       "title", renderer, "text", 0, NULL);
    gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column, 0);
       
    // Creating model
    GtkTreeStore *model = gtk_tree_store_new(1, G_TYPE_STRING);
    
    // Adding toplevel rows
    GtkTreeIter iter;
    gtk_tree_store_append(model, &iter, NULL);
    gtk_tree_store_set(model, &iter, 0, "line 0", -1);
    
    gtk_tree_store_append(model, &iter, NULL);
    gtk_tree_store_set(model, &iter, 0, "line 1", -1);
    
    gtk_tree_store_append(model, &iter, NULL);
    gtk_tree_store_set(model, &iter, 0, "line 2 with children", -1);
    
    // Adding children rows
    GtkTreeIter child;
    gtk_tree_store_append(model, &child, &iter);
    gtk_tree_store_set(model, &child, 0, "child line 1", -1);
    
    gtk_tree_store_append(model, &child, &iter);
    gtk_tree_store_set(model, &child, 0, "child line 2", -1);
    
    // Binding model to view
    gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(model));
    // Selecting a line
    gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "0");
    GtkTreeSelection *selection =
            gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
    gtk_tree_selection_select_iter(selection, &iter);
 
    // Connecting selection callback to view
    g_signal_connect(G_OBJECT(tree_view), "cursor-changed", 
            G_CALLBACK(on_cursor_changed), NULL);
    
    gtk_widget_show(tree_view);
    
    // Gran finale
    gtk_container_add(GTK_CONTAINER(window), tree_view);
    gtk_widget_show(window);
    
    gtk_main();
    return 0;
}
 
void on_cursor_changed(GtkTreeView *tree_view, gpointer data) {
    GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
    GtkTreeIter iter;
    GtkTreeModel *model;
    bool has_selection = gtk_tree_selection_get_selected(
            selection, &model, &iter);
    //if (!has_selection) return;
    
    gchar *path_str = gtk_tree_model_get_string_from_iter(model, &iter);
 
    if (strncmp(path_str, "0", 2) == 0) {
        g_print("1st line selected\n");
    } else if (strncmp(path_str, "1", 2) == 0) {
        g_print("2nd line selected\n");
    } else if (strncmp(path_str, "2", 2) == 0) {
        g_print("3rd line selected\n");
    } else if (strncmp(path_str, "2:", 2) == 0) {
        GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
        gint *indices = gtk_tree_path_get_indices(path);
        g_print("Child #%d from 3rd line selected\n", indices[1]);
    }
    
    g_free(path_str);
}

Comments