Renommage + cleaning après audit
This commit is contained in:
parent
19f3483c2c
commit
8e0ef0fdbd
|
@ -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é
|
||||
|
||||
|
||||
|
|
@ -35,19 +35,19 @@
|
|||
/* W I N D O W S */
|
||||
/******************************************************************************/
|
||||
|
||||
void widget_head_fix_MAIN_WINDOW (GtkApplication *app);
|
||||
void widget_head_fix_DIALOG_WINDOW (GtkApplication *app);
|
||||
void widget_head_fix_TEXT_WINDOW (GtkApplication *app);
|
||||
void widget_topbar_fix_MAIN_WINDOW (GtkApplication *app);
|
||||
void widget_topbar_fix_DIALOG_WINDOW (GtkApplication *app);
|
||||
void widget_topbar_fix_TEXT_WINDOW (GtkApplication *app);
|
||||
|
||||
void widget_head_MAIN_WINDOW_design (GtkWindow *main_window);
|
||||
void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window,
|
||||
void widget_topbar_MAIN_WINDOW_design (GtkWindow *main_window);
|
||||
void widget_topbar_DIALOG_WINDOW_design (GtkWindow *main_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 *widget_head_rec_MAIN_WINDOW();
|
||||
GtkWindow *widget_head_rec_DIALOG_WINDOW();
|
||||
GtkWindow *widget_head_rec_TEXT_WINDOW();
|
||||
GtkWindow *widget_topbar_rec_MAIN_WINDOW();
|
||||
GtkWindow *widget_topbar_rec_DIALOG_WINDOW();
|
||||
GtkWindow *widget_topbar_rec_TEXT_WINDOW();
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
|
@ -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_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) {
|
||||
case (EXEC) : return "EXEC";
|
||||
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) {
|
||||
case (STATE) : return "STATE";
|
||||
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
|
||||
// sub_automaton 1 is STATE_RULES_DATA
|
||||
case (0) : printf("switch %5s x %5s > %5s x %5s\n",
|
||||
|
|
234
src/main.c
234
src/main.c
|
@ -32,75 +32,39 @@
|
|||
|
||||
#include "../include/signal.h"
|
||||
|
||||
/* Comment renommer les fonctions ?
|
||||
* 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 ?
|
||||
/* Sur quel modèle se guider pour structurer le client gem-graph ?
|
||||
* https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
|
||||
* https://en.wikipedia.org/wiki/Multitier_architecture
|
||||
*
|
||||
* > Quelles structures sont suffisamment individualisées dès aujourd'hui,
|
||||
* ou ont un développement suffisamment prévisible (modules, interfaces)
|
||||
* pour qu'on puisse décider de les renommer
|
||||
* (et comment classer et nommer les autres) ?
|
||||
* Le nom de toute fonction qui peut être appelée d'un autre module doit comporter :
|
||||
* - 1) le nom du module auquel elle appartient (widget, graphics, parse,...)
|
||||
* - 2) une indication sur son action (get, set, rec, fix, create, add,...)
|
||||
* - 3) une indication sur l'objet de cette action (STATE, RULES, STACK,...)
|
||||
*
|
||||
* > Comment rendre "human-readable" des noms d'un langage "machine-readable" ?
|
||||
*
|
||||
* _________________
|
||||
*
|
||||
* >>> 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()
|
||||
* ex: on_save_CURRENT_MODEL()
|
||||
* 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')
|
||||
* 'graph' == area ('graph' est un alias de 'area')
|
||||
* 'on_' == callback ('on_' est un alias de 'callbacks')
|
||||
* Ainsi, TOUS les callbacks sont dans le fichier 'src/callbacks.c'
|
||||
* 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 :
|
||||
* Il est prévisible que 'state.c' devienne 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()
|
||||
* Une fonction comme : get_ZOOM_box()
|
||||
* devra alors être renommé : state_camera_get_ZOOM_box() (par exemple)
|
||||
*
|
||||
* _________________
|
||||
*
|
||||
*
|
||||
* QUELLE EST L'ORGANISATION ACTUELLE ?
|
||||
* ORGANISATION ACTUELLE
|
||||
*
|
||||
* 1) Les structures hiérarchiques.
|
||||
* --------------------------------
|
||||
*
|
||||
* La description de l'aspect (du 'design') des fenêtres
|
||||
* se trouve dans le dossier 'widget.c'
|
||||
* et s'organise naturellement sur le même modèle : en arborescence
|
||||
* qu'il sera facile de répartir en dossiers et fichiers
|
||||
* au fur à mesure de leur développement.
|
||||
* La description du 'design' des fenêtres se trouve dans le dossier 'widget'
|
||||
* et s'organise naturellement en arborescence, comme les widgets eux-mêmes.
|
||||
*
|
||||
* Il sera donc facile de répartir cette description en dossiers et fichiers
|
||||
* au fur à mesure de son développement.
|
||||
*
|
||||
* 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)
|
||||
* qui peut prendre au moins trois apparences différentes :
|
||||
* - 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...
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
* --------------------------------
|
||||
*
|
||||
* Les fonctions 'transversales' comme celles de
|
||||
* 'graph' 'parse', possiblement 'tree' mais - surtout - 'automat',
|
||||
* Les fonctions 'transversales' comme celles de 'graphics' 'parse', 'fsm',
|
||||
* doivent pouvoir être accédées directement
|
||||
* sans avoir à passer par la hiérarchie des widgets et/ou callbacks.
|
||||
* 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;
|
||||
* Elle sera probablement décomposée en de nombreux 'sous-automates'
|
||||
* tels que chaque état de la fenêtre soit une combinaison unique
|
||||
|
@ -175,10 +111,6 @@
|
|||
* - 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.
|
||||
* Leur recueil et leur mémorisation seront probablement des fonctions centrales
|
||||
* 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 *
|
||||
* *****************************************************************************
|
||||
* (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 *
|
||||
* *****************************************************************************
|
||||
* 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'OÙ -
|
||||
*
|
||||
*
|
||||
* 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 ?
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
|
24
src/signal.c
24
src/signal.c
|
@ -64,14 +64,14 @@ static void on_auto_notification (const char *message)
|
|||
void on_windows_activation (GtkApplication *app,
|
||||
gpointer no_user_data)
|
||||
{
|
||||
widget_head_fix_MAIN_WINDOW (app);
|
||||
widget_head_MAIN_WINDOW_design (widget_head_rec_MAIN_WINDOW());
|
||||
widget_topbar_fix_MAIN_WINDOW (app);
|
||||
widget_topbar_MAIN_WINDOW_design (widget_topbar_rec_MAIN_WINDOW());
|
||||
|
||||
widget_head_fix_DIALOG_WINDOW (app);
|
||||
widget_head_DIALOG_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_DIALOG_WINDOW());
|
||||
widget_topbar_fix_DIALOG_WINDOW (app);
|
||||
widget_topbar_DIALOG_WINDOW_design (widget_topbar_rec_MAIN_WINDOW(), widget_topbar_rec_DIALOG_WINDOW());
|
||||
|
||||
widget_head_fix_TEXT_WINDOW (app);
|
||||
widget_head_TEXT_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_TEXT_WINDOW());
|
||||
widget_topbar_fix_TEXT_WINDOW (app);
|
||||
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()) {
|
||||
|
||||
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()));
|
||||
break;
|
||||
|
||||
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()));
|
||||
break;
|
||||
|
||||
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()));
|
||||
break;
|
||||
|
||||
|
@ -284,7 +284,7 @@ void on_toggle_EXEC_EDIT (GtkWidget *toggled_button, gpointer user_data)
|
|||
"text-editor-symbolic");
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
@ -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) {
|
||||
// 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)
|
||||
{
|
||||
printf ("callback.on_clicked_HOME() button presents the dialog_window\
|
||||
( :- ) 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()));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -54,24 +54,6 @@
|
|||
/* 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://toshiocp.github.io/Gtk4-tutorial/sec29.html
|
||||
// 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://web.mit.edu/barnowl/share/gtk-doc/html/gobject/gobject-Signals.html
|
||||
// https://docs.gtk.org/gio/class.MenuModel.html#a-menu-example
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -43,17 +43,17 @@
|
|||
static GtkWindow *main_window, *dialog_window, *text_window;
|
||||
static GtkButton *btt_STATE, *btt_RULES, *btt_DATA;
|
||||
|
||||
GtkWindow *widget_head_rec_MAIN_WINDOW() { return main_window; }
|
||||
GtkWindow *widget_head_rec_DIALOG_WINDOW() { return dialog_window; }
|
||||
GtkWindow *widget_head_rec_TEXT_WINDOW() { return text_window; }
|
||||
GtkWindow *widget_topbar_rec_MAIN_WINDOW() { return main_window; }
|
||||
GtkWindow *widget_topbar_rec_DIALOG_WINDOW() { return dialog_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)); }
|
||||
|
||||
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)); }
|
||||
|
||||
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)); }
|
||||
|
||||
|
||||
|
@ -62,7 +62,7 @@ void widget_head_fix_TEXT_WINDOW (GtkApplication *app)
|
|||
/* 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. ";
|
||||
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 */
|
||||
/******************************************************************************/
|
||||
|
||||
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? ";
|
||||
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_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);
|
||||
window_header_bar_left (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 *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_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 ();
|
||||
gtk_popover_set_child (GTK_POPOVER (pop), list_box);
|
||||
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);
|
||||
|
||||
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_always_show_arrow (open_menu, TRUE);
|
||||
gtk_menu_button_set_popover (open_menu, GTK_WIDGET (pop));
|
||||
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);
|
||||
// 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 (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));
|
||||
|
||||
|
||||
g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box);
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue