diff options
Diffstat (limited to 'src/gui/core/panels.c')
-rw-r--r-- | src/gui/core/panels.c | 285 |
1 files changed, 248 insertions, 37 deletions
diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 69ab2aa..4c113b8 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * panels.c - gestion d'ensemble de tous les panneaux graphiques du framework * - * Copyright (C) 2016-2024 Cyrille Bagard + * Copyright (C) 2016-2025 Cyrille Bagard * * This file is part of Chrysalide. * @@ -25,25 +25,137 @@ #include "panels.h" +#include <assert.h> #include <malloc.h> +#include <string.h> + + +#include <i18n.h> #include "../panels/binary.h" +#include "../panels/binary-params.h" #include "../panels/welcome.h" +#include "../../gtkext/launcher.h" + + + +/* Définition générique complète d'un panneau */ +typedef struct _ext_panel_info_t +{ + /* Début des champs copiés de panel_info_t */ + + char *category; /* Groupe de rassemblement */ + + char *image; /* Eventuelle image associée */ + char *title; /* Désignation humaine */ + char *desc; /* Description humaine */ + FrameworkPanelPersonality personality; /* Comportement attendu */ + + GType panel_type; /* Type du panneau représenté */ + GType params_type; /* Composant de paramètre */ + + /* Fin des champs copiés de panel_info_t */ + + GtkTiledPanel *singleton; /* Conservation des allocations*/ + +} ext_panel_info_t; /* Liste des panneaux disponibles */ -static GPanelItem **_panels_list = NULL; +static ext_panel_info_t **_panels_list = NULL; static size_t _panels_count = 0; +/* Copie une définition basique de panneau graphqiue. */ +static ext_panel_info_t *copy_panel_info(const panel_info_t *); + +/* Efface une définition étendue de panneau graphique. */ +static void delete_panel_info(ext_panel_info_t *); + + + +/****************************************************************************** +* * +* Paramètres : info = information de base à copier. * +* * +* Description : Copie une définition basique de panneau graphqiue. * +* * +* Retour : Structure mémorisant l'ensemble des informations. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static ext_panel_info_t *copy_panel_info(const panel_info_t *info) +{ + ext_panel_info_t *result; /* Structure à retourner */ + + result = calloc(1, sizeof(ext_panel_info_t)); + + if (info->category != NULL) + result->category = strdup(info->category); + + if (info->image != NULL) + result->image = strdup(info->image); + + result->title = strdup(info->title); + + if (info->desc != NULL) + result->desc = strdup(info->desc); + + result->personality = info->personality; + + result->panel_type = info->panel_type; + result->params_type = info->params_type; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : info = informations à supprimer de la mémoire. * +* * +* Description : Efface une définition étendue de panneau graphique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void delete_panel_info(ext_panel_info_t *info) +{ + if (info->category != NULL) + free(info->category); + + if (info->image != NULL) + free(info->image); + + free(info->title); + + if (info->desc != NULL) + free(info->desc); + + if (info->singleton != NULL) + { + assert(info->personality & FPP_SINGLETON); + unref_object(info->singleton); + } + + free(info); + +} + /****************************************************************************** * * * Paramètres : - * * * -* Description : Charge les principaux panneaux graphiques du framework. * +* Description : Charge les définitions des principaux panneaux du framework. * * * * Retour : Bilan de l'opération. * * * @@ -51,19 +163,45 @@ static size_t _panels_count = 0; * * ******************************************************************************/ -bool load_main_panels(void) +bool load_main_framework_panel_definitions(void) { bool result; /* Bilan à retourner */ - - result = true; + panel_info_t info; /* Infos d'enregistrement */ // TODO register_panel_item(G_TYPE_LOG_PANEL, config); /* Chargement du panneau de rapport au plus tôt */ // TODO panel = g_panel_item_new(G_TYPE_LOG_PANEL, NULL); - register_panel_item(g_binary_panel_new()); - register_panel_item(g_welcome_panel_new()); + info.category = "Main"; + + info.image = "binfile-symbolic"; + info.title = _("Binary analysis"); + info.desc = _("Load a binary content and parse its format if recognized"); + + info.personality = FPP_MAIN_PANEL; + + info.panel_type = GTK_TYPE_BINARY_PANEL; + info.params_type = GTK_TYPE_BINARY_PARAMETERS; + + result = register_framework_panel_definition(&info); + if (!result) goto done; + + info.category = NULL; + + info.image = NULL; + info.title = _("Welcome"); + info.desc = NULL; + + info.personality = FPP_MAIN_PANEL | FPP_SINGLETON; + + info.panel_type = GTK_TYPE_WELCOME_PANEL; + info.params_type = G_TYPE_INVALID; + + result = register_framework_panel_definition(&info); + if (!result) goto done; + + done: return result; @@ -82,12 +220,12 @@ bool load_main_panels(void) * * ******************************************************************************/ -void unload_all_panels(void) +void unload_all_framework_panel_definitions(void) { size_t i; /* Boucle de parcours */ for (i = 0; i < _panels_count; i++) - unref_object(_panels_list[i]); + delete_panel_info(_panels_list[i]); _panels_list = NULL; _panels_count = 0; @@ -97,10 +235,9 @@ void unload_all_panels(void) /****************************************************************************** * * -* Paramètres : type = type du composant à présenter à l'affichage. * -* config = configuration à compléter. * +* Paramètres : info = information de base à copier. * * * -* Description : Enregistre un panneau comme partie intégrante de l'éditeur. * +* Description : Enregistre la définition d'un panneau graphique. * * * * Retour : - * * * @@ -108,11 +245,36 @@ void unload_all_panels(void) * * ******************************************************************************/ -void register_panel_item(/* __steal */ GPanelItem *item) +bool register_framework_panel_definition(const panel_info_t *info) { - _panels_list = realloc(_panels_list, ++_panels_count * sizeof(GPanelItem *)); + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + ext_panel_info_t *ext_info; /* Informations conservées */ + + result = false; - _panels_list[_panels_count - 1] = item; + /* Validation */ + + for (i = 0; i < _panels_count; i++) + if (_panels_list[i]->panel_type == info->panel_type) + break; + + if (i < _panels_count) + goto done; + + /* Enregistrement */ + + ext_info = copy_panel_info(info); + + _panels_list = realloc(_panels_list, ++_panels_count * sizeof(ext_panel_info_t *)); + + _panels_list[_panels_count - 1] = ext_info; + + result = true; + + done: + + return result; } @@ -121,7 +283,7 @@ void register_panel_item(/* __steal */ GPanelItem *item) * * * Paramètres : target = type de définition de panneau recherchée. * * * -* Description : Retrouve la définition d'un type de panneau. * +* Description : Met en place (au besoin) un panneau graphique unique. * * * * Retour : Instance de définition identifiée ou NULL en cas d'échec. * * * @@ -129,23 +291,27 @@ void register_panel_item(/* __steal */ GPanelItem *item) * * ******************************************************************************/ -GPanelItem *find_item_panel_by_type(GType target) +GtkTiledPanel *get_framework_panel_singleton(GType target) { - GPanelItem *result; /* Instance à renvoyer */ + GtkTiledPanel *result; /* Instance à renvoyer */ size_t i; /* Boucle de parcours */ - GPanelItem *item; /* Définition de panneau */ + ext_panel_info_t *info; /* Informations conservées */ result = NULL; for (i = 0; i < _panels_count; i++) { - item = _panels_list[i]; + info = _panels_list[i]; - if (G_OBJECT_TYPE(item) == target) + if (info->panel_type == target) { - result = item; + if (info->singleton == NULL) + info->singleton = g_object_new(target, NULL); + + result = info->singleton; ref_object(result); break; + } } @@ -157,39 +323,84 @@ GPanelItem *find_item_panel_by_type(GType target) /****************************************************************************** * * -* Paramètres : skip = saute le panneau d'accueil lors du parcours ? * -* handle = routine à appeler pour chaque panneau. * -* data = données fournies pour accompagner cet appel. * +* Paramètres : list = liste à compléter. * * * -* Description : Effectue le parcours de tous les panneaux chargés. * +* Description : Intègre une définition de panneau enregistrée. * * * -* Retour : true si le parcours a été total, false sinon. * +* Retour : true pour un parcours complet de la liste des définitions. * * * * Remarques : - * * * ******************************************************************************/ -bool browse_all_item_panels(bool skip, handle_panel_item_fc handle, void *data) +void populate_framework_panel_launcher_list(GtkListBox *list) { - bool result; /* Résultat à renvoyer */ size_t i; /* Boucle de parcours */ - GPanelItem *item; /* Définition de panneau */ - - result = true; + ext_panel_info_t *info; /* Informations conservées */ + GtkPanelLauncher *launcher; /* Lanceur à intégrer */ for (i = 0; i < _panels_count; i++) { - item = _panels_list[i]; + info = _panels_list[i]; - if (skip && G_OBJECT_TYPE(item) == G_TYPE_WELCOME_PANEL) + if (info->category == NULL) continue; - result = handle(item, data); + launcher = gtk_panel_launcher_new(info->image, info->title, info->desc); + + g_object_set_data(G_OBJECT(launcher), "panel_type", GSIZE_TO_POINTER(info->panel_type)); + + gtk_list_box_append(list, GTK_WIDGET(launcher)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : row = lanceur sélectionné. * +* * +* Description : Fournit un composant d'édition de paramètres de panneau. * +* * +* Retour : Composant d'édition de paramètres ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *get_framework_panel_parameters(GtkListBoxRow *row) +{ + GtkWidget *result; /* Composant à retourner */ + gpointer *data; /* Valeur incrustée */ + GType target; /* Type de panneau recherché */ + ext_panel_info_t *info; /* Informations conservées */ + size_t i; /* Boucle de parcours */ + + data = g_object_get_data(G_OBJECT(row), "panel_type"); + assert(data != NULL); + + target = GPOINTER_TO_SIZE(data); - if (!result) break; + info = NULL; + + for (i = 0; i < _panels_count; i++) + { + info = _panels_list[i]; + + if (info->panel_type == target) + break; } + assert(info != NULL); + assert(i < _panels_count); + + if (info->params_type == G_TYPE_INVALID) + result = NULL; + else + result = g_object_new(info->params_type, NULL); + return result; } |