#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