diff --git a/include/ui.h b/include/ui.h
index 53f7c8a..402b4d2 100644
--- a/include/ui.h
+++ b/include/ui.h
@@ -122,13 +122,34 @@ void ui_toggle_sidebar ();
// Tree primitives
-void traverse_list_store (GtkListStore *liststore);
-void onTreeViewRowActivated (GtkTreeView *view, GtkTreePath *path,
- GtkTreeViewColumn *col, gpointer userdata);
+// struct _GemGraphClientWindow
+// {
+// GtkApplicationWindow parent_instance;
+
+// /* Template widgets */
+// GtkHeaderBar *main_titlebar;
+// GtkStack *main_stack;
+// GtkStack *side_stack;
+// GtkPaned *main_paned;
+// GtkMenuButton *main_button_mode;
+// GtkToggleButton *main_button_sidebar;
+// GtkRevealer *toast_revealer;
+// GtkToggleButton *toast_close_button;
+// GtkLabel *toast_text;
+// GtkGLArea *run_glarea;
+// GtkBox *run_controls;
+
+// /* Stack objects */
+// GtkStack *runlib_stack;
+// GtkBox *runlib_objects;
+// };
+
+// G_DEFINE_FINAL_TYPE (GemGraphClientWindow,
+// gem_graph_client_window,
+// GTK_TYPE_APPLICATION_WINDOW)
void print_test_in_tree_dot_c(void);
-void print_test_in_tree_dot_c();
-
-GtkWidget *create_tree_label(void);
-GtkWidget *create_a_button_to_click_on(void);
+//GtkWidget *create_tree_label(void);
+//GtkWidget *create_a_button_to_click_on(void);
+//GtkWidget *create_a_button_in_the_tab(GemGraphClientWindow *window);
diff --git a/src/ui/tree.c b/src/ui/tree.c
index 24a24ab..586e78d 100644
--- a/src/ui/tree.c
+++ b/src/ui/tree.c
@@ -21,6 +21,181 @@
* along with this program. If not, see .
*/
+/*----------------------------------------------------------------------------*/
+/**************** 2024-01-06 À la chasse aux widgets ! ****************/
+/* */
+/* (1) Je recopie les fragments de code qui me semblent utiles */
+/* tirés de demos/gtk-demo/main.c et de la liste suivante */
+/*----------------------------------------------------------------------------*/
+
+
+// https://www.gtk.org/
+/******************************************************************************/
+/* */
+/* W I N D O W = D O _ S O M E _ A P P L I C A T I O N _ E X A M P L E */
+/* */
+// window = do_tree_store(NULL);
+// window = do_listview_words(NULL);
+// window = do_editable_cells(NULL);
+// window = do_dnd(NULL); // drag and drop
+// window = do_drawingarea(NULL);
+// window = do_entry_undo(NULL);
+// window = do_expander(NULL);
+// window = do_textundo(NULL);
+// window = do_search_entry2(NULL);
+// window = do_scale(NULL); // scale entries from bars
+// window = do_font_features(NULL);
+// window = do_hypertext(NULL);
+// window = do_iconview_edit(NULL); // drag and drop
+// window = do_image_scaling(NULL);
+// window = do_infobar(NULL);
+// window = do_links(NULL);
+// window = do_listbox_controls(NULL);
+// window = do_list_store(NULL);
+// window = do_listview_colors(NULL);
+// window = do_listview_selections(NULL);
+// window = do_mask(NULL);
+
+/* */
+/******************************************************************************/
+
+
+/*
+https://blog.gtk.org/2020/06/08/more-on-lists-in-gtk-4/
+https://docs.gtk.org/gtk4/section-list-widget.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://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Columns_and_Renderer
+*/
+
+
+
+/******************************************** The basic ideas behind list views: ************************************************/
+/* */
+/* The data for items is provided in the form of a model (containing objects) */
+/* Widgets are created just for the viewable range of items */
+/* Widgets can be recycled by binding them to different items */
+/* Avoid iterating over all items in the model as much as possible, */
+/* and just deal with the items in the visible range which are bound to widgets */
+/* from https://blog.gtk.org/2020/06/07/scalable-lists-in-gtk-4/ */
+/* */
+/****************************************************************************************************************************************/
+
+// GtkListItemFactory is the object that is tasked with creating widgets for the items in the model.
+// One implementations of this factory, GtkBuilderListItemFactory, is using ui files as templates for the list item widgets.
+// https://gitlab.gnome.org/GNOME/gtk/-/blob/main/demos/gtk-demo/listview_settings.ui
+
+
+/* Lists/Application launcher #Keywords: GtkListItemFactory, GListModel
+ * This demo uses the GtkListView widget as a fancy application launcher. It is also a very small introduction to listviews.
+ * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/demos/gtk-demo/listview_applauncher.c */
+
+
+
+/************************************************** W I D G E T S ********************************************************/
+/* _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ */
+/* _ _ _ _ _ _ _ _ _ _ _ _ _ E D I T A B L E _ _ _ _ _ _ _ _ _ _ _ _ _ _ */
+/* */
+/* https://developer-old.gnome.org/gtk4/stable/ch03s02.html Which widget should I use ?... */
+/* https://developer-old.gnome.org/gtk4/stable/GtkCellEditable.html#GtkCellEditable-struct */
+/* The GtkCellEditable interface must be implemented for widgets to be usable to edit the contents of a GtkTreeView cell. */
+/* It provides a way to specify how temporary widgets should be configured for editing, get the new value, etc. */
+/* _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ */
+/* _ _ _ _ _ _ _ _ _ _ _ _ _ _ T R E E _ _ _ _ _ _ _ _ _ _ _ _ _ _ */
+/* */
+/* https://toshiocp.github.io/Gtk4-tutorial/sec29.html <<< TODO */
+/* https://docs.gtk.org/gtk4/ */
+/* https://docs.gtk.org/gtk4/section-list-widget.html << (see below the "quick comparison chart of equivalent functionalities") */
+/* https://docs.gtk.org/gtk4/class.TreeListModel.html */
+/* */
+/* */
+/* https://developer-old.gnome.org/gtk4/stable/GtkTreeView.html */
+/* https://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Custom_Models */
+/* https://developer-old.gnome.org/gtk4/stable/GtkTreeSelection.html#GtkTreeSelection-struct */
+/* https://developer-old.gnome.org/gtk4/stable/GtkTreeView.html#gtk-tree-view-get-path-at-pos << get-path-at-pos */
+/* Finds the path at the point (x , y ), relative to bin_window coordinates. Use gtk_tree_view_convert_widget_to_bin_window_coords(). */
+/* https://www.gnu.org/software/guile-gnome/docs/gtk/html/GtkCellRenderer.html */
+/* GtkTreeSelection, GtkTreeView drag-and-drop, GtkTreeSortable, GtkTreeModelSort, GtkCellEditable, GtkCellRendererText,... */
+/* gtk_tree_view_get_search_entry (treeview) https://blog.gtk.org/2020/09/08/on-list-models/ */
+/* */
+/****************************************************************************************************************************************/
+
+// ? utile ?
+// gtk_tree_model_foreach (model, TRUE, my_user_data); https://developer-old.gnome.org/gtk4/stable/GtkTreeModel.html#GtkTreeModelForeachFunc
+
+
+
+/* ... Finally here’s a quick comparison chart of equivalent functionalitqy
+ to look for when transitioning code:
+
+ Old New
+ ..................................................................
+ GtkTreeModel GListModel
+ GtkTreePath guint position, GtkTreeListRow
+ GtkTreeIter guint position
+ GtkTreeRowReference GObject item
+ GtkListStore GListStore
+ GtkTreeStore GtkTreeListModel, GtkTreeExpander
+ GtkTreeSelection GtkSelectionModel
+ GtkTreeViewColumn GtkColumnView
+ GtkTreeView GtkListView, GtkColumnView
+ GtkCellView GtkListItem
+ GtkComboBox GtkDropDown
+ GtkIconView GtkGridView
+ GtkTreeSortable GtkColumnView
+ GtkTreeModelSort GtkSortListModel
+ GtkTreeModelFilter GtkFilterListModel
+ GtkCellLayout GtkListItemFactory
+ GtkCellArea GtkWidget
+ GtkCellRenderer GtkWidget
+..............................................................................*/
+
+
+
+/*..............................................................................
+ *
+ * >>> GtkStringList <<<
+ *
+ * GtkStringList is a list model that wraps an array of strings.
+ * The objects in the model are of type GtkStringObject
+ * and have a “string” property that can be used inside expressions.
+ * Use it where/when you would typically use a char*[], but need a list model.
+ *
+ * implements GtkBuildable interface
+ * are GObject instances; support “translatable”, “context” and “comments”
+ *
+ *
+ *
+ * Every item in a model has a position (= unsigned integer)
+ * "factories" takes care of mapping the items of the model
+ * to widgets that can be shown in the view
+ * by creating a listitem for each item that is currently in use.
+ * List items are always GtkListItem instances. Widgets can be recycled.
+ *
+ * GtkStringList can only handle strings. It is backed by a dynamically allocated array.
+ * GListStore is backed by a balanced tree.
+ *
+ * GTK provides functionality to make lists look and behave like trees
+ * by using the GtkTreeListModel and the GtkTreeExpander widget.
+ *
+ * Widgets are styleable using GTK CSS. Use the .rich-list style class.
+ *
+ *
+ * GListModel is an interface that represents a mutable list of GObjects.
+ * https://gnome.pages.gitlab.gnome.org/libsoup/gio/GListModel.html
+ * https://docs.gtk.org/gio/iface.ListModel.html < +++
+ * https://blog.gtk.org/2020/09/08/on-list-models/
+ *
+ *............................................................................*/
+
+
+
#include
#include
#include
@@ -29,230 +204,96 @@
#include "../../include/ui.h"
#include
+#include
+//#include "config.h"
+//#include "custom-list.h"
+#include
-/*
- * ! WARNING ! Ici règne le désordre le plus complet ! WARNING !
- * Attention vous entrez à vos risques et périls dans un dangereux laboratoire.
- * Ici, rien n'est balisé. Tout peut arriver. Le code est encombré de déchets inutiles.
- * Les commentaires sont inadaptés, incompréhensibles et possiblement nuisibles.
- * (en tout cas, inutilisables...)
- * Nul ne sait ce qui s'y passe et l'auteur, possiblement frappé d'idiotie,
- * ne sait dire lui-même ce qu'il veut, ce qu'il fait ou a fait et ce qu'il fera...
- */
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
enum
{
- COL_FIRST_NAME = 0,
- COL_LAST_NAME,
- NUM_COLS
-} ;
-GtkWidget *view;
-GtkListStore *list_store;
-GtkTreeStore *tree_store;
-GtkTreeIter iter, child;
+ STRING_COLUMN,
+ NUM_COLUMNS
+};
-static GtkTreeModel *
-create_and_fill_model (void)
+
+/* TreeItem structure */
+typedef struct _TreeItem TreeItem;
+struct _TreeItem
{
- // GtkTreeStore *tree_store;
- GtkTreeIter toplevel;//, child;
+ const char *label;
+ TreeItem *children;
+};
- tree_store = 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(tree_store, &toplevel, NULL);
- gtk_tree_store_set(tree_store, &toplevel,
- COL_FIRST_NAME, "RanTanPlan",
- COL_LAST_NAME, "(a stupid dog)",
- -1);
-
- gtk_tree_store_append(tree_store, &toplevel, NULL);
- gtk_tree_store_set(tree_store, &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(tree_store, &toplevel, NULL);
- gtk_tree_store_set(tree_store, &toplevel,
- COL_FIRST_NAME, "Joe",
- COL_LAST_NAME, "Dalton",
- -1);
-
- gtk_tree_store_append(tree_store, &toplevel, NULL);
- gtk_tree_store_set(tree_store, &toplevel,
- COL_FIRST_NAME, "Jack",
- COL_LAST_NAME, "Dalton",
- -1);
-
- gtk_tree_store_append(tree_store, &toplevel, NULL);
- gtk_tree_store_set(tree_store, &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(tree_store, &child, &toplevel);
- gtk_tree_store_set(tree_store, &child,
- COL_FIRST_NAME, "Averell",
- COL_LAST_NAME, "Dalton",
- -1);
-
- return GTK_TREE_MODEL(tree_store);
-}
-
- /***********************************************************
- * *
- * 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)
-{
-
- GtkTreeViewColumn *col;
- GtkCellRenderer *renderer;
- GtkWidget *view;
- GtkTreeModel *model;
-
- view = gtk_tree_view_new();
-
- col = gtk_tree_view_column_new();
-
- gtk_tree_view_column_set_title(col, "First Name");
+/* tree data */
+/* static TreeItem E[] = {NULL}, F[] = {NULL}, G[] = {NULL}, H[] = {NULL}; */
+/* static TreeItem I[] = {NULL}, K[] = {NULL}, N[] = {NULL}, M[] = {NULL}; */
+/* static TreeItem L[] = {{"M", M}, {"N", N}, {NULL }}, J[] = {{"L", L}, {NULL}}; */
+/* static TreeItem D[] = {{"I", I}, {"J", J}, {"K", K}, {NULL}}; */
+/* static TreeItem C[] = {{"F", F}, {"G", G}, {"H", H}, {NULL}}; */
+/* static TreeItem A[] = {{"D", D}, {NULL}}, B[] = {{"E", E}, {NULL}}; */
+/* static TreeItem R[] = {{"A", A}, {"B", B}, {"C", C}, {NULL}}; */
+/* static TreeItem O[] = {{"ROOT", R}, {NULL}}; // Artefact added for symmetry */
- list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_UINT);
+/* static GListStore *create_node_recursive (GListModel *model, // GListStore* g_list_store_new (GType item_type) */
+/* TreeItem *current_item, */
+/* GtkTreeIter *iter_parent, */
+/* int depth) */
+/* { */
+/* GtkTreeIter iter; */
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(list_store));
+/* if (model == NULL) */
+/* model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING); */
- // g_object_unref(liststore);
+/* while (current_item->label) { */
+/* if (0) printf("[%d] Current label : %s\n", depth, current_item->label); */
+/* gtk_tree_store_append (model, &iter, iter_parent); */
+/* gtk_tree_store_set (model, &iter, STRING_COLUMN, current_item->label, -1); */
- /* 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);
+/* if (current_item->children) */
+/* create_node_recursive (model, current_item->children, &iter, depth + 1); */
+/* else */
+/* break; */
- tree_store = gtk_tree_store_new(1, G_TYPE_STRING);
+/* current_item++; */
+/* } */
- /* 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);
+/* if (depth == 0) */
+/* return G_LIST_MODEL(model); // can cast to GListModel or to GtkTreeStore ? */
+/* else */
+/* return 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");
-}
+/* static void */
+/* print_hello (GtkWidget *widget, */
+/* gpointer data) */
+/* { */
+/* static int nb; */
+/* nb++; */
+/* printf("Button clicked (n = %d)\n", nb); */
+/* } */
-void print_test_in_tree_dot_c(void)
+/* GtkWidget *create_a_button_to_click_on(GemGraphClientWindow *my_window) */
+/* { */
+/* GtkWidget *button; */
+/* const char *text = "Hello ! I'm the new button. Click me !"; */
+
+/* button = gtk_button_new_with_label(text); */
+/* gtk_box_append(GTK_BOX(my_window->runlib_objects), button); */
+/* gtk_widget_show(button); */
+
+/* g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); */
+
+/* return button; */
+/* } */
+
+void print_test_in_tree_dot_c (void)
{
printf("tree.c > print test() \
-------------------------------------\n\
-A button is now in the GtkBox and an action is associated to it.\n\n");
+------------------------------------\nClick the 'new button' in the GtkBox.\n");
}
-/*
-https://mesonbuild.com/Manual.html
-https://blog.gtk.org/2020/06/08/more-on-lists-in-gtk-4/
-https://docs.gtk.org/gtk4/section-list-widget.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
-*/
-
-static GListModel *
-create_settings_model (gpointer item,
- gpointer unused)
-{
- GSettings *settings = item;
- char **schemas;
- GListStore *result;
- guint i;
-
- schemas = g_settings_list_children (settings);
-
- if (schemas == NULL || schemas[0] == NULL)
- {
- g_free (schemas);
- return NULL;
- }
-
- result = g_list_store_new (G_TYPE_SETTINGS);
- for (i = 0; schemas[i] != NULL; i++)
- {
- GSettings *child = g_settings_get_child (settings, schemas[i]);
- g_list_store_append (result, child);
- g_object_unref (child);
- }
-
- g_strfreev (schemas);
-
- return G_LIST_MODEL (result);
-}
diff --git a/src/ui/window.c b/src/ui/window.c
index b4a42dc..c36bd76 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -123,7 +123,8 @@ static void gem_graph_client_window_init(GemGraphClientWindow *self)
}
/* -------------------------------------------------------------------------- */
-static void let_s_scroll_it_guys(void);
+
+GtkWidget *create_a_button_to_click_on(void);
void ui_set_stack(const char *mode)
{
@@ -141,7 +142,7 @@ void ui_set_stack(const char *mode)
case 'r':
gtk_menu_button_set_icon_name(window->main_button_mode, "system-run-symbolic");
create_a_button_to_click_on();
- let_s_scroll_it_guys();
+ // let_s_scroll_it_guys();
print_test_in_tree_dot_c();
break;
@@ -280,8 +281,3 @@ GtkWidget *create_a_button_to_click_on(void)
return button;
}
-static void
-let_s_scroll_it_guys(void){
- GtkWidget scrolled_thing = *gtk_scrolled_window_new ();
- // gtk_box_append(GTK_BOX(window->runlib_objects), scrolled_thing);
-}