summaryrefslogtreecommitdiff
path: root/src/gui/core/panels.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/core/panels.c')
-rw-r--r--src/gui/core/panels.c285
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;
}