/* OpenIDA - Outil d'analyse de fichiers binaires
* gtkextstatusbar.h - prototypes pour la barre de statut améliorée
*
* Copyright (C) 2009-2010 Cyrille Bagard
*
* This file is part of OpenIDA.
*
* OpenIDA 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.
*
* OpenIDA 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 Foobar. If not, see .
*/
#include "gtkextstatusbar.h"
#include
#include
/* Initialise la classe des barres de statut améliorées. */
static void gtk_extended_status_bar_class_init(GtkExtStatusBarClass *);
/* Initialise une instance de barre de statut améliorée. */
static void gtk_extended_status_bar_init(GtkExtStatusBar *);
/* Détermine le type de la barre de statut améliorée. */
G_DEFINE_TYPE(GtkExtStatusBar, gtk_extended_status_bar, GTK_TYPE_STATUSBAR)
/******************************************************************************
* *
* Paramètres : klass = classe GTK à initialiser. *
* *
* Description : Initialise la classe des barres de statut améliorées. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void gtk_extended_status_bar_class_init(GtkExtStatusBarClass *klass)
{
}
/******************************************************************************
* *
* Paramètres : bar = instance GTK à initialiser. *
* *
* Description : Initialise une instance de barre de statut améliorée. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void gtk_extended_status_bar_init(GtkExtStatusBar *bar)
{
bar->context = gtk_statusbar_get_context_id(GTK_STATUSBAR(bar), "");
bar->progress = GTK_PROGRESS_BAR(gtk_progress_bar_new());
gtk_widget_set_size_request(GTK_WIDGET(bar->progress), 200, -1);
gtk_progress_bar_set_fraction(bar->progress, 0.5);
gtk_progress_bar_set_text(bar->progress, "50%");
gtk_box_pack_start(GTK_BOX(bar), GTK_WIDGET(bar->progress), FALSE, FALSE, 4);
}
/******************************************************************************
* *
* Paramètres : - *
* *
* Description : Crée une nouvelle instance de barre de statut. *
* *
* Retour : Composant GTK mis en place. *
* *
* Remarques : - *
* *
******************************************************************************/
GtkWidget *gtk_extended_status_bar_new(void)
{
return g_object_new(GTK_TYPE_EXT_STATUS_BAR, NULL);
}
/******************************************************************************
* *
* Paramètres : bar = barre de statut à manipuler. *
* message = message à afficher pour l'utilisateur. *
* progressive = utilisation de la barre de progression. *
* *
* Description : Place un nouveau message dans la barre de statut. *
* *
* Retour : Identifiant du nouveau statut défini. *
* *
* Remarques : - *
* *
******************************************************************************/
guint gtk_extended_status_bar_push(GtkExtStatusBar *bar, const gchar *message, gboolean progressive)
{
guint result; /* Identifiant à retourner */
gdk_threads_enter();
result = gtk_statusbar_push(GTK_STATUSBAR(bar), bar->context, message);
bar->msg_count++;
bar->msg_id = (guint *)realloc(bar->msg_id, bar->msg_count * sizeof(guint));
bar->is_progressive = (gboolean *)realloc(bar->is_progressive, bar->msg_count * sizeof(gboolean));
bar->msg_id[bar->msg_count - 1] = result;
bar->is_progressive[bar->msg_count - 1] = progressive;
if (progressive)
{
gtk_progress_bar_set_fraction(bar->progress, 0.0);
gtk_progress_bar_set_text(bar->progress, "0%");
gtk_widget_show(GTK_WIDGET(bar->progress));
}
else gtk_widget_hide(GTK_WIDGET(bar->progress));
gdk_flush ();
gdk_threads_leave();
return result;
}
/******************************************************************************
* *
* Paramètres : bar = barre de statut à manipuler. *
* id = identifiant du message concerné. *
* value = valeur actuelle de la progression. *
* *
* Description : Met à jour la barre de progression de la barre de statut. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void gtk_extended_status_bar_update_activity(GtkExtStatusBar *bar, guint id, gdouble value)
{
gchar percent[5]; /* Pourcentage en version txt. */
if (bar->msg_count == 0) return;
if (id == bar->msg_id[bar->msg_count - 1] && bar->is_progressive[bar->msg_count - 1])
{
if (value != 1.0 && value - gtk_progress_bar_get_fraction(bar->progress) < 0.01)
return;
g_snprintf(percent, 5, "%.0f%%", value * 100);
gdk_threads_enter();
gtk_progress_bar_set_fraction(bar->progress, value);
gtk_progress_bar_set_text(bar->progress, percent);
gdk_threads_leave();
}
}
/******************************************************************************
* *
* Paramètres : bar = barre de statut à manipuler. *
* id = identifiant du statut à supprimer. *
* *
* Description : Retire de la barre un statut, visible ou non. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void gtk_extended_status_bar_remove(GtkExtStatusBar *bar, guint id)
{
size_t i; /* Boucle de parcours */
gdk_threads_enter();
gtk_statusbar_remove(GTK_STATUSBAR(bar), bar->context, id);
for (i = 0; i < bar->msg_count; i++)
if (bar->msg_id[i] == id)
break;
if ((i + 1) < bar->msg_count)
{
memmove(&bar->msg_id[i], &bar->msg_id[i + 1], (bar->msg_count - i - 1) * sizeof(guint));
memmove(&bar->is_progressive[i], &bar->is_progressive[i + 1], (bar->msg_count - i - 1) * sizeof(gboolean));
}
bar->msg_count--;
bar->msg_id = (guint *)realloc(bar->msg_id, bar->msg_count * sizeof(guint));
bar->is_progressive = (gboolean *)realloc(bar->is_progressive, bar->msg_count * sizeof(gboolean));
if (bar->msg_count > 0 && bar->is_progressive[bar->msg_count - 1])
gtk_widget_show(GTK_WIDGET(bar->progress));
else
gtk_widget_hide(GTK_WIDGET(bar->progress));
gdk_flush ();
gdk_threads_leave();
}