diff options
Diffstat (limited to 'src/gui/dialogs')
| -rw-r--r-- | src/gui/dialogs/preferences.c | 3 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/Makefile.am | 3 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/appearance-int.h | 64 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/appearance.c | 251 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/appearance.h | 41 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/appearance.ui | 184 | ||||
| -rw-r--r-- | src/gui/dialogs/prefs/gresource.xml | 1 | 
7 files changed, 547 insertions, 0 deletions
| diff --git a/src/gui/dialogs/preferences.c b/src/gui/dialogs/preferences.c index 68e7fd9..0369241 100644 --- a/src/gui/dialogs/preferences.c +++ b/src/gui/dialogs/preferences.c @@ -34,6 +34,7 @@  #include "preferences-int.h" +#include "prefs/appearance.h"  #include "prefs/security.h"  #include "../../common/cpp.h"  #include "../../gtkext/tweak.h" @@ -140,6 +141,8 @@ static void gtk_preferences_dialog_init(GtkPreferencesDialog *dialog)      tweak_info_t infos[] = {          TWEAK_SIMPLE_DEF("root", "Basics", +                         "security-high-symbolic", "appearance", "Appearance", GTK_TYPE_APPEARANCE_TWEAK_PANEL), +        TWEAK_SIMPLE_DEF("root", "Basics",                           "security-high-symbolic", "security", "Security", GTK_TYPE_SECURITY_TWEAK_PANEL),      }; diff --git a/src/gui/dialogs/prefs/Makefile.am b/src/gui/dialogs/prefs/Makefile.am index fa1af96..50bc3c8 100644 --- a/src/gui/dialogs/prefs/Makefile.am +++ b/src/gui/dialogs/prefs/Makefile.am @@ -4,9 +4,12 @@ BUILT_SOURCES = resources.h resources.c  noinst_LTLIBRARIES  = libguidialogsprefs.la  UI_FILES =									\ +	appearance.ui							\  	security.ui  libguidialogsprefs_la_SOURCES =				\ +	appearance-int.h						\ +	appearance.h appearance.c				\  	resources.h resources.c					\  	security-int.h							\  	security.h security.c diff --git a/src/gui/dialogs/prefs/appearance-int.h b/src/gui/dialogs/prefs/appearance-int.h new file mode 100644 index 0000000..886a562 --- /dev/null +++ b/src/gui/dialogs/prefs/appearance-int.h @@ -0,0 +1,64 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * appearance-int.h - définitions internes pour la configuration des paramètres liés aux apparences + * + * Copyright (C) 2025 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  Chrysalide is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  Chrysalide is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GUI_DIALOGS_PREFS_APPEARANCE_INT_H +#define _GUI_DIALOGS_PREFS_APPEARANCE_INT_H + + +#include "appearance.h" + + + +/* Composant d'édition des paramètres liés aux apparences (instance) */ +struct _GtkAppearanceTweakPanel +{ +    GtkBox parent;                          /* A laisser en premier        */ + +    /* Disposition des panneaux */ + +    GSettings *tiles_settings;              /* Configuration sollicitée    */ + +    GtkWidget *layout_preview;              /* Zone d'aperçu de dispositon*/ + +    GtkWidget *top_panel;                   /* Composant d'aperçu #1       */ +    GtkWidget *left_panel;                  /* Composant d'aperçu #2       */ +    GtkWidget *right_panel;                 /* Composant d'aperçu #3       */ +    GtkWidget *bottom_panel;                /* Composant d'aperçu #4       */ + +    GtkCheckButton *left_top_reach;         /* Paramètre de disposition #1 */ +    GtkCheckButton *left_bottom_reach;      /* Paramètre de disposition #2 */ +    GtkCheckButton *right_top_reach;        /* Paramètre de disposition #3 */ +    GtkCheckButton *right_bottom_reach;     /* Paramètre de disposition #4 */ + +}; + +/* Composant d'édition des paramètres liés aux apparences (classe) */ +struct _GtkAppearanceTweakPanelClass +{ +    GtkBoxClass parent;                     /* A laisser en premier        */ + +}; + + + +#endif  /* _GUI_DIALOGS_PREFS_APPEARANCE_INT_H */ diff --git a/src/gui/dialogs/prefs/appearance.c b/src/gui/dialogs/prefs/appearance.c new file mode 100644 index 0000000..a8585fa --- /dev/null +++ b/src/gui/dialogs/prefs/appearance.c @@ -0,0 +1,251 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * appearance.c - configuration des paramètres liés aux apparences + * + * Copyright (C) 2025 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  Chrysalide is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  Chrysalide is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "appearance.h" + + +#include "appearance-int.h" +#include "../../../gtkext/grid.h" +#include "../../../gtkext/helpers.h" + + + +/* Procède à l'initialisation de classe des configurations. */ +static void gtk_appearance_tweak_panel_class_init(GtkAppearanceTweakPanelClass *); + +/* Procède à l'initialisation des configurations de sécurité. */ +static void gtk_appearance_tweak_panel_init(GtkAppearanceTweakPanel *); + +/* Supprime toutes les références externes. */ +static void gtk_appearance_tweak_panel_dispose(GObject *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_appearance_tweak_panel_finalize(GObject *); + +/* Réagit à un changement de paramètre de configuration. */ +static void gtk_appearance_tweak_panel_on_tiles_settings_changed(GSettings *, const gchar *, GtkAppearanceTweakPanel *); + +/* Change la disposition des panneaux de la fenêtre principale. */ +static void gtk_appearance_tweak_panel_on_panel_reach_toggled(GtkCheckButton *, GtkAppearanceTweakPanel *); + + +/* Indique le type du composant de configuration des notes. */ +G_DEFINE_TYPE(GtkAppearanceTweakPanel, gtk_appearance_tweak_panel, GTK_TYPE_BOX); + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : class = classe GTK à initialiser.                            * +*                                                                             * +*  Description : Procède à l'initialisation de classe des configurations.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_class_init(GtkAppearanceTweakPanelClass *class) +{ +    GObjectClass *object;                   /* Plus haut niveau équivalent */ +    GtkWidgetClass *widget;                 /* Classe de haut niveau       */ + +    object = G_OBJECT_CLASS(class); + +    object->dispose = gtk_appearance_tweak_panel_dispose; +    object->finalize = gtk_appearance_tweak_panel_finalize; + +    widget = GTK_WIDGET_CLASS(class); + +    gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/dialogs/prefs/appearance.ui"); + +    gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_appearance_tweak_panel_on_panel_reach_toggled)); + +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, layout_preview); + +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, top_panel); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, left_panel); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, right_panel); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, bottom_panel); + +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, left_top_reach); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, left_bottom_reach); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, right_top_reach); +    gtk_widget_class_bind_template_child(widget, GtkAppearanceTweakPanel, right_bottom_reach); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = composant GTK à initialiser.                         * +*                                                                             * +*  Description : Procède à l'initialisation des configurations de sécurité.   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_init(GtkAppearanceTweakPanel *panel) +{ +    LayoutReachOptions options;             /* Détails de disposition      */ + +    gtk_widget_init_template(GTK_WIDGET(panel)); + +    panel->tiles_settings = g_settings_new_with_path("re.chrysalide.framework.tiledgrid", +                                                     "/re/chrysalide/framework/gui/tiles/"); + +    options = g_settings_get_flags(panel->tiles_settings, "layout"); + +    gtk_check_button_set_active(panel->left_top_reach, options & LRO_LEFT_TOP_REACH); +    gtk_check_button_set_active(panel->left_bottom_reach, options & LRO_LEFT_BOTTOM_REACH); +    gtk_check_button_set_active(panel->right_top_reach, options & LRO_RIGHT_TOP_REACH); +    gtk_check_button_set_active(panel->right_bottom_reach, options & LRO_RIGHT_BOTTOM_REACH); + +    gtk_appearance_tweak_panel_on_tiles_settings_changed(panel->tiles_settings, "layout", panel); + +    g_signal_connect(panel->tiles_settings, "changed", +                     G_CALLBACK(gtk_appearance_tweak_panel_on_tiles_settings_changed), panel); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : object = instance d'objet GLib à traiter.                    * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_dispose(GObject *object) +{ +    GtkAppearanceTweakPanel *panel;         /* Version spécialisée         */ + +    gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_APPEARANCE_TWEAK_PANEL); + +    panel = GTK_APPEARANCE_TWEAK_PANEL(object); + +    g_clear_object(&panel->tiles_settings); + +    G_OBJECT_CLASS(gtk_appearance_tweak_panel_parent_class)->dispose(object); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : object = instance d'objet GLib à traiter.                    * +*                                                                             * +*  Description : Procède à la libération totale de la mémoire.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_finalize(GObject *object) +{ +    G_OBJECT_CLASS(gtk_appearance_tweak_panel_parent_class)->finalize(object); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : settings = ensemble de paramètres connaissant une évolution. * +*                key      = identifiant du paramètre ayant changé.            * +*                panel    = panneau de paramétrage concerné par l'appel.      * +*                                                                             * +*  Description : Réagit à un changement de paramètre de configuration.        * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_on_tiles_settings_changed(GSettings *settings, const gchar *key, GtkAppearanceTweakPanel *panel) +{ +    LayoutReachOptions options;             /* Détails de disposition      */ + +    if (strcmp(key, "layout") == 0) +    { +        options = g_settings_get_flags(panel->tiles_settings, "layout"); + +        apply_tiling_grid_layout(GTK_GRID(panel->layout_preview), options, (GtkWidget *[]) { +                panel->top_panel, panel->left_panel, panel->right_panel, panel->bottom_panel +            }); + +    } + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : button = composant radio dont l'état vient de basculer.      * +*                panel  = panneau d'édition des préférences courant.          * +*                                                                             * +*  Description : Change la disposition des panneaux de la fenêtre principale. * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_appearance_tweak_panel_on_panel_reach_toggled(GtkCheckButton *button, GtkAppearanceTweakPanel *panel) +{ +    gboolean left_top_reach;                /* Paramètre de disposition #1 */ +    gboolean left_bottom_reach;             /* Paramètre de disposition #2 */ +    gboolean right_top_reach;               /* Paramètre de disposition #3 */ +    gboolean right_bottom_reach;            /* Paramètre de disposition #4 */ +    LayoutReachOptions options;             /* Options à appliquer         */ + +    /* Récupération des indications */ + +    left_top_reach = gtk_check_button_get_active(panel->left_top_reach); +    left_bottom_reach = gtk_check_button_get_active(panel->left_bottom_reach); +    right_top_reach = gtk_check_button_get_active(panel->right_top_reach); +    right_bottom_reach = gtk_check_button_get_active(panel->right_bottom_reach); + +    /* Conversion et application */ + +    options = LRO_NONE; + +    if (left_top_reach) options |= LRO_LEFT_TOP_REACH; +    if (left_bottom_reach) options |= LRO_LEFT_BOTTOM_REACH; +    if (right_top_reach) options |= LRO_RIGHT_TOP_REACH; +    if (right_bottom_reach) options |= LRO_RIGHT_BOTTOM_REACH; + +    g_settings_set_flags(panel->tiles_settings, "layout", options); + +} diff --git a/src/gui/dialogs/prefs/appearance.h b/src/gui/dialogs/prefs/appearance.h new file mode 100644 index 0000000..916b194 --- /dev/null +++ b/src/gui/dialogs/prefs/appearance.h @@ -0,0 +1,41 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * appearance.h - prototypes pour la configuration des paramètres liés aux apparences + * + * Copyright (C) 2025 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  Chrysalide is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  Chrysalide is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GUI_DIALOGS_PREFS_APPEARANCE_H +#define _GUI_DIALOGS_PREFS_APPEARANCE_H + + +#include <gtk/gtk.h> + + +#include "../../../glibext/helpers.h" + + + +#define GTK_TYPE_APPEARANCE_TWEAK_PANEL (gtk_appearance_tweak_panel_get_type()) + +DECLARE_GTYPE(GtkAppearanceTweakPanel, gtk_appearance_tweak_panel, GTK, APPEARANCE_TWEAK_PANEL); + + + +#endif  /* _GUI_DIALOGS_PREFS_APPEARANCE_H */ diff --git a/src/gui/dialogs/prefs/appearance.ui b/src/gui/dialogs/prefs/appearance.ui new file mode 100644 index 0000000..3410115 --- /dev/null +++ b/src/gui/dialogs/prefs/appearance.ui @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + +    <template class="GtkAppearanceTweakPanel" parent="GtkBox"> + +        <property name="orientation">vertical</property> +        <property name="margin-start">20</property> +        <property name="margin-end">20</property> +        <property name="margin-top">20</property> +        <property name="margin-bottom">20</property> +        <property name="spacing">10</property> + +        <!-- Disposition des panneaux --> + +        <child> +            <object class="GtkLabel"> +                <property name="label">Layout</property> +                <property name="use-markup">true</property> +                <property name="xalign">0</property> +                <style> +                    <class name="heading"/> +                </style> +            </object> +        </child> + +        <child> +            <object class="GtkLabel"> +                <property name="label">Layout defines the global panel organization of the main window.</property> +                <property name="wrap">true</property> +                <property name="use-markup">true</property> +                <property name="xalign">0</property> +                <style> +                    <class name="dim-label"/> +                </style> +            </object> +        </child> + + +        <child> +            <object class="GtkBox"> +                <property name="orientation">horizontal</property> + +                <!-- Aperçu --> + +                <child> +                    <object class="GtkGrid" id="layout_preview"> +                        <property name="margin-start">20</property> +                        <property name="margin-end">20</property> +                        <property name="margin-top">10</property> +                        <property name="margin-bottom">10</property> +                        <property name="row-spacing">5</property> +                        <property name="column-spacing">5</property> +                        <property name="hexpand">false</property> +                        <property name="vexpand">false</property> +                        <property name="height-request">200</property> +                        <property name="width-request">300</property> + +                        <child> +                            <object class="GtkFrame" id="top_panel"> +                                <property name="hexpand">true</property> +                                <property name="vexpand">false</property> +                                <property name="height-request">20</property> +                                <layout> +                                    <property name="column">0</property> +                                    <property name="row">0</property> +                                    <property name="column-span">3</property> +                                </layout> +                                <style> +                                    <class name="view"/> +                                </style> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkFrame" id="left_panel"> +                                <property name="hexpand">false</property> +                                <property name="vexpand">true</property> +                                <property name="width-request">50</property> +                                <layout> +                                    <property name="column">0</property> +                                    <property name="row">1</property> +                                </layout> +                                <style> +                                    <class name="view"/> +                                </style> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkFrame"> +                                <property name="hexpand">true</property> +                                <property name="vexpand">true</property> +                                <layout> +                                    <property name="column">1</property> +                                    <property name="row">1</property> +                                </layout> +                                <style> +                                    <class name="view"/> +                                </style> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkFrame" id="right_panel"> +                                <property name="hexpand">false</property> +                                <property name="vexpand">true</property> +                                <property name="width-request">50</property> +                                <layout> +                                    <property name="column">2</property> +                                    <property name="row">1</property> +                                </layout> +                                <style> +                                    <class name="view"/> +                                </style> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkFrame" id="bottom_panel"> +                                <property name="hexpand">true</property> +                                <property name="vexpand">false</property> +                                <property name="height-request">50</property> +                                <layout> +                                    <property name="column">0</property> +                                    <property name="row">2</property> +                                    <property name="column-span">3</property> +                                </layout> +                                <style> +                                    <class name="view"/> +                                </style> +                            </object> +                        </child> + +                    </object> +                </child> + +                <!-- Options --> + +                <child> +                    <object class="GtkBox"> +                        <property name="orientation">vertical</property> +                        <property name="valign">center</property> +                        <property name="spacing">10</property> + +                        <child> +                            <object class="GtkCheckButton" id="left_top_reach"> +                                <property name="label">Left panels reach the top of the window</property> +                                <property name="active">false</property> +                                <signal name="toggled" handler="gtk_appearance_tweak_panel_on_panel_reach_toggled"/> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkCheckButton" id="left_bottom_reach"> +                                <property name="label">Left panels reach the bottom of the window</property> +                                <property name="active">false</property> +                                <signal name="toggled" handler="gtk_appearance_tweak_panel_on_panel_reach_toggled"/> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkCheckButton" id="right_top_reach"> +                                <property name="label">Right panels reach the top of the window</property> +                                <property name="active">false</property> +                                <signal name="toggled" handler="gtk_appearance_tweak_panel_on_panel_reach_toggled"/> +                            </object> +                        </child> + +                        <child> +                            <object class="GtkCheckButton" id="right_bottom_reach"> +                                <property name="label">Right panels reach the bottom of the window</property> +                                <property name="active">false</property> +                                <signal name="toggled" handler="gtk_appearance_tweak_panel_on_panel_reach_toggled"/> +                            </object> +                        </child> + +                    </object> +                </child> + +            </object> +        </child> + +    </template> +</interface> diff --git a/src/gui/dialogs/prefs/gresource.xml b/src/gui/dialogs/prefs/gresource.xml index 7b18143..ad0f97f 100644 --- a/src/gui/dialogs/prefs/gresource.xml +++ b/src/gui/dialogs/prefs/gresource.xml @@ -1,6 +1,7 @@  <?xml version="1.0" encoding="UTF-8"?>  <gresources>      <gresource prefix="/re/chrysalide/framework/gui/dialogs/prefs"> +        <file compressed="true">appearance.ui</file>          <file compressed="true">security.ui</file>      </gresource>  </gresources> | 
