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;  }  | 
