diff options
Diffstat (limited to 'src/gtkext/gtkdockpanel.c')
-rw-r--r-- | src/gtkext/gtkdockpanel.c | 116 |
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; } |