/* 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 <http://www.gnu.org/licenses/>.
 */


#include "about.h"


#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <gdk/gdkkeysyms.h>


#include <config.h>


#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;

}