From 9289de32f8ac00ef27cb452e2888334cf7637f34 Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Wed, 29 May 2024 15:34:54 +0200 Subject: [PATCH] =?UTF-8?q?WIP:=20le=203=C3=A8me=20boutton=20de=20la=20bar?= =?UTF-8?q?re,=20en=20haut=20=C3=A0=20gauche,=20change=20d'icone=20si=20to?= =?UTF-8?q?ggled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO (next version).txt | 37 ++++++++++++++++++-------- src/ui/application.c | 10 +++---- src/ui/contain.c | 24 ++++++++++------- src/ui/window.c | 59 ++++++++++++++++++++++------------------- 4 files changed, 76 insertions(+), 54 deletions(-) diff --git a/TODO (next version).txt b/TODO (next version).txt index 532716c..350d89a 100644 --- a/TODO (next version).txt +++ b/TODO (next version).txt @@ -1,4 +1,6 @@ -L'utilisation d'OpenGL fait que la première version de Gem-graph sera tout naturellement en 3D. Le modèle de marche aléatoire de dimères sera aussi facile à y réaliser que dans un modèle 1D (on pourrait même se servir d'une seule règle au lieu de deux !) (mais deux règles permettront un meilleur rendu). +L'utilisation d'OpenGL fait que la première version de Gem-graph sera tout naturellement en 3D. +Le modèle de marche aléatoire de dimères sera aussi facile à y réaliser que dans un modèle 1D +(on pourrait même se servir d'une seule règle au lieu de deux !) (mais deux règles permettront un meilleur rendu). Modifier la forme des flèches ? Pour cette première version, la forme "central star" + "cône" a l'avantage de la simplicité. @@ -7,11 +9,17 @@ Dans la version actuelle, elle est redessinée si plusieurs flèches sont dans l Ce dessin est peu coûteux (deux lignes superposées pour chaque nouvelle flèche) et ce cas (plusieurs flèches dans le même cube) sera peu fréquent dans les premiers modèles développés. Mais... TODO -Le plus simple serait un trait allant du centre d'un cube au centre d'une de ses faces. Ce serait peu lisible pour des objets mais pourrait avoir un intérêt pour les tags (balises) éventuellement associés aux objets ou situations. Ces tags seraient machine-readable. Nécessairement. Seraient-ils human-readable aussi ? Ce serait idéal ! A inventer ou essayer, en tout cas. -Un seul trait aurait sûrement un intérêt dans la représentation de voisinages de Moore 3D (Je préfère ne pas imaginer ça pour l'instant ! Il va falloir choisir de ne représenter ou de ne visualiser qu'une partie des connexions à la fois...). +Le plus simple serait un trait allant du centre d'un cube au centre d'une de ses faces. +Ce serait peu lisible pour des objets mais pourrait avoir un intérêt pour les tags (balises) éventuellement associés aux objets ou situations. +Ces tags seraient machine-readable. Nécessairement. Seraient-ils human-readable aussi ? Ce serait idéal ! A inventer ou essayer, en tout cas. +Un seul trait aurait sûrement un intérêt dans la représentation de voisinages de Moore 3D +(Je préfère ne pas imaginer ça pour l'instant ! Il va falloir choisir de ne représenter ou de ne visualiser qu'une partie des connexions à la fois...). -Le premier objectif des versions à venir est l'extension du voisinage. Un voisinage type von Neumann 3D - le plus simple possible si on le veut symétrique par rapport aux axes de l'espace - est tout à fait indiqué pour cette première version. Mais les versions à venir devraient travailler en priorité avec des voisinages type Moore 3D approximativement spériques de rayon proche de celui de l'espace local. -Par ailleurs, Gem-graph ne peut avoir sa puissance théorique maximale que s'il peut utiliser un voisinage étendu à tout l'espace. Mais cette puissance est vraisemblablement inutile, sauf pour les démonstrations mathématiques d'équivalence avec les automates cellulaires, par exemple, ou d'autres formalismes. +Le premier objectif des versions à venir est l'extension du voisinage. +Un voisinage type von Neumann 3D - le plus simple possible si on le veut symétrique par rapport aux axes de l'espace - est tout à fait indiqué pour cette première version. +Mais les versions à venir devraient travailler en priorité avec des voisinages type Moore 3D approximativement spériques de rayon proche de celui de l'espace local. +Par ailleurs, Gem-graph ne peut avoir sa puissance théorique maximale que s'il peut utiliser un voisinage étendu à tout l'espace. +Mais cette puissance est vraisemblablement inutile, sauf pour les démonstrations mathématiques d'équivalence avec les automates cellulaires, par exemple, ou d'autres formalismes. Par ailleurs, il est d'ores et déjà possible d'utiliser pleinement le "poids" (weight) ou la "charge" (load) des flèches. ! WARNING ! J'ai inversé pôle Nord et pôle Sud. Et c'est à corriger, je pense. 👀️ @@ -23,20 +31,26 @@ les +z sont derrière moi et les -z devant. Donc les -z sont au Nord (que je r Les vertex situés aux intersections des "grilles" (X-X, Y-Y et Z-Z) sont-ils utiles ? Ils le seraient si ses cubes individuels étaient coloriés ou soulignés pour mettre en valeur des flèches qu'ils contiennent ou d'autres particularités. -Mais tant qu'il n'est pas possible de rendre sélectivement transparentes les parois de cubes individuels (ou de tel ou tel objet dessiné par les flèches), cette fonction est inutilisable et les vertex situés aux intersections des grilles sont donc inutiles. +Mais tant qu'il n'est pas possible de rendre sélectivement transparentes les parois de cubes individuels (ou de tel ou tel objet dessiné par les flèches), +cette fonction est inutilisable et les vertex situés aux intersections des grilles sont donc inutiles. On pourrait ne garder que ceux situés sur les faces de l'espace qui, eux, servent à tracer les grilles X-X, Y-Y et Z-Z. Le nombre de vertex de l'espace serait alors de 12 par cube-unité (soit 12 * x * y * z) plus les vertex intersections des seules faces de l'espace (soit (x * y + x * z + y * z) * 2). A raison, bien sûr de trois nombres par vertex plus les couleurs. -Je comprends (maintenant seulement !) que si des régions du buffer lignes (idem pour le buffer triangles) sont laissées vides (occupées par des zéros) elles seront néanmoins redessinées en permanence et que le seul moyen d'éviter cela est de réallouer la taille du buffer à chaque délétion ou chaque ajout de flèche. +Je comprends (maintenant seulement !) que si des régions du buffer lignes (idem pour le buffer triangles) sont laissées vides (occupées par des zéros) +elles seront néanmoins redessinées en permanence et que le seul moyen d'éviter cela est de réallouer la taille du buffer à chaque délétion ou chaque ajout de flèche. -Néanmoins, lorsque le nombre de flèches présent dans l'espace est invariant, - cas de mes premiers modèles - il peut être avantageux de travailler dans un buffer de taille fixe. Il faut, pour cela, fixer une "densité maximale de flèches dans l'espace" nécessairement arbitraire. +Néanmoins, lorsque le nombre de flèches présent dans l'espace est invariant, - cas de mes premiers modèles - il peut être avantageux de travailler dans un buffer de taille fixe. +Il faut, pour cela, fixer une "densité maximale de flèches dans l'espace" nécessairement arbitraire. Bien que ce nombre reste toujours arbitraire, on peut estimer que certaines de ses valeurs seront plus utiles/utilisables que d'autres : - un espace totalement vide ou totalement saturé ne pourrait rien représenter -- un espace trop vide ou trop plein (à définir - c'est intuitif) aurait peu de chances de représenter des phénomènes intéressants. La marche aléatoire d'un seul ou de quelques dimères dans un grand espace, par exemple, servira plus de test pour le bon fonctionnement de Gem-graph que de modèle d'étude. -- on peut considérer un espace rempli de flèches aux 2/3 comme équivalent à un espace repli au tiers (1/3) mais où les flèches seraient écrites "en creux" et, par conséquent, moins lisibles. Inutile, donc, de remplir plus de la moitié de l'espace. +- un espace trop vide ou trop plein (à définir - c'est intuitif) aurait peu de chances de représenter des phénomènes intéressants. + La marche aléatoire d'un seul ou de quelques dimères dans un grand espace, par exemple, servira plus de test pour le bon fonctionnement de Gem-graph que de modèle d'étude. +- on peut considérer un espace rempli de flèches aux 2/3 comme équivalent à un espace repli au tiers (1/3) mais où les flèches seraient écrites "en creux" + et, par conséquent, moins lisibles. Inutile, donc, de remplir plus de la moitié de l'espace. D'expérience, -- les densités de l'ordre du tiers (1/3 des unités de l'espace occupées par au moins une flèche) suffisent à représenter un nombre de phénomènes tel qu'il n'est pas nécessaire, au moins dans un premier temps, de prévoir davantage (mais des réalloc sont toujours possibles) et les densités trop fortes sont peu lisibles. +- les densités de l'ordre du tiers (1/3 des unités de l'espace occupées par au moins une flèche) suffisent à représenter un nombre de phénomènes tel + qu'il n'est pas nécessaire, au moins dans un premier temps, de prévoir davantage (mais des réalloc sont toujours possibles) et les densités trop fortes sont peu lisibles. Un buffer lignes pourrait donc avoir une taille fixe qui serait calculée selon les paramètres suivants : - x * y * z = nombre de cubes - nombre de flèches moyen par cube = 2 (il s'agit d'un nombre "moyen" qui surestime très probablement le nombre de flèches utilisé par la plupart des modèles) @@ -50,6 +64,7 @@ Faut-il coder cette option ? -------------------------- notes, refs, doc, liens ------------------------- https://www.gnu.org/software/guile-gnome/docs/gtk/html/GtkToolButton.html +https://wiki.gnome.org/HowDoI/CustomWidgets SIGNAL diff --git a/src/ui/application.c b/src/ui/application.c index 68377b7..26fee11 100644 --- a/src/ui/application.c +++ b/src/ui/application.c @@ -24,7 +24,7 @@ #include "../../include/ui.h" -#define COMMUTE 1 // 0 first design (2023) based on XML data +#define COMMUTE 0 // 0 first design (2023) based on XML data // 1 2024 May design, free of Builder & templates static int mode = 0; @@ -45,18 +45,18 @@ static void gem_graph_client_application_activate (GApplication *app) NULL)); switch(COMMUTE) { // enum {...} in ui.h - case GG_2023: // Launch with sidebar of gtk_notebook_append_pagef + case GG_2023: // Launch with sidebar of gtk_notebook_append_pagef ui_toggle_sidebar(); ui_set_stack (HOME_MODE); ui_debug_model_loading (window, "data/models/dimers random walk.xml"); // XXX the window closes when a leaf expander is clicked (Erreur de segmentation) - break; + break; case GG_2024_05: // see > in contain.c experimental_activate_00 (app, window); // ui_debug_model_loading (window, "data/models/dimers random walk.xml"); - break; + break; default: - break; + break; } gtk_window_present (GTK_WINDOW (window)); diff --git a/src/ui/contain.c b/src/ui/contain.c index 0bebc03..278ecad 100644 --- a/src/ui/contain.c +++ b/src/ui/contain.c @@ -185,8 +185,8 @@ void experimental_activate_00 (GtkApplication *app, GtkWindow *window) { gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar), title); GtkWidget *run_edit_mode = gtk_toggle_button_new (); gtk_button_set_icon_name (GTK_BUTTON (run_edit_mode), "document-edit-symbolic"); - gtk_button_set_icon_name (GTK_BUTTON (run_edit_mode), "system-run-symbolic"); gtk_button_set_icon_name (GTK_BUTTON (run_edit_mode), "text-editor-symbolic"); + gtk_button_set_icon_name (GTK_BUTTON (run_edit_mode), "system-run-symbolic"); gtk_actionable_set_action_name (GTK_ACTIONABLE (run_edit_mode), "app.togglerunedit"); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), run_edit_mode); gtk_window_set_titlebar (window, header_bar); @@ -195,10 +195,14 @@ void experimental_activate_00 (GtkApplication *app, GtkWindow *window) { gtk_button_set_icon_name (GTK_BUTTON (run_stop_model_exec), "system-shutdown-symbolic"); gtk_button_set_icon_name (GTK_BUTTON (run_stop_model_exec), "media-playback-start-symbolic"); gtk_button_set_icon_name (GTK_BUTTON (run_stop_model_exec), "media-playback-pause-symbolic"); - gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), run_stop_model_exec); +// gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), run_stop_model_exec); // https://iconduck.com/sets/adwaita-icon-theme + GtkWidget *go_home = gtk_button_new (); + gtk_button_set_icon_name (GTK_BUTTON (go_home), "go-home-symbolic"); + gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), go_home); + GtkWidget *help_faq = gtk_button_new (); gtk_button_set_icon_name (GTK_BUTTON (help_faq), "help-faq-symbolic"); gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), help_faq); @@ -211,17 +215,17 @@ void experimental_activate_00 (GtkApplication *app, GtkWindow *window) { gtk_button_set_icon_name (GTK_BUTTON (preferences_system), "preferences-system-symbolic"); gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), preferences_system); - GtkWidget *go_home = gtk_button_new (); - gtk_button_set_icon_name (GTK_BUTTON (go_home), "go-home-symbolic"); - gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), go_home); + GtkWidget *document_properties = gtk_button_new (); + gtk_button_set_icon_name (GTK_BUTTON (document_properties), "document-properties-symbolic"); + gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), document_properties); GtkWidget *applications_utilities = gtk_button_new (); gtk_button_set_icon_name (GTK_BUTTON (applications_utilities), "applications-utilities-symbolic"); gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), applications_utilities); - GtkWidget *document_properties = gtk_button_new (); - gtk_button_set_icon_name (GTK_BUTTON (document_properties), "document-properties-symbolic"); - gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), document_properties); + GtkWidget *open_menu = gtk_button_new (); + gtk_button_set_icon_name (GTK_BUTTON (open_menu), "open-menu-symbolic"); + gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), open_menu); GtkNotebook *run_notebook = GTK_NOTEBOOK (gtk_notebook_new()); // gtk_notebook_set_tab_pos (run_notebook, GTK_POS_TOP); // TOP par défaut, I presume. Sinon : GTK_POS_LEFT @@ -231,7 +235,7 @@ void experimental_activate_00 (GtkApplication *app, GtkWindow *window) { gtk_notebook_append_page (run_notebook, get_run_measures_page_new(),gtk_label_new ("measures")); gtk_notebook_append_page (run_notebook, get_run_results_page_new(), gtk_label_new ("results")); gtk_notebook_append_page (run_notebook, get_run_discuss_page_new(), gtk_label_new ("interpret")); - gtk_notebook_append_page (run_notebook, get_run_help_faq_page_new(), gtk_label_new ("help_faq")); + gtk_notebook_append_page (run_notebook, get_run_help_faq_page_new(),gtk_label_new ("help_faq")); GtkNotebook *edit_notebook = GTK_NOTEBOOK (gtk_notebook_new()); @@ -240,7 +244,7 @@ void experimental_activate_00 (GtkApplication *app, GtkWindow *window) { gtk_notebook_append_page (edit_notebook, get_edit_measures_page_new(),gtk_label_new ("measures")); gtk_notebook_append_page (edit_notebook, get_edit_results_page_new(), gtk_label_new ("results")); gtk_notebook_append_page (edit_notebook, get_edit_discuss_page_new(), gtk_label_new ("interpret")); - gtk_notebook_append_page (edit_notebook, get_edit_help_faq_page_new(), gtk_label_new ("help_faq")); + gtk_notebook_append_page (edit_notebook, get_edit_help_faq_page_new(),gtk_label_new ("help_faq")); GtkWidget *run_xor_edit_horizontal_pane = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); gtk_widget_set_size_request (run_xor_edit_horizontal_pane, 0, 0); diff --git a/src/ui/window.c b/src/ui/window.c index f66c306..f4c77ff 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -81,27 +81,27 @@ static void gem_graph_client_window_class_init(GemGraphClientWindowClass *klass) // gtk_widget_class_bind_template_callback_full (GtkToggleButton, ui_toggle_sidebar, "clicked"); // "main_button_sidebar" - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_titlebar); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_stack); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, side_stack); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_paned); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_button_run_edit); -// gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_button_run_stop); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_button_mode); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, main_button_sidebar); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, toast_revealer); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, toast_close_button); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, toast_text); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, control_zone); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, run_glarea_box); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, edition_glarea_box); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, presentation_glarea_box); - gtk_widget_class_bind_template_child(widget_class, GemGraphClientWindow, run_conditions_tree_box); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_titlebar); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_stack); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, side_stack); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_paned); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_button_run_edit); +// gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_button_run_stop); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_button_mode); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, main_button_sidebar); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, toast_revealer); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, toast_close_button); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, toast_text); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, control_zone); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, run_glarea_box); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, edition_glarea_box); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, presentation_glarea_box); + gtk_widget_class_bind_template_child (widget_class, GemGraphClientWindow, run_conditions_tree_box); } static void gem_graph_client_window_init(GemGraphClientWindow *self) { - gtk_widget_init_template(GTK_WIDGET(self)); + gtk_widget_init_template (GTK_WIDGET(self)); window = self; } @@ -166,18 +166,18 @@ void ui_toggle_run_edit() switch(get_run_edit_mode()) { case 1: - gtk_stack_set_visible_child_full(window->main_stack, "edition", GTK_STACK_TRANSITION_TYPE_CROSSFADE); - gtk_stack_set_visible_child_full(window->side_stack, "edition", GTK_STACK_TRANSITION_TYPE_CROSSFADE); + //gtk_stack_set_visible_child_full(window->main_stack, "edition", GTK_STACK_TRANSITION_TYPE_CROSSFADE); + //gtk_stack_set_visible_child_full(window->side_stack, "edition", GTK_STACK_TRANSITION_TYPE_CROSSFADE); gtk_button_set_icon_name (GTK_BUTTON (window->main_button_run_edit), "document-edit-symbolic"); - gtk_paned_set_position(window->main_paned, 300); + //gtk_paned_set_position(window->main_paned, 300); set_run_edit_mode (0); // (EDIT_MODE); // ui_setup_glarea(EDIT_MODE, GTK_WIDGET(window->edition_glarea_box)); - break; + break; case 0: - gtk_stack_set_visible_child_full(window->main_stack, "run", GTK_STACK_TRANSITION_TYPE_CROSSFADE); - gtk_stack_set_visible_child_full(window->side_stack, "run", GTK_STACK_TRANSITION_TYPE_CROSSFADE); + //gtk_stack_set_visible_child_full(window->main_stack, "run", GTK_STACK_TRANSITION_TYPE_CROSSFADE); + //gtk_stack_set_visible_child_full(window->side_stack, "run", GTK_STACK_TRANSITION_TYPE_CROSSFADE); gtk_button_set_icon_name (GTK_BUTTON (window->main_button_run_edit), "system-run-symbolic"); - gtk_paned_set_position(window->main_paned, 200); + //gtk_paned_set_position(window->main_paned, 200); set_run_edit_mode (1); // (EDIT_MODE); // ui_setup_glarea(RUN_MODE, GTK_WIDGET(window->run_glarea_box)); // ui_create_tree (GTK_WIDGET (window->run_conditions_tree_box)); @@ -186,6 +186,7 @@ void ui_toggle_run_edit() break; } printf(" > %d\n", get_run_edit_mode ()); + gtk_widget_set_visible (GTK_BUTTON (window->main_button_run_edit), TRUE); } void ui_send_internal_notification(const char *message) @@ -225,11 +226,13 @@ void ui_toggle_sidebar(void) { int position = gtk_paned_get_position(window->main_paned); - printf("window ui_togglesidebar() ------\n"); - if (position != 0) { - gtk_paned_set_position(window->main_paned, 0); + gtk_paned_set_position (window->main_paned, 0); + printf("window ui_togglesidebar() >|=|<\n"); + gtk_button_set_icon_name (GTK_BUTTON (window->main_button_sidebar), "document-edit-symbolic"); } else { - gtk_paned_set_position(window->main_paned, 400); + gtk_paned_set_position (window->main_paned, 400); + printf("window ui_togglesidebar() <|=|>\n"); + gtk_button_set_icon_name (GTK_BUTTON (window->main_button_sidebar), "system-run-symbolic"); } }