/* OpenIDA - Outil d'analyse de fichiers binaires * gtkextstatusbar.h - prototypes pour la barre de statut améliorée * * Copyright (C) 2009-2012 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(); }