gem-graph-client/src/main.c

178 lines
7.8 KiB
C
Raw Normal View History

/* * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Gem-graph client *
* *
* Main *
* *
* Copyright © 2021 Libre en Communs <contact@a-lec.org> *
* Copyright © 2021 Adrien Bourmault <neox@a-lec.org> *
* Copyright © 2021 Arthur Menges <arthur.menges@a-lec.org> *
* Copyright © 2021 Jean Sirmai <jean@a-lec.org> *
* *
* This file is part of Gem-graph. *
* *
* This program is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Affero General Public License *
* as published by the Free Software Foundation, *
* either version 3 of the License, *
* or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; *
* without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU Affero General Public License for more details. *
* *
* You should have received a copy of the GNU Affero General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../include/widget.h"
2024-07-19 10:54:32 +02:00
/* 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
*
2024-07-19 10:54:32 +02:00
* 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, stock,...)
*
* ex: on_save_current_model()
* model_get_dim_value()
*
* Le fichier 'state.c' est devenu un dossier contenant
* les fichiers 'top.c', 'middle.c', 'bottom.c' et 'distrib.c' (2024-08)
*
* 'middle.c' deviendra, s'il est trop volumineux, un dossier 'middle'
* contenant, par exemple, les fichiers 'camera.c' ou 'contrasts.c' et d'autres
* et ainsi de suite ...
*
* Une fonction comme : get_zoom_box()
* devra alors être renommé : state_camera_get_zoom_box() (par exemple)
*
* _________________
*
*
2024-07-19 10:54:32 +02:00
* ORGANISATION ACTUELLE
*
2024-07-08 22:05:15 +02:00
* 1) Les structures hiérarchiques.
* --------------------------------
*
2024-07-19 10:54:32 +02:00
* La description du 'design' des fenêtres se trouve dans le dossier 'widget'
* et s'organise naturellement en arborescence,
* en se calquant sur l'arborescence des widgets eux-mêmes.
2024-07-19 10:54:32 +02:00
*
* 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 :
2024-07-19 10:54:32 +02:00
* > 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)
* - rules (les règles et les commandes associées)
* - stock (les données provenant des mesures, les outils d'analyse, etc.)
* (nom provisoire : mal défini à ce stade; fonctions à répartir...)
*
* La fenêtre principale s'ouvre sur la vue de l'état ('state.c') en mode 'EXEC'.
* Cette vue comporte trois panneaux (widgets) principaux:
* sup, moyen, inf ou encore: CONTRAST, CAMERA, CONTROL ou EDIT
* si on veut les nommer d'après leur fonction.
*
* Lorsque la description de chaque widget s'affinera
* et demandera plus de place, ces trois widgets principaux
* deviendront des dossiers et les widgets qu'ils contiennent
* des fichiers (ou des dossiers si besoin) et ainsi de suite...
*
2024-07-08 22:05:15 +02:00
*
* 2) Les structures transversales.
* --------------------------------
*
* Les fonctions 'transversales' comme celles de 'graphics', 'parse', 'fsm', 'prefer',
* et peut-être des structures communes à tous les arbres, listes, etc.
2024-07-08 22:05:15 +02:00
* doivent pouvoir être accédées directement
* sans avoir à passer par la hiérarchie des widgets et/ou callbacks.
* Elles restent à la racine: 'src/
*
*
2024-07-19 10:54:32 +02:00
* 'finite state machine' ('fsm') va centraliser l'identification
* des états (apparences) de la fenêtre et des transitions entre ces apparences;
2024-07-08 22:05:15 +02:00
* Elle sera probablement décomposée en de nombreux 'sous-automates'
* tels que chaque état de la fenêtre soit une combinaison unique
* des états de ces sous-automates.
*
* Exemple, muni des deux 'sous-automates' :
* > { EXEC, EDIT }; // xor
* > { STATE, RULES, DATA }; // xor
* la 'finite state machine' peut se trouver dans 2 x 3 = 6 états.
* (voir fsm.h lignes 40-41)
*
*
* Les grandes fonctions du client seront lancées par cette state machine :
* - édition automatique (optimisation) de l'arbre des conditions
* - tests sur un mini-serveur local
2024-07-08 22:05:15 +02:00
* - analyses de données...
*
2024-07-08 22:05:15 +02:00
*
* Leur recueil et la mémorisation des préférences des utilisateurs
* sont des fonctions centrales
* mais leur mise en oeuvre suivra probalement des voies hiérarchiques.
*
* On peut prévoir des préférences concernant l'apparence des widgets,
* les traductions, les 'disabilities'; etc.
* mais aussi concernant les méthodes de travail, l'usage des outils d'analyse, etc.
* >> des 'scripts' pour des 'méta-fonctions' (des 'macros') ?
*
*
*
*
*
*******************************************************************************
* 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 A P P E L S D E F O N C T I O N S *
*******************************************************************************
*/
#include "../include/widget.h"
#include "../include/signal.h"
#include "../include/fsm.h"
int main (int argc, char **argv)
{
2024-07-20 16:38:31 +02:00
GtkApplication *app;
int status;
2024-07-20 16:38:31 +02:00
app = gtk_application_new ("org.gem-graph", G_APPLICATION_DEFAULT_FLAGS);
fsm_init (); // fsm = finite state machine (see : src/fsm/dispatch.c)
2024-07-20 16:38:31 +02:00
g_signal_connect (app, "activate", G_CALLBACK (on_windows_activation), NULL);
// on_windows_activation <> see : src/widget/dispatch
2024-07-20 16:38:31 +02:00
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
// GTK itself does not support event sounds, << A GREAT WAY TO DEBUG ! TODO
// you have to use a loadable module like the one that comes with libcanberra.
// Property GtkSettings:gtk-error-bell
// property gtk-error-bell: gboolean [ read, write ]
// When TRUE, keyboard navigation and other input-related errors will cause a beep.