diff options
Diffstat (limited to 'src/gui/panel.c')
-rw-r--r-- | src/gui/panel.c | 114 |
1 files changed, 46 insertions, 68 deletions
diff --git a/src/gui/panel.c b/src/gui/panel.c index 2ebcdad..04f4844 100644 --- a/src/gui/panel.c +++ b/src/gui/panel.c @@ -34,6 +34,7 @@ #include "../common/extstr.h" #include "../core/params.h" #include "../gtkext/gtkdockable-int.h" +#include "../gtkext/named.h" @@ -108,12 +109,18 @@ G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM, static void g_panel_item_class_init(GPanelItemClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GEditorItemClass *item; /* Encore une autre vision... */ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_panel_item_dispose; object->finalize = (GObjectFinalizeFunc)g_panel_item_finalize; + item = G_EDITOR_ITEM_CLASS(klass); + + item->get_key = (get_item_key_fc)gtk_panel_item_get_name; + item->get_widget = (get_item_widget_fc)gtk_panel_item_get_widget; + g_signal_new("dock-request", G_TYPE_PANEL_ITEM, G_SIGNAL_RUN_LAST, @@ -153,6 +160,9 @@ static void g_panel_item_init(GPanelItem *item) item->personality = PIP_INVALID; + item->widget = NULL; + item->cached_widget = NULL; + item->filter = NULL; g_atomic_int_set(&item->switched, 0); @@ -198,7 +208,8 @@ static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface) static void g_panel_item_dispose(GPanelItem *item) { - g_clear_object(&item->builder); + g_clear_object(&item->widget); + g_clear_object(&item->cached_widget); G_OBJECT_CLASS(g_panel_item_parent_class)->dispose(G_OBJECT(item)); @@ -235,9 +246,7 @@ static void g_panel_item_finalize(GPanelItem *item) /****************************************************************************** * * * Paramètres : personality = nature du panneau à mettre en place. * -* name = nom associé à l'élément. * -* lname = description longue du panneau. * -* widget = composant à présenter à l'affichage. * +* widget = composant avec noms à présenter à l'affichage. * * startup = chargement au démarrage ? * * path = chemin vers la place idéale pour le futur panneau. * * * @@ -249,22 +258,17 @@ static void g_panel_item_finalize(GPanelItem *item) * * ******************************************************************************/ -GPanelItem *g_panel_item_new(PanelItemPersonality personality, const char *name, const char *lname, GtkWidget *widget, bool startup, const char *path) +GPanelItem *g_panel_item_new(PanelItemPersonality personality, GNamedWidget *widget, bool startup, const char *path) { GPanelItem *result; /* Structure à retourner */ - GEditorItem *parent; /* Autre version de l'élément */ result = g_object_new(G_TYPE_PANEL_ITEM, NULL); - parent = G_EDITOR_ITEM(result); - - parent->name = strdup(name); - parent->widget = widget; - assert(personality > PIP_INVALID && personality < PIP_COUNT); result->personality = personality; - result->lname = strdup(lname); + result->widget = widget; + g_object_ref(G_OBJECT(widget)); result->dock_at_startup = startup; result->path = strdup(path); @@ -276,62 +280,23 @@ GPanelItem *g_panel_item_new(PanelItemPersonality personality, const char *name, /****************************************************************************** * * -* Paramètres : item = panneau dont la construction est à poursuivre. * -* name = nom associé à l'élément dans les ressources globales. * -* * -* Description : Charge les éléments graphiques du panneau via les ressources.* -* * -* Retour : Constructeur mis en place, afin de faciliter son usage. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkBuilder *g_panel_item_build(GPanelItem *item, const char *name) -{ - GtkBuilder *result; /* Constructeur à retourner */ - char *path; /* Chemin d'accès à constituer */ - - asprintf(&path, "/org/chrysalide/gui/panels/%s.ui", name); - - result = g_panel_item_build_full(item, path); - - free(path); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = panneau dont la construction est à poursuivre. * -* path = chemin d'accès complet à la ressource à charger. * +* Paramètres : item = instance de panneau à consulter. * * * -* Description : Charge les éléments graphiques du panneau via les ressources.* +* Description : Indique le composant graphique principal du panneau. * * * -* Retour : Constructeur mis en place, afin de faciliter son usage. * +* Retour : Composant graphique avec nom constituant le panneau. * * * * Remarques : - * * * ******************************************************************************/ -GtkBuilder *g_panel_item_build_full(GPanelItem *item, const char *path) +GNamedWidget *gtk_panel_item_get_named_widget(const GPanelItem *item) { - GtkBuilder *result; /* Constructeur à retourner */ - GEditorItem *base; /* Version basique d'instance */ - - result = gtk_builder_new_from_resource(path); - - item->builder = result; + GNamedWidget *result; /* Composant nommé à retourner */ - base = G_EDITOR_ITEM(item); + result = item->widget; - base->widget = GTK_WIDGET(gtk_builder_get_object(result, "box")); - - g_object_ref(G_OBJECT(base->widget)); - - gtk_widget_unparent(base->widget); + g_object_ref(G_OBJECT(result)); return result; @@ -354,7 +319,7 @@ static char *gtk_panel_item_get_name(const GPanelItem *item) { char *result; /* Désignation à retourner */ - result = strdup(G_EDITOR_ITEM(item)->name); + result = g_named_widget_get_name(G_NAMED_WIDGET(item->widget), false); return result; @@ -377,7 +342,7 @@ static char *gtk_panel_item_get_desc(const GPanelItem *item) { char *result; /* Description à retourner */ - result = strdup(item->lname); + result = g_named_widget_get_name(G_NAMED_WIDGET(item->widget), true); return result; @@ -426,7 +391,10 @@ static GtkWidget *gtk_panel_item_get_widget(GPanelItem *item) { GtkWidget *result; /* Composant à retourner */ - result = G_EDITOR_ITEM(item)->widget; + if (item->cached_widget == NULL) + item->cached_widget = g_named_widget_get_widget(G_NAMED_WIDGET(item->widget)); + + result = item->cached_widget; g_object_ref(G_OBJECT(result)); @@ -479,7 +447,7 @@ static char *gtk_panel_item_build_configuration_key(const GPanelItem *item, cons char *result; /* Construction à renvoyer */ const char *name; /* Nom court du panneau */ - name = g_editor_item_get_name(G_EDITOR_ITEM(item)); + name = g_editor_item_get_key(G_EDITOR_ITEM(item)); asprintf(&result, "gui.panels.%s.%s", attrib, name); @@ -851,6 +819,7 @@ static gboolean g_panel_item_draw_mask(GtkWidget *widget, cairo_t *cr, GPanelIte void g_panel_item_switch_to_updating_mask(GPanelItem *item) { + GtkBuilder *builder; /* Constructeur sous-jacent */ GtkWidget *content; /* Composant à faire évoluer */ GdkWindow *window; /* Fenêtre au contenu à copier */ int width; /* Largeur du composant actuel */ @@ -867,7 +836,9 @@ void g_panel_item_switch_to_updating_mask(GPanelItem *item) assert(item->surface == NULL); - content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); + builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(item->widget)); + + content = GTK_WIDGET(gtk_builder_get_object(builder, "content")); window = gtk_widget_get_window(content); @@ -902,9 +873,9 @@ void g_panel_item_switch_to_updating_mask(GPanelItem *item) /* Opération de basculement effectif */ - stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); + stack = GTK_STACK(gtk_builder_get_object(builder, "stack")); - mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); + mask = GTK_WIDGET(gtk_builder_get_object(builder, "mask")); gtk_spinner_start(GTK_SPINNER(mask)); @@ -913,6 +884,8 @@ void g_panel_item_switch_to_updating_mask(GPanelItem *item) gtk_stack_set_visible_child(stack, mask); + g_object_unref(G_OBJECT(builder)); + } @@ -930,6 +903,7 @@ void g_panel_item_switch_to_updating_mask(GPanelItem *item) void g_panel_item_switch_to_updated_content(GPanelItem *item) { + GtkBuilder *builder; /* Constructeur sous-jacent */ GtkWidget *content; /* Composant à faire évoluer */ GtkAdjustment *adj; /* Défilement éventuel */ GtkStack *stack; /* Pile de composants GTK */ @@ -940,7 +914,9 @@ void g_panel_item_switch_to_updated_content(GPanelItem *item) /* Restauration d'une éventuelle position */ - content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); + builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(item->widget)); + + content = GTK_WIDGET(gtk_builder_get_object(builder, "content")); if (GTK_IS_SCROLLED_WINDOW(content)) { @@ -954,11 +930,11 @@ void g_panel_item_switch_to_updated_content(GPanelItem *item) /* Opération de basculement effectif */ - stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); + stack = GTK_STACK(gtk_builder_get_object(builder, "stack")); gtk_stack_set_visible_child(stack, content); - mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); + mask = GTK_WIDGET(gtk_builder_get_object(builder, "mask")); g_signal_handlers_disconnect_by_func(mask, G_CALLBACK(g_panel_item_draw_mask), item); @@ -972,6 +948,8 @@ void g_panel_item_switch_to_updated_content(GPanelItem *item) item->surface = NULL; } + g_object_unref(G_OBJECT(builder)); + skip: g_atomic_int_dec_and_test(&item->switched); |