summaryrefslogtreecommitdiff
path: root/src/gui/core/panels.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/core/panels.c')
-rw-r--r--src/gui/core/panels.c173
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;
}