From 39ead30e3bcb19925946e9e3d752486d6cc1d0cb Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 25 Jul 2024 00:04:04 +0200
Subject: Display new panels inside the main window when needed.

---
 src/gui/panels/binary.c | 30 +++++++++++++++++-------------
 src/gui/panels/binary.h |  5 +++--
 src/gui/window.c        | 24 +++++++++++++++++++++++-
 src/gui/window.h        |  4 ++++
 4 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/src/gui/panels/binary.c b/src/gui/panels/binary.c
index 88b19d2..aba0c7f 100644
--- a/src/gui/panels/binary.c
+++ b/src/gui/panels/binary.c
@@ -26,6 +26,7 @@
 
 
 #include "binary-int.h"
+#include "../window.h"
 #include "../../analysis/contents/file.h"
 #include "../../gtkext/helpers.h"
 #include "../../gtkext/hexview.h"
@@ -35,10 +36,10 @@
 /* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */
 
 
-/* Initialise la classe des panneaux d'accueil par défaut. */
+/* Initialise la classe des panneaux pour binaires. */
 static void gtk_binary_panel_class_init(GtkBinaryPanelClass *);
 
-/* Initialise une instance de panneau d'accueil par défaut. */
+/* Initialise une instance de panneau pour binaire. */
 static void gtk_binary_panel_init(GtkBinaryPanel *);
 
 /* Supprime toutes les références externes. */
@@ -86,7 +87,7 @@ static GtkWidget *g_binary_panel_get_launcher(GBinaryPanel *);
 static GtkWidget *g_binary_panel_get_properties(GBinaryPanel *);
 
 /* Ouvre une boîte de dialogue pour récupérer un fichier. */
-static void g_binary_panel_on_new_file_entry_icon_release(GtkEntry *, GtkEntryIconPosition, gpointer);
+static void g_binary_panel_on_new_file_entry_icon_release(GtkEntry *, GtkEntryIconPosition, GBinaryPanel *);
 
 /* Fournit un composant représentant un panneau graphique. */
 static GtkTiledPanel *g_binary_panel_get_panel(GBinaryPanel *, GtkWidget *);
@@ -106,7 +107,7 @@ G_DEFINE_TYPE(GtkBinaryPanel, gtk_binary_panel, GTK_TYPE_TILED_PANEL);
 *                                                                             *
 *  Paramètres  : class = classe à initialiser.                                *
 *                                                                             *
-*  Description : Initialise la classe des panneaux d'accueil par défaut.      *
+*  Description : Initialise la classe des panneaux pour binaires.             *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -137,7 +138,7 @@ static void gtk_binary_panel_class_init(GtkBinaryPanelClass *class)
 *                                                                             *
 *  Paramètres  : panel = instance à initialiser.                              *
 *                                                                             *
-*  Description : Initialise une instance de panneau d'accueil par défaut.     *
+*  Description : Initialise une instance de panneau pour binaire.             *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -196,7 +197,7 @@ static void gtk_binary_panel_finalize(GtkBinaryPanel *panel)
 *                                                                             *
 *  Paramètres  : content = contenu brut à exposer.                            *
 *                                                                             *
-*  Description : Crée une nouvelle instance de panneau d'accueil.             *
+*  Description : Crée une nouvelle instance de panneau pour binaire.          *
 *                                                                             *
 *  Retour      : Composant GTK mis en place.                                  *
 *                                                                             *
@@ -439,6 +440,7 @@ static GtkWidget *g_binary_panel_get_properties(GBinaryPanel *panel)
 
     builder = gtk_builder_new();
     gtk_builder_set_scope(builder, scope);
+    gtk_builder_set_current_object(builder, G_OBJECT(panel));
 
 #ifndef NDEBUG
     status = gtk_builder_add_from_resource(builder, "/re/chrysalide/framework/gui/panels/binary-props.ui", NULL);
@@ -460,9 +462,9 @@ static GtkWidget *g_binary_panel_get_properties(GBinaryPanel *panel)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : entry =
-*                icon_pos = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
-*                panel = définition de panneau à manipuler.                   *
+*  Paramètres  : entry    = zone de saisie concernée par l'appel.             *
+*                icon_pos = position de l'icone incrustée dans la zone.       *
+*                panel    = définition de panneau à manipuler.                *
 *                                                                             *
 *  Description : Ouvre une boîte de dialogue pour récupérer un fichier.       *
 *                                                                             *
@@ -472,14 +474,16 @@ static GtkWidget *g_binary_panel_get_properties(GBinaryPanel *panel)
 *                                                                             *
 ******************************************************************************/
 
-static void g_binary_panel_on_new_file_entry_icon_release(GtkEntry *entry, GtkEntryIconPosition icon_pos, gpointer user_data)
+static void g_binary_panel_on_new_file_entry_icon_release(GtkEntry *entry, GtkEntryIconPosition icon_pos, GBinaryPanel *panel)
 {
+    GtkRoot *root;                          /* Racine du composant         */
+    GtkTiledPanel *tiled;                   /* Panneau d'affichage complet */
 
+    root = gtk_widget_get_root(GTK_WIDGET(entry));
 
-    printf("open...\n");
-
-
+    tiled = g_binary_panel_get_panel(panel, NULL);
 
+    gtk_framework_window_add(GTK_FRAMEWORK_WINDOW(root), tiled);
 
 }
 
diff --git a/src/gui/panels/binary.h b/src/gui/panels/binary.h
index bcf8707..b459294 100644
--- a/src/gui/panels/binary.h
+++ b/src/gui/panels/binary.h
@@ -30,6 +30,7 @@
 
 
 #include "../panel.h"
+#include "../../analysis/content.h"
 #include "../../glibext/helpers.h"
 #include "../../gtkext/panel.h"
 
@@ -43,8 +44,8 @@
 DECLARE_GTYPE(GtkBinaryPanel, gtk_binary_panel, GTK, BINARY_PANEL);
 
 
-/* Crée une nouvelle instance de panneau d'accueil. */
-GtkTiledPanel *gtk_binary_panel_new(void);
+/* Crée une nouvelle instance de panneau pour binaire. */
+GtkTiledPanel *gtk_binary_panel_new_for_content(GBinContent *);
 
 
 
diff --git a/src/gui/window.c b/src/gui/window.c
index 24716ed..432a8a1 100644
--- a/src/gui/window.c
+++ b/src/gui/window.c
@@ -207,7 +207,7 @@ bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app
     item = find_item_panel_by_type(G_TYPE_WELCOME_PANEL);
 
     panel = g_panel_item_get_panel(item);
-    gtk_stack_add_child(window->grid, GTK_WIDGET(panel));
+    gtk_framework_window_add(window, panel);
 
     unref_object(item);
 
@@ -236,3 +236,25 @@ bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app
     return result;
 
 }
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : window = instance de fenêtre principale à remplir.           *
+*                panel  = nouveau panneau à afficher.                         *
+*                                                                             *
+*  Description : Ajoute un panneau à la fenêtre principale de Chrysalide.     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void gtk_framework_window_add(GtkFrameworkWindow *window, /* __steal */GtkTiledPanel *panel)
+{
+    gtk_stack_add_child(window->grid, GTK_WIDGET(panel));
+
+    gtk_stack_set_visible_child(window->grid, GTK_WIDGET(panel));
+
+}
diff --git a/src/gui/window.h b/src/gui/window.h
index 4e73a76..56c56ec 100644
--- a/src/gui/window.h
+++ b/src/gui/window.h
@@ -29,6 +29,7 @@
 
 
 #include "../glibext/helpers.h"
+#include "../gtkext/panel.h"
 
 
 
@@ -46,6 +47,9 @@ DECLARE_GTYPE(GtkFrameworkWindow, gtk_framework_window, GTK, FRAMEWORK_WINDOW);
 /* Crée une nouvelle application principale pour Chrysalide. */
 GtkApplicationWindow *gtk_framework_window_new(GtkApplication *);
 
+/* Ajoute un panneau à la fenêtre principale de Chrysalide. */
+void gtk_framework_window_add(GtkFrameworkWindow *, GtkTiledPanel *);
+
 
 
 #endif  /* _GUI_WINDOW_H */
-- 
cgit v0.11.2-87-g4458