diff options
Diffstat (limited to 'src/gui/core/panels.c')
-rw-r--r-- | src/gui/core/panels.c | 173 |
1 files changed, 45 insertions, 128 deletions
diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 8505f37..1b6f604 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -25,10 +25,10 @@ #include "panels.h" +#include <assert.h> #include <malloc.h> -#include "global.h" #include "items.h" #include "../panel-int.h" #include "../panels/bintree.h" @@ -42,12 +42,12 @@ #include "../panels/symbols.h" #include "../panels/welcome.h" #include "../../core/params.h" -#include "../../gtkext/gtkdockable.h" -/* Liste des panneaux en place. */ -static GPanelItem *_panels_list = NULL; +/* Liste des panneaux disponibles */ +static GType *_panels_list = NULL; +static size_t _panels_count = 0; @@ -66,46 +66,32 @@ static GPanelItem *_panels_list = NULL; void load_main_panels(void) { GGenConfig *config; /* Configuration globale */ - GPanelItem *item; /* Panneau de base à charger */ + GPanelItem *panel; /* Panneau à précharger */ config = get_main_configuration(); - item = g_welcome_panel_new(); - register_panel_item(item, config); + register_panel_item(G_TYPE_LOG_PANEL, config); - item = g_log_panel_new(); - register_panel_item(item, config); + /* Chargement du panneau de rapport au plus tôt */ + panel = g_panel_item_new(G_TYPE_LOG_PANEL, NULL); + g_object_unref(G_OBJECT(panel)); - item = g_regedit_panel_new(); - register_panel_item(item, config); - - item = g_symbols_panel_new(); - register_panel_item(item, config); - - item = g_history_panel_new(); - register_panel_item(item, config); - - item = g_strings_panel_new(); - register_panel_item(item, config); - - item = g_glance_panel_new(); - register_panel_item(item, config); - - item = g_bookmarks_panel_new(); - register_panel_item(item, config); - - item = g_bintree_panel_new(); - register_panel_item(item, config); - - item = g_error_panel_new(); - register_panel_item(item, config); + register_panel_item(G_TYPE_WELCOME_PANEL, config); + register_panel_item(G_TYPE_REGEDIT_PANEL, config); + register_panel_item(G_TYPE_SYMBOLS_PANEL, config); + register_panel_item(G_TYPE_HISTORY_PANEL, config); + register_panel_item(G_TYPE_STRINGS_PANEL, config); + register_panel_item(G_TYPE_GLANCE_PANEL, config); + register_panel_item(G_TYPE_BOOKMARKS_PANEL, config); + register_panel_item(G_TYPE_BINTREE_PANEL, config); + register_panel_item(G_TYPE_ERROR_PANEL, config); } /****************************************************************************** * * -* Paramètres : item = composant à présenter à l'affichage. * +* Paramètres : type = type du composant à présenter à l'affichage. * * config = configuration à compléter. * * * * Description : Enregistre un panneau comme partie intégrante de l'éditeur. * @@ -116,46 +102,27 @@ void load_main_panels(void) * * ******************************************************************************/ -void register_panel_item(GPanelItem *item, GGenConfig *config) +void register_panel_item(GType type, GGenConfig *config) { - GEditorItem *parent; /* Autre version de l'élément */ + GPanelItemClass *class; /* Classe associée au type */ +#ifndef NDEBUG + bool status; /* Bilan de mise en place */ +#endif - parent = G_EDITOR_ITEM(item); + _panels_list = realloc(_panels_list, ++_panels_count * sizeof(GType)); - /* Enregistre correctement le tout */ - register_editor_item(parent); - panels_list_add_tail(item, &_panels_list); + _panels_list[_panels_count - 1] = type; - activate_panel_item(item, config); + class = g_type_class_ref(type); -} +#ifndef NDEBUG + status = gtk_panel_item_class_setup_configuration(class, config); + assert(status); +#else + gtk_panel_item_class_setup_configuration(class, config); +#endif - -/****************************************************************************** -* * -* Paramètres : item = composant à présenter à l'affichage. * -* config = configuration à compléter. * -* * -* Description : Intègre un panneau comme partie intégrante de l'éditeur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void activate_panel_item(GPanelItem *item, GGenConfig *config) -{ - GtkTiledGrid *grid; /* Composant d'affichage */ - - grid = get_tiled_grid(); - - g_signal_connect_swapped(item, "dock-request", G_CALLBACK(gtk_tiled_grid_add), grid); - g_signal_connect_swapped(item, "undock-request", G_CALLBACK(gtk_tiled_grid_remove), grid); - - gtk_dockable_setup_dnd(GTK_DOCKABLE(item)); - - gtk_panel_item_setup_configuration(item, config); + g_type_class_unref(class); } @@ -177,79 +144,29 @@ void activate_panel_item(GPanelItem *item, GGenConfig *config) bool _browse_all_item_panels(bool skip, handle_panel_item_fc handle, void *data) { bool result; /* Résultat à renvoyer */ - GPanelItem *welcome; /* Panneau d'accueil */ - GPanelItem *iter; /* Boucle de parcours */ + GType type; /* Type de panneau à traiter */ + size_t i; /* Boucle de parcours */ + GPanelItemClass *class; /* Classe associée au type */ result = true; - if (skip) - welcome = get_panel_item_by_name(PANEL_WELCOME_ID); - else - welcome = NULL; - - panels_list_for_each(iter, _panels_list) + for (i = 0; i < _panels_count; i++) { - if (skip && iter == welcome) - continue; + type = _panels_list[i]; - result = handle(iter, data); - - if (!result) break; - - } - - g_clear_object(&welcome); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : name = désignation courte servant de clef. * -* * -* Description : Recherche un panneau à partir de son nom court. * -* * -* Retour : Panneau trouvé ou NULL si aucun. * -* * -* Remarques : Le parcours peut se faire aussi depuis la classe parente, * -* mais il est plus rapide par ici. * -* * -******************************************************************************/ - -GPanelItem *get_panel_item_by_name(const char *name) -{ - GPanelItem *result; /* Trouvaille à retourner */ - - bool look_for_named_panel(GPanelItem *item, GPanelItem **found) - { - char *key; /* Clef à utiliser */ - bool status; /* Bilan de la comparaison */ + if (skip && type == G_TYPE_WELCOME_PANEL) + continue; - key = g_editor_item_get_key(G_EDITOR_ITEM(item)); + class = g_type_class_ref(type); - if (strcmp(key, name) == 0) - { - *found = item; - status = false; - } - else - status = true; + result = handle(class, data); - free(key); + g_type_class_unref(class); - return status; + if (!result) break; } - result = NULL; - - browse_all_item_panels((handle_panel_item_fc)look_for_named_panel, &result); - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - return result; } |