/* * Gem-graph OpenGL experiments * * Desc: User interface functions * * Copyright (C) 2023 Jean Sirmai * * This file is part of Gem-graph. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include #include #include #include "../../include/base.h" #include "../../include/ui.h" #include enum { COL_FIRST_NAME = 0, COL_LAST_NAME, NUM_COLS } ; GtkListStore *list_store; GtkTreeStore *tree_store; GtkTreeIter iter, child; static void tree_c_printing_test(void); static GtkTreeModel * create_and_fill_model (void) { GtkTreeStore *treestore; GtkTreeIter toplevel, child; treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING); /* Append a top level row and leave it empty */ gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "RanTanPlan", COL_LAST_NAME, "(dog)", -1); gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "Ma", COL_LAST_NAME, "Dalton", -1); /* Append a second top level row, and fill it with some data */ gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "Joe", COL_LAST_NAME, "Dalton", -1); gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "Jack", COL_LAST_NAME, "Dalton", -1); gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "William", COL_LAST_NAME, "Dalton", -1); /* Append a child to the second top level row, and fill in some data */ gtk_tree_store_append(treestore, &child, &toplevel); gtk_tree_store_set(treestore, &child, COL_FIRST_NAME, "Averell", COL_LAST_NAME, "Dalton", -1); return GTK_TREE_MODEL(treestore); } /*********************************************************** * * * Going through every row in a list store * * * ***********************************************************/ void traverse_list_store (GtkListStore *liststore) { gboolean valid; g_return_if_fail ( liststore != NULL ); /* Get first row in list store */ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore), &iter); while (valid) { /* ... do something with that row using the iter ... */ /* (Here column 0 of the list store is of type G_TYPE_STRING) */ gtk_list_store_set(liststore, &iter, 0, "Joe", -1); /* Make iter point to the next row in the list store */ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore), &iter); } } /************************************************************* * * * Converting a GtkTreePath into a GtkTreeIter * * * *************************************************************/ /************************************************************* * * * onTreeViewRowActivated: a row has been double-clicked * * * *************************************************************/ void onTreeViewRowActivated (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer userdata) { GtkTreeModel *model; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { gchar *name; gtk_tree_model_get(model, &iter, "ANY_COLUMN_NAME", &name, -1); g_print ("The row containing the name '%s' has been double-clicked.\n", name); g_free(name); } } void tree_c_test(void) { list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_UINT); /* Append empty rows to the list store. Iter will point to the new row */ gtk_list_store_append(list_store, &iter); gtk_list_store_append(list_store, &iter); gtk_list_store_append(list_store, &iter); tree_store = gtk_tree_store_new(1, G_TYPE_STRING); /* Append an empty top-level row to the tree store. * Iter will point to the new row */ gtk_tree_store_append(tree_store, &iter, NULL); /* Append another empty top-level row to the tree store. * Iter will point to the new row */ gtk_tree_store_append(tree_store, &iter, NULL); /* Append a child to the row we just added. * Child will point to the new row */ gtk_tree_store_append(tree_store, &child, &iter); /* Get the first row, and add a child to it as well (could have been done * right away earlier of course, this is just for demonstration purposes) */ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tree_store), &iter)) { /* Child will point to new row */ gtk_tree_store_append(tree_store, &child, &iter); } else g_error("Oops, we should have a first row in the tree store!\n"); // GtkTreeViewColumn *col; // GtkCellRenderer *renderer; // GtkWidget *view; // GtkTreeModel *model; // GtkWidget *window; tree_c_printing_test(); } static void tree_c_printing_test(void) { printf("tree.c tree_c_printing_test() \ -------------------------------\n\ A button is now in the GtkBox and an action is associated to it.\n\n"); } /* https://docs.gtk.org/gtk4/input-handling.html https://stackoverflow.com/questions/76583553/how-to-use-eventcontroller-in-gtk4 https://docs.gtk.org/gobject/func.signal_connect_object.html https://docs.gtk.org/gobject/#functions https://docs.gtk.org/gtk4/class.Label.html?q= https://docs.gtk.org/gtk4/ctor.Button.new_with_label.html https://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Tree_Models https://stackoverflow.com/questions/74556059/how-to-build-a-tree-in-gtk4-4-10 https://stackoverflow.com/questions/51002454/how-to-list-all-the-rows-of-a-gtk-treeview https://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Columns_and_Renderer */