diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-09-13 23:11:24 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-09-13 23:11:24 (GMT) |
commit | 1c4da24a1d4b96d58fee08e2be21198b22e7eef6 (patch) | |
tree | a0723bd1948395413fa5a7a37a9405567e32c015 /src/gtkext | |
parent | 18134387d5cb025703af8e1d07e0152784e31efc (diff) |
Improved the editor window refreshing when several binaries are loaded.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@114 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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 *); |