diff options
Diffstat (limited to 'src/gtkext')
| -rw-r--r-- | src/gtkext/gtkbinview.c | 19 | ||||
| -rw-r--r-- | src/gtkext/gtkbinview.h | 3 | ||||
| -rw-r--r-- | src/gtkext/gtkdockitem.c | 23 | ||||
| -rw-r--r-- | src/gtkext/gtkdockitem.h | 4 | ||||
| -rw-r--r-- | src/gtkext/gtkdockpanel.c | 116 | ||||
| -rw-r--r-- | src/gtkext/gtkdockpanel.h | 9 | 
6 files changed, 150 insertions, 24 deletions
| diff --git a/src/gtkext/gtkbinview.c b/src/gtkext/gtkbinview.c index f049470..696799b 100644 --- a/src/gtkext/gtkbinview.c +++ b/src/gtkext/gtkbinview.c @@ -251,6 +251,25 @@ void gtk_bin_view_set_rendering_lines(GtkBinView *view, GOpenidaBinary *binary,  *                                                                             *  *  Paramètres  : view = composant GTK à consulter.                            *  *                                                                             * +*  Description : Fournit le binaire associé à la représentation.              * +*                                                                             * +*  Retour      : Représentation de contenu binaire.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GOpenidaBinary *gtk_bin_view_get_binary(const GtkBinView *view) +{ +    return view->binary; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : view = composant GTK à consulter.                            * +*                                                                             *  *  Description : Fournit la liste des lignes associées à la représentation.   *  *                                                                             *  *  Retour      : Ligne de représentation.                                     * diff --git a/src/gtkext/gtkbinview.h b/src/gtkext/gtkbinview.h index 945eefb..2dae0eb 100644 --- a/src/gtkext/gtkbinview.h +++ b/src/gtkext/gtkbinview.h @@ -59,6 +59,9 @@ void gtk_bin_view_show_border(GtkBinView *, bool);  /* Définit les lignes à associer à la représentation. */  void gtk_bin_view_set_rendering_lines(GtkBinView *, GOpenidaBinary *, GRenderingLine *, GRenderingLine *); +/* Fournit le binaire associé à la représentation. */ +GOpenidaBinary *gtk_bin_view_get_binary(const GtkBinView *); +  /* Fournit la liste des lignes associées à la représentation. */  GRenderingLine *gtk_bin_view_get_lines(const GtkBinView *); diff --git a/src/gtkext/gtkdockitem.c b/src/gtkext/gtkdockitem.c index fcef31d..89d606c 100644 --- a/src/gtkext/gtkdockitem.c +++ b/src/gtkext/gtkdockitem.c @@ -24,13 +24,15 @@  #include "gtkdockitem.h" +#include "iodamarshal.h" + +  /* Détermine le type d'un panneau dockable. */  G_DEFINE_TYPE(GtkDockItem, gtk_dock_item, GTK_TYPE_OBJECT) -  /******************************************************************************  *                                                                             *  *  Paramètres  : class = classe GTK à initialiser.                            * @@ -45,7 +47,13 @@ G_DEFINE_TYPE(GtkDockItem, gtk_dock_item, GTK_TYPE_OBJECT)  static void gtk_dock_item_class_init(GtkDockItemClass *class)  { - +    g_signal_new("content-changed", +                 GTK_TYPE_DOCK_ITEM, +                 G_SIGNAL_RUN_LAST, +                 G_STRUCT_OFFSET(GtkDockItemClass, content_changed), +                 NULL, NULL, +                 g_cclosure_user_marshal_VOID__OBJECT_OBJECT, +                 G_TYPE_NONE, 2, GTK_TYPE_WIDGET, GTK_TYPE_WIDGET);  } @@ -204,12 +212,19 @@ const gchar *gtk_dock_item_get_desc(GtkDockItem *ditem)  void gtk_dock_item_set_panel(GtkDockItem *ditem, GtkWidget *panel)  { -    if (ditem->panel != NULL) -        gtk_widget_unref(ditem->panel); +    GtkWidget *old;                         /* Ancien panneau remplacé     */ + +    old = ditem->panel;      ditem->panel = panel;      gtk_widget_ref(panel); +    if (old != NULL) +    { +        g_signal_emit_by_name(ditem, "content-changed", old, panel); +        gtk_widget_unref(old); +    } +  } diff --git a/src/gtkext/gtkdockitem.h b/src/gtkext/gtkdockitem.h index 906973c..851d8de 100644 --- a/src/gtkext/gtkdockitem.h +++ b/src/gtkext/gtkdockitem.h @@ -58,6 +58,10 @@ struct _GtkDockItemClass  {      GtkVBoxClass parent_class;              /* Présence obligatoire en 1er */ +    /* Signaux */ + +    void (* content_changed) (GtkDockItem *, GtkWidget *, GtkWidget *); +  }; 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;  } diff --git a/src/gtkext/gtkdockpanel.h b/src/gtkext/gtkdockpanel.h index 037ee26..2c0cda9 100644 --- a/src/gtkext/gtkdockpanel.h +++ b/src/gtkext/gtkdockpanel.h @@ -46,6 +46,8 @@ typedef struct _GtkDockPanel GtkDockPanel;  typedef struct _GtkDockPanelClass GtkDockPanelClass; +#include <stdbool.h> +  struct _GtkDockPanel  { @@ -64,6 +66,10 @@ struct _GtkDockPanelClass  {      GtkVBoxClass parent_class;              /* Présence obligatoire en 1er */ +    /* Signaux */ + +    void (* switch_item) (GtkDockPanel *, GtkDockItem *); +  }; @@ -79,9 +85,6 @@ GtkDockItem *gtk_dock_panel_item_from_name(GtkDockPanel *, const char *);  /* Ajoute un paquet d'informations à la station dockable. */  void gtk_dock_panel_add_item(GtkDockPanel *, GtkDockItem *); -/* Remplace le panneau d'un membre actuellement affiché. */ -void gtk_dock_panel_replace_item_content(GtkDockPanel *, GtkDockItem *, GtkWidget *); -  /* Supprime un paquet d'informations à la station dockable. */  void gtk_dock_panel_remove_item(GtkDockPanel *, GtkDockItem *); | 
