dia r4211 - in trunk: . app data samples



Author: hans
Date: Tue Jan 20 23:21:59 2009
New Revision: 4211
URL: http://svn.gnome.org/viewvc/dia?rev=4211&view=rev

Log:
2009-01-20  Hans Breuer  <hans breuer org>

	* app/undo.[ch] app/commands.[ch] app/menus.c app/diagram.c 
	  data/*-ui. : implement "Objects/Move to layer above/below" 
	(maintaining connections between layers). Fixes bug #59105.
	* samples/undo-check.dia a diagram to play with the above


Added:
   trunk/samples/undo-check.dia   (contents, props changed)
Modified:
   trunk/ChangeLog
   trunk/app/commands.c
   trunk/app/commands.h
   trunk/app/diagram.c
   trunk/app/menus.c
   trunk/app/menus.h
   trunk/app/undo.c
   trunk/app/undo.h
   trunk/data/display-ui.xml
   trunk/data/integrated-ui.xml
   trunk/data/popup-ui.xml

Modified: trunk/app/commands.c
==============================================================================
--- trunk/app/commands.c	(original)
+++ trunk/app/commands.c	Tue Jan 20 23:21:59 2009
@@ -419,20 +419,20 @@
   ddisplay_do_update_menu_sensitivity(ddisp);
 }
 
-static void
-move_objects_up_layer(GtkAction *action)
+void
+objects_move_up_layer(GtkAction *action)
 {
   DDisplay *ddisp = ddisplay_active();
   GList *selected_list;
+  Change *change;
 
   if (!ddisp || textedit_mode(ddisp)) return;
   selected_list = diagram_get_sorted_selected(ddisp->diagram);
 
-#ifdef MOVE_OBJECTS_LAYER
   change = undo_move_object_other_layer(ddisp->diagram, selected_list, TRUE);
   
   (change->apply)(change, ddisp->diagram);
-#endif
+
   diagram_modified(ddisp->diagram);
   undo_set_transactionpoint(ddisp->diagram->undo);
   
@@ -441,22 +441,21 @@
   ddisplay_do_update_menu_sensitivity(ddisp);
 }
 
-static void
-move_objects_down_layer(GtkAction *action)
+ void
+objects_move_down_layer(GtkAction *action)
 {
   DDisplay *ddisp = ddisplay_active();
   GList *selected_list;
+  Change *change;
 
   if (!ddisp || textedit_mode(ddisp)) return;
   selected_list = diagram_get_sorted_selected(ddisp->diagram);
 
   /* Must check if move is legal here */
 
-#ifdef MOVE_OBJECTS_LAYER
   change = undo_move_object_other_layer(ddisp->diagram, selected_list, FALSE);
   
   (change->apply)(change, ddisp->diagram);
-#endif
 
   diagram_modified(ddisp->diagram);
   undo_set_transactionpoint(ddisp->diagram->undo);

Modified: trunk/app/commands.h
==============================================================================
--- trunk/app/commands.h	(original)
+++ trunk/app/commands.h	Tue Jan 20 23:21:59 2009
@@ -72,6 +72,9 @@
 void objects_place_under_callback       (GtkAction *action);
 void objects_place_up_callback          (GtkAction *action);
 void objects_place_down_callback        (GtkAction *action);
+void objects_move_up_layer              (GtkAction *action);
+void objects_move_down_layer            (GtkAction *action);
+
 void objects_parent_callback            (GtkAction *action);
 void objects_unparent_callback          (GtkAction *action);
 void objects_unparent_children_callback (GtkAction *action);

Modified: trunk/app/diagram.c
==============================================================================
--- trunk/app/diagram.c	(original)
+++ trunk/app/diagram.c	Tue Jan 20 23:21:59 2009
@@ -534,6 +534,11 @@
   gtk_action_set_sensitive (items->bring_forwards, 
 			    !textedit_active && selected_count > 0);
     
+  gtk_action_set_sensitive (items->objects_layer_above, 
+			    !textedit_active && selected_count > 0);
+  gtk_action_set_sensitive (items->objects_layer_below, 
+			    !textedit_active && selected_count > 0);
+
   gtk_action_set_sensitive (items->parent, 
 			    !textedit_active && diagram_selected_can_parent (dia));
   gtk_action_set_sensitive (items->unparent, 

Modified: trunk/app/menus.c
==============================================================================
--- trunk/app/menus.c	(original)
+++ trunk/app/menus.c	Tue Jan 20 23:21:59 2009
@@ -135,7 +135,7 @@
 
   { "Diagram", NULL, N_("_Diagram"), NULL, NULL, NULL }, 
     { "DiagramProperties", GTK_STOCK_PROPERTIES, NULL, "<shift><alt>Return", NULL, G_CALLBACK (view_diagram_properties_callback) },
-    { "DiagramLayers", NULL, N_("_Layers..."), NULL, NULL, G_CALLBACK (dialogs_layers_callback) },
+    { "DiagramLayers", NULL, N_("_Layers..."), "<control>L", NULL, G_CALLBACK (dialogs_layers_callback) },
 
   { "View", NULL, N_("_View"), NULL, NULL, NULL },
     { "ViewZoomin", GTK_STOCK_ZOOM_IN, NULL, "<control>plus", NULL, G_CALLBACK (view_zoom_in_callback) },
@@ -168,6 +168,9 @@
     { "ObjectsSendbackwards", GTK_STOCK_GO_DOWN, N_("Send Backwards"), NULL, NULL, G_CALLBACK (objects_place_down_callback) },
     { "ObjectsBringforwards", GTK_STOCK_GO_UP, N_("Bring Forwards"), NULL, NULL, G_CALLBACK (objects_place_up_callback) },
 
+    { "ObjectsLayerAbove", NULL, N_("Move to layer above"), NULL, NULL, G_CALLBACK (objects_move_up_layer) },
+    { "ObjectsLayerBelow", NULL, N_("Move to layer below"), NULL, NULL, G_CALLBACK (objects_move_down_layer) },
+    
     { "ObjectsGroup", DIA_STOCK_GROUP, N_("_Group"), "<control>G", NULL, G_CALLBACK (objects_group_callback) },
     /* deliberately not using Ctrl+U for Ungroup */
     { "ObjectsUngroup", DIA_STOCK_UNGROUP, N_("_Ungroup"), "<control><shift>G", NULL, G_CALLBACK (objects_ungroup_callback) }, 
@@ -1202,6 +1205,9 @@
     items->bring_to_front = gtk_action_group_get_action (actions, "ObjectsBringtofront");
     items->send_backwards = gtk_action_group_get_action (actions, "ObjectsSendbackwards");
     items->bring_forwards = gtk_action_group_get_action (actions, "ObjectsBringforwards");
+
+    items->objects_layer_above = gtk_action_group_get_action (actions, "ObjectsLayerAbove");
+    items->objects_layer_below = gtk_action_group_get_action (actions, "ObjectsLayerBelow");
   
     items->group = gtk_action_group_get_action (actions, "ObjectsGroup");
     items->ungroup = gtk_action_group_get_action (actions, "ObjectsUngroup");

Modified: trunk/app/menus.h
==============================================================================
--- trunk/app/menus.h	(original)
+++ trunk/app/menus.h	Tue Jan 20 23:21:59 2009
@@ -48,6 +48,9 @@
   GtkAction *send_backwards;
   GtkAction *bring_forwards;
 
+  GtkAction *objects_layer_above;
+  GtkAction *objects_layer_below;
+  
   GtkAction *group;
   GtkAction *ungroup;
 

Modified: trunk/app/undo.c
==============================================================================
--- trunk/app/undo.c	(original)
+++ trunk/app/undo.c	Tue Jan 20 23:21:59 2009
@@ -1208,74 +1208,95 @@
 }
 
 /* ********* MOVE TO OTHER LAYER  */
-#ifdef MOVE_OTHER_LAYER
-struct MoveObjectToLayerChange {
+typedef struct _MoveObjectToLayerChange {
   Change change;
   /** The objects we are moving */
   GList *objects;
   /** All objects in the original layer */
-  GList *original_list;
+  GList *orig_list;
+  /** The active layer when started */
+  Layer *orig_layer;
   gboolean moving_up;
-};
+} MoveObjectToLayerChange;
 
+/*!
+ * BEWARE: we need to notify the DiagramTree somehow - maybe 
+ * better make it listen to object-add signal?
+ */
 static void 
 move_object_layer_relative(Diagram *dia, GList *objects, gint dist)
 {
-
+  /* from the active layer to above or below */
+  Layer *active, *target;
+  guint pos;
+ 
+  g_return_if_fail(dia->data->active_layer);
+
+  active =  dia->data->active_layer;
+  for (pos = 0; pos < dia->data->layers->len; ++pos)
+    if (active == g_ptr_array_index(dia->data->layers, pos))
+      break;
+
+  pos = (pos + dia->data->layers->len + dist) % dia->data->layers->len;
+  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
-move_object_to_layer_apply(Change *change, Diagram *dia)
+move_object_to_layer_apply(MoveObjectToLayerChange *change, Diagram *dia)
 {
-  struct MoveObjectToLayerChange *movechange 
-    = (struct MoveObjectToLayerChange*)change;
-  if (movechange->moving_up) {
-    move_object_layer_relative(dia, movechange->objects, 1);
+  if (change->moving_up) {
+    move_object_layer_relative(dia, change->objects, 1);
   } else {
-    move_object_layer_relative(dia, movechange->objects, -1);
+    move_object_layer_relative(dia, change->objects, -1);
   }
 }
 
 static void
-move_object_to_layer_revert(Change *change, Diagram *dia)
+move_object_to_layer_revert(MoveObjectToLayerChange *change, Diagram *dia)
 {
-  struct MoveObjectToLayerChange *movechange 
-    = (struct MoveObjectToLayerChange*)change;
-  diagram_set_objects(dia, movechange->original_list);
-  if (movechange->moving_up) {
-    move_object_layer_relative(dia, movechange->objects, -1);
+  if (change->moving_up) {
+    move_object_layer_relative(dia, change->objects, -1);
   } else {
-    move_object_layer_relative(dia, movechange->objects, 1);
+    diagram_unselect_objects(dia, change->objects);
+    move_object_layer_relative(dia, change->objects, 1);
+    /* overwriting the 'unsorted' list of objects to the order it had before */
+    layer_set_object_list(change->orig_layer, g_list_copy(change->orig_list));
+    object_add_updates_list(change->orig_list, dia);
   }
 }
 
 static void
-move_object_to_layer_free(Change *change)
+move_object_to_layer_free(MoveObjectToLayerChange *change)
 {
-  struct MoveObjectToLayerChange *movechange 
-    = (struct MoveObjectToLayerChange*)change;
-  g_list_free(movechange->objects);
-  g_list_free(movechange->original_list);
+  g_list_free(change->objects);
+  g_list_free(change->orig_list);
+  change->objects = NULL;
+  change->orig_list = NULL;
 }
 
 Change *
-undo_move_object_other_layer(Diagram *diagram, GList *selected_list,
-			     GList *original_list, gboolean moving_up)
+undo_move_object_other_layer(Diagram *dia, GList *selected_list,
+			     gboolean moving_up)
 {
-  struct MoveObjectToLayerChange *movetolayerchange 
-    = g_new0(struct MoveObjectToLayerChange, 1);
+  MoveObjectToLayerChange *movetolayerchange 
+    = g_new0(MoveObjectToLayerChange, 1);
   Change *change = (Change*)movetolayerchange;
-  change->apply = move_object_to_layer_apply;
-  change->revert = move_object_to_layer_revert;
-  change->free = move_object_to_layer_free;
-
-  movetolayerchange->objects = selected_list;
-  movetolayerchange->original_list = original_list;
+  change->apply = (UndoApplyFunc) move_object_to_layer_apply;
+  change->revert = (UndoRevertFunc) move_object_to_layer_revert;
+  change->free = (UndoFreeFunc) move_object_to_layer_free;
+
+  movetolayerchange->orig_layer = dia->data->active_layer;
+  movetolayerchange->orig_list = g_list_copy(dia->data->active_layer->objects);
+  movetolayerchange->objects = g_list_copy(selected_list);
   movetolayerchange->moving_up = moving_up;
 
   DEBUG_PRINTF(("UNDO: Push new obj_layer_change at %d\n", depth(dia->undo)));
   undo_push_change(dia->undo, change);
   return change;
-  
 }
-#endif

Modified: trunk/app/undo.h
==============================================================================
--- trunk/app/undo.h	(original)
+++ trunk/app/undo.h	Tue Jan 20 23:21:59 2009
@@ -68,8 +68,7 @@
 Change *undo_connect(Diagram *dia, DiaObject *obj, Handle *handle,
 		     ConnectionPoint *connectionpoint);
 Change *undo_unconnect(Diagram *dia, DiaObject *obj, Handle *handle);
-Change *
-undo_delete_objects_children(Diagram *dia, GList *obj_list);
+Change *undo_delete_objects_children(Diagram *dia, GList *obj_list);
 Change *undo_delete_objects(Diagram *dia, GList *obj_list); /* Reads current obj list */
 Change *undo_insert_objects(Diagram *dia, GList *obj_list,
 			    int applied);
@@ -84,7 +83,7 @@
 Change *undo_parenting(Diagram *dia, DiaObject *parentobj, DiaObject *childobj,
 		       gboolean parent);
 Change *undo_move_object_other_layer(Diagram *diagram, GList *selected_list,
-				     GList *original_list, gboolean moving_up);
+				     gboolean moving_up);
 
 #endif /* UNDO_H */
 

Modified: trunk/data/display-ui.xml
==============================================================================
--- trunk/data/display-ui.xml	(original)
+++ trunk/data/display-ui.xml	Tue Jan 20 23:21:59 2009
@@ -77,6 +77,8 @@
 			<menuitem name="ObjectsBringtofront" action="ObjectsBringtofront" />
 			<menuitem name="ObjectsSendbackwards" action="ObjectsSendbackwards" />
 			<menuitem name="ObjectsBringforwards" action="ObjectsBringforwards" />
+			<menuitem name="ObjectsLayerAbove" action="ObjectsLayerAbove" />
+			<menuitem name="ObjectsLayerBelow" action="ObjectsLayerBelow" />
 			<separator name="ObjectsSep1" />
 			<menuitem name="ObjectsGroup" action="ObjectsGroup" />
 			<menuitem name="ObjectsUngroup" action="ObjectsUngroup" />

Modified: trunk/data/integrated-ui.xml
==============================================================================
--- trunk/data/integrated-ui.xml	(original)
+++ trunk/data/integrated-ui.xml	Tue Jan 20 23:21:59 2009
@@ -91,6 +91,8 @@
 			<menuitem name="ObjectsBringtofront" action="ObjectsBringtofront" />
 			<menuitem name="ObjectsSendbackwards" action="ObjectsSendbackwards" />
 			<menuitem name="ObjectsBringforwards" action="ObjectsBringforwards" />
+			<menuitem name="ObjectsLayerAbove" action="ObjectsLayerAbove" />
+			<menuitem name="ObjectsLayerBelow" action="ObjectsLayerBelow" />
 			<separator name="ObjectsSep1" />
 			<menuitem name="ObjectsGroup" action="ObjectsGroup" />
 			<menuitem name="ObjectsUngroup" action="ObjectsUngroup" />

Modified: trunk/data/popup-ui.xml
==============================================================================
--- trunk/data/popup-ui.xml	(original)
+++ trunk/data/popup-ui.xml	Tue Jan 20 23:21:59 2009
@@ -76,6 +76,8 @@
 			<menuitem name="ObjectsBringtofront" action="ObjectsBringtofront" />
 			<menuitem name="ObjectsSendbackwards" action="ObjectsSendbackwards" />
 			<menuitem name="ObjectsBringforwards" action="ObjectsBringforwards" />
+			<menuitem name="ObjectsLayerAbove" action="ObjectsLayerAbove" />
+			<menuitem name="ObjectsLayerBelow" action="ObjectsLayerBelow" />
 			<separator name="ObjectsSep1" />
 			<menuitem name="ObjectsGroup" action="ObjectsGroup" />
 			<menuitem name="ObjectsUngroup" action="ObjectsUngroup" />

Added: trunk/samples/undo-check.dia
==============================================================================
Binary file. No diff available.



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