summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-09-13 23:11:24 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-09-13 23:11:24 (GMT)
commit1c4da24a1d4b96d58fee08e2be21198b22e7eef6 (patch)
treea0723bd1948395413fa5a7a37a9405567e32c015 /src/gtkext
parent18134387d5cb025703af8e1d07e0152784e31efc (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.c19
-rw-r--r--src/gtkext/gtkbinview.h3
-rw-r--r--src/gtkext/gtkdockitem.c23
-rw-r--r--src/gtkext/gtkdockitem.h4
-rw-r--r--src/gtkext/gtkdockpanel.c116
-rw-r--r--src/gtkext/gtkdockpanel.h9
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 *);