summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2025-02-22 13:25:55 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2025-02-22 13:38:26 (GMT)
commit0b8fbc0c0d6a18cf1b90337dbd20639316af1fe7 (patch)
treebd5fd817ddacb34ab8c90ecc30b601185ec62eba /plugins
parente16bc694115b5487df601858a471eea34eadc1ba (diff)
Create a plugin skeleton for Python notebooks.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Makefile.am3
-rw-r--r--plugins/pynb/Makefile.am75
-rw-r--r--plugins/pynb/core-ui-int.h56
-rw-r--r--plugins/pynb/core-ui.c292
-rw-r--r--plugins/pynb/core-ui.h43
-rw-r--r--plugins/pynb/data/images/pynb-symbolic.svg144
-rw-r--r--plugins/pynb/gresource.xml11
-rw-r--r--plugins/pynb/panel-int.h56
-rw-r--r--plugins/pynb/panel.c210
-rw-r--r--plugins/pynb/panel.h47
-rw-r--r--plugins/pynb/panel.ui21
-rw-r--r--plugins/pynb/params-int.h50
-rw-r--r--plugins/pynb/params.c171
-rw-r--r--plugins/pynb/params.h41
-rw-r--r--plugins/pynb/params.ui52
-rw-r--r--plugins/pynb/prefs.ui38
16 files changed, 1309 insertions, 1 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 89a8e25..529f4fe 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -14,7 +14,8 @@ endif
# androhelpers
SUBDIRS = \
$(PYTHON3_SUBDIRS) \
- pe
+ pe \
+ pynb
# arm \
# bootimg \
diff --git a/plugins/pynb/Makefile.am b/plugins/pynb/Makefile.am
new file mode 100644
index 0000000..a4a3423
--- /dev/null
+++ b/plugins/pynb/Makefile.am
@@ -0,0 +1,75 @@
+
+BUILT_SOURCES = resources.h resources.c
+
+
+lib_LTLIBRARIES = libpynbui.la
+
+libdir = $(pluginslibdir)
+
+
+# if BUILD_PYTHON3_BINDINGS
+
+# PYTHON3_LIBADD = python/libpynbpython.la
+
+# if BUILD_DISCARD_LOCAL
+
+# PYTHON3_LDFLAGS = -Wl,-rpath,$(pluginslibdir) \
+# -L$(top_srcdir)/plugins/pychrysalide/.libs -l:pychrysalide.so
+
+# else
+
+# PYTHON3_LDFLAGS = -Wl,-rpath,$(abs_top_srcdir)/plugins/pychrysalide/.libs \
+# -L$(top_srcdir)/plugins/pychrysalide/.libs -l:pychrysalide.so
+
+# endif
+
+# PYTHON3_SUBDIRS = python
+
+# endif
+
+
+libpynbui_la_SOURCES = \
+ core-ui-int.h \
+ core-ui.h core-ui.c \
+ panel-int.h \
+ panel.h panel.c \
+ params-int.h \
+ params.h params.c \
+ resources.h resources.c
+
+libpynbui_la_LIBADD = \
+ $(PYTHON3_LIBADD)
+
+libpynbui_la_CFLAGS = $(LIBGTK4_CFLAGS)
+
+libpynbui_la_LDFLAGS = \
+ $(LIBGTK4_LIBS) $(PYTHON3_LDFLAGS)
+
+
+devdir = $(includedir)/chrysalide-$(subdir)
+
+dev_HEADERS = $(libpynbui_la_SOURCES:%c=)
+
+
+RES_FILES = \
+ panel.ui \
+ params.ui \
+ prefs.ui \
+ data/images/pynb-symbolic.svg
+
+
+resources.c: gresource.xml $(RES_FILES)
+ glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name plugins_pynb gresource.xml
+
+resources.h: gresource.xml
+ glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-header --c-name plugins_pynb gresource.xml
+
+
+CLEANFILES = resources.h resources.c
+
+EXTRA_DIST = gresource.xml $(RES_FILES)
+
+
+AM_CPPFLAGS = -I$(top_srcdir)/src $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
+
+SUBDIRS = $(PYTHON3_SUBDIRS)
diff --git a/plugins/pynb/core-ui-int.h b/plugins/pynb/core-ui-int.h
new file mode 100644
index 0000000..caf5713
--- /dev/null
+++ b/plugins/pynb/core-ui-int.h
@@ -0,0 +1,56 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * core-ui-int.h - prototypes internes pour le plugin présentant des notes avec code Python
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _PLUGINS_PYNB_CORE_UI_INT_H
+#define _PLUGINS_PYNB_CORE_UI_INT_H
+
+
+#include <plugins/native-int.h>
+
+
+#include "core-ui.h"
+
+
+
+/* Greffon natif pour la présentation de notes avec texte et code Python (instance) */
+struct _GPythonNotebookPluginUI
+{
+ GNativePlugin parent; /* A laisser en premier */
+
+};
+
+
+/* Greffon natif pour la présentation de notes avec texte et code Python (classe) */
+struct _GPythonNotebookPluginUIClass
+{
+ GNativePluginClass parent; /* A laisser en premier */
+
+};
+
+
+/* Met en place un module pour un module pour présentation. */
+bool g_python_notebook_plugin_ui_create(GPythonNotebookPluginUI *, GModule *);
+
+
+
+#endif /* _PLUGINS_PYNB_CORE_UI_INT_H */
diff --git a/plugins/pynb/core-ui.c b/plugins/pynb/core-ui.c
new file mode 100644
index 0000000..1f89848
--- /dev/null
+++ b/plugins/pynb/core-ui.c
@@ -0,0 +1,292 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * core-ui.c - présentation de notes sous forme de texte et de code Python
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "core-ui.h"
+
+
+#include <i18n.h>
+#include <gui/core/panels.h>
+#include <plugins/self.h>
+
+
+#include "core-ui-int.h"
+#include "panel.h"
+#include "params.h"
+
+
+
+/* ---------------------- COMPOSITION DE NOUVEAU GREFFON NATIF ---------------------- */
+
+
+/* Initialise la classe des recherches et identifications. */
+static void g_python_notebook_plugin_ui_class_init(GPythonNotebookPluginUIClass *);
+
+/* Initialise une instance de recherches et identifications. */
+static void g_python_notebook_plugin_ui_init(GPythonNotebookPluginUI *);
+
+/* Supprime toutes les références externes. */
+static void g_python_notebook_plugin_ui_dispose(GObject *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_python_notebook_plugin_ui_finalize(GObject *);
+
+
+
+/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */
+
+
+/* Prend acte de l'activation du greffon. */
+static bool g_python_notebook_plugin_ui_enable(GPythonNotebookPluginUI *);
+
+/* Prend acte de la désactivation du greffon. */
+static bool g_python_notebook_plugin_ui_disable(GPythonNotebookPluginUI *);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* COMPOSITION DE NOUVEAU GREFFON NATIF */
+/* ---------------------------------------------------------------------------------- */
+
+
+/* Indique le type défini pour un greffon de liaison Python */
+G_DEFINE_TYPE(GPythonNotebookPluginUI, g_python_notebook_plugin_ui, G_TYPE_NATIVE_PLUGIN);
+
+
+NATIVE_PLUGIN_ENTRYPOINT(g_python_notebook_plugin_ui_new);
+
+
+/******************************************************************************
+* *
+* Paramètres : class = classe à initialiser. *
+* *
+* Description : Initialise la classe des recherches et identifications. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_python_notebook_plugin_ui_class_init(GPythonNotebookPluginUIClass *class)
+{
+ GObjectClass *object; /* Autre version de la classe */
+ GPluginModuleClass *plugin; /* Version parente de la classe*/
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = g_python_notebook_plugin_ui_dispose;
+ object->finalize = g_python_notebook_plugin_ui_finalize;
+
+ plugin = G_PLUGIN_MODULE_CLASS(class);
+
+ plugin->enable = (pg_management_fc)g_python_notebook_plugin_ui_enable;
+ plugin->disable = (pg_management_fc)g_python_notebook_plugin_ui_disable;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance à initialiser. *
+* *
+* Description : Initialise une instance de recherches et identifications. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_python_notebook_plugin_ui_init(GPythonNotebookPluginUI *plugin)
+{
+ STORE_PLUGIN_ABI(plugin);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_python_notebook_plugin_ui_dispose(GObject *object)
+{
+ G_OBJECT_CLASS(g_python_notebook_plugin_ui_parent_class)->dispose(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_python_notebook_plugin_ui_finalize(GObject *object)
+{
+ G_OBJECT_CLASS(g_python_notebook_plugin_ui_parent_class)->finalize(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : module = extension vue du système. *
+* *
+* Description : Crée un module pour présentation de notes. *
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : Le transfert de propriétée du module est total. *
+* *
+******************************************************************************/
+
+GPluginModule *g_python_notebook_plugin_ui_new(GModule *module)
+{
+ GPythonNotebookPluginUI *result; /* Structure à retourner */
+
+ result = g_object_new(G_TYPE_PYTHON_NOTEBOOK_PLUGIN_UI, NULL);
+
+ if (!g_python_notebook_plugin_ui_create(result, module))
+ g_clear_object(&result);
+
+ return G_PLUGIN_MODULE(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance à initialiser pleinement. *
+* module = extension vue du système. *
+* *
+* Description : Met en place un module pour un module pour présentation. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : Le transfert de propriétée du module est total. *
+* *
+******************************************************************************/
+
+bool g_python_notebook_plugin_ui_create(GPythonNotebookPluginUI *plugin, GModule *module)
+{
+ bool result; /* Bilan à retourner */
+
+#ifdef INCLUDE_PYTHON3_BINDINGS
+# define PG_REQ REQ_LIST("PyChrysalide")
+#else
+# define PG_REQ NO_REQ
+#endif
+
+ result = g_native_plugin_create(G_NATIVE_PLUGIN(plugin),
+ "PythonNotebook",
+ "Edit notebook with text and code to support binary analysis",
+ PACKAGE_VERSION,
+ CHRYSALIDE_WEBSITE("doc/plugins/pynb"),
+ PG_REQ,
+ module);
+
+ return result;
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* IMPLEMENTATION DES FONCTIONS DE CLASSE */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à manipuler. *
+* *
+* Description : Prend acte de l'activation du greffon. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_python_notebook_plugin_ui_enable(GPythonNotebookPluginUI *plugin)
+{
+ bool result; /* Bilan à retourner */
+ panel_info_t info; /* Infos d'enregistrement */
+
+ info.category = "Main";
+
+ info.image = "pynb-symbolic";
+ info.title = _("Python notebook");
+ info.desc = _("Edit notebook with text and code to support binary analysis");
+
+ info.personality = FPP_MAIN_PANEL;
+
+ info.panel_type = GTK_TYPE_PYTHON_NOTEBOOK_PANEL;
+ info.params_type = GTK_TYPE_PYTHON_NOTEBOOK_PARAMETERS;
+
+ result = register_framework_panel_definition(&info);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à manipuler. *
+* *
+* Description : Prend acte de la désactivation du greffon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_python_notebook_plugin_ui_disable(GPythonNotebookPluginUI *plugin)
+{
+ bool result; /* Bilan à retourner */
+
+
+ // TODO : unregister
+
+ result = true;
+
+
+ return result;
+
+}
diff --git a/plugins/pynb/core-ui.h b/plugins/pynb/core-ui.h
new file mode 100644
index 0000000..8ab9dd9
--- /dev/null
+++ b/plugins/pynb/core-ui.h
@@ -0,0 +1,43 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * core-ui.h - prototypes pour la présentation de notes sous forme de texte et de code Python
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _PLUGINS_FIDO_CORE_UI_H
+#define _PLUGINS_FIDO_CORE_UI_H
+
+
+#include <plugins/plugin.h>
+#include <plugins/plugin-int.h>
+
+
+
+#define G_TYPE_PYTHON_NOTEBOOK_PLUGIN_UI (g_python_notebook_plugin_ui_get_type())
+
+DECLARE_GTYPE(GPythonNotebookPluginUI, g_python_notebook_plugin_ui, G, PYTHON_NOTEBOOK_PLUGIN_UI);
+
+
+/* Crée un module pour présentation de notes. */
+GPluginModule *g_python_notebook_plugin_ui_new(GModule *);
+
+
+
+#endif /* _PLUGINS_FIDO_CORE_UI_H */
diff --git a/plugins/pynb/data/images/pynb-symbolic.svg b/plugins/pynb/data/images/pynb-symbolic.svg
new file mode 100644
index 0000000..f8cae60
--- /dev/null
+++ b/plugins/pynb/data/images/pynb-symbolic.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="256"
+ height="256"
+ viewBox="0 0 67.73333 67.733333"
+ version="1.1"
+ id="svg2759"
+ sodipodi:docname="pynotebook.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview2761"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="false"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="px"
+ showgrid="false"
+ inkscape:zoom="2.9329997"
+ inkscape:cx="126.83261"
+ inkscape:cy="128.1964"
+ inkscape:window-width="1920"
+ inkscape:window-height="1011"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs2756">
+ <linearGradient
+ id="b"
+ x1="28.809"
+ y1="28.882"
+ x2="45.803001"
+ y2="45.162998"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(12.026515,0,0,11.963752,-37.015053,-73.520624)">
+ <stop
+ stop-color="#FFE052"
+ id="stop3586" />
+ <stop
+ offset="1"
+ stop-color="#FFC331"
+ id="stop3588" />
+ </linearGradient>
+ <linearGradient
+ id="a"
+ x1="19.075001"
+ y1="18.782"
+ x2="34.897999"
+ y2="34.658001"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(12.026515,0,0,11.963752,-37.015053,-73.520624)">
+ <stop
+ stop-color="#387EB8"
+ id="stop3581" />
+ <stop
+ offset="1"
+ stop-color="#366994"
+ id="stop3583" />
+ </linearGradient>
+ </defs>
+ <g
+ inkscape:label="Calque 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g3524"
+ transform="translate(2.9562937,-0.62320885)"
+ sodipodi:insensitive="true"
+ style="display:none">
+ <path
+ id="rect2966"
+ style="fill:#3a1616;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="m 49.272443,10.836031 c 0.102978,0.351405 0.158647,0.723392 0.158647,1.108976 V 57.03476 c 0,2.168007 -1.745406,3.913456 -3.913456,3.913456 H 16.30288 c -0.385538,0 -0.75709,-0.05622 -1.108459,-0.159163 0.237938,0.812336 0.730853,1.513585 1.387112,2.01175 0.65626,0.498165 1.475864,0.793246 2.367181,0.793246 h 29.214753 c 2.16805,0 3.913456,-1.745449 3.913456,-3.913456 V 14.59084 c 0,-1.782422 -1.180022,-3.278791 -2.80448,-3.754809 z"
+ sodipodi:nodetypes="csssscsssssc" />
+ <path
+ id="rect2964"
+ style="display:inline;fill:#a44040;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="m 13.657273,5.3857002 h 29.21476 c 2.168053,0 3.913452,1.7453645 3.913452,3.9133733 V 54.388991 c 0,2.168009 -1.745399,3.913373 -3.913452,3.913373 h -29.21476 c -1.084026,0 -2.062389,-0.436341 -2.769745,-1.143683 -0.707357,-0.707342 -1.1437069,-1.685685 -1.1437069,-2.76969 V 9.2990735 c 0,-2.1680088 1.7453999,-3.9133733 3.9134519,-3.9133733 z"
+ sodipodi:nodetypes="ssssssssss" />
+ <path
+ id="rect3518"
+ style="fill:#2d3a16;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="m 10.887528,57.158681 5.291742,4.9e-5 5.29299,5.29246 h -5.291667 z"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ id="g3807"
+ transform="matrix(0.275,0,0,0.27644269,10.179141,20.324238)"
+ style="display:none;stroke-width:3.62685">
+ <path
+ d="m 76.135321,-13.223349 c -26.868437,0 -25.19164,11.6515879 -25.19164,11.6515879 l 0.03307,12.0716141 h 25.638125 v 3.621485 h -35.82789 c 0,0 -17.187994,-1.951302 -17.187994,25.161874 0,27.106562 15.005182,26.147447 15.005182,26.147447 h 8.956145 V 52.849722 c 0,0 -0.482864,-15.005182 14.767057,-15.005182 h 25.426458 c 0,0 14.287506,0.231511 14.287506,-13.807942 V 0.82271803 c 0,0 2.16958,-14.04606703 -25.906021,-14.04606703 z m -14.138672,8.1160932 c 2.549922,0 4.613672,2.0637499 4.613672,4.61367177 0,2.54992183 -2.06375,4.61367183 -4.613672,4.61367183 a 4.6070572,4.6070572 0 0 1 -4.613672,-4.61367183 c 0,-2.54992187 2.06375,-4.61367177 4.613672,-4.61367177 z"
+ fill="url(#a)"
+ id="path3577"
+ style="fill:url(#a);stroke-width:11.9951" />
+ <path
+ d="m 76.895998,92.057664 c 26.868432,0 25.191642,-11.651588 25.191642,-11.651588 l -0.0331,-12.071615 h -25.6381 v -3.621484 h 35.82458 c 0,0 17.1913,1.951302 17.1913,-25.158567 0,-27.109869 -15.00518,-26.147447 -15.00518,-26.147447 H 105.471 v 12.57763 c 0,0 0.48286,15.005182 -14.76706,15.005182 H 65.277482 c 0,0 -14.287499,-0.231511 -14.287499,13.807942 v 23.21388 c 0,0 -2.169584,14.046067 25.906015,14.046067 z m 14.138671,-8.116093 a 4.6070572,4.6070572 0 0 1 -4.613671,-4.613672 c 0,-2.546615 2.06375,-4.610365 4.613671,-4.610365 2.549922,0 4.613672,2.060443 4.613672,4.610365 0,2.553229 -2.06375,4.613672 -4.613672,4.613672 z"
+ fill="url(#b)"
+ id="path3579"
+ style="fill:url(#b);stroke-width:11.9951" />
+ </g>
+ <g
+ id="g3859"
+ style="display:none;fill:#000000;fill-opacity:1">
+ <path
+ id="path3544"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="m 52.228737,10.212822 c 0.102978,0.351405 0.158647,0.723392 0.158647,1.108976 v 45.089753 c 0,2.168007 -1.745406,3.913456 -3.913456,3.913456 H 19.259174 c -0.385538,0 -0.75709,-0.05622 -1.108459,-0.159163 0.237938,0.812336 0.730853,1.513585 1.387112,2.01175 0.65626,0.498165 1.475864,0.793246 2.367181,0.793246 h 29.214753 c 2.16805,0 3.913456,-1.745449 3.913456,-3.913456 V 13.967631 c 0,-1.782422 -1.180022,-3.278791 -2.80448,-3.754809 z"
+ sodipodi:nodetypes="csssscsssssc" />
+ <path
+ id="path3546"
+ style="display:inline;fill:#000000;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="M 16.613456,4.7624999 C 14.445408,4.7625 12.7,6.5079516 12.7,8.675956 v 45.089753 c 0,1.084003 0.436244,2.062515 1.143599,2.769857 0.707354,0.70734 1.685833,1.143599 2.769857,1.143599 h 29.214753 c 2.168049,0 3.913456,-1.745451 3.913456,-3.913456 V 8.675956 c 0,-2.1680044 -1.745407,-3.9134561 -3.913456,-3.9134561 z M 31.116446,16.66875 c 7.720775,0 7.124113,3.882967 7.124113,3.882967 v 6.417179 c 0,3.881096 -3.928959,3.817338 -3.928959,3.817338 h -6.992338 c -4.19372,0 -4.061251,4.148067 -4.061251,4.148067 v 3.477824 h -2.462898 c 0,0 -4.126363,0.264897 -4.126363,-7.2285 0,-7.495223 4.726843,-6.955647 4.726843,-6.955647 h 9.852628 v -1.000973 h -7.050215 l -0.0093,-3.337264 c 0,0 -0.461064,-3.220991 6.927742,-3.220991 z m -3.888135,2.24379 c -0.701226,0 -1.268656,0.570469 -1.268656,1.275374 a 1.2669408,1.2735872 0 0 0 1.268656,1.275375 c 0.701229,0 1.268657,-0.570467 1.268657,-1.275375 0,-0.704905 -0.567428,-1.275374 -1.268657,-1.275374 z m 14.46475,5.117 c 0.453342,-0.0018 4.079854,0.203094 4.079854,7.229016 0,7.494318 -4.727359,6.955131 -4.727359,6.955131 h -9.852112 v 1.000973 h 7.050732 l 0.0093,3.337263 c 0,0 0.461069,3.220992 -6.927742,3.220992 -7.720783,0 -7.124113,-3.882967 -7.124113,-3.882967 v -6.417179 c 0,-3.881101 3.928959,-3.817338 3.928959,-3.817338 h 6.992338 c 4.193725,0 4.060734,-4.148067 4.060734,-4.148067 v -3.47679 h 2.462898 c 0,0 0.01629,-9.15e-4 0.04651,-0.001 z M 35.21387,40.97941 c -0.701227,0 -1.269173,0.570348 -1.269173,1.27434 a 1.2669408,1.2735872 0 0 0 1.269173,1.275375 c 0.701228,0 1.268657,-0.569554 1.268657,-1.275375 0,-0.704906 -0.567429,-1.27434 -1.268657,-1.27434 z" />
+ <path
+ id="path3548"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="m 13.843822,56.535472 5.291742,4.9e-5 5.29299,5.29246 h -5.291667 z"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <path
+ id="rect3934"
+ style="display:none;fill:#00ba2b;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="M 4.7624999,62.970832 20.637499,4.7624999 h 42.333333 l -15.875,58.2083321 z"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ id="path4924"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="M 24.551 4.7625 C 22.3829 4.7625 20.1615 6.50795 19.5702 8.67596 L 7.27299 53.7657 C 6.97735 54.8497 7.14673 55.8282 7.66117 56.5356 L 11.5111 61.8277 L 11.5147 61.8277 C 11.6056 61.9525 11.7049 62.0706 11.8167 62.1776 C 12.3371 62.6758 13.0763 62.9708 13.9676 62.9708 L 43.1824 62.9708 C 45.3504 62.9708 47.5719 61.2254 48.1631 59.0574 L 60.4603 13.9676 C 60.9465 12.1852 60.1745 10.6888 58.6799 10.2128 C 58.687 10.5642 58.6413 10.9362 58.5361 11.3218 L 46.2389 56.4115 C 45.6476 58.5795 43.4262 60.325 41.2581 60.325 L 15.7098 60.325 L 13.7851 57.6792 L 39.3339 57.6792 C 41.5019 57.6792 43.7234 55.9337 44.3147 53.7657 L 56.6119 8.67596 C 57.2031 6.50795 55.9338 4.7625 53.7657 4.7625 L 24.551 4.7625 Z M 35.8068 16.6688 C 43.5276 16.6688 41.8719 20.5517 41.8719 20.5517 L 40.1218 26.9689 C 39.0633 30.85 35.1517 30.7862 35.1517 30.7862 L 28.1594 30.7862 C 23.9657 30.7862 22.9668 34.9343 22.9668 34.9343 L 22.0183 38.4121 L 19.5554 38.4121 C 19.5554 38.4121 15.3568 38.677 17.4005 31.1836 C 19.4446 23.6884 24.0243 24.228 24.0243 24.228 L 33.877 24.228 L 34.1499 23.227 L 27.0997 23.227 L 28.0006 19.8897 C 28.0006 19.8897 28.418 16.6688 35.8068 16.6688 Z M 31.3067 18.9125 C 30.6055 18.9125 29.8825 19.483 29.6902 20.1879 C 29.5975 20.5263 29.6424 20.851 29.8152 21.0902 C 29.9879 21.3295 30.2743 21.4637 30.611 21.4633 C 31.3123 21.4633 32.0353 20.8928 32.2275 20.1879 C 32.4198 19.483 32.0079 18.9125 31.3067 18.9125 Z M 44.3759 24.0295 C 44.8297 24.0277 48.4004 24.2326 46.4842 31.2586 C 44.4403 38.7529 39.86 38.2137 39.86 38.2137 L 30.0079 38.2137 L 29.7349 39.2147 L 36.7856 39.2147 L 35.8848 42.5519 C 35.8848 42.5519 35.4674 45.7729 28.0786 45.7729 C 20.3578 45.7729 22.0135 41.8899 22.0135 41.8899 L 23.7636 35.4728 C 24.8221 31.5917 28.7336 31.6554 28.7336 31.6554 L 35.726 31.6554 C 39.9197 31.6554 40.918 27.5074 40.918 27.5074 L 41.8662 24.0306 L 44.3291 24.0306 C 44.3291 24.0306 44.3457 24.0296 44.3759 24.0295 Z M 33.274 40.9794 C 32.5728 40.9794 31.8493 41.5498 31.6573 42.2538 C 31.5645 42.5922 31.6095 42.917 31.7824 43.1563 C 31.9553 43.3956 32.2418 43.5297 32.5787 43.5291 C 33.2799 43.5291 34.0026 42.9596 34.1951 42.2538 C 34.3874 41.5488 33.9753 40.9794 33.274 40.9794 Z" />
+ <path
+ style="display:none;fill:#af00ba;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;paint-order:fill markers stroke"
+ d="M 4.7624999,62.970832 20.637499,4.7624999 h 42.333333 l -15.875,58.2083321 z"
+ id="path5158"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/plugins/pynb/gresource.xml b/plugins/pynb/gresource.xml
new file mode 100644
index 0000000..71eb8ed
--- /dev/null
+++ b/plugins/pynb/gresource.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/re/chrysalide/framework/gui/panels">
+ <file compressed="true" alias="pynb-panel.ui">panel.ui</file>
+ <file compressed="true" alias="pynb-params.ui">params.ui</file>
+ <file compressed="true" alias="pynb-prefs.ui">prefs.ui</file>
+ </gresource>
+ <gresource prefix="/re/chrysalide/framework/gui/icons/scalable/actions">
+ <file compressed="true" alias="pynb-symbolic.svg">data/images/pynb-symbolic.svg</file>
+ </gresource>
+</gresources>
diff --git a/plugins/pynb/panel-int.h b/plugins/pynb/panel-int.h
new file mode 100644
index 0000000..23884c7
--- /dev/null
+++ b/plugins/pynb/panel-int.h
@@ -0,0 +1,56 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * panel-int.h - prototypes internes pour le panneau dédié à la présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#ifndef _PLUGINS_PYNB_PANEL_INT_H
+#define _PLUGINS_PYNB_PANEL_INT_H
+
+
+#include <gtkext/panel-int.h>
+
+
+#include "panel.h"
+
+
+
+/* Panneau de cartopgraphie des dispositions d'échantillons (instance) */
+struct _GtkPythonNotebookPanel
+{
+ GtkTiledPanel parent; /* A laisser en premier */
+
+};
+
+/* Panneau de cartopgraphie des dispositions d'échantillons (classe) */
+struct _GtkPythonNotebookPanelClass
+{
+ GtkTiledPanelClass parent; /* A laisser en premier */
+
+};
+
+
+/* Met en place nouvelle instance de panneau de présentation. */
+bool gtk_python_notebook_panel_create(GtkPythonNotebookPanel *);
+
+
+
+#endif /* _PLUGINS_PYNB_PANEL_INT_H */
diff --git a/plugins/pynb/panel.c b/plugins/pynb/panel.c
new file mode 100644
index 0000000..1b4b3e3
--- /dev/null
+++ b/plugins/pynb/panel.c
@@ -0,0 +1,210 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * panel.c - panneau dédié à la présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include "panel.h"
+
+
+#include <gtkext/helpers.h>
+
+
+#include "panel-int.h"
+
+
+
+/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */
+
+
+/* Initialise la classe des panneaux pour binaires. */
+static void gtk_python_notebook_panel_class_init(GtkPythonNotebookPanelClass *);
+
+/* Initialise une instance de panneau pour binaire. */
+static void gtk_python_notebook_panel_init(GtkPythonNotebookPanel *);
+
+/* Supprime toutes les références externes. */
+static void gtk_python_notebook_panel_dispose(GObject *);
+
+/* Procède à la libération totale de la mémoire. */
+static void gtk_python_notebook_panel_finalize(GObject *);
+
+
+
+/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */
+
+
+/* Fournit les composants adaptés pour la barre de titre. */
+//static GListStore *gtk_python_notebook_panel_get_title_widgets(GtkTiledPanel *, bool);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* COEUR D'UN PANNEAU D'AFFICHAGE */
+/* ---------------------------------------------------------------------------------- */
+
+
+/* Indique le type défini pour un panneau d'accueil. */
+G_DEFINE_TYPE(GtkPythonNotebookPanel, gtk_python_notebook_panel, GTK_TYPE_TILED_PANEL);
+
+
+/******************************************************************************
+* *
+* Paramètres : class = classe à initialiser. *
+* *
+* Description : Initialise la classe des panneaux pour binaires. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_panel_class_init(GtkPythonNotebookPanelClass *class)
+{
+ GObjectClass *object; /* Autre version de la classe */
+ GtkWidgetClass *widget; /* Classe de haut niveau */
+ GtkTiledPanelClass *panel; /* Version parente de classe */
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = gtk_python_notebook_panel_dispose;
+ object->finalize = gtk_python_notebook_panel_finalize;
+
+ widget = GTK_WIDGET_CLASS(class);
+
+ gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/panels/pynb-panel.ui");
+
+ //gtk_widget_class_bind_template_child(widget, GtkPythonNotebookPanel, summary);
+
+ panel = GTK_TILED_PANEL_CLASS(class);
+
+ //panel->get_widgets = (get_tiled_panel_widgets_cb)gtk_python_notebook_panel_get_title_widgets;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = instance à initialiser. *
+* *
+* Description : Initialise une instance de panneau pour binaire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_panel_init(GtkPythonNotebookPanel *panel)
+{
+ gtk_widget_init_template(GTK_WIDGET(panel));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_panel_dispose(GObject *object)
+{
+ gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_PYTHON_NOTEBOOK_PANEL);
+
+ G_OBJECT_CLASS(gtk_python_notebook_panel_parent_class)->dispose(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_panel_finalize(GObject *object)
+{
+ G_OBJECT_CLASS(gtk_python_notebook_panel_parent_class)->finalize(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Crée une nouvelle instance de panneau de présentation. *
+* *
+* Retour : Composant GTK mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GtkTiledPanel *gtk_python_notebook_panel_new(void)
+{
+ GtkTiledPanel *result; /* Instance à retourner */
+
+ result = g_object_new(GTK_TYPE_PYTHON_NOTEBOOK_PANEL, NULL);
+
+ if (!gtk_python_notebook_panel_create(GTK_PYTHON_NOTEBOOK_PANEL(result)))
+ g_clear_object(&result);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = panneau de recherche et récupération à remplir. *
+* *
+* Description : Met en place nouvelle instance de panneau de présentation. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool gtk_python_notebook_panel_create(GtkPythonNotebookPanel *panel)
+{
+ bool result; /* Bilan à retourner */
+
+ result = true;
+
+ return result;
+
+}
diff --git a/plugins/pynb/panel.h b/plugins/pynb/panel.h
new file mode 100644
index 0000000..f9f8016
--- /dev/null
+++ b/plugins/pynb/panel.h
@@ -0,0 +1,47 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * panel.h - prototypes pour le panneau dédié à la présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#ifndef _PLUGINS_PYNB_PANEL_H
+#define _PLUGINS_PYNB_PANEL_H
+
+
+#include <gtk/gtk.h>
+
+
+#include <glibext/helpers.h>
+#include <gtkext/panel.h>
+
+
+
+#define GTK_TYPE_PYTHON_NOTEBOOK_PANEL (gtk_python_notebook_panel_get_type())
+
+DECLARE_GTYPE(GtkPythonNotebookPanel, gtk_python_notebook_panel, GTK, PYTHON_NOTEBOOK_PANEL);
+
+
+/* Crée une nouvelle instance de panneau de présentation. */
+GtkTiledPanel *gtk_python_notebook_panel_new(void);
+
+
+
+#endif /* _PLUGINS_PYNB_PANEL_H */
diff --git a/plugins/pynb/panel.ui b/plugins/pynb/panel.ui
new file mode 100644
index 0000000..d16af80
--- /dev/null
+++ b/plugins/pynb/panel.ui
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+
+ <template class="GtkPythonNotebookPanel" parent="GtkTiledPanel">
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="hscrollbar-policy">automatic</property>
+ <property name="vscrollbar-policy">automatic</property>
+ <property name="hexpand">true</property>
+ <property name="vexpand">true</property>
+ <property name="has-frame">true</property>
+ <property name="margin-start">8</property>
+ <property name="margin-top">8</property>
+ <property name="margin-end">8</property>
+ <property name="margin-bottom">8</property>
+
+ </object>
+ </child>
+ </template>
+
+</interface>
diff --git a/plugins/pynb/params-int.h b/plugins/pynb/params-int.h
new file mode 100644
index 0000000..7f3bc8b
--- /dev/null
+++ b/plugins/pynb/params-int.h
@@ -0,0 +1,50 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * params-int.h - définitions internes pour l'édition des paramètres initiaux d'une présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _PLUGINS_PYNB_PARAMS_INT_H
+#define _PLUGINS_PYNB_PARAMS_INT_H
+
+
+#include "params.h"
+
+
+
+/* Composant pour les paramètres de chargement d'un binaire (instance) */
+struct _GtkPythonNotebookParameters
+{
+ GtkGrid parent; /* A laisser en premier */
+
+ //GtkEntry *filename; /* CHemin d'un binaire */
+
+};
+
+/* Composant pour les paramètres de chargement d'un binaire (classe) */
+struct _GtkPythonNotebookParametersClass
+{
+ GtkGridClass parent; /* A laisser en premier */
+
+};
+
+
+
+#endif /* _PLUGINS_PYNB_PARAMS_INT_H */
diff --git a/plugins/pynb/params.c b/plugins/pynb/params.c
new file mode 100644
index 0000000..3a6bf70
--- /dev/null
+++ b/plugins/pynb/params.c
@@ -0,0 +1,171 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * params.c - édition des paramètres initiaux d'une présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "params.h"
+
+
+#include "panel.h"
+#include "params-int.h"
+#include <gtkext/helpers.h>
+#include <gui/window.h>
+
+
+
+/* Initialise la classe des composants d'édition de paramètres. */
+static void gtk_python_notebook_parameters_class_init(GtkPythonNotebookParametersClass *);
+
+/* Initialise une instance de composant d'édition de paramètres. */
+static void gtk_python_notebook_parameters_init(GtkPythonNotebookParameters *);
+
+/* Supprime toutes les références externes. */
+static void gtk_python_notebook_parameters_dispose(GObject *);
+
+/* Procède à la libération totale de la mémoire. */
+static void gtk_python_notebook_parameters_finalize(GObject *);
+
+/* Réagit à une demande de création de notes. */
+static void gtk_python_notebook_parameters_on_create_clicked(GtkButton *, GtkPythonNotebookParameters *);
+
+
+
+/* Détermine le type du composant d'édition des paramètres de chargement. */
+G_DEFINE_TYPE(GtkPythonNotebookParameters, gtk_python_notebook_parameters, GTK_TYPE_GRID);
+
+
+/******************************************************************************
+* *
+* Paramètres : class = classe GTK à initialiser. *
+* *
+* Description : Initialise la classe des composants d'édition de paramètres. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_parameters_class_init(GtkPythonNotebookParametersClass *class)
+{
+ GObjectClass *object; /* Plus haut niveau équivalent */
+ GtkWidgetClass *widget; /* Classe de haut niveau */
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = gtk_python_notebook_parameters_dispose;
+ object->finalize = gtk_python_notebook_parameters_finalize;
+
+ widget = GTK_WIDGET_CLASS(class);
+
+ gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/panels/pynb-params.ui");
+
+ gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_python_notebook_parameters_on_create_clicked));
+
+ //gtk_widget_class_bind_template_child(widget, GtkPythonNotebookParameters, filename);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : params = composant GTK à initialiser. *
+* *
+* Description : Initialise une instance de composant d'édition de paramètres.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_parameters_init(GtkPythonNotebookParameters *params)
+{
+ gtk_widget_init_template(GTK_WIDGET(params));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_parameters_dispose(GObject *object)
+{
+ gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_PYTHON_NOTEBOOK_PARAMETERS);
+
+ G_OBJECT_CLASS(gtk_python_notebook_parameters_parent_class)->dispose(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_parameters_finalize(GObject *object)
+{
+ G_OBJECT_CLASS(gtk_python_notebook_parameters_parent_class)->finalize(object);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : button = bouton GTK concerné par l'appel. *
+* params = paramètres du panneau à mettre en place. *
+* *
+* Description : Réagit à une demande de création de notes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_python_notebook_parameters_on_create_clicked(GtkButton *button, GtkPythonNotebookParameters *params)
+{
+ GtkRoot *root; /* Racine du composant */
+ GtkTiledPanel *tiled; /* Panneau d'affichage complet */
+
+ root = gtk_widget_get_root(GTK_WIDGET(button));
+
+ tiled = gtk_python_notebook_panel_new();
+
+ gtk_framework_window_add(GTK_FRAMEWORK_WINDOW(root), tiled);
+
+}
diff --git a/plugins/pynb/params.h b/plugins/pynb/params.h
new file mode 100644
index 0000000..2d4b39b
--- /dev/null
+++ b/plugins/pynb/params.h
@@ -0,0 +1,41 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * params.h - prototypes pour l'édition des paramètres initiaux d'une présentation de notes
+ *
+ * Copyright (C) 2025 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _PLUGINS_PYNB_PARAMS_H
+#define _PLUGINS_PYNB_PARAMS_H
+
+
+#include <gtk/gtk.h>
+
+
+#include <glibext/helpers.h>
+
+
+
+#define GTK_TYPE_PYTHON_NOTEBOOK_PARAMETERS (gtk_python_notebook_parameters_get_type())
+
+DECLARE_GTYPE(GtkPythonNotebookParameters, gtk_python_notebook_parameters, GTK, PYTHON_NOTEBOOK_PARAMETERS);
+
+
+
+#endif /* _PLUGINS_PYNB_PARAMS_H */
diff --git a/plugins/pynb/params.ui b/plugins/pynb/params.ui
new file mode 100644
index 0000000..21a4788
--- /dev/null
+++ b/plugins/pynb/params.ui
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+
+ <template class="GtkPythonNotebookParameters" parent="GtkGrid">
+ <property name="margin-bottom">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">12</property>
+ <property name="column-spacing">12</property>
+ <property name="row-spacing">8</property>
+
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Load and analyze a new notebook file:</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkEntry" id="filename">
+ <property name="secondary-icon-name">document-open-symbolic</property>
+ <property name="placeholder-text">File location</property>
+ <property name="hexpand">TRUE</property>
+ <property name="hexpand-set">TRUE</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ <style>
+ <class name="background"/>
+ </style>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkButton" id="create">
+ <property name="label">Create</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ <signal name="clicked" handler="gtk_python_notebook_parameters_on_create_clicked"/>
+ </object>
+ </child>
+
+ </template>
+
+</interface>
diff --git a/plugins/pynb/prefs.ui b/plugins/pynb/prefs.ui
new file mode 100644
index 0000000..a6e44be
--- /dev/null
+++ b/plugins/pynb/prefs.ui
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+
+ <template class="GtkPythonNotebookTweakPanel" parent="GtkBox">
+
+ <property name="orientation">vertical</property>
+
+ <!-- Conservation de paramètres sécurisée -->
+ <child>
+ <object class="GtkGrid">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="row-spacing">10</property>
+ <property name="column-spacing">10</property>
+
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Secret storage</property>
+ <property name="use-markup">true</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">2</property>
+ </layout>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+
+ </object>
+ </child>
+
+ </template>
+</interface>