diff options
Diffstat (limited to 'src/gui/panels')
| -rw-r--r-- | src/gui/panels/Makefile.am | 33 | ||||
| -rw-r--r-- | src/gui/panels/binary-int.h | 75 | ||||
| -rw-r--r-- | src/gui/panels/binary-launch.ui | 64 | ||||
| -rw-r--r-- | src/gui/panels/binary-props.ui | 39 | ||||
| -rw-r--r-- | src/gui/panels/binary.c | 513 | ||||
| -rw-r--r-- | src/gui/panels/binary.h | 64 | ||||
| -rw-r--r-- | src/gui/panels/binary.ui | 16 | ||||
| -rw-r--r-- | src/gui/panels/gresource.xml | 24 | ||||
| -rw-r--r-- | src/gui/panels/welcome-hints.txt | 23 | ||||
| -rw-r--r-- | src/gui/panels/welcome-int.h | 89 | ||||
| -rw-r--r-- | src/gui/panels/welcome.c | 817 | ||||
| -rw-r--r-- | src/gui/panels/welcome.h | 38 | ||||
| -rw-r--r-- | src/gui/panels/welcome.ui | 448 | 
13 files changed, 1397 insertions, 846 deletions
| diff --git a/src/gui/panels/Makefile.am b/src/gui/panels/Makefile.am index 83e173b..476a436 100644 --- a/src/gui/panels/Makefile.am +++ b/src/gui/panels/Makefile.am @@ -3,7 +3,7 @@ DEFAULT_INCLUDES = -idirafter. -I$(top_builddir)  BUILT_SOURCES = resources.h resources.c -noinst_LTLIBRARIES  = libguipanels.la +noinst_LTLIBRARIES  = libguipanels4.la # libguipanels.la  UI_FILES =								\  	bintree.ui							\ @@ -14,8 +14,7 @@ UI_FILES =								\  	log.ui								\  	regedit.ui							\  	strings.ui							\ -	symbols.ui							\ -	welcome.ui +	symbols.ui  libguipanels_la_SOURCES =				\  	bintree.h bintree.c					\ @@ -30,18 +29,38 @@ libguipanels_la_SOURCES =				\  	symbols.h symbols.c					\  	updating-int.h						\  	updating.h updating.c				\ -	view.h view.c						\ -	welcome.h welcome.c +	view.h view.c  libguipanels_la_CFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) +IMG_PATH = ../../../data/images + +RES_FILES =									\ +	binary.ui								\ +	binary-launch.ui						\ +	binary-props.ui							\ +	$(IMG_PATH)/binfile-symbolic.svg		\ +	welcome.ui								\ +	welcome-hints.txt						\ +	$(IMG_PATH)/tipoftheday-symbolic.svg + +libguipanels4_la_SOURCES =					\ +	binary-int.h							\ +	binary.h binary.c						\ +	resources.h resources.c					\ +	welcome-int.h						 	\ +	welcome.h welcome.c + +libguipanels4_la_CFLAGS = $(LIBGTK4_CFLAGS) + +  devdir = $(includedir)/chrysalide/$(subdir:src/%=core/%)  dev_HEADERS = $(libguipanels_la_SOURCES:%c=) -resources.c: gresource.xml $(UI_FILES) +resources.c: gresource.xml $(RES_FILES)  	glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name gui_panels gresource.xml  resources.h: gresource.xml @@ -50,4 +69,4 @@ resources.h: gresource.xml  CLEANFILES = resources.h resources.c -EXTRA_DIST = gresource.xml $(UI_FILES) +EXTRA_DIST = gresource.xml $(RES_FILES) diff --git a/src/gui/panels/binary-int.h b/src/gui/panels/binary-int.h new file mode 100644 index 0000000..9b3f596 --- /dev/null +++ b/src/gui/panels/binary-int.h @@ -0,0 +1,75 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * binary-int.h - prototypes internes pour le panneau d'affichage de contenus d'un binaire, bruts ou non + * + * Copyright (C) 2024 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 _GUI_PANELS_BINARY_INT_H +#define _GUI_PANELS_BINARY_INT_H + + +#include "binary.h" +#include "../panel-int.h" +#include "../../gtkext/panel-int.h" + + + +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ + + +/* Panneau d'accueil par défaut (instance) */ +struct _GtkBinaryPanel +{ +    GtkTiledPanel parent;                   /* A laisser en premier        */ + +    GtkScrolledWindow *hex_scroll;          /* Défilement pour contenu #0  */ + +}; + +/* Panneau d'accueil par défaut (classe) */ +struct _GtkBinaryPanelClass +{ +    GtkTiledPanelClass parent;              /* A laisser en premier        */ + +}; + + + +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ + + +/* Définition pour gestion part le framework d'un panneau graphique (instance) */ +struct _GBinaryPanel +{ +    GPanelItem parent;                      /* A laisser en premier        */ + +}; + +/* Définition pour gestion part le framework d'un panneau graphique (classe) */ +struct _GBinaryPanelClass +{ +    GPanelItemClass parent;                 /* A laisser en premier        */ + +}; + + + +#endif  /* _GUI_PANELS_BINARY_INT_H */ diff --git a/src/gui/panels/binary-launch.ui b/src/gui/panels/binary-launch.ui new file mode 100644 index 0000000..c4ed3f7 --- /dev/null +++ b/src/gui/panels/binary-launch.ui @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + +    <object class="GtkGrid" id="launcher"> +        <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> +        <child> +            <object class="GtkImage"> +                <property name="icon-name">binfile-symbolic</property> +                <property name="pixel-size">48</property> +                <layout> +                    <property name="column">0</property> +                    <property name="row">0</property> +                    <property name="row-span">2</property> +                </layout> +                <style> +                    <class name="icon-dropshadow"/> +                </style> +            </object> +        </child> +        <child> +            <object class="GtkLabel"> +                <property name="label"><b>Binary analysis</b></property> +                <property name="use-markup">TRUE</property> +                <property name="xalign">0</property> +                <layout> +                    <property name="column">1</property> +                    <property name="row">0</property> +                </layout> +            </object> +        </child> +        <child> +            <object class="GtkLabel"> +                <property name="label">Load a binary content and parse its format if recognized</property> +                <property name="xalign">0</property> +                <layout> +                    <property name="column">1</property> +                    <property name="row">1</property> +                </layout> +                <style> +                    <class name="dim-label"/> +                </style> +            </object> +        </child> +        <child> +            <object class="GtkImage"> +                <property name="icon-name">go-next-symbolic</property> +                <property name="margin-start">12</property> +                <layout> +                    <property name="column">2</property> +                    <property name="row">0</property> +                    <property name="row-span">2</property> +                </layout> +                <style> +                    <class name="icon-dropshadow"/> +                </style> +            </object> +        </child> +    </object> + +</interface> diff --git a/src/gui/panels/binary-props.ui b/src/gui/panels/binary-props.ui new file mode 100644 index 0000000..bd48ea8 --- /dev/null +++ b/src/gui/panels/binary-props.ui @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + +    <object class="GtkGrid" id="properties"> +        <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 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="new_file"> +                <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> +                <signal name="icon-release" handler="g_binary_panel_on_new_file_entry_icon_release"/> +            </object> +        </child> +    </object> + +</interface> diff --git a/src/gui/panels/binary.c b/src/gui/panels/binary.c new file mode 100644 index 0000000..88b19d2 --- /dev/null +++ b/src/gui/panels/binary.c @@ -0,0 +1,513 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * welcome.c - panneau d'affichage de contenus d'un binaire, bruts ou non + * + * Copyright (C) 2024 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 "binary.h" + + +#include "binary-int.h" +#include "../../analysis/contents/file.h" +#include "../../gtkext/helpers.h" +#include "../../gtkext/hexview.h" + + + +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ + + +/* Initialise la classe des panneaux d'accueil par défaut. */ +static void gtk_binary_panel_class_init(GtkBinaryPanelClass *); + +/* Initialise une instance de panneau d'accueil par défaut. */ +static void gtk_binary_panel_init(GtkBinaryPanel *); + +/* Supprime toutes les références externes. */ +static void gtk_binary_panel_dispose(GtkBinaryPanel *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_binary_panel_finalize(GtkBinaryPanel *); + + + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + + + + + + +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ + + +/* Initialise la classe des panneaux graphiques pour binaires. */ +static void g_binary_panel_class_init(GBinaryPanelClass *); + +/* Initialise une instance de panneau graphique pour binaire. */ +static void g_binary_panel_init(GBinaryPanel *); + +/* Supprime toutes les références externes. */ +static void g_binary_panel_dispose(GBinaryPanel *); + +/* Procède à la libération totale de la mémoire. */ +static void g_binary_panel_finalize(GBinaryPanel *); + + + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + + +/* Fournit une indication sur la personnalité du panneau. */ +static PanelItemPersonality g_binary_panel_get_personality(const GBinaryPanel *); + +/* Fournit un composant pour lancer l'activité d'un panneau. */ +static GtkWidget *g_binary_panel_get_launcher(GBinaryPanel *); + +/* Fournit un composant pour paramétrer l'activité d'un panneau. */ +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); + +/* Fournit un composant représentant un panneau graphique. */ +static GtkTiledPanel *g_binary_panel_get_panel(GBinaryPanel *, GtkWidget *); + + + +/* ---------------------------------------------------------------------------------- */ +/*                           COEUR D'UN PANNEAU D'AFFICHAGE                           */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour un panneau d'accueil. */ +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.      * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_binary_panel_class_init(GtkBinaryPanelClass *class) +{ +    GObjectClass *object;                   /* Autre version de la classe  */ +    GtkWidgetClass *widget;                 /* Classe de haut niveau       */ + +    object = G_OBJECT_CLASS(class); + +    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_binary_panel_dispose; +    object->finalize = (GObjectFinalizeFunc)gtk_binary_panel_finalize; + +    widget = GTK_WIDGET_CLASS(class); + +    gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/panels/binary.ui"); + +    gtk_widget_class_bind_template_child(widget, GtkBinaryPanel, hex_scroll); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance à initialiser.                              * +*                                                                             * +*  Description : Initialise une instance de panneau d'accueil par défaut.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_binary_panel_init(GtkBinaryPanel *panel) +{ +    gtk_widget_init_template(GTK_WIDGET(panel)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_binary_panel_dispose(GtkBinaryPanel *panel) +{ +    gtk_widget_dispose_template(GTK_WIDGET(panel), GTK_TYPE_BINARY_PANEL); + +    G_OBJECT_CLASS(gtk_binary_panel_parent_class)->dispose(G_OBJECT(panel)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     * +*                                                                             * +*  Description : Procède à la libération totale de la mémoire.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_binary_panel_finalize(GtkBinaryPanel *panel) +{ +    G_OBJECT_CLASS(gtk_binary_panel_parent_class)->finalize(G_OBJECT(panel)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : content = contenu brut à exposer.                            * +*                                                                             * +*  Description : Crée une nouvelle instance de panneau d'accueil.             * +*                                                                             * +*  Retour      : Composant GTK mis en place.                                  * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GtkTiledPanel *gtk_binary_panel_new_for_content(GBinContent *content) +{ +    GtkTiledPanel *result;                  /* Instance à retourner        */ +    GtkHexView *view;                       /* Composant d'affichage       */ + +    result = g_object_new(GTK_TYPE_BINARY_PANEL, NULL); + +    view = gtk_hex_view_new(content); +    gtk_scrolled_window_set_child(GTK_BINARY_PANEL(result)->hex_scroll, GTK_WIDGET(view)); + +    return result; + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ +/* ---------------------------------------------------------------------------------- */ + + + + + + + + + +/* ---------------------------------------------------------------------------------- */ +/*                        MANIPULATIONS D'UN PANNEAU GRAPHIQUE                        */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour une manipulation de panneau pour binaires. */ +G_DEFINE_TYPE(GBinaryPanel, g_binary_panel, G_TYPE_PANEL_ITEM); + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : class = classe à initialiser.                                * +*                                                                             * +*  Description : Initialise la classe des panneaux graphiques pour binaires.  * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_binary_panel_class_init(GBinaryPanelClass *class) +{ +    GObjectClass *object;                   /* Autre version de la classe  */ +    GPanelItemClass *panel;                 /* Encore une autre vision...  */ + +    object = G_OBJECT_CLASS(class); + +    object->dispose = (GObjectFinalizeFunc/* ! */)g_binary_panel_dispose; +    object->finalize = (GObjectFinalizeFunc)g_binary_panel_finalize; + +    panel = G_PANEL_ITEM_CLASS(class); + +    panel->get_personality = (get_panel_item_personality_cb)g_binary_panel_get_personality; +    panel->get_launcher = (get_panel_item_widget_cb)g_binary_panel_get_launcher; +    panel->get_properties = (get_panel_item_widget_cb)g_binary_panel_get_properties; +    panel->get_panel = (get_panel_item_panel_cb)g_binary_panel_get_panel; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance à initialiser.                              * +*                                                                             * +*  Description : Initialise une instance de panneau graphique pour binaire.   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_binary_panel_init(GBinaryPanel *panel) +{ + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_binary_panel_dispose(GBinaryPanel *panel) +{ +    G_OBJECT_CLASS(g_binary_panel_parent_class)->dispose(G_OBJECT(panel)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     * +*                                                                             * +*  Description : Procède à la libération totale de la mémoire.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_binary_panel_finalize(GBinaryPanel *panel) +{ +    G_OBJECT_CLASS(g_binary_panel_parent_class)->finalize(G_OBJECT(panel)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Constitue une définition de manipulation de panneau.         * +*                                                                             * +*  Retour      : Définition de propriétés mise en place.                      * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GPanelItem *g_binary_panel_new(void) +{ +    GPanelItem *result;                     /* Structure à retourner       */ + +    result = g_object_new(G_TYPE_BINARY_PANEL, NULL); + +    return result; + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = définition de panneau à consulter.                   * +*                                                                             * +*  Description : Fournit une indication sur la personnalité du panneau.       * +*                                                                             * +*  Retour      : Identifiant lié à la nature du panneau.                      * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static PanelItemPersonality g_binary_panel_get_personality(const GBinaryPanel *panel) +{ +    PanelItemPersonality result;            /* Personnalité à retourner    */ + +    result = PIP_MAIN_PANEL; + +    return result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = définition de panneau à manipuler.                   * +*                                                                             * +*  Description : Fournit un composant pour lancer l'activité d'un panneau.    * +*                                                                             * +*  Retour      : Composant GTK (déjà ?) mis en place.                         * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static GtkWidget *g_binary_panel_get_launcher(GBinaryPanel *panel) +{ +    GtkWidget *result;                      /* Composant à retourner       */ +    GtkBuilder *builder;                    /* Constructeur d'UI           */ + +    builder = gtk_builder_new_from_resource("/re/chrysalide/framework/gui/panels/binary-launch.ui"); + +    result = GTK_WIDGET(gtk_builder_get_object(builder, "launcher")); +    ref_object(result); + +    unref_object(builder); + +    return result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = définition de panneau à manipuler.                   * +*                                                                             * +*  Description : Fournit un composant pour paramétrer l'activité d'un panneau.* +*                                                                             * +*  Retour      : Composant GTK (déjà ?) mis en place.                         * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static GtkWidget *g_binary_panel_get_properties(GBinaryPanel *panel) +{ +    GtkWidget *result;                      /* Composant à retourner       */ +    GtkBuilderScope *scope;                 /* Fonctions pour signaux      */ +    GtkBuilderCScope *cscope;               /* Fonctions pour signaux      */ +    GtkBuilder *builder;                    /* Constructeur d'UI           */ +#ifndef NDEBUG +    gboolean status;                        /* Bilan d'un chargement       */ +#endif + +    scope = gtk_builder_cscope_new(); +    cscope = GTK_BUILDER_CSCOPE(scope); + +    gtk_builder_cscope_add_callback_symbol(cscope, BUILDER_CB(g_binary_panel_on_new_file_entry_icon_release)); + +    builder = gtk_builder_new(); +    gtk_builder_set_scope(builder, scope); + +#ifndef NDEBUG +    status = gtk_builder_add_from_resource(builder, "/re/chrysalide/framework/gui/panels/binary-props.ui", NULL); +    assert(status); +#else +    gtk_builder_add_from_resource(builder, "/re/chrysalide/framework/gui/panels/binary-props.ui", NULL); +#endif + +    result = GTK_WIDGET(gtk_builder_get_object(builder, "properties")); +    ref_object(result); + +    unref_object(builder); +    unref_object(scope); + +    return result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : entry = +*                icon_pos = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx +*                panel = définition de panneau à manipuler.                   * +*                                                                             * +*  Description : Ouvre une boîte de dialogue pour récupérer un fichier.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_binary_panel_on_new_file_entry_icon_release(GtkEntry *entry, GtkEntryIconPosition icon_pos, gpointer user_data) +{ + + +    printf("open...\n"); + + + + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = définition de panneau à manipuler.                   * +*                props = éventuels éléments graphiques de paramétrages.       * +*                                                                             * +*  Description : Fournit un composant représentant un panneau graphique.      * +*                                                                             * +*  Retour      : Composant GTK (déjà ?) mis en place.                         * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static GtkTiledPanel *g_binary_panel_get_panel(GBinaryPanel *panel, GtkWidget *props) +{ +    GtkTiledPanel *result;                  /* Composant à retourner       */ +    GBinContent *content;                   /* Contenu binaire à afficher  */ + +    content = g_file_content_new("/bin/id"); + +    result = gtk_binary_panel_new_for_content(content); + +    unref_object(content); + +    return result; + +} diff --git a/src/gui/panels/binary.h b/src/gui/panels/binary.h new file mode 100644 index 0000000..bcf8707 --- /dev/null +++ b/src/gui/panels/binary.h @@ -0,0 +1,64 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * binary.h - prototypes pour le panneau d'accueil par défaut + * + * Copyright (C) 2012-2024 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 _GUI_PANELS_BINARY_H +#define _GUI_PANELS_BINARY_H + + +#include <gtk/gtk.h> + + +#include "../panel.h" +#include "../../glibext/helpers.h" +#include "../../gtkext/panel.h" + + + +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ + + +#define GTK_TYPE_BINARY_PANEL (gtk_binary_panel_get_type()) + +DECLARE_GTYPE(GtkBinaryPanel, gtk_binary_panel, GTK, BINARY_PANEL); + + +/* Crée une nouvelle instance de panneau d'accueil. */ +GtkTiledPanel *gtk_binary_panel_new(void); + + + +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ + + +#define G_TYPE_BINARY_PANEL (g_binary_panel_get_type()) + +DECLARE_GTYPE(GBinaryPanel, g_binary_panel, G, BINARY_PANEL); + + +/* Constitue une définition de manipulation de panneau. */ +GPanelItem *g_binary_panel_new(void); + + + +#endif  /* _GUI_PANELS_WELCOME_H */ diff --git a/src/gui/panels/binary.ui b/src/gui/panels/binary.ui new file mode 100644 index 0000000..a34c409 --- /dev/null +++ b/src/gui/panels/binary.ui @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + +    <template class="GtkBinaryPanel" parent="GtkTiledPanel"> +        <child> +            <object class="GtkScrolledWindow" id="hex_scroll"> +                <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">0</property> +            </object> +        </child> +    </template> + +</interface> diff --git a/src/gui/panels/gresource.xml b/src/gui/panels/gresource.xml index d996ef1..d00953d 100644 --- a/src/gui/panels/gresource.xml +++ b/src/gui/panels/gresource.xml @@ -1,20 +1,14 @@  <?xml version="1.0" encoding="UTF-8"?>  <gresources> -    <gresource prefix="/org/chrysalide/gui/panels"> -        <file compressed="true">../../../pixmaps/tbutton_list_view.png</file> -        <file compressed="true">../../../pixmaps/tbutton_tree_view.png</file> -        <file compressed="true">../../../pixmaps/tbutton_collapse.png</file> -        <file compressed="true">../../../pixmaps/tbutton_expand.png</file> -        <file compressed="true">../../../pixmaps/symbol_class_classic.png</file> -        <file compressed="true">bintree.ui</file> -        <file compressed="true">bookmarks.ui</file> -        <file compressed="true">errors.ui</file> -        <file compressed="true">glance.ui</file> -        <file compressed="true">history.ui</file> -        <file compressed="true">log.ui</file> -        <file compressed="true">regedit.ui</file> -        <file compressed="true">strings.ui</file> -        <file compressed="true">symbols.ui</file> +    <gresource prefix="/re/chrysalide/framework/gui/panels"> +        <file compressed="true">binary.ui</file> +        <file compressed="true">binary-launch.ui</file> +        <file compressed="true">binary-props.ui</file>          <file compressed="true">welcome.ui</file> +        <file compressed="true">welcome-hints.txt</file> +    </gresource> +    <gresource prefix="/re/chrysalide/framework/gui/icons/scalable/actions"> +        <file compressed="true" alias="binfile-symbolic.svg">../../../data/images/binfile-symbolic.svg</file> +        <file compressed="true" alias="tipoftheday-symbolic.svg">../../../data/images/tipoftheday-symbolic.svg</file>      </gresource>  </gresources> diff --git a/src/gui/panels/welcome-hints.txt b/src/gui/panels/welcome-hints.txt new file mode 100644 index 0000000..a35ea64 --- /dev/null +++ b/src/gui/panels/welcome-hints.txt @@ -0,0 +1,23 @@ +Chrysalide's GUI offers launchers at startup in order to run main activities quickly. + +Once an activity is selected, options get displayed and allow some tunning before starting new processes. + +Such options are usually saved between runs. + + +There is no need to install Chrysalide on your system if you only want to give it a try. + +Just compile the source code and run the program from there. + + +Chrysalide can be used in external Python scripts by setting PYTHONPATH to the directory containing the 'pychrysalide.so' file. For instance: + +  cd plugins/pychrysa/.libs/ +  export PYTHONPATH=$PWD + +Then run the interpreter suitable to your configuration (debug or release): + +  python3-dbg -c 'import pychrysalide ; print(pychrysalide.mod_version())' + + +All the configuration files for Chrysalide are located in $HOME/.config/chrysalide/.
\ No newline at end of file diff --git a/src/gui/panels/welcome-int.h b/src/gui/panels/welcome-int.h new file mode 100644 index 0000000..34bf922 --- /dev/null +++ b/src/gui/panels/welcome-int.h @@ -0,0 +1,89 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * welcome-int.h - prototypes internes pour le panneau d'accueil par défaut + * + * Copyright (C) 2024 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 _GUI_PANELS_WELCOME_INT_H +#define _GUI_PANELS_WELCOME_INT_H + + +#include "welcome.h" +#include "../panel-int.h" +#include "../../gtkext/panel-int.h" + + + +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ + + +/* Panneau d'accueil par défaut (instance) */ +struct _GtkWelcomePanel +{ +    GtkTiledPanel parent;                   /* A laisser en premier        */ + +    GListStore *store;                      /* Données brutes              */ +    GtkListBox *list;                       /* Liste de lanceurs           */ +    GtkStack *properties;                   /* Premières propriétés        */ + +    GtkWidget *def_child;                   /* Contenu par défaut          */ +    GtkLabel *hints;                        /* Affichage d'astuces du jour */ +    GtkWidget *other_child;                 /* Autre contenu, alternatif   */ + +    gchar **raw_hints;                      /* Liste d'astuces             */ +    guint raw_count;                        /* Taille de cette liste       */ +    guint cur_hint;                         /* Position dans le parcours   */ + +}; + +/* Panneau d'accueil par défaut (classe) */ +struct _GtkWelcomePanelClass +{ +    GtkTiledPanelClass parent;              /* A laisser en premier        */ + +}; + + +/* Met en place un nouveau panneau d'accueil. */ +bool gtk_welcome_panel_create(GtkWelcomePanel *); + + + +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ + + +/* Définition pour gestion part le framework d'un panneau graphique (instance) */ +struct _GWelcomePanel +{ +    GPanelItem parent;                      /* A laisser en premier        */ + +}; + +/* Définition pour gestion part le framework d'un panneau graphique (classe) */ +struct _GWelcomePanelClass +{ +    GPanelItemClass parent;                 /* A laisser en premier        */ + +}; + + + +#endif  /* _GUI_PANELS_WELCOME_INT_H */ diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c index 60593d1..d10b16a 100644 --- a/src/gui/panels/welcome.c +++ b/src/gui/panels/welcome.c @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * welcome.c - panneau d'accueil par défaut   * - * Copyright (C) 2012-2019 Cyrille Bagard + * Copyright (C) 2012-2024 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -26,130 +26,98 @@  #include <assert.h> -#include <malloc.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h>  #include <i18n.h> -#include "../panel-int.h" -#include "../core/global.h" -#include "../../common/cpp.h" -#include "../../common/io.h" -#include "../../common/net.h" +#include "welcome-int.h" +#include "../core/panels.h"  #include "../../common/shuffle.h" -#include "../../core/global.h" -#include "../../core/params.h" -#include "../../core/paths.h" -#include "../../gtkext/easygtk.h" -#include "../../gtkext/named.h" +#include "../../gtkext/helpers.h" -/* Panneau d'accueil par défaut (instance) */ -struct _GWelcomePanel -{ -    GPanelItem parent;                      /* A laisser en premier        */ +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ -    cairo_surface_t *background;            /* Fond pour astuces           */ -    char **tips;                            /* Liste de toutes les astuces */ -    size_t count;                           /* Quantité d'astuces          */ -    size_t current;                         /* Indice de l'astuce courante */ +/* Initialise la classe des panneaux d'accueil par défaut. */ +static void gtk_welcome_panel_class_init(GtkWelcomePanelClass *); -    bool uorigin;                           /* Origine de l'affichage      */ +/* Initialise une instance de panneau d'accueil par défaut. */ +static void gtk_welcome_panel_init(GtkWelcomePanel *); -    gulong sig_id;                          /* Connexion par signal        */ +/* Supprime toutes les références externes. */ +static void gtk_welcome_panel_dispose(GtkWelcomePanel *); -}; +/* Procède à la libération totale de la mémoire. */ +static void gtk_welcome_panel_finalize(GtkWelcomePanel *); -/* Panneau d'accueil par défaut (classe) */ -struct _GWelcomePanelClass -{ -    GPanelItemClass parent;                 /* A laisser en premier        */ +/* Intègre une définition de panneau enregistrée. */ +static bool gtk_welcome_panel_add_launcher(GPanelItem *, GListStore *); -}; +/* Prépare un composant pour représenter une définition. */ +static GtkWidget *gtk_welcome_panel_create_launcher_widget(GPanelItem *, gpointer); +/* Réagit à un changement de sélection de la liste de panneaux. */ +static void gtk_welcome_panel_on_selected_rows_changed(GtkListBox *, GtkWelcomePanel *); -/* Colonnes de la liste des messages */ -typedef enum _RecentProjectColumn -{ -    RPC_VALID,                              /* Validité de l'entrée        */ -    RPC_FULLPATH,                           /* Chemin d'accès à un projet  */ +/* Réagit à une demande d'affichage de l'astuce précédente. */ +static void gtk_welcome_panel_on_prev_hint_clicked(GtkButton *, GtkWelcomePanel *); -    RPC_COUNT                               /* Nombre de colonnes          */ +/* Réagit à une demande d'affichage de l'astuce suivante. */ +static void gtk_welcome_panel_on_next_hint_clicked(GtkButton *, GtkWelcomePanel *); -} RecentProjectColumn; -/* Initialise la classe des panneaux d'accueil par défaut. */ -static void g_welcome_panel_class_init(GWelcomePanelClass *); +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ -/* Initialise une instance de panneau d'accueil par défaut. */ -static void g_welcome_panel_init(GWelcomePanel *); -/* Supprime toutes les références externes. */ -static void g_welcome_panel_dispose(GWelcomePanel *); -/* Procède à la libération totale de la mémoire. */ -static void g_welcome_panel_finalize(GWelcomePanel *); -/* Fournit le nom interne attribué à l'élément réactif. */ -static char *g_welcome_panel_class_get_key(const GWelcomePanelClass *); -/* Fournit une indication sur la personnalité du panneau. */ -static PanelItemPersonality g_welcome_panel_class_get_personality(const GWelcomePanelClass *); -/* Indique le chemin initial de la localisation d'un panneau. */ -static char *g_welcome_panel_class_get_path(const GWelcomePanelClass *); -/* Place un panneau dans l'ensemble affiché. */ -static void g_welcome_panel_dock(GWelcomePanel *); +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ -/* Charge l'ensemble des astuces. */ -static void g_welcome_panel_load_tips(GWelcomePanel *); -/* Assure le dessin du fond de la bulle d'astuce. */ -static gboolean on_tip_background_draw(GtkWidget *, cairo_t *, GWelcomePanel *); +/* Initialise la classe des panneaux graphiques pour binaires. */ +static void g_welcome_panel_class_init(GWelcomePanelClass *); + +/* Initialise une instance de panneau graphique pour binaire. */ +static void g_welcome_panel_init(GWelcomePanel *); -/* Réagit à la demande d'étude d'un nouveau binaire. */ -static void on_new_binary_clicked(GtkButton *, GWelcomePanel *); +/* Supprime toutes les références externes. */ +static void g_welcome_panel_dispose(GWelcomePanel *); -/* Actualise au besoin la liste des projets récents. */ -static void on_recent_list_changed(GtkRecentManager *, GWelcomePanel *); +/* Procède à la libération totale de la mémoire. */ +static void g_welcome_panel_finalize(GWelcomePanel *); -/* Recharge une liste à jour des projets récents. */ -static void g_welcome_panel_reload_project_list(GWelcomePanel *, GtkRecentManager *); -/* Réagit à une sélection décidée d'un projet particulier. */ -static void on_row_activated_for_projects(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, GWelcomePanel *); -/* Enregistre les conditions d'affichage du panneau d'accueil. */ -static void on_startup_toggled(GtkToggleButton *, GWelcomePanel *); +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ -/* Consulte les versions existantes et affiche une conclusion. */ -static void g_welcome_panel_check_version(GWelcomePanel *); -/* Affiche l'astuce précédente dans la liste globale. */ -static void on_tip_previous_clicked(GtkButton *, GWelcomePanel *); +/* Fournit une indication sur la personnalité du panneau. */ +static PanelItemPersonality g_welcome_panel_get_personality(const GWelcomePanel *); -/* Affiche l'astuce suivante dans la liste globale. */ -static void on_tip_next_clicked(GtkButton *, GWelcomePanel *); +/* Fournit un composant représentant un panneau graphique. */ +static GtkTiledPanel *g_welcome_panel_get_panel(GWelcomePanel *, GtkWidget *); -/* Actualise l'affichage des astuces. */ -static void g_welcome_panel_refresh_tip(GWelcomePanel *); + + +/* ---------------------------------------------------------------------------------- */ +/*                           COEUR D'UN PANNEAU D'AFFICHAGE                           */ +/* ---------------------------------------------------------------------------------- */  /* Indique le type défini pour un panneau d'accueil. */ -G_DEFINE_TYPE(GWelcomePanel, g_welcome_panel, G_TYPE_PANEL_ITEM); +G_DEFINE_TYPE(GtkWelcomePanel, gtk_welcome_panel, GTK_TYPE_TILED_PANEL);  /******************************************************************************  *                                                                             * -*  Paramètres  : klass = classe à initialiser.                                * +*  Paramètres  : class = classe à initialiser.                                *  *                                                                             *  *  Description : Initialise la classe des panneaux d'accueil par défaut.      *  *                                                                             * @@ -159,28 +127,28 @@ G_DEFINE_TYPE(GWelcomePanel, g_welcome_panel, G_TYPE_PANEL_ITEM);  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_class_init(GWelcomePanelClass *klass) +static void gtk_welcome_panel_class_init(GtkWelcomePanelClass *class)  {      GObjectClass *object;                   /* Autre version de la classe  */ -    GEditorItemClass *item;                 /* Encore une autre vision...  */ -    GPanelItemClass *panel;                 /* Version parente de classe   */ +    GtkWidgetClass *widget;                 /* Classe de haut niveau       */ -    object = G_OBJECT_CLASS(klass); +    object = G_OBJECT_CLASS(class); -    object->dispose = (GObjectFinalizeFunc/* ! */)g_welcome_panel_dispose; -    object->finalize = (GObjectFinalizeFunc)g_welcome_panel_finalize; - -    item = G_EDITOR_ITEM_CLASS(klass); +    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_welcome_panel_dispose; +    object->finalize = (GObjectFinalizeFunc)gtk_welcome_panel_finalize; -    item->get_key = (get_item_key_fc)g_welcome_panel_class_get_key; +    widget = GTK_WIDGET_CLASS(class); -    panel = G_PANEL_ITEM_CLASS(klass); +    gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/panels/welcome.ui"); -    panel->get_personality = (get_panel_personality_fc)g_welcome_panel_class_get_personality; -    panel->dock_at_startup = gtk_panel_item_class_return_false; -    panel->get_path = (get_panel_path_fc)g_welcome_panel_class_get_path; +    gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_welcome_panel_on_selected_rows_changed)); +    gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_welcome_panel_on_prev_hint_clicked)); +    gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_welcome_panel_on_next_hint_clicked)); -    panel->ack_dock = (ack_undock_process_fc)g_welcome_panel_dock; +    gtk_widget_class_bind_template_child(widget, GtkWelcomePanel, list); +    gtk_widget_class_bind_template_child(widget, GtkWelcomePanel, properties); +    gtk_widget_class_bind_template_child(widget, GtkWelcomePanel, def_child); +    gtk_widget_class_bind_template_child(widget, GtkWelcomePanel, hints);  } @@ -197,86 +165,31 @@ static void g_welcome_panel_class_init(GWelcomePanelClass *klass)  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_init(GWelcomePanel *panel) +static void gtk_welcome_panel_init(GtkWelcomePanel *panel)  { -    GPanelItem *pitem;                      /* Version parente du panneau  */ -    GtkBuilder *builder;                    /* Constructeur utilisé        */ -    GtkTreeView *treeview;                  /* Affichage de la liste       */ -    GtkCellRenderer *renderer;              /* Moteur de rendu de colonne  */ -    GtkTreeViewColumn *column;              /* Colonne de la liste         */ -    GtkToggleButton *button;                /* Bouton à bascule à traiter  */ -    bool state;                             /* Etat de la coche à définir  */ -    gchar *filename;                        /* Chemin d'accès à une image  */ -    GtkRecentManager *manager;              /* Gestionnaire global         */ +    GBytes *bytes;                          /* Données brutes de ressource */ +    const gchar *data;                      /* Données brutes natives      */ -    /* Eléments de base */ +    gtk_widget_init_template(GTK_WIDGET(panel)); -    pitem = G_PANEL_ITEM(panel); +    panel->store = g_list_store_new(G_TYPE_PANEL_ITEM); -    pitem->widget = G_NAMED_WIDGET(gtk_built_named_widget_new_for_panel(_("Welcome"), -                                                                        _("Welcome panel"), -                                                                        PANEL_WELCOME_ID)); +    panel->other_child = NULL; -    panel->uorigin = !gtk_panel_item_class_dock_at_startup(G_PANEL_ITEM_GET_CLASS(pitem)); +    bytes = g_resources_lookup_data("/re/chrysalide/framework/gui/panels/welcome-hints.txt", +                                    G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); +    assert(bytes != NULL); -    /* Représentation graphique */ +    data = g_bytes_get_data(bytes, NULL); -    builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(pitem->widget)); +    panel->raw_hints = g_strsplit(data, "\n\n\n", -1); -    /* Liste des projets récents */ +    g_bytes_unref(bytes); -    treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); +    panel->raw_count = g_strv_length(panel->raw_hints); +    assert(panel->raw_count > 0); -    column = gtk_tree_view_column_new(); -    gtk_tree_view_append_column(treeview, column); -    gtk_tree_view_set_expander_column(treeview, column); - -    renderer = gtk_cell_renderer_text_new(); -    gtk_tree_view_column_pack_start(column, renderer, TRUE); -    gtk_tree_view_column_add_attribute(column, renderer, "markup", RPC_FULLPATH); - -    /* Affichage au démarrage ? */ - -    button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "startup")); - -    g_generic_config_get_value(get_main_configuration(), MPK_WELCOME_STARTUP, &state); - -    gtk_toggle_button_set_active(button, state); - -    /* Chargement de l'image de fond */ - -    filename = find_pixmap_file("tipoftheday.png"); - -    panel->background = cairo_image_surface_create_from_png(filename); - -    g_free(filename); - -    /* Connexion des signaux */ - -    gtk_builder_add_callback_symbols(builder, -                                     BUILDER_CALLBACK(on_tip_background_draw), -                                     BUILDER_CALLBACK(on_new_binary_clicked), -                                     BUILDER_CALLBACK(on_row_activated_for_projects), -                                     BUILDER_CALLBACK(on_startup_toggled), -                                     BUILDER_CALLBACK(on_tip_previous_clicked), -                                     BUILDER_CALLBACK(on_tip_next_clicked), -                                     NULL); - -    gtk_builder_connect_signals(builder, panel); - -    g_object_unref(G_OBJECT(builder)); - -    /* Actualisation du contenu du panneau */ - -    manager = get_project_manager(); - -    panel->sig_id = g_signal_connect(manager, "changed", G_CALLBACK(on_recent_list_changed), panel); - -    g_welcome_panel_reload_project_list(panel, manager); - -    g_welcome_panel_load_tips(panel); - -    g_welcome_panel_check_version(panel); +    panel->cur_hint = 0;  } @@ -293,20 +206,13 @@ static void g_welcome_panel_init(GWelcomePanel *panel)  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_dispose(GWelcomePanel *panel) +static void gtk_welcome_panel_dispose(GtkWelcomePanel *panel)  { -    GtkRecentManager *manager;              /* Gestionnaire global         */ +    gtk_widget_dispose_template(GTK_WIDGET(panel), GTK_TYPE_WELCOME_PANEL); -    if (panel->sig_id > 0) -    { -        manager = get_project_manager(); - -        g_signal_handler_disconnect(manager, panel->sig_id); -        panel->sig_id = 0; +    g_clear_object(&panel->other_child); -    } - -    G_OBJECT_CLASS(g_welcome_panel_parent_class)->dispose(G_OBJECT(panel)); +    G_OBJECT_CLASS(gtk_welcome_panel_parent_class)->dispose(G_OBJECT(panel));  } @@ -323,34 +229,35 @@ static void g_welcome_panel_dispose(GWelcomePanel *panel)  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_finalize(GWelcomePanel *panel) +static void gtk_welcome_panel_finalize(GtkWelcomePanel *panel)  { -    cairo_surface_destroy(panel->background); +    G_OBJECT_CLASS(gtk_welcome_panel_parent_class)->finalize(G_OBJECT(panel)); -    free(panel->tips); - -    G_OBJECT_CLASS(g_welcome_panel_parent_class)->finalize(G_OBJECT(panel)); +    g_strfreev(panel->raw_hints);  }  /******************************************************************************  *                                                                             * -*  Paramètres  : class = classe à consulter.                                  * +*  Paramètres  : -                                                            *  *                                                                             * -*  Description : Fournit le nom interne attribué à l'élément réactif.         * +*  Description : Crée une nouvelle instance de panneau d'accueil.             *  *                                                                             * -*  Retour      : Désignation (courte) de l'élément de l'éditeur.              * +*  Retour      : Composant GTK mis en place.                                  *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static char *g_welcome_panel_class_get_key(const GWelcomePanelClass *class) +GtkTiledPanel *gtk_welcome_panel_new(void)  { -    char *result;                           /* Description à renvoyer      */ +    GtkTiledPanel *result;                  /* Instance à retourner        */ + +    result = g_object_new(GTK_TYPE_WELCOME_PANEL, NULL); -    result = strdup(PANEL_WELCOME_ID); +    if (!gtk_welcome_panel_create(GTK_WELCOME_PANEL(result))) +        g_clear_object(&result);      return result; @@ -359,67 +266,41 @@ static char *g_welcome_panel_class_get_key(const GWelcomePanelClass *class)  /******************************************************************************  *                                                                             * -*  Paramètres  : class = classe à consulter.                                  * +*  Paramètres  : panel = panneau d'accueil à initialiser.                     *  *                                                                             * -*  Description : Fournit une indication sur la personnalité du panneau.       * +*  Description : Met en place un nouveau panneau d'accueil.                   *  *                                                                             * -*  Retour      : Identifiant lié à la nature unique du panneau.               * +*  Retour      : Bilan de l'opération.                                        *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static PanelItemPersonality g_welcome_panel_class_get_personality(const GWelcomePanelClass *class) +bool gtk_welcome_panel_create(GtkWelcomePanel *panel)  { -    PanelItemPersonality result;            /* Personnalité à retourner    */ +    bool result;                            /* Bilan à retourner           */ +    int min;                                /* Taille à gauche minimale    */ -    result = PIP_PERSISTENT_SINGLETON; +    /* Constitution de la liste des démarreurs */ -    return result; +    result = browse_all_item_panels(true, (handle_panel_item_fc)gtk_welcome_panel_add_launcher, panel->store); -} +    gtk_list_box_bind_model(panel->list, G_LIST_MODEL(panel->store), +                            (GtkListBoxCreateWidgetFunc)gtk_welcome_panel_create_launcher_widget, +                            NULL, NULL); -/****************************************************************************** -*                                                                             * -*  Paramètres  : class = classe à consulter.                                  * -*                                                                             * -*  Description : Indique le chemin initial de la localisation d'un panneau.   * -*                                                                             * -*  Retour      : Chemin fixé associé à la position initiale.                  * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ -static char *g_welcome_panel_class_get_path(const GWelcomePanelClass *class) -{ -    char *result;                           /* Emplacement à retourner     */ +    /* Dimensionnement de la zone d'astuces */ -    result = strdup("M"); +    gtk_widget_measure(GTK_WIDGET(panel->list), GTK_ORIENTATION_HORIZONTAL, -1, &min, NULL, NULL, NULL); -    return result; +    if (min > 150) +        min -= 150; -} +    g_object_set(G_OBJECT(panel->hints), "width-request", min, NULL); - -/****************************************************************************** -*                                                                             * -*  Paramètres  : -                                                            * -*                                                                             * -*  Description : Crée un panneau d'accueil par défaut.                        * -*                                                                             * -*  Retour      : Adresse de la structure mise en place.                       * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GPanelItem *g_welcome_panel_new(void) -{ -    GPanelItem *result;                     /* Structure à retourner       */ - -    result = g_object_new(G_TYPE_WELCOME_PANEL, NULL); +    gtk_label_set_markup(panel->hints, panel->raw_hints[panel->cur_hint]);      return result; @@ -428,157 +309,129 @@ GPanelItem *g_welcome_panel_new(void)  /******************************************************************************  *                                                                             * -*  Paramètres  : panel = composant à présenter à l'affichage.                 * +*  Paramètres  : item  = définition de panneau à intégrer.                    * +*                store = liste à compléter.                                   *  *                                                                             * -*  Description : Place un panneau dans l'ensemble affiché.                    * +*  Description : Intègre une définition de panneau enregistrée.               *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : true pour un parcours complet de la liste des définitions.   *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_dock(GWelcomePanel *panel) +static bool gtk_welcome_panel_add_launcher(GPanelItem *item, GListStore *store)  { -    g_welcome_panel_set_user_origin(panel, true); +    bool result;                            /* Poursuite du parcours       */ + +    result = true; + +    g_list_store_append(store, G_OBJECT(item)); + +    return result;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : panel = panneau d'accueil à mettre à jour.                   * +*  Paramètres  : item  = définition de panneau à consulter.                   * +*                unused = adresse non utilisée ici.                           *  *                                                                             * -*  Description : Charge l'ensemble des astuces.                               * +*  Description : Prépare un composant pour représenter une définition.        *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Composant de représentation de définition de panneau.        *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_load_tips(GWelcomePanel *panel) +static GtkWidget *gtk_welcome_panel_create_launcher_widget(GPanelItem *item, gpointer unused)  { -    size_t i;                               /* Boucle de parcours          */ - -    char *tips[] = { - -        _("There is no need to install Chrysalide on your system if you only want to give it a try.\n\n" -          "Just compile the source code and run the program from there."), - -        _("Chrysalide can be used in external Python scripts by setting PYTHONPATH to the directory " -          "containing the 'pychrysalide.so' file. For instance:\n\n" -          "  cd plugins/pychrysa/.libs/\n" -          "  export PYTHONPATH=$PWD\n\n" -          "Then run the interpreter suitable to your configuration (debug or release):\n\n" -          "  python3-dbg -c 'import pychrysalide ; print(pychrysalide.mod_version())'"), - -        _("All the configuration files for Chrysalide are located in $HOME/.config/chrysalide/."), - -        _("The behavior of the main menu bar is copied from the one of a well known browser " -          "with a fox mascot.\n\n" -          "To make the menu bar appear and disappear, just press and release the Alt key.") - -    }; - -    panel->count = ARRAY_SIZE(tips); - -    panel->tips = (char **)calloc(panel->count, sizeof(char *)); - -    for (i = 0; i < panel->count; i++) -        panel->tips[i] = tips[i]; - -    shuffle(panel->tips, panel->count, sizeof(char *)); +    GtkWidget *result;                      /* Composant GTK à retourner   */ -    panel->current = 0; +    result = g_panel_item_get_launcher(item); -    g_welcome_panel_refresh_tip(panel); +    return result;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : widget = composant graphique à redessiner.                   * -*                cr     = contexte graphique à utiliser.                      * -*                panel  = panneau associé comportant des informations utiles. * +*  Paramètres  : box   = liste GTK concernée par l'appel.                     * +*                panel = panneau d'accueil lié à la liste.                    *  *                                                                             * -*  Description : Assure le dessin du fond de la bulle d'astuce.               * +*  Description : Réagit à un changement de sélection de la liste de panneaux. *  *                                                                             * -*  Retour      : FALSE pour poursuivre la propagation de l'événement.         * +*  Retour      : -                                                            *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static gboolean on_tip_background_draw(GtkWidget *widget, cairo_t *cr, GWelcomePanel *panel) +static void gtk_welcome_panel_on_selected_rows_changed(GtkListBox *box, GtkWelcomePanel *panel)  { -    int wgt_width;                          /* Largeur disponible totale   */ -    int wgt_height;                         /* Hauteur disponible totale   */ -    int img_width;                          /* Largeur de l'image de fond  */ -    int img_height;                         /* Hauteur de l'image de fond  */ -    double scale;                           /* Echelle à appliquer         */ - -    if (cairo_surface_status(panel->background) == CAIRO_STATUS_SUCCESS) -    { -        wgt_width = gtk_widget_get_allocated_width(widget); -        wgt_height = gtk_widget_get_allocated_height(widget); +    GtkListBoxRow *row;                     /* Ligne sélectionnée          */ +    int selected;                           /* Indice de sélection         */ +    GPanelItem *item;                       /* Elément correspondant       */ +    GtkWidget *new;                         /* Nouvelles propriétés        */ -        img_width = cairo_image_surface_get_width(panel->background); -        img_height = cairo_image_surface_get_height(panel->background); +    row = gtk_list_box_get_selected_row(box); -        scale = wgt_height / (2.0 * img_height); - -        cairo_scale(cr, scale, scale); +    /** +     * Perte de sélection : bascule sur les informations d'accueil. +     */ +    if (row == NULL) +    { +        assert(panel->other_child != NULL); -        cairo_set_source_surface(cr, panel->background, -                                 (wgt_width / scale) - img_width, -                                 ((wgt_height / scale) - img_height) / 2); +        gtk_stack_set_visible_child(panel->properties, panel->def_child); -        cairo_paint(cr); +        gtk_stack_remove(panel->properties, panel->other_child); +        g_clear_object(&panel->other_child);      } -    return FALSE; +    /** +     * Bascule vers une nouvelle fenêtre. +     */ +    else +    { +        selected = gtk_list_box_row_get_index(row); +        item = g_list_model_get_item(G_LIST_MODEL(panel->store), selected); -} +        new = g_panel_item_get_properties(item); +        if (new == panel->other_child) +            unref_object(new); -/****************************************************************************** -*                                                                             * -*  Paramètres  : button = bouton impliqué dans la procédure.                  * -*                panel  = panneau associé comportant des informations utiles. * -*                                                                             * -*  Description : Réagit à la demande d'étude d'un nouveau binaire.            * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void on_new_binary_clicked(GtkButton *button, GWelcomePanel *panel) -{ -    GObject *ref;                           /* Espace de référencements    */ -    GtkMenuItem *item;                      /* Elément de menu simulé      */ +        else +        { +            gtk_stack_add_child(panel->properties, new); +            gtk_stack_set_visible_child(panel->properties, new); -    ref = G_OBJECT(get_editor_window()); +            if (panel->other_child != NULL) +            { +                gtk_stack_remove(panel->properties, panel->other_child); +                g_clear_object(&panel->other_child); +            } -    item = GTK_MENU_ITEM(g_object_get_data(ref, "mnu_project_add_binary")); +            panel->other_child = new; -    g_object_unref(ref); +        } -    gtk_menu_item_activate(item); +    }  }  /******************************************************************************  *                                                                             * -*  Paramètres  : manager = gestion de fichiers récemment utilisés.            * -*                panel   = panneau associé comportant des informations utiles.* +*  Paramètres  : button = bouton GTK concerné par l'appel.                    * +*                panel  = panneau d'accueil lié à la liste.                   *  *                                                                             * -*  Description : Actualise au besoin la liste des projets récents.            * +*  Description : Réagit à une demande d'affichage de l'astuce précédente.     *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -586,19 +439,24 @@ static void on_new_binary_clicked(GtkButton *button, GWelcomePanel *panel)  *                                                                             *  ******************************************************************************/ -static void on_recent_list_changed(GtkRecentManager *manager, GWelcomePanel *panel) +static void gtk_welcome_panel_on_prev_hint_clicked(GtkButton *button, GtkWelcomePanel *panel)  { -    g_welcome_panel_reload_project_list(panel, manager); +    if (panel->cur_hint > 0) +        panel->cur_hint--; +    else +        panel->cur_hint = panel->raw_count - 1; + +    gtk_label_set_markup(panel->hints, panel->raw_hints[panel->cur_hint]);  }  /******************************************************************************  *                                                                             * -*  Paramètres  : panel   = panneau comportant des informations utiles.        * -*                manager = gestion de fichiers récemment utilisés.            * +*  Paramètres  : button = bouton GTK concerné par l'appel.                    * +*                panel  = panneau d'accueil lié à la liste.                   *  *                                                                             * -*  Description : Recharge une liste à jour des projets récents.               * +*  Description : Réagit à une demande d'affichage de l'astuce suivante.       *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -606,82 +464,45 @@ static void on_recent_list_changed(GtkRecentManager *manager, GWelcomePanel *pan  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_reload_project_list(GWelcomePanel *panel, GtkRecentManager *manager) +static void gtk_welcome_panel_on_next_hint_clicked(GtkButton *button, GtkWelcomePanel *panel)  { -    GtkBuilder *builder;                    /* Constructeur utilisé        */ -    GtkListStore *store;                    /* Modèle de gestion           */ -    bool empty;                             /* Liste vide ?                */ -    GList *recents;                         /* Liste des fichiers récents  */ -    GList *recent;                          /* Elément à traiter           */ -    GtkRecentInfo *info;                    /* Informations sur l'élément  */ -    GtkTreeIter iter;                       /* Point d'insertion           */ - -    /* Réinitialisation */ - -    builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(G_PANEL_ITEM(panel)->widget)); - -    store = GTK_LIST_STORE(gtk_builder_get_object(builder, "store")); +    if ((panel->cur_hint + 1) < panel->raw_count) +        panel->cur_hint++; +    else +        panel->cur_hint = 0; -    gtk_list_store_clear(store); +    gtk_label_set_markup(panel->hints, panel->raw_hints[panel->cur_hint]); -    empty = true; +} -    /* Chargement */ -    recents = gtk_recent_manager_get_items(manager); -    if (recents != NULL) -    { -        for (recent = g_list_first(recents); recent != NULL; recent = g_list_next(recent)) -        { -            info = recent->data; +/* ---------------------------------------------------------------------------------- */ +/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ +/* ---------------------------------------------------------------------------------- */ -            if (strcmp(gtk_recent_info_get_mime_type(info), "application/chrysalide.project") == 0) -            { -                gtk_list_store_append(store, &iter); -                gtk_list_store_set(store, &iter, -                                   RPC_VALID, true, -                                   RPC_FULLPATH, gtk_recent_info_get_uri_display(info), -                                   -1); -                empty = false; -            } -            gtk_recent_info_unref(info); -        } -        g_list_free(recents); -    } -    /* Indication par défaut */ -    if (empty) -    { -        gtk_list_store_append(store, &iter); - -        gtk_list_store_set(store, &iter, -                           RPC_VALID, false, -                           RPC_FULLPATH, _("<i>(No recent project)</i>"), -                           -1); - -    } +/* ---------------------------------------------------------------------------------- */ +/*                        MANIPULATIONS D'UN PANNEAU GRAPHIQUE                        */ +/* ---------------------------------------------------------------------------------- */ -    g_object_unref(G_OBJECT(builder)); -} +/* Indique le type défini pour une manipulation de panneau de bienvenue. */ +G_DEFINE_TYPE(GWelcomePanel, g_welcome_panel, G_TYPE_PANEL_ITEM);  /******************************************************************************  *                                                                             * -*  Paramètres  : treeview = liste graphique concernée par la procédure.       * -*                path     = chemin d'accès à la ligne sélectionnée.           * -*                column   = colonne concernée par la sélection.               * -*                panel    = panneau associé avec des informations utiles.     * +*  Paramètres  : class = classe à initialiser.                                *  *                                                                             * -*  Description : Réagit à une sélection décidée d'un projet particulier.      * +*  Description : Initialise la classe des panneaux graphiques pour binaires.  *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -689,47 +510,29 @@ static void g_welcome_panel_reload_project_list(GWelcomePanel *panel, GtkRecentM  *                                                                             *  ******************************************************************************/ -static void on_row_activated_for_projects(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, GWelcomePanel *panel) +static void g_welcome_panel_class_init(GWelcomePanelClass *class)  { -    GtkTreeModel *model;                    /* Modèle de gestion           */ -    GtkTreeIter iter;                       /* Point de la consultation    */ -    gboolean valid;                         /* Validité de l'entrée        */ -    gchar *filename;                        /* Chemin d'accès au projet    */ -    GStudyProject *project;                 /* Nouveau projet à ouvrir     */ - -    model = gtk_tree_view_get_model(treeview); - -    if (gtk_tree_model_get_iter(model, &iter, path)) -    { -        gtk_tree_model_get(model, &iter, RPC_VALID, &valid, RPC_FULLPATH, &filename, -1); - -        if (valid) -        { -            project = g_study_project_open(filename, true); - -            if (project != NULL) -            { -                set_current_project(project); +    GObjectClass *object;                   /* Autre version de la classe  */ +    GPanelItemClass *panel;                 /* Encore une autre vision...  */ -                push_project_into_recent_list(project); +    object = G_OBJECT_CLASS(class); -            } +    object->dispose = (GObjectFinalizeFunc/* ! */)g_welcome_panel_dispose; +    object->finalize = (GObjectFinalizeFunc)g_welcome_panel_finalize; -            g_free(filename); +    panel = G_PANEL_ITEM_CLASS(class); -        } - -    } +    panel->get_personality = (get_panel_item_personality_cb)g_welcome_panel_get_personality; +    panel->get_panel = (get_panel_item_panel_cb)g_welcome_panel_get_panel;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : button = bouton de défilement des astuces activé;            * -*                panel  = panneau associé comportant des informations utiles. * +*  Paramètres  : panel = instance à initialiser.                              *  *                                                                             * -*  Description : Enregistre les conditions d'affichage du panneau d'accueil.  * +*  Description : Initialise une instance de panneau graphique pour binaire.   *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -737,19 +540,17 @@ static void on_row_activated_for_projects(GtkTreeView *treeview, GtkTreePath *pa  *                                                                             *  ******************************************************************************/ -static void on_startup_toggled(GtkToggleButton *button, GWelcomePanel *panel) +static void g_welcome_panel_init(GWelcomePanel *panel)  { -    g_generic_config_set_value(get_main_configuration(), -                               MPK_WELCOME_STARTUP, gtk_toggle_button_get_active(button));  }  /******************************************************************************  *                                                                             * -*  Paramètres  : panel = panneau d'accueil à mettre à jour.                   * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     *  *                                                                             * -*  Description : Consulte les versions existantes et affiche une conclusion.  * +*  Description : Supprime toutes les références externes.                     *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -757,114 +558,18 @@ static void on_startup_toggled(GtkToggleButton *button, GWelcomePanel *panel)  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_check_version(GWelcomePanel *panel) +static void g_welcome_panel_dispose(GWelcomePanel *panel)  { -    bool skip;                              /* Saut de la vérification     */ -    bool unknown;                           /* Impossibilité de comparaison*/ -    int current;                            /* Version courante            */ -    int sock;                               /* Canal de communication      */ -    bool status;                            /* Bilan d'une communication   */ -    char buffer[1024];                      /* Tampon de réception         */ -    size_t got;                             /* Quantité de données reçues  */ -    char *version;                          /* Version récupérée           */ -    int available;                          /* Version disponible          */ -    GtkBuilder *builder;                    /* Constructeur utilisé        */ -    GtkLabel *label;                        /* Etiquette à éditer          */ -    char *msg;                              /* Message à faire paraître    */ - -    g_generic_config_get_value(get_main_configuration(), MPK_WELCOME_CHECK, &skip); -    skip = !skip; - -    unknown = true; - -    current = atoi(VERSION); - -    if (skip) goto check_process; - -    /* Recherche en ligne */ - -    sock = connect_via_tcp("www.chrysalide.re", "80", NULL); -    if (sock == -1) goto check_process; - -#define REQUEST "GET /version.last HTTP/1.1\r\nHost: www.chrysalide.re\r\n\r\n" - -    status = safe_send(sock, REQUEST, strlen(REQUEST), 0); -    if (!status) goto check_done; - -    status = recv_all(sock, buffer, sizeof(buffer), &got); -    if (!status) goto check_done; - -    version = strstr(buffer, "\r\n\r\n"); - -    if (version != NULL) -    { -        available = atoi(version + 4); - -        unknown = false; - -    } - - check_done: - -    close(sock); - - check_process: - -    /* Affichage */ - -    builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(G_PANEL_ITEM(panel)->widget)); - -    label = GTK_LABEL(gtk_builder_get_object(builder, "version")); - -    if (skip) -        asprintf(&msg, -                 "Your version is: <b>%d</b>\n\n"               \ -                 "Automatic version check is disabled.", -                 current); - -    else -    { -        if (unknown) -            asprintf(&msg, -                     "Your version is: <b>%d</b>\n\n"           \ -                     "Lastest available version is unknown.", -                     current); - -        else -        { -            if (current >= available) -                asprintf(&msg, -                         "Your version is: <b>%d</b>\n\n"       \ -                         "Lastest version is: <b>%d</b>\n\n"    \ -                         "Your software is <span color='green'><b>up-to-date</b></span>.", -                         current, available); - -            else -                asprintf(&msg, -                         "Your version is: <b>%d</b>\n\n"       \ -                         "Lastest version is: <b>%d</b>\n\n"    \ -                         "Your software is <span color='red'><b>outdated</b></span>.", -                         current, available); - -        } - -    } - -    gtk_label_set_markup(label, msg); - -    free(msg); - -    g_object_unref(G_OBJECT(builder)); +    G_OBJECT_CLASS(g_welcome_panel_parent_class)->dispose(G_OBJECT(panel));  }  /******************************************************************************  *                                                                             * -*  Paramètres  : button = bouton de défilement des astuces activé;            * -*                panel  = panneau associé comportant des informations utiles. * +*  Paramètres  : panel = instance d'objet GLib à traiter.                     *  *                                                                             * -*  Description : Affiche l'astuce précédente dans la liste globale.           * +*  Description : Procède à la libération totale de la mémoire.                *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -872,107 +577,89 @@ static void g_welcome_panel_check_version(GWelcomePanel *panel)  *                                                                             *  ******************************************************************************/ -static void on_tip_previous_clicked(GtkButton *button, GWelcomePanel *panel) +static void g_welcome_panel_finalize(GWelcomePanel *panel)  { -    if (panel->current > 0) -        panel->current--; -    else -        panel->current = panel->count - 1; - -    g_welcome_panel_refresh_tip(panel); +    G_OBJECT_CLASS(g_welcome_panel_parent_class)->finalize(G_OBJECT(panel));  }  /******************************************************************************  *                                                                             * -*  Paramètres  : button = bouton de défilement des astuces activé;            * -*                panel  = panneau associé comportant des informations utiles. * +*  Paramètres  : -                                                            *  *                                                                             * -*  Description : Affiche l'astuce suivante dans la liste globale.             * +*  Description : Constitue une définition de manipulation de panneau.         *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Définition de propriétés mise en place.                      *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static void on_tip_next_clicked(GtkButton *button, GWelcomePanel *panel) +GPanelItem *g_welcome_panel_new(void)  { -    if ((panel->current + 1) < panel->count) -        panel->current++; -    else -        panel->current = 0; +    GPanelItem *result;                     /* Structure à retourner       */ -    g_welcome_panel_refresh_tip(panel); +    result = g_object_new(G_TYPE_WELCOME_PANEL, NULL); + +    return result;  } + +/* ---------------------------------------------------------------------------------- */ +/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ +/* ---------------------------------------------------------------------------------- */ + +  /******************************************************************************  *                                                                             * -*  Paramètres  : panel = panneau associé comportant des informations utiles.  * +*  Paramètres  : panel = définition de panneau à consulter.                   *  *                                                                             * -*  Description : Actualise l'affichage des astuces.                           * +*  Description : Fournit une indication sur la personnalité du panneau.       *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Identifiant lié à la nature du panneau.                      *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static void g_welcome_panel_refresh_tip(GWelcomePanel *panel) +static PanelItemPersonality g_welcome_panel_get_personality(const GWelcomePanel *panel)  { -    GtkBuilder *builder;                    /* Constructeur utilisé        */ -    GtkLabel *label;                        /* Etiquette de présentation   */ - -    assert(panel->current < panel->count); - -    builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(G_PANEL_ITEM(panel)->widget)); - -    label = GTK_LABEL(gtk_builder_get_object(builder, "tip")); +    PanelItemPersonality result;            /* Personnalité à retourner    */ -    gtk_label_set_markup(label, panel->tips[panel->current]); +    result = PIP_MAIN_PANEL | PIP_SINGLETON; -    g_object_unref(G_OBJECT(builder)); +    return result;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : panel = panneau associé comportant des informations utiles.  * +*  Paramètres  : panel = définition de panneau à manipuler.                   * +*                props = éventuels éléments graphiques de paramétrages.       *  *                                                                             * -*  Description : Indique l'origine de l'affichage du panneau d'accueil.       * +*  Description : Fournit un composant représentant un panneau graphique.      *  *                                                                             * -*  Retour      : true si l'affichage est le fait de l'utilisateur.            * +*  Retour      : Composant GTK (déjà ?) mis en place.                         *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -bool g_welcome_panel_get_user_origin(const GWelcomePanel *panel) +static GtkTiledPanel *g_welcome_panel_get_panel(GWelcomePanel *panel, GtkWidget *props)  { -    return panel->uorigin; +    GtkTiledPanel *result;                  /* Composant à retourner       */ -} +    /** +     * Il n'existe pas de composants de paramètrage pour ce panneau. +     */ +    assert(props == NULL); +    result = gtk_welcome_panel_new(); -/****************************************************************************** -*                                                                             * -*  Paramètres  : panel   = panneau associé comportant des informations utiles.* -*                uorigin = true si l'affichage est le fait de l'utilisateur.  * -*                                                                             * -*  Description : Détermine l'origine de l'affichage du panneau d'accueil.     * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_welcome_panel_set_user_origin(GWelcomePanel *panel, bool uorigin) -{ -    panel->uorigin = uorigin; +    return result;  } diff --git a/src/gui/panels/welcome.h b/src/gui/panels/welcome.h index 5cdd6a1..d267f80 100644 --- a/src/gui/panels/welcome.h +++ b/src/gui/panels/welcome.h @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * welcome.h - prototypes pour le panneau d'accueil par défaut   * - * Copyright (C) 2012-2019 Cyrille Bagard + * Copyright (C) 2012-2024 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -26,42 +26,38 @@  #define _GUI_PANELS_WELCOME_H -#include <i18n.h> +#include <gtk/gtk.h>  #include "../panel.h" +#include "../../glibext/helpers.h" +#include "../../gtkext/panel.h" -#define PANEL_WELCOME_ID "welcome" +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ -#define G_TYPE_WELCOME_PANEL               g_welcome_panel_get_type() -#define G_WELCOME_PANEL(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_welcome_panel_get_type(), GWelcomePanel)) -#define G_IS_WELCOME_PANEL(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_welcome_panel_get_type())) -#define G_WELCOME_PANEL_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_WELCOME_PANEL, GWelcomePanelClass)) -#define G_IS_WELCOME_PANEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_WELCOME_PANEL)) -#define G_WELCOME_PANEL_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_WELCOME_PANEL, GWelcomePanelClass)) +#define GTK_TYPE_WELCOME_PANEL (gtk_welcome_panel_get_type()) +DECLARE_GTYPE(GtkWelcomePanel, gtk_welcome_panel, GTK, WELCOME_PANEL); -/* Panneau d'accueil par défaut (instance) */ -typedef struct _GWelcomePanel GWelcomePanel; -/* Panneau d'accueil par défaut (classe) */ -typedef struct _GWelcomePanelClass GWelcomePanelClass; +/* Crée une nouvelle instance de panneau d'accueil. */ +GtkTiledPanel *gtk_welcome_panel_new(void); -/* Indique le type défini pour un panneau d'accueil. */ -GType g_welcome_panel_get_type(void); -/* Crée un panneau d'accueil par défaut. */ -GPanelItem *g_welcome_panel_new(void); +/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */ + + +#define G_TYPE_WELCOME_PANEL (g_welcome_panel_get_type()) -/* Indique l'origine de l'affichage du panneau d'accueil. */ -bool g_welcome_panel_get_user_origin(const GWelcomePanel *); +DECLARE_GTYPE(GWelcomePanel, g_welcome_panel, G, WELCOME_PANEL); -/* Détermine l'origine de l'affichage du panneau d'accueil. */ -void g_welcome_panel_set_user_origin(GWelcomePanel *, bool); + +/* Constitue une définition de manipulation de panneau. */ +GPanelItem *g_welcome_panel_new(void); diff --git a/src/gui/panels/welcome.ui b/src/gui/panels/welcome.ui index d016907..422e2ad 100644 --- a/src/gui/panels/welcome.ui +++ b/src/gui/panels/welcome.ui @@ -1,245 +1,217 @@  <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 -->  <interface> -  <requires lib="gtk+" version="3.12"/> -  <object class="GtkImage" id="image1"> -    <property name="visible">True</property> -    <property name="can_focus">False</property> -    <property name="stock">gtk-new</property> -    <property name="icon_size">6</property> -  </object> -  <object class="GtkListStore" id="store"> -    <columns> -      <!-- column-name valid --> -      <column type="gboolean"/> -      <!-- column-name fullpath --> -      <column type="gchararray"/> -    </columns> -  </object> -  <object class="GtkOffscreenWindow" id="offscreenwindow1"> -    <property name="can_focus">False</property> -    <child> -      <object class="GtkBox" id="box"> -        <property name="visible">True</property> -        <property name="can_focus">False</property> -        <property name="homogeneous">True</property> -        <child> -          <object class="GtkBox" id="box2"> -            <property name="visible">True</property> -            <property name="can_focus">False</property> -            <property name="margin_left">8</property> -            <property name="margin_right">8</property> -            <property name="margin_top">8</property> -            <property name="margin_bottom">8</property> -            <property name="orientation">vertical</property> -            <property name="spacing">8</property> -            <child> -              <object class="GtkAlignment" id="alignment1"> -                <property name="visible">True</property> -                <property name="can_focus">False</property> -                <property name="halign">center</property> -                <property name="top_padding">180</property> -                <property name="bottom_padding">30</property> -                <child> -                  <object class="GtkButton" id="button1"> -                    <property name="label" translatable="yes">New binary...</property> -                    <property name="visible">True</property> -                    <property name="can_focus">True</property> -                    <property name="receives_default">True</property> -                    <property name="image">image1</property> -                    <property name="image_position">top</property> -                    <property name="always_show_image">True</property> -                    <signal name="clicked" handler="on_new_binary_clicked" swapped="no"/> -                  </object> -                </child> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">0</property> -              </packing> -            </child> -            <child> -              <object class="GtkLabel" id="label1"> -                <property name="visible">True</property> -                <property name="can_focus">False</property> -                <property name="xalign">0</property> -                <property name="label" translatable="yes">Last projects:</property> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">1</property> -              </packing> -            </child> -            <child> -              <object class="GtkTreeView" id="treeview"> -                <property name="height_request">250</property> -                <property name="visible">True</property> -                <property name="can_focus">True</property> -                <property name="margin_left">8</property> -                <property name="hexpand">True</property> -                <property name="model">store</property> -                <property name="headers_visible">False</property> -                <property name="rules_hint">True</property> -                <signal name="row-activated" handler="on_row_activated_for_projects" swapped="no"/> -                <child internal-child="selection"> -                  <object class="GtkTreeSelection" id="treeview-selection1"/> -                </child> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">2</property> -              </packing> -            </child> -            <child> -              <object class="GtkCheckButton" id="startup"> -                <property name="label" translatable="yes">Show this panel at startup.</property> -                <property name="visible">True</property> -                <property name="can_focus">True</property> -                <property name="receives_default">False</property> -                <property name="halign">start</property> -                <property name="valign">end</property> -                <property name="vexpand">True</property> -                <property name="xalign">0</property> -                <property name="draw_indicator">True</property> -                <signal name="toggled" handler="on_startup_toggled" swapped="no"/> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">3</property> -              </packing> -            </child> -          </object> -          <packing> -            <property name="expand">False</property> -            <property name="fill">True</property> -            <property name="position">0</property> -          </packing> -        </child> + +    <template class="GtkWelcomePanel" parent="GtkTiledPanel">          <child> -          <object class="GtkBox" id="box3"> -            <property name="visible">True</property> -            <property name="can_focus">False</property> -            <property name="margin_left">8</property> -            <property name="margin_right">8</property> -            <property name="margin_top">8</property> -            <property name="margin_bottom">8</property> -            <property name="orientation">vertical</property> -            <property name="spacing">8</property> -            <child> -              <object class="GtkBox" id="box4"> -                <property name="visible">True</property> -                <property name="can_focus">False</property> -                <property name="homogeneous">True</property> -                <child> -                  <object class="GtkLabel" id="version"> -                    <property name="visible">True</property> -                    <property name="can_focus">False</property> -                    <property name="opacity">0.81999999977648264</property> -                    <property name="use_markup">True</property> -                  </object> -                  <packing> -                    <property name="expand">False</property> -                    <property name="fill">True</property> -                    <property name="position">0</property> -                  </packing> -                </child> -                <child> -                  <object class="GtkLabel" id="label3"> -                    <property name="visible">True</property> -                    <property name="can_focus">False</property> -                    <property name="opacity">0.81999999999999995</property> -                    <property name="label" translatable="yes">Get access to the online documentation and stay tuned by visiting the official website : <a href="http://chrysalide.re">chrysalide.re</a> - -You can also follow Chrysalide on Twitter : <a href="http://twitter.com/chrysalide_ref">@chrysalide_ref</a></property> -                    <property name="use_markup">True</property> -                    <property name="wrap">True</property> -                    <property name="track_visited_links">False</property> -                  </object> -                  <packing> -                    <property name="expand">False</property> -                    <property name="fill">True</property> -                    <property name="position">1</property> -                  </packing> -                </child> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">0</property> -              </packing> -            </child> -            <child> -              <object class="GtkLabel" id="tip"> -                <property name="visible">True</property> -                <property name="can_focus">False</property> -                <property name="xalign">0</property> -                <property name="yalign">1</property> -                <property name="xpad">8</property> -                <property name="ypad">8</property> -                <property name="label" translatable="yes">label</property> -                <property name="wrap">True</property> -                <property name="selectable">True</property> -                <signal name="draw" handler="on_tip_background_draw" swapped="no"/> -              </object> -              <packing> -                <property name="expand">True</property> -                <property name="fill">True</property> -                <property name="position">1</property> -              </packing> -            </child> -            <child> -              <object class="GtkButtonBox" id="buttonbox1"> -                <property name="visible">True</property> -                <property name="can_focus">False</property> -                <property name="spacing">8</property> -                <property name="layout_style">end</property> -                <child> -                  <object class="GtkButton" id="button3"> -                    <property name="label" translatable="yes">Previous</property> -                    <property name="visible">True</property> -                    <property name="can_focus">True</property> -                    <property name="receives_default">True</property> -                    <signal name="clicked" handler="on_tip_previous_clicked" swapped="no"/> -                  </object> -                  <packing> -                    <property name="expand">True</property> -                    <property name="fill">True</property> -                    <property name="position">0</property> -                  </packing> -                </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">0</property>                  <child> -                  <object class="GtkButton" id="button2"> -                    <property name="label" translatable="yes">Next</property> -                    <property name="visible">True</property> -                    <property name="can_focus">True</property> -                    <property name="receives_default">True</property> -                    <signal name="clicked" handler="on_tip_next_clicked" swapped="no"/> -                  </object> -                  <packing> -                    <property name="expand">True</property> -                    <property name="fill">True</property> -                    <property name="position">1</property> -                  </packing> +                    <object class="GtkGizmo"> +                        <property name="halign">center</property> +                        <property name="valign">center</property> +                        <property name="margin-bottom">32</property> +                        <property name="margin-end">32</property> +                        <property name="margin-start">32</property> +                        <property name="margin-top">32</property> + +                        <!-- Layout --> +                        <property name="layout-manager"> +                            <object class="GtkConstraintLayout"> +                                <constraints> + +                                    <!-- Central point --> + +                                    <guide name="guide-center" +                                           min-width="1" nat-width="1" max-width="1" +                                           min-height="1" nat-height="1" max-height="1"/> + +                                    <constraint target="guide-center" target-attribute="left" +                                                source="super" source-attribute="width" +                                                relation="eq" +                                                multiplier="0.5" +                                                strength="required"/> + +                                    <constraint target="guide-center" target-attribute="top" +                                                source="super" source-attribute="height" +                                                relation="eq" +                                                multiplier="0.5" +                                                strength="required"/> + +                                    <!-- Widgets --> + +                                    <constraint target="list" target-attribute="right" +                                                source="guide-center" source-attribute="left" +                                                relation="eq" +                                                constant="-32" +                                                strength="required"/> + +                                    <constraint target="list" target-attribute="center-y" +                                                source="guide-center" source-attribute="top" +                                                relation="eq" +                                                strength="required"/> + +                                    <constraint target="properties" target-attribute="left" +                                                source="guide-center" source-attribute="left" +                                                relation="eq" +                                                constant="32" +                                                strength="required"/> + +                                    <constraint target="properties" target-attribute="width" +                                                source="list" source-attribute="width" +                                                relation="eq" +                                                strength="required"/> + +                                    <constraint target="properties" target-attribute="center-y" +                                                source="guide-center" source-attribute="top" +                                                relation="eq" +                                                strength="required"/> + +                                    <!-- Surface for viewport --> + +                                    <constraint target="super" target-attribute="left" +                                                source="list" source-attribute="left" +                                                relation="le" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="left" +                                                source="properties" source-attribute="left" +                                                relation="le" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="right" +                                                source="list" source-attribute="right" +                                                relation="ge" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="right" +                                                source="properties" source-attribute="right" +                                                relation="ge" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="top" +                                                source="list" source-attribute="top" +                                                relation="le" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="top" +                                                source="properties" source-attribute="top" +                                                relation="le" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="bottom" +                                                source="list" source-attribute="bottom" +                                                relation="ge" +                                                strength="required"/> + +                                    <constraint target="super" target-attribute="bottom" +                                                source="properties" source-attribute="bottom" +                                                relation="ge" +                                                strength="required"/> + +                                </constraints> +                            </object> +                        </property> + +                        <!-- Launcher list --> +                        <child> +                            <object class="GtkListBox" id="list"> +                                <property name="halign">end</property> +                                <property name="valign">center</property> +                                <property name="selection-mode">GTK_SELECTION_SINGLE</property> +                                <property name="activate-on-single-click">0</property> +                                <style> +                                    <class name="boxed-list"/> +                                    <class name="frame"/> +                                </style> +                                <signal name="selected-rows-changed" handler="gtk_welcome_panel_on_selected_rows_changed"/> +                            </object> +                        </child> + +                        <!-- Hints / options --> +                        <child> +                            <object class="GtkStack" id="properties"> +                                <property name="halign">start</property> +                                <property name="valign">fill</property> +                                <child> + +                                    <object class="GtkStackPage"> +                                        <property name="name">default</property> +                                        <property name="title">Welcome</property> +                                        <property name="child"> +                                            <object class="GtkGrid" id="def_child"> +                                                <property name="halign">start</property> +                                                <property name="valign">fill</property> +                                                <property name="column-spacing">16</property> +                                                <property name="column-homogeneous">FALSE</property> + +                                                <!-- Text --> +                                                <child> +                                                    <object class="GtkLabel" id="hints"> +                                                        <property name="halign">start</property> +                                                        <property name="valign">fill</property> +                                                        <property name="xalign">0</property> +                                                        <property name="yalign">1</property> +                                                        <property name="vexpand">1</property> +                                                        <property name="width-request">50</property> +                                                        <property name="wrap">TRUE</property> +                                                        <layout> +                                                            <property name="column">0</property> +                                                            <property name="row">0</property> +                                                        </layout> +                                                    </object> +                                                </child> + +                                                <!-- Prev/Next buttons --> +                                                <child> +                                                    <object class="GtkBox"> +                                                        <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> +                                                        <property name="halign">fill</property> +                                                        <property name="valign">center</property> +                                                        <property name="homogeneous">TRUE</property> +                                                        <layout> +                                                            <property name="column">1</property> +                                                            <property name="row">1</property> +                                                        </layout> +                                                        <child> +                                                            <object class="GtkButton"> +                                                                <property name="icon-name">go-previous-symbolic</property> +                                                                <property name="halign">end</property> +                                                                <signal name="clicked" handler="gtk_welcome_panel_on_prev_hint_clicked"/> +                                                            </object> +                                                        </child> +                                                        <child> +                                                            <object class="GtkButton"> +                                                                <property name="icon-name">go-next-symbolic</property> +                                                                <property name="halign">start</property> +                                                                <signal name="clicked" handler="gtk_welcome_panel_on_next_hint_clicked"/> +                                                            </object> +                                                        </child> +                                                        <style> +                                                            <class name="linked"/> +                                                        </style> +                                                    </object> +                                                </child> + +                                                <style> +                                                    <class name="hints"/> +                                                </style> + +                                            </object> + +                                        </property> +                                    </object> +                                </child> + +                            </object> +                        </child> +                    </object>                  </child> -              </object> -              <packing> -                <property name="expand">False</property> -                <property name="fill">True</property> -                <property name="position">2</property> -              </packing> -            </child> -          </object> -          <packing> -            <property name="expand">False</property> -            <property name="fill">True</property> -            <property name="position">1</property> -          </packing> +            </object>          </child> -      </object> -    </child> -  </object> +    </template> +  </interface> | 
