diff options
Diffstat (limited to 'src/gui')
| -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 | ||||
| -rw-r--r-- | src/gui/style.css | 12 | ||||
| -rw-r--r-- | src/gui/window-int.h | 2 | ||||
| -rw-r--r-- | src/gui/window.c | 196 | ||||
| -rw-r--r-- | src/gui/window.ui | 20 | 
11 files changed, 765 insertions, 12 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> diff --git a/src/gui/style.css b/src/gui/style.css index 9078310..e21d931 100644 --- a/src/gui/style.css +++ b/src/gui/style.css @@ -61,3 +61,15 @@ grid.hints > box {      min-width: 130px;  } + + +/* dockstation.css */ + +.control-button { + +    min-height: 0; +    min-width: 0; + +    padding: 6px; + +} diff --git a/src/gui/window-int.h b/src/gui/window-int.h index d79e189..b72a499 100644 --- a/src/gui/window-int.h +++ b/src/gui/window-int.h @@ -37,7 +37,7 @@ struct _GtkFrameworkWindow      GSettings *settings;                    /* Paramètres globaux          */ -    GtkStack *grid;                         /* Réceptacle de panneaux      */ +    GtkTilingGrid *grid;                    /* Réceptacle de panneaux      */  }; diff --git a/src/gui/window.c b/src/gui/window.c index f45cec9..dbe7e87 100644 --- a/src/gui/window.c +++ b/src/gui/window.c @@ -29,7 +29,9 @@  #include "core/panels.h"  #include "dialogs/about.h"  #include "dialogs/preferences.h" +#include "panels/logs.h"  #include "panels/welcome.h" +#include "../gtkext/grid.h"  #include "../gtkext/helpers.h"  #include "../gtkext/statusstack.h" @@ -42,10 +44,25 @@ static void gtk_framework_window_class_init(GtkFrameworkWindowClass *);  static void gtk_framework_window_init(GtkFrameworkWindow *);  /* Supprime toutes les références externes. */ -static void gtk_framework_window_dispose(GtkFrameworkWindow *); +static void gtk_framework_window_dispose(GObject *);  /* Procède à la libération totale de la mémoire. */ -static void gtk_framework_window_finalize(GtkFrameworkWindow *); +static void gtk_framework_window_finalize(GObject *); + +/* Bascule l'affichage d'un panneau de bordure. */ +static void gtk_framework_window_toggle_pannel_visibility(GtkFrameworkWindow *, TilingGridBorder); + +/* Réagit à une activation de bascule du panneau supérieur. */ +static void gtk_framework_window_activate_toggle_top(GSimpleAction *, GVariant *, gpointer); + +/* Réagit à une activation de bascule du panneau de gauche. */ +static void gtk_framework_window_activate_toggle_left(GSimpleAction *action, GVariant *, gpointer); + +/* Réagit à une activation de bascule du panneau de droite. */ +static void gtk_framework_window_activate_toggle_right(GSimpleAction *, GVariant *, gpointer); + +/* Réagit à une activation de bascule du panneau inférieur. */ +static void gtk_framework_window_activate_toggle_bottom(GSimpleAction *, GVariant *, gpointer);  /* Réagit à une activation du menu "Préférences" de la fenetre. */  static void gtk_framework_window_activate_preferences(GSimpleAction *, GVariant *, gpointer); @@ -83,6 +100,7 @@ static void gtk_framework_window_class_init(GtkFrameworkWindowClass *class)      widget = GTK_WIDGET_CLASS(class); +    g_type_ensure(GTK_TYPE_TILING_GRID);      g_type_ensure(GTK_TYPE_STATUS_STACK);      gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/window.ui"); @@ -111,7 +129,13 @@ static void gtk_framework_window_class_init(GtkFrameworkWindowClass *class)  static void gtk_framework_window_init(GtkFrameworkWindow *window)  { +    GAction *action;                        /* Action mise en place        */ +      static GActionEntry app_entries[] = { +        { "toggle-top", gtk_framework_window_activate_toggle_top, NULL, NULL, NULL }, +        { "toggle-left", gtk_framework_window_activate_toggle_left, NULL, NULL, NULL }, +        { "toggle-right", gtk_framework_window_activate_toggle_right, NULL, NULL, NULL }, +        { "toggle-bottom", gtk_framework_window_activate_toggle_bottom, NULL, NULL, NULL },          { "preferences", gtk_framework_window_activate_preferences, NULL, NULL, NULL },          { "about", gtk_framework_window_activate_about, NULL, NULL, NULL },      }; @@ -128,12 +152,41 @@ static void gtk_framework_window_init(GtkFrameworkWindow *window)                                      app_entries, G_N_ELEMENTS(app_entries),                                      window); +    /** +     * Définition de l'accès aux actions pour obtenir un effet de bord sur +     * l'accès aux boutons graphiques de déclenchement. +     */ + +    action = g_action_map_lookup_action(G_ACTION_MAP(window), "toggle-top"); + +    g_object_bind_property(G_OBJECT(window->grid), "empty-top", +                           G_OBJECT(action), "enabled", +                           G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); + +    action = g_action_map_lookup_action(G_ACTION_MAP(window), "toggle-left"); + +    g_object_bind_property(G_OBJECT(window->grid), "empty-left", +                           G_OBJECT(action), "enabled", +                           G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); + +    action = g_action_map_lookup_action(G_ACTION_MAP(window), "toggle-right"); + +    g_object_bind_property(G_OBJECT(window->grid), "empty-right", +                           G_OBJECT(action), "enabled", +                           G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); + +    action = g_action_map_lookup_action(G_ACTION_MAP(window), "toggle-bottom"); + +    g_object_bind_property(G_OBJECT(window->grid), "empty-bottom", +                           G_OBJECT(action), "enabled", +                           G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); +  }  /******************************************************************************  *                                                                             * -*  Paramètres  : window = instance d'objet GLib à traiter.                    * +*  Paramètres  : object = instance d'objet GLib à traiter.                    *  *                                                                             *  *  Description : Supprime toutes les références externes.                     *  *                                                                             * @@ -143,20 +196,24 @@ static void gtk_framework_window_init(GtkFrameworkWindow *window)  *                                                                             *  ******************************************************************************/ -static void gtk_framework_window_dispose(GtkFrameworkWindow *window) +static void gtk_framework_window_dispose(GObject *object)  { +    GtkFrameworkWindow *window;             /* Version spécialisée         */ + +    window = GTK_FRAMEWORK_WINDOW(object); +      gtk_widget_dispose_template(GTK_WIDGET(window), GTK_TYPE_FRAMEWORK_WINDOW);      g_clear_object(&window->settings); -    G_OBJECT_CLASS(gtk_framework_window_parent_class)->dispose(G_OBJECT(window)); +    G_OBJECT_CLASS(gtk_framework_window_parent_class)->dispose(object);  }  /******************************************************************************  *                                                                             * -*  Paramètres  : window = instance d'objet GLib à traiter.                    * +*  Paramètres  : object = instance d'objet GLib à traiter.                    *  *                                                                             *  *  Description : Procède à la libération totale de la mémoire.                *  *                                                                             * @@ -166,9 +223,9 @@ static void gtk_framework_window_dispose(GtkFrameworkWindow *window)  *                                                                             *  ******************************************************************************/ -static void gtk_framework_window_finalize(GtkFrameworkWindow *window) +static void gtk_framework_window_finalize(GObject *object)  { -    G_OBJECT_CLASS(gtk_framework_window_parent_class)->finalize(G_OBJECT(window)); +    G_OBJECT_CLASS(gtk_framework_window_parent_class)->finalize(object);  } @@ -228,6 +285,14 @@ bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app      gtk_framework_window_add(window, panel); +    if (1/* FIXME : first time */) +    { +        panel = get_framework_panel_singleton(GTK_TYPE_LOGS_PANEL); + +        gtk_framework_window_add(window, panel); + +    } +      /* Chargement des extensions de thème */      css = gtk_css_provider_new(); @@ -257,6 +322,116 @@ bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app  /******************************************************************************  *                                                                             * +*  Paramètres  : window = instance de fenêtre principale à manipuler.         * +*                border = sélection de la zone à considérer.                  * +*                                                                             * +*  Description : Bascule l'affichage d'un panneau de bordure.                 * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_toggle_pannel_visibility(GtkFrameworkWindow *window, TilingGridBorder border) +{ +    bool state;                             /* Etat courant à basculer     */ + +    state = gtk_tiling_grid_get_visible(window->grid, border); + +    state = !state; + +    gtk_tiling_grid_set_visible(window->grid, border, state); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : action  = désignation de l'action concernée par l'appel.     * +*                unused  = adresse non utilisée ici.                          * +*                _window = instance de fenêtre principale à manipuler.        * +*                                                                             * +*  Description : Réagit à une activation de bascule du panneau supérieur.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_activate_toggle_top(GSimpleAction *action, GVariant *unused, gpointer _window) +{ +    gtk_framework_window_toggle_pannel_visibility(_window, TGB_TOP); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : action  = désignation de l'action concernée par l'appel.     * +*                unused  = adresse non utilisée ici.                          * +*                _window = instance de fenêtre principale à manipuler.        * +*                                                                             * +*  Description : Réagit à une activation de bascule du panneau de gauche.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_activate_toggle_left(GSimpleAction *action, GVariant *unused, gpointer _window) +{ +    gtk_framework_window_toggle_pannel_visibility(_window, TGB_LEFT); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : action  = désignation de l'action concernée par l'appel.     * +*                unused  = adresse non utilisée ici.                          * +*                _window = instance de fenêtre principale à manipuler.        * +*                                                                             * +*  Description : Réagit à une activation de bascule du panneau de droite.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_activate_toggle_right(GSimpleAction *action, GVariant *unused, gpointer _window) +{ +    gtk_framework_window_toggle_pannel_visibility(_window, TGB_RIGHT); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : action  = désignation de l'action concernée par l'appel.     * +*                unused  = adresse non utilisée ici.                          * +*                _window = instance de fenêtre principale à manipuler.        * +*                                                                             * +*  Description : Réagit à une activation de bascule du panneau inférieur.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_activate_toggle_bottom(GSimpleAction *action, GVariant *unused, gpointer _window) +{ +    gtk_framework_window_toggle_pannel_visibility(_window, TGB_BOTTOM); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : action  = désignation de l'action concernée par l'appel.     *  *                unused  = adresse non utilisée ici.                          *  *                _window = instance de fenêtre principale à manipuler.        * @@ -332,9 +507,10 @@ void gtk_framework_window_add(GtkFrameworkWindow *window, /* __steal */GtkTiledP      guint i;                                /* Boucle de parcours          */      GtkWidget *widget;                      /* Composant à intégrer        */ -    gtk_stack_add_child(window->grid, GTK_WIDGET(panel)); -    gtk_stack_set_visible_child(window->grid, GTK_WIDGET(panel)); + +    gtk_tiling_grid_add_panel(window->grid, panel, G_OBJECT_TYPE(panel) == GTK_TYPE_WELCOME_PANEL); + diff --git a/src/gui/window.ui b/src/gui/window.ui index 363ea54..1c6a89a 100644 --- a/src/gui/window.ui +++ b/src/gui/window.ui @@ -22,6 +22,23 @@          <child type="titlebar">              <object class="GtkHeaderBar"> + +                <child type="start"> +                    <object class="GtkToggleButton"> +                        <property name="icon-name">dock-station-left-symbolic</property> +                        <property name="action-name">win.toggle-left</property> +                        <property name="active" bind-source="grid" bind-property="visible-left" bind-flags="sync-create"/> +                    </object> +                </child> + +                <child type="end"> +                    <object class="GtkToggleButton"> +                        <property name="icon-name">dock-station-right-symbolic</property> +                        <property name="action-name">win.toggle-right</property> +                        <property name="active" bind-source="grid" bind-property="visible-right" bind-flags="sync-create"/> +                    </object> +                </child> +                  <child type="end">                      <object class="GtkMenuButton">                          <property name="icon-name">open-menu-symbolic</property> @@ -37,7 +54,7 @@                  <property name="orientation">vertical</property>                  <child> -                    <object class="GtkStack" id="grid"> +                    <object class="GtkTilingGrid" id="grid">                          <property name="vexpand">TRUE</property>                      </object>                  </child> @@ -50,6 +67,7 @@                  <child>                      <object class="GtkStatusStack" id="status"> +                        <property name="show-bottom" bind-source="grid" bind-property="visible-bottom" bind-flags="sync-create"/>                      </object>                  </child>  | 
