summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkdockpanel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkdockpanel.c')
-rw-r--r--src/gtkext/gtkdockpanel.c116
1 files changed, 99 insertions, 17 deletions
diff --git a/src/gtkext/gtkdockpanel.c b/src/gtkext/gtkdockpanel.c
index 536d21b..1d9548f 100644
--- a/src/gtkext/gtkdockpanel.c
+++ b/src/gtkext/gtkdockpanel.c
@@ -29,6 +29,7 @@
#include "gtkdropwindow.h"
+#include "iodamarshal.h"
@@ -54,7 +55,16 @@ static void gtk_dock_panel_drag_data_get_cb(GtkDockPanel *, GdkDragContext *, Gt
static void gtk_dock_panel_drag_end_cb(GtkDockPanel *, GdkDragContext *, gpointer);
/* Nettoie les traces d'un "Drag and drop". */
-static void gtk_dock_panel_drag_data_delete_cb(GtkDockPanel *, GdkDragContext *, gpointer);
+//static void gtk_dock_panel_drag_data_delete_cb(GtkDockPanel *, GdkDragContext *, gpointer);
+
+/* Ajoute un paquet d'informations à la station dockable. */
+static void _gtk_dock_panel_add_item(GtkDockPanel *, GtkDockItem *, gint);
+
+/* Remplace le panneau d'un membre actuellement affiché. */
+static void on_dock_item_content_changed(GtkDockItem *, GtkWidget *, GtkWidget *, GtkDockPanel *);
+
+/* Supprime un paquet d'informations à la station dockable. */
+static void _gtk_dock_panel_remove_item(GtkDockPanel *, GtkDockItem *, GtkWidget *);
/* Met à jour le titre du support de panneaux dockables. */
static gboolean gtk_dock_panel_update_title(GtkNotebook *, GtkNotebookPage *, guint, gpointer);
@@ -114,7 +124,13 @@ G_DEFINE_TYPE(GtkDockPanel, gtk_dock_panel, GTK_TYPE_VBOX)
static void gtk_dock_panel_class_init(GtkDockPanelClass *class)
{
-
+ g_signal_new("switch-item",
+ GTK_TYPE_DOCK_PANEL,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GtkDockPanelClass, switch_item),
+ NULL, NULL,
+ g_cclosure_user_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, GTK_TYPE_DOCK_ITEM);
}
@@ -231,7 +247,6 @@ static void gtk_dock_panel_init(GtkDockPanel *dpanel)
dpanel->dropwin = gtk_drop_window_new();
-
/* Make the "well label" a DnD destination. */
gtk_drag_dest_set
(
@@ -562,31 +577,51 @@ GtkDockItem *gtk_dock_panel_item_from_name(GtkDockPanel *dpanel, const char *nam
void gtk_dock_panel_add_item(GtkDockPanel *dpanel, GtkDockItem *ditem)
{
+ _gtk_dock_panel_add_item(dpanel, ditem, -1);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : dpanel = composant GTK à compléter. *
+* ditem = nouvel élément à intégrer. *
+* position = point d'insertion (-1 pour la fin). *
+* *
+* Description : Ajoute un paquet d'informations à la station dockable. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void _gtk_dock_panel_add_item(GtkDockPanel *dpanel, GtkDockItem *ditem, gint position)
+{
GtkWidget *label; /* Etiquette d'onglet */
- dpanel->ditems = g_list_append(dpanel->ditems, ditem);
+ dpanel->ditems = g_list_insert(dpanel->ditems, ditem, position);
printf("[add %p to %p] list len :: %u\n", ditem, dpanel, g_list_length(dpanel->ditems));
- gtk_container_add(GTK_CONTAINER(dpanel->notebook), gtk_dock_item_get_panel(ditem));
-
label = gtk_label_new(gtk_dock_item_get_name(ditem));
gtk_widget_show(label);
- gtk_notebook_set_tab_label(dpanel->notebook,
- gtk_notebook_get_nth_page(dpanel->notebook, gtk_notebook_get_n_pages(dpanel->notebook) - 1),
- label);
+ gtk_notebook_insert_page(dpanel->notebook, gtk_dock_item_get_panel(ditem), label, position);
gtk_notebook_set_show_tabs(dpanel->notebook, g_list_length(dpanel->ditems) > 1);
+ g_signal_connect(ditem, "content-changed", G_CALLBACK(on_dock_item_content_changed), dpanel);
+
}
/******************************************************************************
* *
-* Paramètres : dpanel = composant GTK à mettre à jour. *
-* ditem = nouvel élément à sortir. *
-* panel = nouveau panneau à présenter. *
+* Paramètres : ditem = composant GTK déjà mis à jour. *
+* old = ancien panneau retiré. *
+* new = nouveau panneau présenté. *
+* dpanel = composant GTK à mettre à jour. *
* *
* Description : Remplace le panneau d'un membre actuellement affiché. *
* *
@@ -596,14 +631,21 @@ void gtk_dock_panel_add_item(GtkDockPanel *dpanel, GtkDockItem *ditem)
* *
******************************************************************************/
-void gtk_dock_panel_replace_item_content(GtkDockPanel *dpanel, GtkDockItem *ditem, GtkWidget *panel)
+static void on_dock_item_content_changed(GtkDockItem *ditem, GtkWidget *old, GtkWidget *new, GtkDockPanel *dpanel)
{
- gtk_widget_ref(gtk_dock_item_get_panel(ditem));
- gtk_container_remove(GTK_CONTAINER(dpanel->notebook), gtk_dock_item_get_panel(ditem));
+ gint position; /* Position de l'onglet à maj */
+
+ position = gtk_notebook_page_num(dpanel->notebook, old);
+
+ g_signal_handlers_disconnect_by_func(dpanel->notebook, G_CALLBACK(gtk_dock_panel_update_title), dpanel);
- gtk_dock_item_set_panel(ditem, panel);
+ _gtk_dock_panel_remove_item(dpanel, ditem, old);
+ _gtk_dock_panel_add_item(dpanel, ditem, position);
+
+ gtk_notebook_set_current_page(dpanel->notebook, position);
+
+ g_signal_connect(dpanel->notebook, "switch-page", G_CALLBACK(gtk_dock_panel_update_title), dpanel);
- gtk_container_add(GTK_CONTAINER(dpanel->notebook), gtk_dock_item_get_panel(ditem));
}
@@ -625,6 +667,8 @@ void gtk_dock_panel_remove_item(GtkDockPanel *dpanel, GtkDockItem *ditem)
{
gint pos; /* Position de l'élément visé */
+ g_signal_handlers_disconnect_by_func(ditem, G_CALLBACK(on_dock_item_content_changed), dpanel);
+
pos = g_list_index(dpanel->ditems, ditem);
dpanel->ditems = g_list_remove(dpanel->ditems, ditem);
@@ -643,6 +687,42 @@ void gtk_dock_panel_remove_item(GtkDockPanel *dpanel, GtkDockItem *ditem)
/******************************************************************************
* *
+* Paramètres : dpanel = composant GTK à mettre à jour. *
+* ditem = nouvel élément à sortir. *
+* panel = panneau GTK de l'élément à supprimer. *
+* *
+* Description : Supprime un paquet d'informations à la station dockable. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void _gtk_dock_panel_remove_item(GtkDockPanel *dpanel, GtkDockItem *ditem, GtkWidget *panel)
+{
+ gint pos; /* Position de l'élément visé */
+
+ g_signal_handlers_disconnect_by_func(ditem, G_CALLBACK(on_dock_item_content_changed), dpanel);
+
+ pos = g_list_index(dpanel->ditems, ditem);
+
+ dpanel->ditems = g_list_remove(dpanel->ditems, ditem);
+
+ printf("[rem %p from %p] list len :: %u\n", ditem, dpanel, g_list_length(dpanel->ditems));
+
+ gtk_widget_ref(panel);
+ gtk_container_remove(GTK_CONTAINER(dpanel->notebook), panel);
+
+ //gtk_notebook_remove_page(dpanel->notebook, pos);
+
+ gtk_notebook_set_show_tabs(dpanel->notebook, g_list_length(dpanel->ditems) > 1);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : notebook = support à l'origine de la mise à jour. *
* page = onglet mis en avant. *
* index = indice de l'onglet actuellement actif. *
@@ -685,6 +765,8 @@ static gboolean gtk_dock_panel_update_title(GtkNotebook *notebook, GtkNotebookPa
free(str);
+ g_signal_emit_by_name(GTK_DOCK_PANEL(data), "switch-item", ditem);
+
return TRUE;
}