diff options
Diffstat (limited to 'src/gui/dialogs')
-rw-r--r-- | src/gui/dialogs/Makefile.am | 2 | ||||
-rw-r--r-- | src/gui/dialogs/about-int.h | 14 | ||||
-rw-r--r-- | src/gui/dialogs/about.c | 57 | ||||
-rw-r--r-- | src/gui/dialogs/about.css | 9 | ||||
-rw-r--r-- | src/gui/dialogs/about.ui | 80 | ||||
-rw-r--r-- | src/gui/dialogs/gresource.xml | 16 | ||||
-rw-r--r-- | src/gui/dialogs/preferences.c | 27 | ||||
-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 | ||||
-rw-r--r-- | src/gui/dialogs/prefs/security-int.h | 4 | ||||
-rw-r--r-- | src/gui/dialogs/prefs/security.c | 4 |
15 files changed, 601 insertions, 156 deletions
diff --git a/src/gui/dialogs/Makefile.am b/src/gui/dialogs/Makefile.am index e910c96..3492f63 100644 --- a/src/gui/dialogs/Makefile.am +++ b/src/gui/dialogs/Makefile.am @@ -3,7 +3,9 @@ BUILT_SOURCES = resources.h resources.c noinst_LTLIBRARIES = libguidialogs.la + UI_FILES = \ + about.css \ about.ui \ preferences.ui # bookmark.ui \ diff --git a/src/gui/dialogs/about-int.h b/src/gui/dialogs/about-int.h index 616c73f..96a470e 100644 --- a/src/gui/dialogs/about-int.h +++ b/src/gui/dialogs/about-int.h @@ -37,20 +37,6 @@ struct _GtkAppAboutDialog { GtkWindow parent; /* A laisser en premier */ - union - { - struct - { - GtkPicture *revision_0; /* Numéro #0 */ - GtkPicture *revision_1; /* Numéro #1 */ - GtkPicture *revision_2; /* Numéro #2 */ - GtkPicture *revision_3; /* Numéro #3 */ - GtkPicture *revision_4; /* Numéro #4 */ - GtkPicture *revision_5; /* Numéro #5 */ - }; - GtkPicture *revisions[6]; /* Tous les numéros d'un coup */ - }; - }; /* Boîte "A propos de" dédiée à l'application (classe) */ diff --git a/src/gui/dialogs/about.c b/src/gui/dialogs/about.c index 956918b..1dca752 100644 --- a/src/gui/dialogs/about.c +++ b/src/gui/dialogs/about.c @@ -44,10 +44,10 @@ static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *); static void gtk_app_about_dialog_init(GtkAppAboutDialog *); /* Supprime toutes les références externes. */ -static void gtk_app_about_dialog_dispose(GtkAppAboutDialog *); +static void gtk_app_about_dialog_dispose(GObject *); /* Procède à la libération totale de la mémoire. */ -static void gtk_app_about_dialog_finalize(GtkAppAboutDialog *); +static void gtk_app_about_dialog_finalize(GObject *); @@ -74,22 +74,17 @@ static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *class) object = G_OBJECT_CLASS(class); - object->dispose = (GObjectFinalizeFunc/* ! */)gtk_app_about_dialog_dispose; - object->finalize = (GObjectFinalizeFunc)gtk_app_about_dialog_finalize; + object->dispose = gtk_app_about_dialog_dispose; + object->finalize = gtk_app_about_dialog_finalize; widget = GTK_WIDGET_CLASS(class); + gtk_widget_class_set_css_name(widget, "aboutdialog"); + gtk_widget_class_add_binding_action(widget, GDK_KEY_Escape, 0, "window.close", NULL); gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/dialogs/about.ui"); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_0); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_1); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_2); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_3); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_4); - gtk_widget_class_bind_template_child(widget, GtkAppAboutDialog, revision_5); - } @@ -107,40 +102,14 @@ static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *class) static void gtk_app_about_dialog_init(GtkAppAboutDialog *dialog) { - unsigned int revision; /* Numéro de révision */ - unsigned int max; /* Nbre. de boucles à effectuer*/ - unsigned int i; /* Boucle de parcours */ - unsigned int level; /* Unité la plus importante */ - char buffer[64]; /* Nom d'image à forger */ - gtk_widget_init_template(GTK_WIDGET(dialog)); - revision = REVISION; - max = log(revision) / log(10); - - assert(max <= 6); - - for (i = 0; i <= max; i++) - { - level = pow(10, max - i); - - snprintf(buffer, 64, "/org/chrysalide/gui/dialogs/about/revision_%u.png", revision / level); - - gtk_picture_set_resource(dialog->revisions[i], buffer); - - revision %= level; - - } - - for (; i < 6; i++) - gtk_widget_set_visible(GTK_WIDGET(dialog->revisions[i]), FALSE); - } /****************************************************************************** * * -* Paramètres : dialog = instance d'objet GLib à traiter. * +* Paramètres : object = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * * * @@ -150,18 +119,18 @@ static void gtk_app_about_dialog_init(GtkAppAboutDialog *dialog) * * ******************************************************************************/ -static void gtk_app_about_dialog_dispose(GtkAppAboutDialog *dialog) +static void gtk_app_about_dialog_dispose(GObject *object) { - gtk_widget_dispose_template(GTK_WIDGET(dialog), GTK_TYPE_APP_ABOUT_DIALOG); + gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_APP_ABOUT_DIALOG); - G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->dispose(G_OBJECT(dialog)); + G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->dispose(object); } /****************************************************************************** * * -* Paramètres : dialog = instance d'objet GLib à traiter. * +* Paramètres : object = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * * * @@ -171,9 +140,9 @@ static void gtk_app_about_dialog_dispose(GtkAppAboutDialog *dialog) * * ******************************************************************************/ -static void gtk_app_about_dialog_finalize(GtkAppAboutDialog *dialog) +static void gtk_app_about_dialog_finalize(GObject *object) { - G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->finalize(G_OBJECT(dialog)); + G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->finalize(object); } diff --git a/src/gui/dialogs/about.css b/src/gui/dialogs/about.css new file mode 100644 index 0000000..af3fa97 --- /dev/null +++ b/src/gui/dialogs/about.css @@ -0,0 +1,9 @@ + +aboutdialog > box { + + background-color: black; + + background-image: url('resource:///re/chrysalide/framework/gui/dialogs/about/bg.png'); + background-repeat: no-repeat; + +} diff --git a/src/gui/dialogs/about.ui b/src/gui/dialogs/about.ui index 989e53b..7b519d2 100644 --- a/src/gui/dialogs/about.ui +++ b/src/gui/dialogs/about.ui @@ -8,91 +8,13 @@ <property name="modal">true</property> <property name="resizable">false</property> - <style> - <class name="black-bg"/> - </style> - <child> <object class="GtkBox"> <property name="orientation">vertical</property> - <child> - <object class="GtkPicture" id="logo"> - <property name="margin-top">10</property> - <property name="file">resource://org/chrysalide/gui/dialogs/about/chrysalide-full.png</property> - </object> - </child> - - <!-- - Etage intermédiaire pour ne pas que l'image se voie allouer la largeur entière - de la fenêtre. Sinon des marges sont placées autour du rendu lors que l'image - n'est pas étendue pour couvrir cette largeur entière. - --> - <child> - <object class="GtkBox"> - <property name="orientation">horizontal</property> - <property name="halign">center</property> - <property name="margin-top">14</property> - <child> - <object class="GtkPicture" id="text"> - <property name="width-request">253</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/chrysalide_text.png</property> - </object> - </child> - </object> - </child> - - <child> - <object class="GtkBox"> - <property name="orientation">horizontal</property> - <property name="margin-start">149</property> - <child> - <object class="GtkPicture" id="revision"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_0"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_1"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_2"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_3"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_4"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - <child> - <object class="GtkPicture" id="revision_5"> - <property name="width-request">14</property> - <property name="file">resource:///org/chrysalide/gui/dialogs/about/revision.png</property> - </object> - </child> - </object> - </child> <child> <object class="GtkLabel"> - <property name="margin-top">22</property> + <property name="margin-top">368</property> <property name="margin-bottom">10</property> <property name="label" translatable="yes"><span fgcolor='white'>Copyright (C) 2008-2025 Cyrille Bagard</span></property> <property name="use-markup">True</property> diff --git a/src/gui/dialogs/gresource.xml b/src/gui/dialogs/gresource.xml index 169f440..966d9c8 100644 --- a/src/gui/dialogs/gresource.xml +++ b/src/gui/dialogs/gresource.xml @@ -1,22 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/re/chrysalide/framework/gui/dialogs"> + <file compressed="true">about.css</file> <file compressed="true">about.ui</file> <file compressed="true">preferences.ui</file> </gresource> - <gresource prefix="/org/chrysalide/gui/dialogs/about"> - <file compressed="true" alias="chrysalide-full.png">../../../pixmaps/chrysalide-full.png</file> - <file compressed="true" alias="chrysalide_text.png">../../../pixmaps/chrysalide_text.png</file> - <file compressed="true" alias="revision.png">../../../pixmaps/revision.png</file> - <file compressed="true" alias="revision_0.png">../../../pixmaps/revision_0.png</file> - <file compressed="true" alias="revision_1.png">../../../pixmaps/revision_1.png</file> - <file compressed="true" alias="revision_2.png">../../../pixmaps/revision_2.png</file> - <file compressed="true" alias="revision_3.png">../../../pixmaps/revision_3.png</file> - <file compressed="true" alias="revision_4.png">../../../pixmaps/revision_4.png</file> - <file compressed="true" alias="revision_5.png">../../../pixmaps/revision_5.png</file> - <file compressed="true" alias="revision_6.png">../../../pixmaps/revision_6.png</file> - <file compressed="true" alias="revision_7.png">../../../pixmaps/revision_7.png</file> - <file compressed="true" alias="revision_8.png">../../../pixmaps/revision_8.png</file> - <file compressed="true" alias="revision_9.png">../../../pixmaps/revision_9.png</file> - </gresource> </gresources> diff --git a/src/gui/dialogs/preferences.c b/src/gui/dialogs/preferences.c index aca562a..0369241 100644 --- a/src/gui/dialogs/preferences.c +++ b/src/gui/dialogs/preferences.c @@ -34,9 +34,12 @@ #include "preferences-int.h" +#include "prefs/appearance.h" #include "prefs/security.h" #include "../../common/cpp.h" #include "../../gtkext/tweak.h" +#include "../../plugins/pglist.h" +#include "../../plugins/tweakable.h" @@ -133,9 +136,13 @@ static void gtk_preferences_dialog_init(GtkPreferencesDialog *dialog) const tweak_info_t *info; /* Informations à considérer */ GtkListBox *navigation; /* Liste de sections à afficher*/ GtkTweakSection *section; /* Nouvelle section à présenter*/ + tweak_info_t *dyn_infos; /* Informations supplémentaires*/ + size_t dyn_count; /* Quantité de ces informations*/ 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), }; @@ -158,6 +165,26 @@ static void gtk_preferences_dialog_init(GtkPreferencesDialog *dialog) } + /* Chargement des sections dynamiques */ + + dyn_infos = get_tweakable_plugins_info(&dyn_count); + + for (i = 0; i < dyn_count; i++) + { + info = &dyn_infos[i]; + + navigation = gtk_preferences_dialog_get_navigation(dialog, info->parent, true); + assert(navigation != NULL); + + section = gtk_tweak_section_new(info); + + gtk_list_box_append(navigation, GTK_WIDGET(section)); + + } + + if (dyn_infos != NULL) + free(dyn_infos); + /* Affichage de la liste racine */ navigation = gtk_preferences_dialog_get_navigation(dialog, "root", false); 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> diff --git a/src/gui/dialogs/prefs/security-int.h b/src/gui/dialogs/prefs/security-int.h index c693fdb..be7867c 100644 --- a/src/gui/dialogs/prefs/security-int.h +++ b/src/gui/dialogs/prefs/security-int.h @@ -30,7 +30,7 @@ -/* Fenêtre d'édition générale de la configuration (instance) */ +/* Composant d'édition des paramètres de sécurité (instance) */ struct _GtkSecurityTweakPanel { GtkBox parent; /* A laisser en premier */ @@ -52,7 +52,7 @@ struct _GtkSecurityTweakPanel }; -/* Fenêtre d'édition générale de la configuration (classe) */ +/* Composant d'édition des paramètres de sécurité (classe) */ struct _GtkSecurityTweakPanelClass { GtkBoxClass parent; /* A laisser en premier */ diff --git a/src/gui/dialogs/prefs/security.c b/src/gui/dialogs/prefs/security.c index cf2f6c8..2b82339 100644 --- a/src/gui/dialogs/prefs/security.c +++ b/src/gui/dialogs/prefs/security.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * security.h - configuration des paramètres liés à la sécurité + * security.c - configuration des paramètres liés à la sécurité * * Copyright (C) 2025 Cyrille Bagard * @@ -82,7 +82,7 @@ static void gtk_security_tweak_panel_on_remove_password_clicked(GtkButton *, Gtk /* ---------------------------------------------------------------------------------- */ -/* Détermine le type du composant d'affichage générique. */ +/* Indique le type du composant d'édition des paramètres de sécurité. */ G_DEFINE_TYPE(GtkSecurityTweakPanel, gtk_security_tweak_panel, GTK_TYPE_BOX); |