/* 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 . */ #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); }