WIP: tree successfully created. Now, let's display it in the window

This commit is contained in:
Jean Sirmai 2024-01-08 09:31:07 +01:00
parent b8ef224742
commit 8dcd4fc8be
Signed by: jean
GPG Key ID: FB3115C340E057E3
3 changed files with 120 additions and 44 deletions

View File

@ -124,5 +124,5 @@ void ui_toggle_sidebar ();
void print_test_in_tree_dot_c(void); void print_test_in_tree_dot_c(void);
// GtkWidget *create_a_button_to_click_on(GemGraphClientWindow *window); GtkWidget *create_a_button(GemGraphClientWindow *window);

View File

@ -300,33 +300,35 @@ struct _TreeItem
/* static void */ static void
/* print_hello (GtkWidget *widget, */ print_hello (GtkWidget *widget,
/* gpointer data) */ gpointer data)
/* { */ {
/* static int nb; */ static int nb;
/* nb++; */ nb++;
/* printf("Button clicked (n = %d)\n", nb); */ printf("From 'tree.c', > button clicked (n = %d)\n", nb);
/* } */
/* 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); */
/* printf("tree.c > print test() \ */
/* ------------------------------------\nClick the 'new button' in the GtkBox.\n"); */
/* return button; */
/* } */
void print_test_in_tree_dot_c() {
printf("tree.c > print test() \
------------------------------------\nClick the 'new button' in the GtkBox.\n");
} }
GtkWidget *create_a_button(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); */
/* src/ui/tree.c:318:37: error: invalid use of incomplete typedef 'GemGraphClientWindow' */
/* {aka 'struct _GemGraphClientWindow'} */
gtk_widget_show(button);
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
printf("--------------------------------------------------------- tree.c line 325\n\
Current obstacle : invalid use of incomplete typedef 'GemGraphClientWindow'\n\
How to enable the 'tree.c' code (line 318) to create widgets in the main window ?\n\
(In the meanwhile, you can click the 'new button' in the GtkBox.)\n\
NB The speed makefile bug has been fixed in branch [devel]\n\
(but not here, in [origin/dev/ui-simple-tree])\n");
return button;
}

View File

@ -22,10 +22,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdio.h>
#include <gio/gio.h>
#include <unistd.h> #include <unistd.h>
#include <gtk-4.0/gtk/gtk.h> #include <gtk-4.0/gtk/gtk.h>
#include <glib-2.0/glib.h> #include <glib-2.0/glib.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
#include "../../include/base.h" #include "../../include/base.h"
#include "../../include/ui.h" #include "../../include/ui.h"
@ -50,7 +54,7 @@ float rotation_angles[N_AXIS] = { 0.0 }; // Rotation angles on each axis
GtkWidget *gl_area = NULL; GtkWidget *gl_area = NULL;
static GemGraphClientWindow *window; GemGraphClientWindow *window;
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -70,6 +74,7 @@ struct _GemGraphClientWindow
GtkLabel *toast_text; GtkLabel *toast_text;
GtkGLArea *run_glarea; GtkGLArea *run_glarea;
GtkBox *run_controls; GtkBox *run_controls;
// GtkButton *my_button;
/* Stack objects */ /* Stack objects */
GtkStack *runlib_stack; GtkStack *runlib_stack;
@ -108,6 +113,7 @@ static void gem_graph_client_window_class_init(GemGraphClientWindowClass *klass)
gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, run_controls); gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, run_controls);
gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, runlib_stack); gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, runlib_stack);
gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, runlib_objects); gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, runlib_objects);
// gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, my_button);
} }
static void gem_graph_client_window_init(GemGraphClientWindow *self) static void gem_graph_client_window_init(GemGraphClientWindow *self)
@ -124,7 +130,8 @@ static void gem_graph_client_window_init(GemGraphClientWindow *self)
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
GtkWidget *create_a_button_to_click_on(GemGraphClientWindow *my_window); static void create_my_list_model();
GtkWidget *create_a_button_in_(GemGraphClientWindow *my_window);
void ui_set_stack(const char *mode) void ui_set_stack(const char *mode)
{ {
@ -141,10 +148,9 @@ void ui_set_stack(const char *mode)
break; break;
case 'r': case 'r':
gtk_menu_button_set_icon_name(window->main_button_mode, "system-run-symbolic"); gtk_menu_button_set_icon_name(window->main_button_mode, "system-run-symbolic");
create_a_button_to_click_on(window); create_my_list_model();
// let_s_scroll_it_guys(); create_a_button_in_(window);
print_test_in_tree_dot_c(); create_a_button(window); // <<< This function is in tree.c
break; break;
case 'p': case 'p':
gtk_menu_button_set_icon_name(window->main_button_mode, "x-office-presentation-symbolic"); gtk_menu_button_set_icon_name(window->main_button_mode, "x-office-presentation-symbolic");
@ -262,20 +268,88 @@ print_hello (GtkWidget *widget,
{ {
static int nb; static int nb;
nb++; nb++;
printf("Button clicked (n = %d)\n", nb); printf("From 'window.c', > button clicked (n = %d)\n", nb);
} }
GtkWidget *create_a_button_to_click_on(GemGraphClientWindow *my_window) GtkWidget *create_a_button_in_(GemGraphClientWindow *my_window)
{ {
GtkWidget *button; GtkWidget *my_button;
const char *text = "Hello ! I'm the new button. Click me !"; const char *text = "Hello ! I'm the new button. Click me !";
button = gtk_button_new_with_label(text); my_button = gtk_button_new_with_label(text);
gtk_box_append(GTK_BOX(my_window->runlib_objects), button); gtk_box_append(GTK_BOX(my_window->runlib_objects), my_button);
gtk_widget_show(button); gtk_widget_show(my_button);
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); g_signal_connect (my_button, "clicked", G_CALLBACK (print_hello), NULL);
return button; return my_button;
}
enum
{
STRING_COLUMN,
NUM_COLUMNS
};
/* TreeItem structure */
typedef struct _TreeItem TreeItem;
struct _TreeItem
{
const char *label;
TreeItem *children;
};
// 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
static GListStore *create_node_recursive (GListModel *model, // GListStore* g_list_store_new (GType item_type)
TreeItem *current_item,
GtkTreeIter *iter_parent,
int depth)
{
if (model == NULL)
printf("tree.c > print test() in : create_node_recursive()");
GtkTreeIter iter;
if (model == NULL)
model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING);
while (current_item->label) {
if (1) printf("[%d] %s, ", depth, current_item->label);
gtk_tree_store_append (model, &iter, iter_parent);
gtk_tree_store_set (model, &iter, STRING_COLUMN, current_item->label, -1);
if (current_item->children)
create_node_recursive (model, current_item->children, &iter, depth + 1);
else
break;
current_item++;
}
if (depth == 0)
return G_LIST_MODEL(model); // can cast to GListModel or to GtkTreeStore ?
else
return NULL;
}
static void create_my_list_model()
{
GListStore *my_list_model = NULL;
my_list_model = create_node_recursive (my_list_model, O, NULL, 0);
printf(" << tree is OK\n");
} }