[dia] [flowchart] undo support for move handle



commit 37fc9e525b28390d4b50119987397ec52c448e2d
Author: Hans Breuer <hans breuer org>
Date:   Sun Aug 22 19:01:39 2010 +0200

    [flowchart] undo support for move handle
    
    With strange resize behavior there should
    at least be a way back ;)

 lib/element.c                     |   46 ++++++++++++++++++++++++++++++++++++-
 lib/element.h                     |    3 ++
 lib/libdia.def                    |    1 +
 objects/flowchart/box.c           |   10 ++++++++
 objects/flowchart/diamond.c       |   11 ++++++++-
 objects/flowchart/ellipse.c       |   10 ++++++++
 objects/flowchart/parallelogram.c |   10 ++++++++
 7 files changed, 89 insertions(+), 2 deletions(-)
---
diff --git a/lib/element.c b/lib/element.c
index 2ef514f..f45dc40 100644
--- a/lib/element.c
+++ b/lib/element.c
@@ -445,7 +445,8 @@ element_save(Element *elem, ObjectNode obj_node)
 		 elem->height);
 }
 
-void element_load(Element *elem, ObjectNode obj_node)
+void 
+element_load(Element *elem, ObjectNode obj_node)
 {
   AttributeNode attr;
 
@@ -468,3 +469,46 @@ void element_load(Element *elem, ObjectNode obj_node)
     elem->height = data_real( attribute_first_data(attr));
 
 }
+
+typedef struct _ElementChange {
+  ObjectChange object_change;
+
+  Element *element;
+  Point    corner;
+  real     width;
+  real     height;
+} ElementChange;
+static void
+_element_change_swap (ObjectChange *self,
+		      DiaObject *obj)
+{
+  ElementChange *ec = (ElementChange *)self;
+  Element *elem = ec->element;
+  Point tmppt;
+  real  tmp;
+
+  g_assert(obj == &(ec->element->object));
+
+  tmppt = ec->corner; ec->corner = elem->object.position; elem->object.position = tmppt;
+  tmp = ec->width; ec->width = elem->width; elem->width = tmp;
+  tmp = ec->height; ec->height = elem->height; elem->height = tmp;
+}
+ObjectChange *
+element_change_new (const Point *corner, 
+		    real width,
+		    real height,
+		    Element *elem)
+{
+  ElementChange *ec = g_new (ElementChange, 1);
+
+  ec->object_change.apply  = _element_change_swap;
+  ec->object_change.revert = _element_change_swap;
+  ec->object_change.free = NULL;
+
+  ec->element = elem;
+  ec->corner = elem->corner;
+  ec->width = elem->width;
+  ec->height = elem->height;
+
+  return &ec->object_change;
+}
diff --git a/lib/element.h b/lib/element.h
index 692f40a..417fb3e 100644
--- a/lib/element.h
+++ b/lib/element.h
@@ -64,6 +64,9 @@ void element_move_handle_aspect(Element *elem, HandleId id,
 void element_save(Element *elem, ObjectNode obj_node);
 void element_load(Element *elem, ObjectNode obj_node);
 
+ObjectChange *element_change_new (const Point *corner, 
+				  real width, real height,
+				  Element *elem);
 /* base property stuff ... */
 #ifdef G_OS_WIN32
 /* see lib/properties.h for the reason */
diff --git a/lib/libdia.def b/lib/libdia.def
index 7db2097..1fb5a9d 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -393,6 +393,7 @@ EXPORTS
  element_update_connections_directions
 
  ellipse_bbox
+ element_change_new
 
  filter_get_by_name
  filter_get_callbacks
diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c
index 9b67927..5e91d8a 100644
--- a/objects/flowchart/box.c
+++ b/objects/flowchart/box.c
@@ -263,11 +263,18 @@ box_move_handle(Box *box, Handle *handle,
 		HandleMoveReason reason, ModifierKeys modifiers)
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
+  Point corner;
+  real width, height;
 
   assert(box!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
+  /* remember ... */
+  corner = box->element.corner;
+  width = box->element.width;
+  height = box->element.height;
+
   element_move_handle(&box->element, handle->id, to, cp, reason, modifiers);
 
   switch (handle->id) {
@@ -292,6 +299,9 @@ box_move_handle(Box *box, Handle *handle,
   }
   box_update_data(box, horiz, vert);
 
+  if (width != box->element.width && height != box->element.height)
+    return element_change_new (&corner, width, height, &box->element);
+
   return NULL;
 }
 
diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c
index f5d7d0e..126bbf8 100644
--- a/objects/flowchart/diamond.c
+++ b/objects/flowchart/diamond.c
@@ -272,11 +272,18 @@ diamond_move_handle(Diamond *diamond, Handle *handle,
 		    HandleMoveReason reason, ModifierKeys modifiers)
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
+  Point corner;
+  real width, height;
 
   assert(diamond!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
+  /* remember ... */
+  corner = diamond->element.corner;
+  width = diamond->element.width;
+  height = diamond->element.height;
+
   element_move_handle(&diamond->element, handle->id, to, cp, 
 		      reason, modifiers);
 
@@ -302,6 +309,9 @@ diamond_move_handle(Diamond *diamond, Handle *handle,
   }
   diamond_update_data(diamond, horiz, vert);
 
+  if (width != diamond->element.width && height != diamond->element.height)
+    return element_change_new (&corner, width, height, &diamond->element);
+
   return NULL;
 }
 
@@ -355,7 +365,6 @@ diamond_draw(Diamond *diamond, DiaRenderer *renderer)
   text_draw(diamond->text, renderer);
 }
 
-
 static void
 diamond_update_data(Diamond *diamond, AnchorShape horiz, AnchorShape vert)
 {
diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c
index 2542604..25626ec 100644
--- a/objects/flowchart/ellipse.c
+++ b/objects/flowchart/ellipse.c
@@ -269,11 +269,18 @@ ellipse_move_handle(Ellipse *ellipse, Handle *handle,
 		    HandleMoveReason reason, ModifierKeys modifiers)
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
+  Point corner;
+  real width, height;
 
   assert(ellipse!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
+  /* remember ... */
+  corner = ellipse->element.corner;
+  width = ellipse->element.width;
+  height = ellipse->element.height;
+
   element_move_handle(&ellipse->element, handle->id, to, cp, 
 		      reason, modifiers);
 
@@ -299,6 +306,9 @@ ellipse_move_handle(Ellipse *ellipse, Handle *handle,
   }
   ellipse_update_data(ellipse, horiz, vert);
 
+  if (width != ellipse->element.width && height != ellipse->element.height)
+    return element_change_new (&corner, width, height, &ellipse->element);
+
   return NULL;
 }
 
diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c
index 0925f68..79e0d20 100644
--- a/objects/flowchart/parallelogram.c
+++ b/objects/flowchart/parallelogram.c
@@ -275,11 +275,18 @@ pgram_move_handle(Pgram *pgram, Handle *handle,
 		  HandleMoveReason reason, ModifierKeys modifiers)
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
+  Point corner;
+  real width, height;
 
   assert(pgram!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
+  /* remember ... */
+  corner = pgram->element.corner;
+  width = pgram->element.width;
+  height = pgram->element.height;
+
   element_move_handle(&pgram->element, handle->id, to, cp, reason, modifiers);
 
   switch (handle->id) {
@@ -304,6 +311,9 @@ pgram_move_handle(Pgram *pgram, Handle *handle,
   }
   pgram_update_data(pgram, horiz, vert);
 
+  if (width != pgram->element.width && height != pgram->element.height)
+    return element_change_new (&corner, width, height, &pgram->element);
+
   return NULL;
 }
 



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