[dia] Old DiagramTree ported to new change signaling mechanism



commit 9e65e51530ac0c41e0e9e807c2cf4b1c6985a055
Author: Hans Breuer <hans breuer org>
Date:   Sat Apr 25 13:39:39 2009 +0200

    Old DiagramTree ported to new change signaling mechanism
    
    To simplify the removal of the old DiagramTree it got ported to
    the new signaling mechanism via DiaApplication. Instead of
    sprinkling a lot of diagram_tree_*() calls through the code the
    DiagramTree object just listens on DiaApplication and Diagram
    to react on the relevant changes.
    
    Stuff like LayerDialog and 'recent files' should be ported, too.
---
 app/Makefile.am         |    3 +
 app/commands.c          |    4 +-
 app/dia-application.c   |  126 +++++++++++++++++++++++++++++++++++++++++++++++
 app/dia-application.h   |   15 ++++++
 app/diagram.c           |   21 ++++----
 app/diagram_tree.c      |   81 ++++++++++++++++++++++++++++++-
 app/diagram_tree.h      |   20 -------
 app/diagram_tree_view.c |    3 +
 app/makefile.msc        |    2 +
 app/textedit.c          |    1 +
 app/undo.c              |   27 ++--------
 lib/diamarshal.list     |    2 +
 lib/layer.c             |   21 +++++++-
 lib/libdia.def          |    3 +
 14 files changed, 273 insertions(+), 56 deletions(-)

diff --git a/app/Makefile.am b/app/Makefile.am
index 6f18451..2d87c7b 100644
--- a/app/Makefile.am
+++ b/app/Makefile.am
@@ -189,6 +189,9 @@ dia_core_files = \
 	diagram_tree_menu_callbacks.h \
 	diagram_tree_menu_callbacks.c \
 	\
+	dia-application.h \
+	dia-application.c \
+	\
 	diagram_tree_model.c \
 	diagram_tree_model.h \
 	diagram_tree_view.c \
diff --git a/app/commands.c b/app/commands.c
index 40b7dc1..f81d6ac 100644
--- a/app/commands.c
+++ b/app/commands.c
@@ -38,6 +38,7 @@
 #include <textedit.h>
 #include <focus.h>
 #include "confirm.h"
+#include "dia-application.h"
 
 /** Functions called on menu selects.
  *  Note that GTK (at least up to 2.12) doesn't disable the keyboard shortcuts
@@ -86,7 +87,6 @@ ShellExecuteA (long        hwnd,
 #include "lib/properties.h"
 #include "lib/parent.h"
 #include "dia-props.h"
-#include "diagram_tree_window.h"
 #include "authors.h"                /* master contributors data */
 
 void 
@@ -151,7 +151,7 @@ file_new_callback (GtkAction *action)
   filename = g_filename_from_utf8(name, -1, NULL, NULL, NULL);
   dia = new_diagram(filename);
   ddisp = new_display(dia);
-  diagram_tree_add(diagram_tree(), dia);
+  dia_diagram_add (dia); /* notify DiagramTree etc. */
   g_free (name);
   g_free (filename);
 }
diff --git a/app/dia-application.c b/app/dia-application.c
new file mode 100644
index 0000000..fed6f88
--- /dev/null
+++ b/app/dia-application.c
@@ -0,0 +1,126 @@
+/*
+create_diagram_tree_window
+diagram_tree
+diagtree_show_callback
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "dia-application.h"
+#include "display.h"
+
+#include <lib/diamarshal.h>
+
+enum {
+  DIAGRAM_ADD,
+  DIAGRAM_CHANGE,
+  DIAGRAM_REMOVE,
+  
+  DISPLAY_ADD,
+  DISPLAY_CHANGE,
+  DISPLAY_REMOVE,
+  
+  LAST_SIGNAL
+};
+
+static guint _dia_application_signals[LAST_SIGNAL] = { 0, };
+
+typedef struct _DiaApplicationClass DiaApplicationClass;
+struct _DiaApplicationClass
+{
+  GObjectClass parent_class;
+  
+  /* signalsing global state changes */
+  void (*diagram_add)    (DiaApplication *app, Diagram *diagram);
+  void (*diagram_change) (DiaApplication *app, Diagram *diagram, guint flags);
+  void (*diagram_remove) (DiaApplication *app, Diagram *diagram);
+  
+  void (*display_add)    (DiaApplication *app, DDisplay *display);
+  void (*display_change) (DiaApplication *app, DDisplay *display, guint flags);
+  void (*display_remove) (DiaApplication *app, DDisplay *display);
+};
+
+/**
+ * The central place managing global state changes like (dis-)appearance of diagrams
+ */
+struct _DiaApplication
+{
+  GObject parent;
+};
+
+#define DIA_TYPE_APPLICATION (dia_application_get_type ())
+
+G_DEFINE_TYPE (DiaApplication, dia_application, G_TYPE_OBJECT);
+
+static void
+dia_application_class_init (DiaApplicationClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  
+  _dia_application_signals[DIAGRAM_ADD] =
+    g_signal_new ("diagram_add",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (DiaApplicationClass, diagram_add),
+                  NULL, NULL,
+                  dia_marshal_VOID__OBJECT,
+                  G_TYPE_NONE, 
+                  1,
+		  DIA_TYPE_DIAGRAM);
+  _dia_application_signals[DIAGRAM_CHANGE] =
+    g_signal_new ("diagram_change",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (DiaApplicationClass, diagram_change),
+                  NULL, NULL,
+                  dia_marshal_VOID__OBJECT_UINT_POINTER,
+                  G_TYPE_NONE, 
+                  3,
+		  DIA_TYPE_DIAGRAM, G_TYPE_UINT, G_TYPE_POINTER);
+  _dia_application_signals[DIAGRAM_REMOVE] =
+    g_signal_new ("diagram_remove",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (DiaApplicationClass, diagram_remove),
+                  NULL, NULL,
+                  dia_marshal_VOID__OBJECT,
+                  G_TYPE_NONE, 
+                  1,
+		  DIA_TYPE_DIAGRAM);
+}
+
+static void 
+dia_application_init (DiaApplication *app)
+{
+}
+
+/* ensure the singleton is available */
+DiaApplication *
+dia_application_get (void)
+{
+  static DiaApplication *app = NULL;
+  
+  if (!app)
+    app = g_object_new (DIA_TYPE_APPLICATION, NULL);
+  
+  return app;
+}
+
+void
+dia_diagram_add (Diagram *dia)
+{
+  g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_ADD], 0, dia);
+}
+void
+dia_diagram_remove (Diagram *dia)
+{
+  g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_REMOVE], 0, dia);
+}
+
+void 
+dia_diagram_change (Diagram *dia, guint flags, gpointer object)
+{
+  g_signal_emit (dia_application_get (), _dia_application_signals[DIAGRAM_CHANGE], 0, dia, flags, object);
+}
diff --git a/app/dia-application.h b/app/dia-application.h
new file mode 100644
index 0000000..dbfdbc1
--- /dev/null
+++ b/app/dia-application.h
@@ -0,0 +1,15 @@
+#include "diagram.h"
+
+typedef struct _DiaApplication DiaApplication;
+
+enum {
+  DIAGRAM_CHANGE_NAME   = (1<<0),
+  DIAGRAM_CHANGE_LAYER  = (1<<1),
+  DIAGRAM_CHANGE_OBJECT = (1<<2)
+};
+
+DiaApplication * dia_application_get (void);
+
+void dia_diagram_add    (Diagram *dia);
+void dia_diagram_change (Diagram *dia, guint flags, gpointer object);
+void dia_diagram_remove (Diagram *dia);
diff --git a/app/diagram.c b/app/diagram.c
index 14e4b01..fb2a292 100644
--- a/app/diagram.c
+++ b/app/diagram.c
@@ -37,7 +37,7 @@
 #include "dia_dirs.h"
 #include "load_save.h"
 #include "recent_files.h"
-#include "diagram_tree_window.h"
+#include "dia-application.h"
 #include "autosave.h"
 #include "dynamic_refresh.h"
 #include "textedit.h"
@@ -112,7 +112,7 @@ diagram_finalize(GObject *object)
     undo_destroy(dia->undo);
   dia->undo = NULL;
   
-  diagram_tree_remove(diagram_tree(), dia);
+  dia_diagram_remove(dia);
 
   diagram_cleanup_autosave(dia);
 
@@ -321,7 +321,7 @@ diagram_load(const char *filename, DiaImportFilter *ifilter)
     diagram_set_modified(diagram, FALSE);
     if (app_is_interactive()) {
       recent_file_history_add(filename);
-      diagram_tree_add(diagram_tree(), diagram);
+      dia_diagram_add(diagram);
     }
   }
   
@@ -659,8 +659,6 @@ diagram_add_object(Diagram *dia, DiaObject *obj)
   layer_add_object(dia->data->active_layer, obj);
 
   diagram_modified(dia);
-
-  diagram_tree_add_object(diagram_tree(), dia, obj);
 }
 
 void
@@ -669,8 +667,6 @@ diagram_add_object_list(Diagram *dia, GList *list)
   layer_add_objects(dia->data->active_layer, list);
 
   diagram_modified(dia);
-
-  diagram_tree_add_objects(diagram_tree(), dia, list);
 }
 
 void
@@ -733,7 +729,7 @@ diagram_selected_break_external(Diagram *dia)
 	connected_list = g_list_next(connected_list);
       }
     }
-    diagram_tree_remove_object(diagram_tree(), obj);
+    data_emit (dia->data, dia_object_get_parent_layer(obj), obj, "object_remove");
     list = g_list_next(list);
   }
 }
@@ -1504,7 +1500,8 @@ diagram_update_for_filename(Diagram *dia)
 
   layer_dialog_update_diagram_list();
 
-  diagram_tree_update_name(diagram_tree(), dia);
+  /* signal about the change */
+  dia_diagram_change (dia, DIAGRAM_CHANGE_NAME, NULL);
 }
 
 /** Returns a string with a 'sensible' (human-readable) name for the
@@ -1535,7 +1532,9 @@ int diagram_modified_exists(void)
   return FALSE;
 }
 
-void diagram_object_modified(Diagram *dia, DiaObject *object)
+void 
+diagram_object_modified(Diagram *dia, DiaObject *object)
 {
-  diagram_tree_update_object(diagram_tree(), dia, object);
+  /* signal about the change */
+  dia_diagram_change (dia, DIAGRAM_CHANGE_OBJECT, object);
 }
diff --git a/app/diagram_tree.c b/app/diagram_tree.c
index e341bd4..dddd557 100644
--- a/app/diagram_tree.c
+++ b/app/diagram_tree.c
@@ -32,6 +32,7 @@
 #include "diagram_tree_menu_callbacks.h"
 #include "diagram_tree.h"
 #include "persistence.h"
+#include "dia-application.h"
 
 /* delete a tree (the widget is destroyed, but not the diagrams */
 static void diagram_tree_delete(DiagramTree *tree);
@@ -63,6 +64,16 @@ find_hidden_type(gconstpointer type, gconstpointer object_type)
 
 static void
 update_object(DiagramTree *tree, GtkCTreeNode *node, DiaObject *object);
+static void
+diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
+static void
+diagram_tree_remove_object(DiagramTree *tree, DiaObject *object);
+static void
+diagram_tree_remove_objects(DiagramTree *tree, GList *objects);
+static void
+diagram_tree_update_name(DiagramTree *tree, Diagram *diagram);
+static void
+diagram_tree_update_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
 
 static void
 select_node(DiagramTree *tree, GtkCTreeNode *node, gboolean raise)
@@ -326,6 +337,33 @@ update_diagram_children(DiagramTree *tree, GtkCTreeNode *node,
   sort_objects(tree, node);
 }
 
+/* listen to diagram creation */
+static void
+_diagram_add (DiaApplication *app,
+              Diagram        *dia,
+	      DiagramTree    *tree)
+{
+  diagram_tree_add(tree, dia);
+}
+static void
+_diagram_change (DiaApplication *app,
+                 Diagram        *dia,
+		 guint           flags,
+		 gpointer        object,
+	         DiagramTree    *tree)
+{
+  if (flags & DIAGRAM_CHANGE_NAME)
+    diagram_tree_update_name (tree, dia);
+  if (flags & DIAGRAM_CHANGE_OBJECT)
+    diagram_tree_update_object (tree, dia, object);
+}
+static void
+_diagram_remove (DiaApplication *app,
+                 Diagram        *dia,
+	         DiagramTree    *tree)
+{
+  diagram_tree_remove(tree, dia);
+}
 /* external interface */
 DiagramTree*
 diagram_tree_new(GList *diagrams, GtkWindow *window,
@@ -342,6 +380,20 @@ diagram_tree_new(GList *diagrams, GtkWindow *window,
 		     "button_press_event",
 		   G_CALLBACK(button_press_callback),
 		     (gpointer)result);
+		     
+  g_signal_connect (G_OBJECT (dia_application_get ()),
+                    "diagram_add",
+		    G_CALLBACK (_diagram_add),
+		    result);
+  g_signal_connect (G_OBJECT (dia_application_get ()),
+                    "diagram_change",
+		    G_CALLBACK (_diagram_change),
+		    result);
+  g_signal_connect (G_OBJECT(dia_application_get ()),
+                    "diagram_add",
+		    G_CALLBACK (_diagram_add),
+		    result);
+
   while (diagrams) {
     diagram_tree_add(result, (Diagram *)diagrams->data);
     diagrams = g_list_next(diagrams);
@@ -364,6 +416,27 @@ diagram_tree_delete(DiagramTree *tree)
   gtk_widget_destroy(GTK_WIDGET(tree->tree));
 }
 
+static void
+_object_add (DiagramData *dia,
+	     Layer       *layer,
+             DiaObject   *obj,
+	     DiagramTree *tree)
+{
+  g_return_if_fail (DIA_DIAGRAM(dia) != NULL);
+  
+  diagram_tree_add_object (tree, DIA_DIAGRAM(dia), obj);
+}
+static void
+_object_remove(DiagramData *dia,
+	       Layer       *layer,
+               DiaObject   *obj,
+	       DiagramTree *tree)
+{
+  g_return_if_fail (DIA_DIAGRAM(dia) != NULL);
+  
+  diagram_tree_remove_object (tree, obj);
+}
+
 void
 diagram_tree_add(DiagramTree *tree, Diagram *diagram)
 {
@@ -378,6 +451,9 @@ diagram_tree_add(DiagramTree *tree, Diagram *diagram)
             gtk_ctree_node_set_row_data(tree->tree, node, (gpointer)diagram);
             create_diagram_children(tree, node, diagram);
             sort_diagrams(tree);
+	    
+	    g_signal_connect (G_OBJECT(diagram), "object_add", G_CALLBACK(_object_add), tree);
+	    g_signal_connect (G_OBJECT(diagram), "object_remove", G_CALLBACK(_object_remove), tree);
         }
     }
 }
@@ -391,6 +467,9 @@ diagram_tree_remove(DiagramTree *tree, Diagram *diagram)
 	&& (node = gtk_ctree_find_by_row_data(tree->tree, NULL,
 					      (gpointer)diagram)))
       gtk_ctree_remove_node(tree->tree, node);
+
+      g_signal_handlers_disconnect_by_func (diagram, _object_add, tree);
+      g_signal_handlers_disconnect_by_func (diagram, _object_remove, tree);
   }
 }
 
@@ -435,7 +514,7 @@ diagram_tree_update_name(DiagramTree *tree, Diagram *diagram)
   }
 }
 
-void
+static void
 diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object)
 {
   if (tree) {
diff --git a/app/diagram_tree.h b/app/diagram_tree.h
index a71cd1b..bfe609c 100644
--- a/app/diagram_tree.h
+++ b/app/diagram_tree.h
@@ -63,26 +63,6 @@ diagram_tree_update_all(DiagramTree *tree);
 extern void
 diagram_tree_update(DiagramTree *tree, Diagram *diagram);
 
-extern void
-diagram_tree_update_name(DiagramTree *tree, Diagram *diagram);
-
-/* add/remove an object in a diagram already contained in the tree */
-extern void
-diagram_tree_add_object(DiagramTree *tree, Diagram *diagram, DiaObject *object);
-
-extern void
-diagram_tree_add_objects(DiagramTree *tree, Diagram *diagram, GList *objects);
-
-extern void
-diagram_tree_remove_object(DiagramTree *tree, DiaObject *object);
-
-extern void
-diagram_tree_remove_objects(DiagramTree *tree, GList *objects);
-
-extern void
-diagram_tree_update_object(DiagramTree *tree, Diagram *diagram,
-			   DiaObject *object);
-
 /* operations on the last clicked node */
 extern void
 diagram_tree_raise(DiagramTree *tree);
diff --git a/app/diagram_tree_view.c b/app/diagram_tree_view.c
index d7d4bba..597fb38 100644
--- a/app/diagram_tree_view.c
+++ b/app/diagram_tree_view.c
@@ -509,6 +509,9 @@ diagram_tree_show (void)
     /* expand all rows after the treeview widget has been realized */
     g_signal_connect (dtv, "realize",
 		      G_CALLBACK (gtk_tree_view_expand_all), NULL);
+    g_signal_connect (GTK_OBJECT (window), "destroy",
+		      G_CALLBACK (gtk_widget_destroyed),
+		      &window);
 
     if (!GTK_WIDGET_VISIBLE (window))
       gtk_widget_show_all (window);
diff --git a/app/makefile.msc b/app/makefile.msc
index 1c9fa77..a62864f 100644
--- a/app/makefile.msc
+++ b/app/makefile.msc
@@ -78,6 +78,8 @@ OBJECTS = \
 	\
 	diagram_tree_model.obj \
 	diagram_tree_view.obj \
+	\
+	dia-application.obj
 
 ICON_PNG_PAIRS = \
 	dia_connectable_icon pixmaps\connectable.png \
diff --git a/app/textedit.c b/app/textedit.c
index 4890125..5de4832 100644
--- a/app/textedit.c
+++ b/app/textedit.c
@@ -159,6 +159,7 @@ textedit_end_edit(DDisplay *ddisp, Focus *focus)
   */
   highlight_object_off(focus->obj, ddisp->diagram);
   object_add_updates(focus->obj, ddisp->diagram);
+  diagram_object_modified(ddisp->diagram, focus->obj);
 /* Undo not quite ready yet
   change = (TextEditChange *) undo_remove_to(ddisp->diagram->undo,
 					     text_edit_apply);
diff --git a/app/undo.c b/app/undo.c
index 644747d..88f81cc 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -25,7 +25,6 @@
 #include "focus.h"
 #include "group.h"
 #include "preferences.h"
-#include "diagram_tree_window.h"
 #include "textedit.h"
 #include "parent.h"
 
@@ -647,8 +646,6 @@ delete_objects_apply(struct DeleteObjectsChange *change, Diagram *dia)
 
     list = g_list_next(list);
   }
-
-  diagram_tree_remove_objects(diagram_tree(), change->obj_list);
 }
 
 static void
@@ -673,8 +670,6 @@ delete_objects_revert(struct DeleteObjectsChange *change, Diagram *dia)
 
   list = g_list_next(list);
  }
-
-  diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
 }
 
 static void
@@ -737,7 +732,6 @@ insert_objects_apply(struct InsertObjectsChange *change, Diagram *dia)
   change->applied = 1;
   layer_add_objects(change->layer, g_list_copy(change->obj_list));
   object_add_updates_list(change->obj_list, dia);
-  diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
 }
 
 static void
@@ -761,8 +755,6 @@ insert_objects_revert(struct InsertObjectsChange *change, Diagram *dia)
 
     list = g_list_next(list);
   }
-
-  diagram_tree_remove_objects(diagram_tree(), change->obj_list);
 }
 
 static void
@@ -974,9 +966,6 @@ group_objects_apply(struct GroupObjectsChange *change, Diagram *dia)
 
     list = g_list_next(list);
   }
-
-  diagram_tree_add_object(diagram_tree(), dia, change->group);
-  diagram_tree_remove_objects(diagram_tree(), change->obj_list);
 }
 
 static void
@@ -993,9 +982,6 @@ group_objects_revert(struct GroupObjectsChange *change, Diagram *dia)
   object_add_updates_list(change->obj_list, dia);
 
   properties_hide_if_shown(dia, change->group);
-
-  diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
-  diagram_tree_remove_object(diagram_tree(), change->group);
 }
 
 static void
@@ -1060,9 +1046,6 @@ ungroup_objects_apply(struct UngroupObjectsChange *change, Diagram *dia)
   object_add_updates_list(change->obj_list, dia);
   
   properties_hide_if_shown(dia, change->group);
-
-  diagram_tree_add_objects(diagram_tree(), dia, change->obj_list);
-  diagram_tree_remove_object(diagram_tree(), change->group);
 }
 
 static void
@@ -1090,8 +1073,12 @@ ungroup_objects_revert(struct UngroupObjectsChange *change, Diagram *dia)
     list = g_list_next(list);
   }
 
-  diagram_tree_add_object(diagram_tree(), dia, change->group);
-  diagram_tree_remove_objects(diagram_tree(), change->obj_list);
+  data_emit (dia, change->layer, change->group, "object_add");
+  list = change->obj_list;
+  while (list) {
+    data_emit (dia, change->layer, list->data, "object_remove");
+    list = g_list_next(list);
+  }
 }
 
 static void
@@ -1241,10 +1228,8 @@ move_object_layer_relative(Diagram *dia, GList *objects, gint dist)
   target = g_ptr_array_index(dia->data->layers, pos);
   object_add_updates_list(objects, dia);
   layer_remove_objects(active, objects);
-  diagram_tree_add_objects(diagram_tree(), dia, objects);
   layer_add_objects(target, g_list_copy(objects));
   data_set_active_layer(dia->data, target);
-  diagram_tree_add_objects(diagram_tree(), dia, objects);
 }
 
 static void
diff --git a/lib/diamarshal.list b/lib/diamarshal.list
index 6569357..67e179d 100644
--- a/lib/diamarshal.list
+++ b/lib/diamarshal.list
@@ -24,6 +24,8 @@
 
 VOID: VOID
 VOID: OBJECT
+VOID: OBJECT,UINT,POINTER
+VOID: OBJECT,OBJECT
 VOID: INT
 VOID: POINTER,POINTER
 VOID: STRING, FLAGS
diff --git a/lib/layer.c b/lib/layer.c
index ff3c77b..d78f2ea 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -501,13 +501,14 @@ void
 layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj,
 			       GList *insert_list)
 {
-  GList *list;
+  GList *list, *il;
 
   list = g_list_find(layer->objects, remove_obj);
 
   g_assert(list!=NULL);
   set_parent_layer(remove_obj, NULL);
   dynobj_list_remove_object(remove_obj);
+  data_emit (layer_get_parent_diagram(layer), layer, remove_obj, "object_remove");
   g_list_foreach(insert_list, set_parent_layer, layer);
 
   if (list->prev == NULL) {
@@ -522,6 +523,11 @@ layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj,
     last->next = list->next;
     list->next->prev = last;
   }
+  il = insert_list;
+  while (il) {
+    data_emit (layer_get_parent_diagram(layer), layer, il->data, "object_add");
+    il = g_list_next(il);
+  }
   g_list_free_1(list);
 }
 
@@ -533,11 +539,24 @@ layer_remove_dynobj(gpointer obj, gpointer userdata)
 
 void layer_set_object_list(Layer *layer, GList *list)
 {
+  GList *ol;
+  /* signal removal on all objects */
+  ol = layer->objects;
+  while (ol) {
+    data_emit (layer_get_parent_diagram(layer), layer, ol->data, "object_remove");
+    ol = g_list_next (ol);
+  }
   g_list_foreach(layer->objects, set_parent_layer, NULL);
   g_list_foreach(layer->objects, layer_remove_dynobj, NULL);
   g_list_free(layer->objects);
   layer->objects = list;
   g_list_foreach(layer->objects, set_parent_layer, layer);
+  /* signal addition on all objects */
+  list = layer->objects;
+  while (list) {
+    data_emit (layer_get_parent_diagram(layer), layer, list->data, "object_add");
+    list = g_list_next (list);
+  }
 }
 
 DiagramData *
diff --git a/lib/libdia.def b/lib/libdia.def
index 0e78181..d045631 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -717,3 +717,6 @@ EXPORTS
  
  libdia_init
  dia_log_message
+
+ dia_marshal_VOID__OBJECT_UINT_POINTER
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]