diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2024-08-23 21:36:25 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2024-08-23 21:36:25 (GMT) | 
| commit | c863d2d9093e7205107b5a6e56bd616c0703d4e4 (patch) | |
| tree | 8b7cdd5a95cd79d143d87b98e2074f17e6fd53ee /src/gui | |
| parent | 370311f0a7176aa880dd0a15561c87a324fc111c (diff) | |
Restore an About dialog box.
Diffstat (limited to 'src/gui')
| -rw-r--r-- | src/gui/Makefile.am | 4 | ||||
| -rw-r--r-- | src/gui/dialogs/Makefile.am | 51 | ||||
| -rw-r--r-- | src/gui/dialogs/about-int.h | 69 | ||||
| -rw-r--r-- | src/gui/dialogs/about.c | 180 | ||||
| -rw-r--r-- | src/gui/dialogs/about.h | 12 | ||||
| -rw-r--r-- | src/gui/dialogs/about.ui | 247 | ||||
| -rw-r--r-- | src/gui/dialogs/gresource.xml | 2 | ||||
| -rw-r--r-- | src/gui/style.css | 8 | ||||
| -rw-r--r-- | src/gui/window.c | 43 | ||||
| -rw-r--r-- | src/gui/window.ui | 28 | 
10 files changed, 404 insertions, 240 deletions
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 5ec43d2..42761c4 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -18,7 +18,6 @@ libgui_la_SOURCES =						\  libgui_la_LIBADD =						\  	core/libguicore.la					\ -	dialogs/libguidialogs.la			\  	menus/libguimenus.la				\  	panels/libguipanels.la				\  	tb/libguitb.la @@ -35,6 +34,7 @@ libgui4_la_SOURCES =						\  libgui4_la_LIBADD =							\  	core/libguicore4.la						\ +	dialogs/libguidialogs.la				\  	panels/libguipanels4.la  libgui4_la_CFLAGS = $(LIBGTK4_CFLAGS) @@ -45,7 +45,7 @@ devdir = $(includedir)/chrysalide/$(subdir:src/%=core/%)  dev_HEADERS = $(libgui_la_SOURCES:%c=) -SUBDIRS = core panels # dialogs menus panels tb +SUBDIRS = core dialogs panels # menus panels tb  RES_FILES = 								\ diff --git a/src/gui/dialogs/Makefile.am b/src/gui/dialogs/Makefile.am index 5716f14..5a77b99 100644 --- a/src/gui/dialogs/Makefile.am +++ b/src/gui/dialogs/Makefile.am @@ -4,34 +4,35 @@ BUILT_SOURCES = resources.h resources.c  noinst_LTLIBRARIES  = libguidialogs.la  UI_FILES =								\ -	about.ui							\ -	bookmark.ui							\ -	export_graph.ui						\ -	identity.ui							\ -	loading.ui							\ -	preferences.ui						\ -	prefs_fgraph.ui						\ -	prefs_labels.ui						\ -	snapshots.ui						\ -	storage.ui +	about.ui +# bookmark.ui							\ +# export_graph.ui						\ +# identity.ui							\ +# loading.ui							\ +# preferences.ui						\ +# prefs_fgraph.ui						\ +# prefs_labels.ui						\ +# snapshots.ui						\ +# storage.ui  libguidialogs_la_SOURCES =				\ +	about-int.h							\  	about.h about.c						\ -	bookmark.h bookmark.c				\ -	export_disass.h export_disass.c		\ -	export_graph.h export_graph.c		\ -	goto.h goto.c						\ -	gotox.h gotox.c						\ -	identity.h identity.c				\ -	loading.h loading.c					\ -	preferences.h preferences.c			\ -	prefs_fgraph.h prefs_fgraph.c		\ -	prefs_labels.h prefs_labels.c		\ -	resources.h resources.c				\ -	snapshots.h snapshots.c				\ -	storage.h storage.c - -libguidialogs_la_CFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) +	resources.h resources.c +# bookmark.h bookmark.c				\ +# export_disass.h export_disass.c		\ +# export_graph.h export_graph.c		\ +# goto.h goto.c						\ +# gotox.h gotox.c						\ +# identity.h identity.c				\ +# loading.h loading.c					\ +# preferences.h preferences.c			\ +# prefs_fgraph.h prefs_fgraph.c		\ +# prefs_labels.h prefs_labels.c		\ +# snapshots.h snapshots.c				\ +# storage.h storage.c + +libguidialogs_la_CFLAGS = $(LIBGTK4_CFLAGS)  devdir = $(includedir)/chrysalide/$(subdir:src/%=core/%) diff --git a/src/gui/dialogs/about-int.h b/src/gui/dialogs/about-int.h new file mode 100644 index 0000000..382859b --- /dev/null +++ b/src/gui/dialogs/about-int.h @@ -0,0 +1,69 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * about.h - définitions internes pour la boîte de dialogue d'information sur le programme + * + * Copyright (C) 2024 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_ABOUT_INT_H +#define _GUI_DIALOGS_ABOUT_INT_H + + +#include <stdbool.h> + + +#include "about-int.h" + + + +/* Boîte "A propos de" dédiée à l'application (instance) */ +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) */ +struct _GtkAppAboutDialogClass +{ +    GtkWindowClass parent;                  /* A laisser en premier        */ + +}; + + +/* Met en place la fenêtre d'informations sur le logiciel. */ +bool gtk_app_about_dialog_create(GtkAppAboutDialog *, GtkWindow *); + + + +#endif  /* _GUI_DIALOGS_ABOUT_INT_H */ diff --git a/src/gui/dialogs/about.c b/src/gui/dialogs/about.c index 574c7f2..5c938ad 100644 --- a/src/gui/dialogs/about.c +++ b/src/gui/dialogs/about.c @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * about.h - boîte de dialogue d'information sur le programme   * - * Copyright (C) 2015-2020 Cyrille Bagard + * Copyright (C) 2015-2024 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -33,50 +33,87 @@  #include <config.h> -#include "../../gtkext/easygtk.h" +#include "about-int.h" -/* Réagit à l'appui d'une touche sur la fenêtre 'A propos'. */ -static gboolean close_about_window_on_escape(GtkWidget *, GdkEventKey *, gpointer); +/* Procède à l'initialisation de la boîte "A propos de". */ +static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *); -/* Dessine un fond adapté pour la fenêtre sans toucher au thème. */ -static gboolean draw_black_background(GtkWidget *, cairo_t *, gpointer); +/* Procède à l'initialisation de la boîte "A propos de". */ +static void gtk_app_about_dialog_init(GtkAppAboutDialog *); +/* Supprime toutes les références externes. */ +static void gtk_app_about_dialog_dispose(GtkAppAboutDialog *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_app_about_dialog_finalize(GtkAppAboutDialog *); + + + +/* Détermine le type du composant d'affichage générique. */ +G_DEFINE_TYPE(GtkAppAboutDialog, gtk_app_about_dialog, GTK_TYPE_WINDOW);  /******************************************************************************  *                                                                             * -*  Paramètres  : parent = fenêtre parente à surpasser.                        * -*                outb   = constructeur à détruire après usage. [OUT]          * +*  Paramètres  : class = classe GTK à initialiser.                            *  *                                                                             * -*  Description : Construit la fenêtre d'informations sur le logiciel.         * +*  Description : Procède à l'initialisation de la boîte "A propos de".        *  *                                                                             * -*  Retour      : Adresse de la fenêtre mise en place.                         * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *class) +{ +    GObjectClass *object;                   /* Plus haut niveau équivalent */ +    GtkWidgetClass *widget;                 /* Classe de haut niveau       */ + +    object = G_OBJECT_CLASS(class); + +    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_app_about_dialog_dispose; +    object->finalize = (GObjectFinalizeFunc)gtk_app_about_dialog_finalize; + +    widget = GTK_WIDGET_CLASS(class); + +    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); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : dialog = composant GTK à initialiser.                        * +*                                                                             * +*  Description : Procède à l'initialisation de la boîte "A propos de".        * +*                                                                             * +*  Retour      : -                                                            *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -GtkWidget *create_about_dialog(GtkWindow *parent, GtkBuilder **outb) +static void gtk_app_about_dialog_init(GtkAppAboutDialog *dialog)  { -    GtkWidget *result;                      /* Fenêtre à renvoyer          */ -    GtkBuilder *builder;                    /* Constructeur utilisé        */      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        */ -    GtkImage *img;                          /* Composant d'affichage       */ - -    builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/about.ui"); -    *outb = builder; - -    result = GTK_WIDGET(gtk_builder_get_object(builder, "window")); - -    gtk_window_set_transient_for(GTK_WINDOW(result), parent); -    /* Numéro de révision */ +    gtk_widget_init_template(GTK_WIDGET(dialog));      revision = REVISION;      max = log(revision) / log(10); @@ -85,91 +122,110 @@ GtkWidget *create_about_dialog(GtkWindow *parent, GtkBuilder **outb)      for (i = 0; i <= max; i++)      { -        snprintf(buffer, 64, "revision_%u", i); - -        img = GTK_IMAGE(gtk_builder_get_object(builder, buffer)); -          level = pow(10, max - i);          snprintf(buffer, 64, "/org/chrysalide/gui/dialogs/about/revision_%u.png", revision / level); -        gtk_image_set_from_resource(img, buffer); +        gtk_picture_set_resource(dialog->revisions[i], buffer);          revision %= level;      } -    /* Connexion des signaux */ +    for (; i < 6; i++) +        gtk_widget_set_visible(GTK_WIDGET(dialog->revisions[i]), FALSE); -    gtk_builder_add_callback_symbols(builder, -                                     BUILDER_CALLBACK(close_about_window_on_escape), -                                     BUILDER_CALLBACK(draw_black_background), -                                     NULL); +} -    gtk_builder_connect_signals(builder, builder); -    return result; +/****************************************************************************** +*                                                                             * +*  Paramètres  : dialog = instance d'objet GLib à traiter.                    * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_app_about_dialog_dispose(GtkAppAboutDialog *dialog) +{ +    gtk_widget_dispose_template(GTK_WIDGET(dialog), GTK_TYPE_APP_ABOUT_DIALOG); + +    G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->dispose(G_OBJECT(dialog));  }  /******************************************************************************  *                                                                             * -*  Paramètres  : widget = fenêtre visée par la procédure.                     * -*                event  = informations liées à l'événement.                   * -*                dummy  = donnée non utilisée ici.                            * +*  Paramètres  : dialog = instance d'objet GLib à traiter.                    *  *                                                                             * -*  Description : Réagit à l'appui d'une touche sur la fenêtre 'A propos'.     * +*  Description : Procède à la libération totale de la mémoire.                *  *                                                                             * -*  Retour      : TRUE pour interrompre la propagation, FALSE autrement.       * +*  Retour      : -                                                            *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static gboolean close_about_window_on_escape(GtkWidget *widget, GdkEventKey *event, gpointer dummy) +static void gtk_app_about_dialog_finalize(GtkAppAboutDialog *dialog)  { -    gboolean result;                        /* Ordre à retourner           */ +    G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->finalize(G_OBJECT(dialog)); -    if (event->keyval == GDK_KEY_Escape) -    { -        gtk_widget_destroy(widget); -        result = TRUE; -    } -    else result = FALSE; +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : parent = fenêtre parente à surpasser.                        * +*                                                                             * +*  Description : Construit la fenêtre d'informations sur le logiciel.         * +*                                                                             * +*  Retour      : Adresse de la fenêtre mise en place.                         * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GtkWindow *gtk_app_about_dialog_new(GtkWindow *parent) +{ +    GtkWindow *result;                      /* Boite de dialogue à renvoyer*/ + +    result = g_object_new(GTK_TYPE_APP_ABOUT_DIALOG, NULL); + +    if (!gtk_app_about_dialog_create(GTK_APP_ABOUT_DIALOG(result), parent)) +        g_clear_object(&result);      return result;  } +  /******************************************************************************  *                                                                             * -*  Paramètres  : widget = fenêtre visée par la procédure.                     * -*                event  = informations liées à l'événement.                   * -*                dummy  = donnée non utilisée ici.                            * +*  Paramètres  : dialog  = boîte de dialogue à initialiser pleinement.        * +*                content = contenu binaire à exposer de façon brute.          *  *                                                                             * -*  Description : Dessine un fond adapté pour la fenêtre sans toucher au thème.* +*  Description : Met en place la fenêtre d'informations sur le logiciel.      *  *                                                                             * -*  Retour      : TRUE pour interrompre la propagation, FALSE autrement.       * +*  Retour      : Bilan de l'opération.                                        *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static gboolean draw_black_background(GtkWidget *widget, cairo_t *cr, gpointer dummy) +bool gtk_app_about_dialog_create(GtkAppAboutDialog *dialog, GtkWindow *parent)  { -    int width;                              /* Largeur du composant        */ -    int height;                             /* Hauteur du composant        */ +    bool result;                            /* Bilan à retourner           */ -    width = gtk_widget_get_allocated_width(widget); -    height = gtk_widget_get_allocated_height(widget); +    result = true; -    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); +    gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); -    cairo_rectangle(cr, 0, 0, width, height); -    cairo_fill(cr); - -    return FALSE; +    return result;  } diff --git a/src/gui/dialogs/about.h b/src/gui/dialogs/about.h index f119f67..e569ad3 100644 --- a/src/gui/dialogs/about.h +++ b/src/gui/dialogs/about.h @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * about.h - prototypes pour la boîte de dialogue d'information sur le programme   * - * Copyright (C) 2015-2020 Cyrille Bagard + * Copyright (C) 2015-2024 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -28,9 +28,17 @@  #include <gtk/gtk.h> +#include "../../glibext/helpers.h" + + + +#define GTK_TYPE_APP_ABOUT_DIALOG (gtk_app_about_dialog_get_type()) + +DECLARE_GTYPE(GtkAppAboutDialog, gtk_app_about_dialog, GTK, APP_ABOUT_DIALOG); +  /* Construit la fenêtre d'informations sur le logiciel. */ -GtkWidget *create_about_dialog(GtkWindow *, GtkBuilder **); +GtkWindow *gtk_app_about_dialog_new(GtkWindow *); diff --git a/src/gui/dialogs/about.ui b/src/gui/dialogs/about.ui index 0170508..892b468 100644 --- a/src/gui/dialogs/about.ui +++ b/src/gui/dialogs/about.ui @@ -1,151 +1,106 @@  <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.37.0 -->  <interface> -  <requires lib="gtk+" version="3.12"/> -  <object class="GtkWindow" id="window"> -    <property name="width-request">350</property> -    <property name="height-request">430</property> -    <property name="can-focus">False</property> -    <property name="border-width">0</property> -    <property name="title" translatable="yes">About</property> -    <property name="resizable">False</property> -    <property name="modal">True</property> -    <property name="window-position">center-on-parent</property> -    <property name="default-width">350</property> -    <property name="default-height">430</property> -    <property name="type-hint">dialog</property> -    <signal name="key-press-event" handler="close_about_window_on_escape" swapped="no"/> -    <child> -      <object class="GtkFixed"> -        <property name="visible">True</property> -        <property name="can-focus">False</property> -        <signal name="draw" handler="draw_black_background" swapped="no"/> + +    <template class="GtkAppAboutDialog" parent="GtkWindow"> +        <property name="title" translatable="yes">About</property> +        <property name="default-width">350</property> +        <property name="default-height">430</property> +        <property name="modal">true</property> +        <property name="resizable">false</property> + +        <style> +            <class name="black-bg"/> +        </style> +          <child> -          <object class="GtkLabel"> -            <property name="width-request">350</property> -            <property name="height-request">20</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -            <property name="margin-bottom">10</property> -            <property name="label" translatable="yes"><span fgcolor='white'>Copyright (C) 2008-2020 Cyrille Bagard</span></property> -            <property name="use-markup">True</property> -          </object> -          <packing> -            <property name="y">400</property> -          </packing> +            <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-bottom">10</property> +                        <property name="label" translatable="yes"><span fgcolor='white'>Copyright (C) 2008-2024 Cyrille Bagard</span></property> +                        <property name="use-markup">True</property> +                    </object> +                </child> + +            </object>          </child> -        <child> -          <object class="GtkImage" id="logo"> -            <property name="width-request">330</property> -            <property name="height-request">300</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -            <property name="resource">/org/chrysalide/gui/dialogs/about/chrysalide-full.png</property> -          </object> -          <packing> -            <property name="x">10</property> -            <property name="y">10</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="text"> -            <property name="width-request">253</property> -            <property name="height-request">42</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -            <property name="resource">/org/chrysalide/gui/dialogs/about/chrysalide_text.png</property> -          </object> -          <packing> -            <property name="x">48</property> -            <property name="y">324</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -            <property name="resource">/org/chrysalide/gui/dialogs/about/revision.png</property> -          </object> -          <packing> -            <property name="x">149</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_0"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">163</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_1"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">177</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_2"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">191</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_3"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">205</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_4"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">219</property> -            <property name="y">360</property> -          </packing> -        </child> -        <child> -          <object class="GtkImage" id="revision_5"> -            <property name="width-request">14</property> -            <property name="height-request">18</property> -            <property name="visible">True</property> -            <property name="can-focus">False</property> -          </object> -          <packing> -            <property name="x">233</property> -            <property name="y">360</property> -          </packing> -        </child> -      </object> -    </child> -  </object> + +    </template>  </interface> diff --git a/src/gui/dialogs/gresource.xml b/src/gui/dialogs/gresource.xml index 0e12ef2..b9bc7e2 100644 --- a/src/gui/dialogs/gresource.xml +++ b/src/gui/dialogs/gresource.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <gresources> -    <gresource prefix="/org/chrysalide/gui/dialogs"> +    <gresource prefix="/re/chrysalide/framework/gui/dialogs">          <file compressed="true">about.ui</file>          <file compressed="true">bookmark.ui</file>          <file compressed="true">export_graph.ui</file> diff --git a/src/gui/style.css b/src/gui/style.css index b0853ab..44161f7 100644 --- a/src/gui/style.css +++ b/src/gui/style.css @@ -25,6 +25,14 @@ list.boxed-list, list.boxed-list > row:last-child {  } +/* about.css */ + +.black-bg { + +    background-color: black; + +} +  /* welcome.css */ diff --git a/src/gui/window.c b/src/gui/window.c index 432a8a1..1f10a15 100644 --- a/src/gui/window.c +++ b/src/gui/window.c @@ -27,7 +27,9 @@  #include "window-int.h"  #include "core/panels.h" +#include "dialogs/about.h"  #include "panels/welcome.h" +#include "../gtkext/helpers.h" @@ -43,6 +45,9 @@ static void gtk_framework_window_dispose(GtkFrameworkWindow *);  /* Procède à la libération totale de la mémoire. */  static void gtk_framework_window_finalize(GtkFrameworkWindow *); +/* Réagit à une activation du menu "A propos de" de la fenetre. */ +static void gtk_framework_window_activate_about(GSimpleAction *, GVariant *, gpointer); +  /* Indique le type défini pour une fenêtre graphique principale de Chrysalide. */ @@ -73,8 +78,6 @@ static void gtk_framework_window_class_init(GtkFrameworkWindowClass *class)      widget = GTK_WIDGET_CLASS(class); -    //g_type_ensure(GTK_TYPE_TILING_GRID); -      gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/window.ui");      gtk_widget_class_bind_template_child(widget, GtkFrameworkWindow, grid); @@ -99,6 +102,10 @@ static void gtk_framework_window_class_init(GtkFrameworkWindowClass *class)  static void gtk_framework_window_init(GtkFrameworkWindow *window)  { +    static GActionEntry app_entries[] = { +        { "about", gtk_framework_window_activate_about, NULL, NULL, NULL }, +    }; +      gtk_widget_init_template(GTK_WIDGET(window));      window->settings = g_settings_new(FRAMEWORK_WINDOW_ID); @@ -107,6 +114,10 @@ static void gtk_framework_window_init(GtkFrameworkWindow *window)      g_settings_bind(window->settings, "window-height", G_OBJECT(window), "default-height", G_SETTINGS_BIND_DEFAULT);      g_settings_bind(window->settings, "window-maximized", G_OBJECT(window), "maximized", G_SETTINGS_BIND_DEFAULT); +    g_action_map_add_action_entries(G_ACTION_MAP(window), +                                    app_entries, G_N_ELEMENTS(app_entries), +                                    window); +  } @@ -240,6 +251,34 @@ bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app  /******************************************************************************  *                                                                             * +*  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 du menu "A propos de" de la fenetre. * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void gtk_framework_window_activate_about(GSimpleAction *action, GVariant *unused, gpointer _window) +{ +    GtkFrameworkWindow *window;             /* Fenêtre principale associée */ +    GtkWindow *dialog;                      /* Boîte de dialogue à afficher*/ + +    window = _window; + +    dialog = gtk_app_about_dialog_new(GTK_WINDOW(window)); + +    gtk_window_present(dialog); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : window = instance de fenêtre principale à remplir.           *  *                panel  = nouveau panneau à afficher.                         *  *                                                                             * diff --git a/src/gui/window.ui b/src/gui/window.ui index d9ca32c..7055695 100644 --- a/src/gui/window.ui +++ b/src/gui/window.ui @@ -1,10 +1,36 @@  <?xml version="1.0" encoding="UTF-8"?>  <interface> + +    <menu id="main_menu_model"> +        <section> +            <item> +                <attribute name="label" translatable="yes">Preferences</attribute> +            </item> +            <item> +                <attribute name="label" translatable="yes">About</attribute> +                <attribute name="action">win.about</attribute> +            </item> +        </section> +    </menu> +      <template class="GtkFrameworkWindow" parent="GtkApplicationWindow">          <property name="title" translatable="no">Chrysalide</property>          <property name="default-width">800</property>          <property name="default-height">600</property>          <property name="icon-name">chrysalide-logo</property> + +        <child type="titlebar"> +            <object class="GtkHeaderBar"> +                <child type="end"> +                    <object class="GtkMenuButton"> +                        <property name="icon-name">open-menu-symbolic</property> +                        <property name="menu-model">main_menu_model</property> +                    </object> +                </child> + +            </object> +        </child> +          <child>              <object class="GtkBox">                  <property name="orientation">vertical</property> @@ -15,5 +41,7 @@                  </child>              </object>          </child> +      </template> +  </interface>  | 
