Renommage + cleaning après audit

This commit is contained in:
Jean Sirmai 2024-07-19 10:54:32 +02:00
parent 19f3483c2c
commit 8e0ef0fdbd
Signed by: jean
GPG Key ID: FB3115C340E057E3
7 changed files with 70 additions and 287 deletions

View File

@ -1,9 +0,0 @@
les fonctions commençant par get devraient renvoyer des valeurs et non pas des widgets
> "get_..." remplacé par "rec_..." pour les widgets
> "set_..." remplacé par "fix_..." pour les widgets
ne pas utiliser la taille de fenêtre comme comme référence
> corrigé

View File

@ -35,19 +35,19 @@
/* W I N D O W S */ /* W I N D O W S */
/******************************************************************************/ /******************************************************************************/
void widget_head_fix_MAIN_WINDOW (GtkApplication *app); void widget_topbar_fix_MAIN_WINDOW (GtkApplication *app);
void widget_head_fix_DIALOG_WINDOW (GtkApplication *app); void widget_topbar_fix_DIALOG_WINDOW (GtkApplication *app);
void widget_head_fix_TEXT_WINDOW (GtkApplication *app); void widget_topbar_fix_TEXT_WINDOW (GtkApplication *app);
void widget_head_MAIN_WINDOW_design (GtkWindow *main_window); void widget_topbar_MAIN_WINDOW_design (GtkWindow *main_window);
void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window, void widget_topbar_DIALOG_WINDOW_design (GtkWindow *main_window,
GtkWindow *dialog_window); GtkWindow *dialog_window);
void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, void widget_topbar_TEXT_WINDOW_design (GtkWindow *main_window,
GtkWindow *text_window); GtkWindow *text_window);
GtkWindow *widget_head_rec_MAIN_WINDOW(); GtkWindow *widget_topbar_rec_MAIN_WINDOW();
GtkWindow *widget_head_rec_DIALOG_WINDOW(); GtkWindow *widget_topbar_rec_DIALOG_WINDOW();
GtkWindow *widget_head_rec_TEXT_WINDOW(); GtkWindow *widget_topbar_rec_TEXT_WINDOW();
/******************************************************************************/ /******************************************************************************/

View File

@ -90,7 +90,8 @@ int fsm_get_STATE_RULES_DATA () {return choice_STATE_RULES_DATA;}
int fsm_get_OBJECTS_box_RESET_VALUE () {return choice_OBJECTS_box_RESET_VALUE;} int fsm_get_OBJECTS_box_RESET_VALUE () {return choice_OBJECTS_box_RESET_VALUE;}
int fsm_get_SITUATIONS_box_RESET_VALUE () {return choice_SITUATIONS_box_RESET_VALUE;} int fsm_get_SITUATIONS_box_RESET_VALUE () {return choice_SITUATIONS_box_RESET_VALUE;}
static char *fsm_get_str_EXEC_EDIT (int value) { static char *fsm_get_str_EXEC_EDIT (int value)
{
switch (value) { switch (value) {
case (EXEC) : return "EXEC"; case (EXEC) : return "EXEC";
case (EDIT) : return "EDIT"; case (EDIT) : return "EDIT";
@ -98,7 +99,8 @@ static char *fsm_get_str_EXEC_EDIT (int value) {
} }
} }
static char *fsm_get_str_STATE_RULES_DATA (int value) { static char *fsm_get_str_STATE_RULES_DATA (int value)
{
switch (value) { switch (value) {
case (STATE) : return "STATE"; case (STATE) : return "STATE";
case (RULES) : return "RULES"; case (RULES) : return "RULES";
@ -107,7 +109,8 @@ static char *fsm_get_str_STATE_RULES_DATA (int value) {
} }
} }
static void debug_printing (int value, int sub_automaton) { static void debug_printing (int value, int sub_automaton)
{
switch (sub_automaton) { // sub_automaton 0 is EXEC_EDIT and switch (sub_automaton) { // sub_automaton 0 is EXEC_EDIT and
// sub_automaton 1 is STATE_RULES_DATA // sub_automaton 1 is STATE_RULES_DATA
case (0) : printf("switch %5s x %5s > %5s x %5s\n", case (0) : printf("switch %5s x %5s > %5s x %5s\n",

View File

@ -32,75 +32,39 @@
#include "../include/signal.h" #include "../include/signal.h"
/* Comment renommer les fonctions ? /* Sur quel modèle se guider pour structurer le client gem-graph ?
* Cette question dépend de plusieurs choix
* nécessairement provisoires mais nécessaires.
*
*
* > Sur quel modèle se guider pour organiser le client gem-graph ?
* Comment l'adapter ? Que faut-il garder ? Que faut-il améliorer ?
* https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel * https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
* https://en.wikipedia.org/wiki/Multitier_architecture * https://en.wikipedia.org/wiki/Multitier_architecture
* *
* > Quelles structures sont suffisamment individualisées dès aujourd'hui, * Le nom de toute fonction qui peut être appelée d'un autre module doit comporter :
* ou ont un développement suffisamment prévisible (modules, interfaces) * - 1) le nom du module auquel elle appartient (widget, graphics, parse,...)
* pour qu'on puisse décider de les renommer * - 2) une indication sur son action (get, set, rec, fix, create, add,...)
* (et comment classer et nommer les autres) ? * - 3) une indication sur l'objet de cette action (STATE, RULES, STACK,...)
* *
* > Comment rendre "human-readable" des noms d'un langage "machine-readable" ? * ex: on_save_CURRENT_MODEL()
*
* _________________
*
* >>> Nous avons à nous choisir des règles de renommage des fonctions
* qui soient conformes aux 'bonnes pratiques' du 'génie logiciel'
* ET soient les plus pertinentes possibles pour notre cas particulier.
* (interrompu le 2024-07-09 à 23h00)
*
*
* >>> Proposition : Toute fonction utilisée par un autre module doit
* - commencer D'ABORD par le nom de ce module,
* - indiquer ENSUITE sa nature (get, set, print,...)
* - et ENFIN son objet (STATE, RULES, STACK,...)
*
* ex: widget_get_RULES_page()
* automat_set_STATE_RULES_DATA()
* on_save_CURRENT_MODEL()
* model_get_DIM_VALUE() * model_get_DIM_VALUE()
* model_get_NEXT_ARROW()
* area_get_GRAPH_STACK() ou graph_get_GRAPH_STACK()
* *
* 'model' == parse ('model' est un alias de 'parse') * Il est prévisible que 'state.c' devienne un dossier contenant
* 'graph' == area ('graph' est un alias de 'area') * les fichiers 'controls.c', 'camera.c', 'contrasts.c' et d'autres,
* 'on_' == callback ('on_' est un alias de 'callbacks') * Une fonction comme : get_ZOOM_box()
* Ainsi, TOUS les callbacks sont dans le fichier 'src/callbacks.c' * devra alors être renommé : state_camera_get_ZOOM_box() (par exemple)
* Leur nom commence TOUJOURS par: 'on_'
* ET AUCUN AUTRE nom de fonction ne commence par 'on_'.
*
*
* > selon ces règles, get_user_tree_model()
* devrait être renommé : tree_get_USER_TREE_MODEL()
*
* > si, comme c'est prévisible, 'state.c' devient un dossier contenant :
* les fichiers 'controls.c', 'camera.c', 'contrasts.c' et d'autres,
* alors, get_ZOOM_box()
* devrait être renommé : state_camera_get_ZOOM_box()
* *
* _________________ * _________________
* *
* *
* QUELLE EST L'ORGANISATION ACTUELLE ? * ORGANISATION ACTUELLE
* *
* 1) Les structures hiérarchiques. * 1) Les structures hiérarchiques.
* -------------------------------- * --------------------------------
* *
* La description de l'aspect (du 'design') des fenêtres * La description du 'design' des fenêtres se trouve dans le dossier 'widget'
* se trouve dans le dossier 'widget.c' * et s'organise naturellement en arborescence, comme les widgets eux-mêmes.
* et s'organise naturellement sur le même modèle : en arborescence *
* qu'il sera facile de répartir en dossiers et fichiers * Il sera donc facile de répartir cette description en dossiers et fichiers
* au fur à mesure de leur développement. * au fur à mesure de son développement.
* *
* Actuellement, par exemple, la fenêtre principale comporte : * Actuellement, par exemple, la fenêtre principale comporte :
* > une barre de titre (décrite dans 'headers.c') et * > une barre de titre (décrite dans 'topbar') et
* > un widget 'child' (la partie sous la barre de titre) * > un widget 'child' (la partie sous la barre de titre)
* qui peut prendre au moins trois apparences différentes : * qui peut prendre au moins trois apparences différentes :
* - STATE (montre l'état de l'espace et les commandes associées) * - STATE (montre l'état de l'espace et les commandes associées)
@ -119,44 +83,16 @@
* des fichiers (ou des dossiers si besoin) et ainsi de suite... * des fichiers (ou des dossiers si besoin) et ainsi de suite...
* *
* *
* Dans cette logique,
* sauf s'il y a d'autres arbres que l'arbre des utilisateurs,
* l'actuel ficher 'tree.c' devrait être
* soit inclus dans le fichier 'rules.c'
* (puisque cet arbre est dans la page (le widget) 'rules')
* soit, s'il est trop volumineux, et pour faciliter la lisibilité,
* dans un dossier 'rules.c' (ou 'rules' ?)
* qui regroupera les différents widgets du widget 'rules'.
*
* NB Il est possible qu'il y ait besoin d'autres structures d'arbres:
* dans 'rules', par exemple, il est important de pouvoir visualiser
* l'utilisation (l'activité) des différentes règles
* ou de différents groupes de règles.
* Et donc de disposer d'un ou de plusieurs index vers ces règles.
*
*
* Tous les callbacks sont dans le fichier 'src/callbacks.c'
* et leur nom commence par: 'on_'
* (aucun autre nom de fonction ne commence par 'on_') ('on_' est un alias).
*
* S'ils deviennent trop nombreux, ils seront répartis
* dans des fichiers regroupés dans un dossier: 'src/callbacks.c'.
* (ou 'src/callbacks' ?)
* La description des fonctions devrait plutôt précéder ces fonctions
* pour alléger le fichier 'callbacks.h' (?)
*
*
* 2) Les structures transversales. * 2) Les structures transversales.
* -------------------------------- * --------------------------------
* *
* Les fonctions 'transversales' comme celles de * Les fonctions 'transversales' comme celles de 'graphics' 'parse', 'fsm',
* 'graph' 'parse', possiblement 'tree' mais - surtout - 'automat',
* doivent pouvoir être accédées directement * doivent pouvoir être accédées directement
* sans avoir à passer par la hiérarchie des widgets et/ou callbacks. * sans avoir à passer par la hiérarchie des widgets et/ou callbacks.
* Elles restent à la racine: 'src/ * Elles restent à la racine: 'src/
* *
* *
* 'state machine' ou 'automat' va centraliser l'identification * 'finite state machine' ('fsm') va centraliser l'identification
* des états (apparences) de la fenêtre et des transitions entre ces apparences; * des états (apparences) de la fenêtre et des transitions entre ces apparences;
* Elle sera probablement décomposée en de nombreux 'sous-automates' * Elle sera probablement décomposée en de nombreux 'sous-automates'
* tels que chaque état de la fenêtre soit une combinaison unique * tels que chaque état de la fenêtre soit une combinaison unique
@ -175,10 +111,6 @@
* - analyses de données... * - analyses de données...
* *
* *
* 'parse' et 'read_file (char *filename)' qui se trouve dans 'base.h'
* font vraisemblablement partie d'un seul ensemble 'entrées / sorties'
*
*
* Les préférences des utilisateurs devront être prises en compte. * Les préférences des utilisateurs devront être prises en compte.
* Leur recueil et leur mémorisation seront probablement des fonctions centrales * Leur recueil et leur mémorisation seront probablement des fonctions centrales
* mais leur mise en oeuvre suivra probalement les voies hiérarchiques. * mais leur mise en oeuvre suivra probalement les voies hiérarchiques.
@ -192,143 +124,13 @@
* *
* *
* *
*
*
*
*
*
*
*******************************************************************************
* L I S T E D E S F O N C T I O N S A R E N O M M E R *
* *****************************************************************************
*
* Ces fonctions peuvent être énumérées selon leur source ou leur destination.
* Il y a, en tout, à ce jour :
* - (86) fonctions appelées (dont 6 data)
* - (m) appels de fonction
* - (e) enum
* - (s) struct
* - (d) define
*
* NB Seules les fonctions spécifiques de gem-graph-client sont prises en compte.
* Les fonctions 'static' ne sont pas comptées.
*
* (déplacer systématiquement les enum, struct, size_t, etc. vers les include ?)
*
*
*
******************************************************************************* *******************************************************************************
* L I S T E D E S F O N C T I O N S A P P E L É E S * * L I S T E D E S F O N C T I O N S A P P E L É E S *
* ***************************************************************************** * *****************************************************************************
* (interrompu le 2024-07-09 à 23h00)
*
* main 1
* callbacks 18
* automat 8 + 2 enum
* parse 8
* 35
*
* graph / area 11 + 1 struct + 1 size_t
* graph / stack 3 + 1 struct + 2 size_t + 1 int
* graph / draw 5
* graph / grid 4
* graph / init 2
* graph / shader.frag 1
* graph / shader.vert 1
* 27
*
* widget / heads 10
* widget / rules 1
* widget / state 1
* widget / stock 2
* widget / tree 2 + 1 struct
* widget / labo 1
* 17
*
* data / image 5
* data / text 2
*
* TOTAL 86
*
* Tous les fonctions appelées par les fonctions callback() sont dans 'widgets.h'
* SAUF les 8 suivantes qui concernent la 'state machine' et qui sont dans 'automat.h' :
* set_EXEC_EDIT() get_EXEC_EDIT()
* set_STATE_RULES_DATA() get_STATE_RULES_DATA()
* set_OBJECTS_box_RESET_VALUE() get_OBJECTS_box_RESET_VALUE()
* set_SITUATIONS_box_RESET_VALUE() get_SITUATIONS_box_RESET_VALUE()
*
*
* Les autres fonctions appelées par les fonctions callback() sont :
*
* widget_head_MAIN_WINDOW_design()
* widget_head_DIALOG_WINDOW_design()
* widget_head_TEXT_WINDOW_design()
*
*
* Widgets.c appelle :
*
* on_bind_user_tree_factory()
* on_axis_value_change()
* graph_update_axis_stack()
*
*.....
*
*
*
* *
******************************************************************************* *******************************************************************************
* L I S T E D E S A P P E L S D E F O N C T I O N S * * L I S T E D E S A P P E L S D E F O N C T I O N S *
* ***************************************************************************** * *****************************************************************************
* grep -r "set_EXEC_EDIT" | wc > 5 lignes
* mais il n'y a que 2 appels des fonctions
*
* NB vérifier que tous les accès aux variables
* passent systématiquement par les get / set. (en utilisant 'static')
*
*
*
* - QUOI - - COMBIEN - D' -
*
*
* on_windows_activation 1 main
*
*
* get_EXEC_EDIT 1 callbacks
* 1 widget / state
*
* set_EXEC_EDIT 2 callbacks
*
* get_STATE_RULES_DATA 1 callbacks
*
* set_STATE_RULES_DATA 3 callbacks
*
* get_OBJECTS_box_RESET_VALUE 1 automat
*
* set_OBJECTS_box_RESET_VALUE 1 callbacks
*
* get_SITUATIONS_box_RESET_VALUE 1 automat
*
* set_SITUATIONS_box_RESET_VALUE 1 callbacks
*
*.....
*
*
*
*
* (interrompu le 2024-07-09 à 23h00)
*
*
*
*
*
*
* Faut-il déplacer systématiquement les enum, struct, size_t, etc.
* vers les include ?
*
*
*
*
*/ */

View File

@ -64,14 +64,14 @@ static void on_auto_notification (const char *message)
void on_windows_activation (GtkApplication *app, void on_windows_activation (GtkApplication *app,
gpointer no_user_data) gpointer no_user_data)
{ {
widget_head_fix_MAIN_WINDOW (app); widget_topbar_fix_MAIN_WINDOW (app);
widget_head_MAIN_WINDOW_design (widget_head_rec_MAIN_WINDOW()); widget_topbar_MAIN_WINDOW_design (widget_topbar_rec_MAIN_WINDOW());
widget_head_fix_DIALOG_WINDOW (app); widget_topbar_fix_DIALOG_WINDOW (app);
widget_head_DIALOG_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_DIALOG_WINDOW()); widget_topbar_DIALOG_WINDOW_design (widget_topbar_rec_MAIN_WINDOW(), widget_topbar_rec_DIALOG_WINDOW());
widget_head_fix_TEXT_WINDOW (app); widget_topbar_fix_TEXT_WINDOW (app);
widget_head_TEXT_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_TEXT_WINDOW()); widget_topbar_TEXT_WINDOW_design (widget_topbar_rec_MAIN_WINDOW(), widget_topbar_rec_TEXT_WINDOW());
} }
@ -251,17 +251,17 @@ static void switch_STATE_RULES_DATA()
switch (fsm_get_STATE_RULES_DATA()) { switch (fsm_get_STATE_RULES_DATA()) {
case (STATE) : case (STATE) :
gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(),
GTK_WIDGET (widget_rec_STATE_page())); GTK_WIDGET (widget_rec_STATE_page()));
break; break;
case (RULES) : case (RULES) :
gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(),
GTK_WIDGET (widget_rec_RULES_page())); GTK_WIDGET (widget_rec_RULES_page()));
break; break;
case (DATA) : case (DATA) :
gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(),
GTK_WIDGET (widget_rec_STOCK_page())); GTK_WIDGET (widget_rec_STOCK_page()));
break; break;
@ -284,7 +284,7 @@ void on_toggle_EXEC_EDIT (GtkWidget *toggled_button, gpointer user_data)
"text-editor-symbolic"); "text-editor-symbolic");
// https://docs.gtk.org/gtk4/class.Window.html TODO 2024-06-30 // https://docs.gtk.org/gtk4/class.Window.html TODO 2024-06-30
// gtk_window_present (GTK_WINDOW (widget_head_rec_DIALOG_WINDOW())); // works once only ! // gtk_window_present (GTK_WINDOW (widget_topbar_rec_DIALOG_WINDOW())); // works once only !
fsm_set_EXEC_EDIT (EDIT); fsm_set_EXEC_EDIT (EDIT);
} }
@ -350,14 +350,14 @@ void on_SITUATIONS_box_DO_RESET (GtkWidget *btt_reset, gpointer data)
void on_clicked_search (GtkWidget *btt_menu, gpointer list_box) { void on_clicked_search (GtkWidget *btt_menu, gpointer list_box) {
// next line presents the text_window and works only once.\nIt should present a menu.\n"); // TODO // next line presents the text_window and works only once.\nIt should present a menu.\n"); // TODO
gtk_window_present (GTK_WINDOW (widget_head_rec_TEXT_WINDOW())); gtk_window_present (GTK_WINDOW (widget_topbar_rec_TEXT_WINDOW()));
} }
void on_clicked_HOME (GtkWidget *btt_reset, gpointer data) void on_clicked_HOME (GtkWidget *btt_reset, gpointer data)
{ {
printf ("callback.on_clicked_HOME() button presents the dialog_window\ printf ("callback.on_clicked_HOME() button presents the dialog_window\
( :- ) but it works only once.\n"); // TODO ( :- ) but it works only once.\n"); // TODO
gtk_window_present (GTK_WINDOW (widget_head_rec_DIALOG_WINDOW())); gtk_window_present (GTK_WINDOW (widget_topbar_rec_DIALOG_WINDOW()));
} }

View File

@ -54,24 +54,6 @@
/* E X P E R I M E N T A L A R E A */ /* E X P E R I M E N T A L A R E A */
/******************************************************************************/ /******************************************************************************/
static void *user_data_free_func() {return NULL;}
void learning_how_to_create_a_menu (GtkMenuButton* menu_button) { // Je veux que ce bouton ouvre un menu.
// GtkWidget ex = *gtk_menu_bar_new();
GtkWidget* list_box = gtk_list_box_new ();
gtk_list_box_append (GTK_LIST_BOX (menu_button), GTK_WIDGET (list_box));
gtk_list_box_bind_model (GTK_LIST_BOX (list_box),
NULL, // GListModel* model,
NULL, // GtkListBoxCreateWidgetFunc create_widget_func,
NULL, // gpointer user_data,
(*user_data_free_func) (NULL) // GDestroyNotify user_data_free_func
);
gtk_menu_button_set_child (menu_button, list_box);
// https://docs.gtk.org/gtk4/class.ListView.html // https://docs.gtk.org/gtk4/class.ListView.html
// https://toshiocp.github.io/Gtk4-tutorial/sec29.html // https://toshiocp.github.io/Gtk4-tutorial/sec29.html
// https://blog.gtk.org/2020/06/07/scalable-lists-in-gtk-4/ // https://blog.gtk.org/2020/06/07/scalable-lists-in-gtk-4/
@ -79,9 +61,6 @@ void learning_how_to_create_a_menu (GtkMenuButton* menu_button) { // Je veux qu
// https://docs.gtk.org/gtk4/class.MenuButton.html // https://docs.gtk.org/gtk4/class.MenuButton.html
// https://web.mit.edu/barnowl/share/gtk-doc/html/gobject/gobject-Signals.html // https://web.mit.edu/barnowl/share/gtk-doc/html/gobject/gobject-Signals.html
// https://docs.gtk.org/gio/class.MenuModel.html#a-menu-example // https://docs.gtk.org/gio/class.MenuModel.html#a-menu-example
}

View File

@ -43,17 +43,17 @@
static GtkWindow *main_window, *dialog_window, *text_window; static GtkWindow *main_window, *dialog_window, *text_window;
static GtkButton *btt_STATE, *btt_RULES, *btt_DATA; static GtkButton *btt_STATE, *btt_RULES, *btt_DATA;
GtkWindow *widget_head_rec_MAIN_WINDOW() { return main_window; } GtkWindow *widget_topbar_rec_MAIN_WINDOW() { return main_window; }
GtkWindow *widget_head_rec_DIALOG_WINDOW() { return dialog_window; } GtkWindow *widget_topbar_rec_DIALOG_WINDOW() { return dialog_window; }
GtkWindow *widget_head_rec_TEXT_WINDOW() { return text_window; } GtkWindow *widget_topbar_rec_TEXT_WINDOW() { return text_window; }
void widget_head_fix_MAIN_WINDOW (GtkApplication *app) void widget_topbar_fix_MAIN_WINDOW (GtkApplication *app)
{ main_window = GTK_WINDOW (gtk_application_window_new (app)); } { main_window = GTK_WINDOW (gtk_application_window_new (app)); }
void widget_head_fix_DIALOG_WINDOW (GtkApplication *app) void widget_topbar_fix_DIALOG_WINDOW (GtkApplication *app)
{ dialog_window = GTK_WINDOW (gtk_application_window_new (app)); } { dialog_window = GTK_WINDOW (gtk_application_window_new (app)); }
void widget_head_fix_TEXT_WINDOW (GtkApplication *app) void widget_topbar_fix_TEXT_WINDOW (GtkApplication *app)
{ text_window = GTK_WINDOW (gtk_application_window_new (app)); } { text_window = GTK_WINDOW (gtk_application_window_new (app)); }
@ -62,7 +62,7 @@ void widget_head_fix_TEXT_WINDOW (GtkApplication *app)
/* T E X T W I N D O W */ /* T E X T W I N D O W */
/******************************************************************************/ /******************************************************************************/
void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_window) void widget_topbar_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_window)
{ {
char *title = " Learn more about Gem Graph. "; char *title = " Learn more about Gem Graph. ";
GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ());
@ -85,7 +85,7 @@ void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_win
/* D I A L O G W I N D O W */ /* D I A L O G W I N D O W */
/******************************************************************************/ /******************************************************************************/
void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog_window) void widget_topbar_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog_window)
{ {
char *title = " Save the current model before modifying it? "; char *title = " Save the current model before modifying it? ";
GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ());
@ -129,7 +129,8 @@ static GtkWidget *window_header_bar (GtkWindow *window);
static void window_header_bar_left (GtkWidget *header_bar); static void window_header_bar_left (GtkWidget *header_bar);
static void window_header_bar_right (GtkWidget *header_bar); static void window_header_bar_right (GtkWidget *header_bar);
void widget_head_MAIN_WINDOW_design (GtkWindow *main_window){ void widget_topbar_MAIN_WINDOW_design (GtkWindow *main_window)
{
GtkWidget *header_bar = window_header_bar (main_window); GtkWidget *header_bar = window_header_bar (main_window);
window_header_bar_left (header_bar); window_header_bar_left (header_bar);
window_header_bar_right (header_bar); window_header_bar_right (header_bar);
@ -213,13 +214,18 @@ static void window_header_bar_right (GtkWidget *header_bar)
// https://discourse.gnome.org/t/when-do-we-really-have-to-use-gtk-popover-present-to-show-a-popover-at-a-given-widget/17566/5
// https://stackoverflow.com/questions/69135934/creating-a-simple-menubar-menu-and-menu-item-in-c-using-gtk4
GtkWidget* list_box = gtk_list_box_new(); GtkWidget* list_box = gtk_list_box_new();
GtkWidget *label_A = GTK_WIDGET (gtk_label_new("A")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_A); GtkWidget *label_A = GTK_WIDGET (gtk_label_new("A")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_A);
GtkWidget *label_B = GTK_WIDGET (gtk_label_new("B")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_B); GtkWidget *label_B = GTK_WIDGET (gtk_label_new("B")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_B);
GtkWidget *label_C = GTK_WIDGET (gtk_label_new("C")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_C); GtkWidget *label_C = GTK_WIDGET (gtk_label_new("C")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_C);
// gtk_menu_item_activate (label_C);
// https://discourse.gnome.org/t/when-do-we-really-have-to-use-gtk-popover-present-to-show-a-popover-at-a-given-widget/17566/5
GtkWidget *pop = gtk_popover_new (); GtkWidget *pop = gtk_popover_new ();
gtk_popover_set_child (GTK_POPOVER (pop), list_box); gtk_popover_set_child (GTK_POPOVER (pop), list_box);
gtk_popover_present (GTK_POPOVER (pop)); gtk_popover_present (GTK_POPOVER (pop));
@ -227,22 +233,24 @@ static void window_header_bar_right (GtkWidget *header_bar)
gtk_popover_set_cascade_popdown (GTK_POPOVER (pop), TRUE); gtk_popover_set_cascade_popdown (GTK_POPOVER (pop), TRUE);
GtkMenuButton *open_menu = GTK_MENU_BUTTON (gtk_menu_button_new ()); GtkMenuButton *open_menu = GTK_MENU_BUTTON (gtk_menu_button_new ());
// gtk_menu_button_popup (open_menu); gtk_menu_button_popdown (open_menu);
gtk_menu_button_set_icon_name (open_menu, "open-menu-symbolic"); gtk_menu_button_set_icon_name (open_menu, "open-menu-symbolic");
gtk_menu_button_set_always_show_arrow (open_menu, TRUE); gtk_menu_button_set_always_show_arrow (open_menu, TRUE);
gtk_menu_button_set_popover (open_menu, GTK_WIDGET (pop)); gtk_menu_button_set_popover (open_menu, GTK_WIDGET (pop));
gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), GTK_WIDGET (open_menu)); gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), GTK_WIDGET (open_menu));
// https://stackoverflow.com/questions/69135934/creating-a-simple-menubar-menu-and-menu-item-in-c-using-gtk4
GSimpleAction *act_connect = g_simple_action_new("connect", NULL); GSimpleAction *act_connect = g_simple_action_new("connect", NULL);
// g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect));
g_signal_connect(act_connect, "activate", G_CALLBACK(connect), NULL); g_signal_connect(act_connect, "activate", G_CALLBACK(connect), NULL);
// GMenuItem *label_E = g_menu_item_new("connect", "app.connect"); g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box);
// gtk_menu_button_popup (open_menu); gtk_menu_button_popdown (open_menu);
// gtk_menu_item_activate (label_C);
// g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect));
// GMenuItem *label_E = g_menu_item_new("connect", "app.connect");
// gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (label_E)); // gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (label_E));
g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box);