[dia] [flowchart] undo support for move handle
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] [flowchart] undo support for move handle
- Date: Sun, 22 Aug 2010 18:48:17 +0000 (UTC)
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]