/* Chrysalide - Outil d'analyse de fichiers binaires
* about.h - boîte de dialogue d'information sur le programme
*
* Copyright (C) 2015-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 .
*/
#include "about.h"
#include
#include
#include
#include
#include
#include "about-int.h"
/* Procède à l'initialisation de la boîte "A propos de". */
static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *);
/* 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 : class = classe GTK à initialiser. *
* *
* Description : Procède à l'initialisation de la boîte "A propos de". *
* *
* 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 : - *
* *
******************************************************************************/
static void gtk_app_about_dialog_init(GtkAppAboutDialog *dialog)
{
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 */
gtk_widget_init_template(GTK_WIDGET(dialog));
revision = REVISION;
max = log(revision) / log(10);
assert(max <= 6);
for (i = 0; i <= max; i++)
{
level = pow(10, max - i);
snprintf(buffer, 64, "/org/chrysalide/gui/dialogs/about/revision_%u.png", revision / level);
gtk_picture_set_resource(dialog->revisions[i], buffer);
revision %= level;
}
for (; i < 6; i++)
gtk_widget_set_visible(GTK_WIDGET(dialog->revisions[i]), FALSE);
}
/******************************************************************************
* *
* 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 : dialog = instance d'objet GLib à traiter. *
* *
* Description : Procède à la libération totale de la mémoire. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void gtk_app_about_dialog_finalize(GtkAppAboutDialog *dialog)
{
G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->finalize(G_OBJECT(dialog));
}
/******************************************************************************
* *
* 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 : dialog = boîte de dialogue à initialiser pleinement. *
* content = contenu binaire à exposer de façon brute. *
* *
* Description : Met en place la fenêtre d'informations sur le logiciel. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool gtk_app_about_dialog_create(GtkAppAboutDialog *dialog, GtkWindow *parent)
{
bool result; /* Bilan à retourner */
result = true;
gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
return result;
}