summaryrefslogtreecommitdiff
path: root/src/gui/dialogs/about.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/dialogs/about.c')
-rw-r--r--src/gui/dialogs/about.c180
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;
}