diff options
Diffstat (limited to 'src/gui/dialogs/prefs')
-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 |
6 files changed, 544 insertions, 0 deletions
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> |