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/dialogs/about.c | |
parent | 370311f0a7176aa880dd0a15561c87a324fc111c (diff) |
Restore an About dialog box.
Diffstat (limited to 'src/gui/dialogs/about.c')
-rw-r--r-- | src/gui/dialogs/about.c | 180 |
1 files changed, 118 insertions, 62 deletions
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; } |