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