summaryrefslogtreecommitdiffstats
path: root/scribus/plugins/tools
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-04-09 13:26:22 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-04-09 13:26:22 +0000
commitb252275b0c7d1a59082e7f1c64d984c2acbe5beb (patch)
tree12a1a61bd17239528f795473684b40f79017c565 /scribus/plugins/tools
parent448972858a4deb471b2a00fe28613ea07d43eb17 (diff)
downloadscribus-b252275b0c7d1a59082e7f1c64d984c2acbe5beb.tar.gz
scribus-b252275b0c7d1a59082e7f1c64d984c2acbe5beb.tar.xz
scribus-b252275b0c7d1a59082e7f1c64d984c2acbe5beb.zip
#9046: Undoing path operations doesn't work as expected
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17423 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/plugins/tools')
-rw-r--r--scribus/plugins/tools/pathfinder/pathfinder.cpp409
1 files changed, 266 insertions, 143 deletions
diff --git a/scribus/plugins/tools/pathfinder/pathfinder.cpp b/scribus/plugins/tools/pathfinder/pathfinder.cpp
index a56c3ab..debc817 100644
--- a/scribus/plugins/tools/pathfinder/pathfinder.cpp
+++ b/scribus/plugins/tools/pathfinder/pathfinder.cpp
@@ -32,6 +32,8 @@ for which a new license (GPL+exception) is in place.
#include "propertiespalette.h"
#include "scribuscore.h"
#include "sccolorengine.h"
+#include "undomanager.h"
+#include "undostate.h"
#include "util_color.h"
#include "util_math.h"
#include "util_icon.h"
@@ -117,183 +119,304 @@ void PathFinderPlugin::deleteAboutData(const AboutData* about) const
bool PathFinderPlugin::run(ScribusDoc* doc, QString)
{
- QString vers = QString(qVersion()).left(5);
- if (vers < "4.3.3")
- {
- QMessageBox::information(doc->scMW(), tr("Qt Version too old"), tr("This plugin requires at least version 4.3.3 of the Qt library"));
- return true;
- }
ScribusDoc* currDoc = doc;
if (currDoc == 0)
currDoc = ScCore->primaryMainWindow()->doc;
- if (currDoc->m_Selection->count() > 1)
+ if (currDoc->m_Selection->count() <= 1)
+ return true;
+
+ //<<#9046
+ UndoTransaction* activeTransaction = NULL;
+ UndoManager* undoManager = UndoManager::instance();
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IDocument, Um::PathOperation, "", Um::IPolygon));
+ //>>#9046
+
+ PageItem *Item1 = currDoc->m_Selection->itemAt(0);
+ PageItem *Item2 = currDoc->m_Selection->itemAt(1);
+ PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2);
+ if (dia->exec())
{
- PageItem *Item1 = currDoc->m_Selection->itemAt(0);
- PageItem *Item2 = currDoc->m_Selection->itemAt(1);
- PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2);
- if (dia->exec())
+ int opMode=dia->opMode;
+ if (dia->keepItem1)
{
- if (dia->keepItem1)
+ PageItem *newItem;
+ if (dia->swapped)
+ {
+ newItem = new PageItem_Polygon(*Item2);
+ newItem->setSelected(false);
+ currDoc->Items->insert(Item2->ItemNr, newItem);
+ }
+ else
{
- PageItem *newItem;
+ newItem = new PageItem_Polygon(*Item1);
+ newItem->setSelected(false);
+ currDoc->Items->insert(Item1->ItemNr, newItem);
+ }
+ if (UndoManager::undoEnabled())
+ {
+ ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
+ is->set("CREATE_ITEM", "create_item");
+ is->setItem(newItem);
+ UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
+ undoManager->action(target, is);
+ }
+ }
+ if (dia->keepItem2)
+ {
+ PageItem *newItem;
+ if (dia->swapped)
+ {
+ newItem = new PageItem_Polygon(*Item1);
+ newItem->setSelected(false);
+ currDoc->Items->insert(Item1->ItemNr, newItem);
+ }
+ else
+ {
+ newItem = new PageItem_Polygon(*Item2);
+ newItem->setSelected(false);
+ currDoc->Items->insert(Item2->ItemNr, newItem);
+ }
+ if (UndoManager::undoEnabled())
+ {
+ ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
+ is->set("CREATE_ITEM", "create_item");
+ is->setItem(newItem);
+ UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
+ undoManager->action(target, is);
+ }
+ }
+ if (dia->keepItem1 || dia->keepItem2)
+ currDoc->renumberItemsInListOrder();
+ if (opMode != 4)
+ {
+ PageItem *currItem;
+ QPainterPath path;
+ FPointArray points;
+ if (dia->targetColor == 0)
+ {
+ currItem = Item1;
if (dia->swapped)
{
- newItem = new PageItem_Polygon(*Item2);
- newItem->setSelected(false);
- currDoc->Items->insert(Item2->ItemNr, newItem);
+ currItem = Item2;
+ currItem->setXYPos(Item1->xPos(), Item1->yPos());
+ currItem->setRotation(0.0);
}
+ }
+ else
+ {
+ if (dia->swapped)
+ currItem = Item1;
else
{
- newItem = new PageItem_Polygon(*Item1);
- newItem->setSelected(false);
- currDoc->Items->insert(Item1->ItemNr, newItem);
+ currItem = Item2;
+ currItem->setXYPos(Item1->xPos(), Item1->yPos());
+ currItem->setRotation(0.0);
}
}
- if (dia->keepItem2)
+ path = dia->result;
+ points.fromQPainterPath(path);
+
+ //<<#9046
+ FPointArray oldPOLine=currItem->PoLine;
+ FPointArray oldContourLine=currItem->ContourLine;
+ ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
{
- PageItem *newItem;
- if (dia->swapped)
+ state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
+ state->set("PATH_OPERATION", "path_operation");
+ state->set("PATH_OP_OLD_FRAME", currItem->Frame);
+ state->set("PATH_OP_OLD_CLIPEDITED", currItem->ClipEdited);
+ state->set("PATH_OP_OLD_FRAMETYPE", currItem->FrameType);
+ state->set("PATH_OP_OLD_OLDB2", currItem->OldB2);
+ state->set("PATH_OP_OLD_OLDH2", currItem->OldH2);
+ state->set("PATH_OP_NEW_FRAME", false);
+ state->set("PATH_OP_NEW_CLIPEDITED", true);
+ state->set("PATH_OP_NEW_FRAMETYPE", 3);
+ }
+ //>>#9046
+
+ currItem->PoLine = points;
+ currItem->Frame = false;
+ currItem->ClipEdited = true;
+ currItem->FrameType = 3;
+ currDoc->AdjustItemSize(currItem);
+ currItem->OldB2 = currItem->width();
+ currItem->OldH2 = currItem->height();
+ currItem->updateClip();
+ currItem->ContourLine = currItem->PoLine.copy();
+
+ //<<#9046
+ if (UndoManager::undoEnabled())
+ {
+ state->set("PATH_OP_NEW_OLDB2", currItem->OldB2);
+ state->set("PATH_OP_NEW_OLDH2", currItem->OldH2);
+ state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(points, currItem->ContourLine)));
+ undoManager->action(currItem, state);
+ }
+ //>>#9046
+
+ currDoc->m_Selection->removeItem(currItem);
+ currDoc->itemSelection_DeleteItem();
+
+ }
+ else
+ {
+ QPainterPath path;
+ FPointArray points;
+ PageItem *newItem;
+ double i1x = Item1->xPos();
+ double i1y = Item1->yPos();
+ path = dia->result;
+ if (!path.isEmpty())
+ {
+ points.fromQPainterPath(path);
+ //<<#9046
+ FPointArray oldPOLine=Item1->PoLine;
+ FPointArray oldContourLine=Item1->ContourLine;
+ ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
{
- newItem = new PageItem_Polygon(*Item1);
- newItem->setSelected(false);
- currDoc->Items->insert(Item1->ItemNr, newItem);
+ state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
+ state->set("PATH_OPERATION", "path_operation");
+ state->set("PATH_OP_OLD_FRAME", Item1->Frame);
+ state->set("PATH_OP_OLD_CLIPEDITED", Item1->ClipEdited);
+ state->set("PATH_OP_OLD_FRAMETYPE", Item1->FrameType);
+ state->set("PATH_OP_OLD_OLDB2", Item1->OldB2);
+ state->set("PATH_OP_OLD_OLDH2", Item1->OldH2);
+ state->set("PATH_OP_NEW_FRAME", false);
+ state->set("PATH_OP_NEW_CLIPEDITED", true);
+ state->set("PATH_OP_NEW_FRAMETYPE", 3);
}
- else
+ //>>#9046
+ Item1->PoLine = points;
+ Item1->Frame = false;
+ Item1->ClipEdited = true;
+ Item1->FrameType = 3;
+ currDoc->AdjustItemSize(Item1);
+ Item1->OldB2 = Item1->width();
+ Item1->OldH2 = Item1->height();
+ Item1->updateClip();
+ Item1->ContourLine = Item1->PoLine.copy();
+ //<<#9046
+ if (UndoManager::undoEnabled())
{
- newItem = new PageItem_Polygon(*Item2);
- newItem->setSelected(false);
- currDoc->Items->insert(Item2->ItemNr, newItem);
+ state->set("PATH_OP_NEW_OLDB2", Item1->OldB2);
+ state->set("PATH_OP_NEW_OLDH2", Item1->OldH2);
+ state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item1->PoLine, Item1->ContourLine)));
+ undoManager->action(Item1, state);
}
+ //>>#9046
}
- if (dia->keepItem1 || dia->keepItem2)
- currDoc->renumberItemsInListOrder();
- if (dia->opMode != 4)
+
+ path = QPainterPath();
+ path = dia->result1;
+ if (!path.isEmpty())
{
- PageItem *currItem;
- QPainterPath path;
- FPointArray points;
- if (dia->targetColor == 0)
+ points.fromQPainterPath(path);
+ //<<#9046
+ FPointArray oldPOLine=Item2->PoLine;
+ FPointArray oldContourLine=Item2->ContourLine;
+ ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
{
- currItem = Item1;
- if (dia->swapped)
- {
- currItem = Item2;
- currItem->setXYPos(Item1->xPos(), Item1->yPos());
- currItem->setRotation(0.0);
- }
+ state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
+ state->set("PATH_OPERATION", "path_operation");
+ state->set("PATH_OP_OLD_FRAME", Item2->Frame);
+ state->set("PATH_OP_OLD_CLIPEDITED", Item2->ClipEdited);
+ state->set("PATH_OP_OLD_FRAMETYPE", Item2->FrameType);
+ state->set("PATH_OP_OLD_OLDB2", Item2->OldB2);
+ state->set("PATH_OP_OLD_OLDH2", Item2->OldH2);
+ state->set("PATH_OP_NEW_FRAME", false);
+ state->set("PATH_OP_NEW_CLIPEDITED", true);
+ state->set("PATH_OP_NEW_FRAMETYPE", 3);
}
- else
+ //>>#9046
+ Item2->setXYPos(i1x, i1y);
+ Item2->setRotation(0.0);
+ Item2->PoLine = points;
+ Item2->Frame = false;
+ Item2->ClipEdited = true;
+ Item2->FrameType = 3;
+ currDoc->AdjustItemSize(Item2);
+ Item2->OldB2 = Item2->width();
+ Item2->OldH2 = Item2->height();
+ Item2->updateClip();
+ Item2->ContourLine = Item2->PoLine.copy();
+ //<<#9046
+ if (UndoManager::undoEnabled())
{
- if (dia->swapped)
- currItem = Item1;
- else
- {
- currItem = Item2;
- currItem->setXYPos(Item1->xPos(), Item1->yPos());
- currItem->setRotation(0.0);
- }
+ state->set("PATH_OP_NEW_OLDB2", Item2->OldB2);
+ state->set("PATH_OP_NEW_OLDH2", Item2->OldH2);
+ state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item2->PoLine, Item2->ContourLine)));
+ undoManager->action(Item2, state);
}
- path = dia->result;
- points.fromQPainterPath(path);
- currItem->PoLine = points;
- currItem->Frame = false;
- currItem->ClipEdited = true;
- currItem->FrameType = 3;
- currDoc->AdjustItemSize(currItem);
- currItem->OldB2 = currItem->width();
- currItem->OldH2 = currItem->height();
- currItem->updateClip();
- currItem->ContourLine = currItem->PoLine.copy();
- currDoc->m_Selection->removeItem(currItem);
- currDoc->itemSelection_DeleteItem();
+ //>>#9046
}
- else
+
+ path = QPainterPath();
+ path = dia->result2;
+ if (!path.isEmpty())
{
- QPainterPath path;
- FPointArray points;
- PageItem *newItem;
- double i1x = Item1->xPos();
- double i1y = Item1->yPos();
- path = dia->result;
- if (!path.isEmpty())
+ if (dia->targetColor == 0)
{
- points.fromQPainterPath(path);
- Item1->PoLine = points;
- Item1->Frame = false;
- Item1->ClipEdited = true;
- Item1->FrameType = 3;
- currDoc->AdjustItemSize(Item1);
- Item1->OldB2 = Item1->width();
- Item1->OldH2 = Item1->height();
- Item1->updateClip();
- Item1->ContourLine = Item1->PoLine.copy();
+ newItem = new PageItem_Polygon(*Item1);
+ newItem->setXYPos(i1x, i1y);
}
-
- path = QPainterPath();
- path = dia->result1;
- if (!path.isEmpty())
+ else
+ {
+ newItem = new PageItem_Polygon(*Item2);
+ newItem->setXYPos(i1x, i1y);
+ newItem->setRotation(0.0);
+ }
+ currDoc->Items->append(newItem);
+ newItem->ItemNr = currDoc->Items->count()-1;
+ newItem->setSelected(false);
+ points.fromQPainterPath(path);
+ newItem->PoLine = points;
+ newItem->Frame = false;
+ newItem->ClipEdited = true;
+ newItem->FrameType = 3;
+ currDoc->AdjustItemSize(newItem);
+ newItem->OldB2 = newItem->width();
+ newItem->OldH2 = newItem->height();
+ newItem->updateClip();
+ newItem->ContourLine = newItem->PoLine.copy();
+ if (dia->targetColor == 2)
{
- points.fromQPainterPath(path);
- Item2->setXYPos(i1x, i1y);
- Item2->setRotation(0.0);
- Item2->PoLine = points;
- Item2->Frame = false;
- Item2->ClipEdited = true;
- Item2->FrameType = 3;
- currDoc->AdjustItemSize(Item2);
- Item2->OldB2 = Item2->width();
- Item2->OldH2 = Item2->height();
- Item2->updateClip();
- Item2->ContourLine = Item2->PoLine.copy();
+ QString fill = dia->getOtherFillColor();
+ if (fill == CommonStrings::tr_NoneColor)
+ fill = CommonStrings::None;
+ newItem->setFillColor(fill);
+ QString stroke = dia->getOtherLineColor();
+ if (stroke == CommonStrings::tr_NoneColor)
+ stroke = CommonStrings::None;
+ newItem->setLineColor(stroke);
}
-
- path = QPainterPath();
- path = dia->result2;
- if (!path.isEmpty())
+ if (UndoManager::undoEnabled())
{
- if (dia->targetColor == 0)
- {
- newItem = new PageItem_Polygon(*Item1);
- newItem->setXYPos(i1x, i1y);
- }
- else
- {
- newItem = new PageItem_Polygon(*Item2);
- newItem->setXYPos(i1x, i1y);
- newItem->setRotation(0.0);
- }
- currDoc->Items->append(newItem);
- newItem->ItemNr = currDoc->Items->count()-1;
- newItem->setSelected(false);
- points.fromQPainterPath(path);
- newItem->PoLine = points;
- newItem->Frame = false;
- newItem->ClipEdited = true;
- newItem->FrameType = 3;
- currDoc->AdjustItemSize(newItem);
- newItem->OldB2 = newItem->width();
- newItem->OldH2 = newItem->height();
- newItem->updateClip();
- newItem->ContourLine = newItem->PoLine.copy();
- if (dia->targetColor == 2)
- {
- QString fill = dia->getOtherFillColor();
- if (fill == CommonStrings::tr_NoneColor)
- fill = CommonStrings::None;
- newItem->setFillColor(fill);
- QString stroke = dia->getOtherLineColor();
- if (stroke == CommonStrings::tr_NoneColor)
- stroke = CommonStrings::None;
- newItem->setLineColor(stroke);
- }
+ ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
+ is->set("CREATE_ITEM", "create_item");
+ is->setItem(newItem);
+ UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
+ undoManager->action(target, is);
}
- currDoc->m_Selection->clear();
- currDoc->view()->Deselect(true);
}
- currDoc->changed();
- currDoc->view()->DrawNew();
+ currDoc->m_Selection->clear();
+ currDoc->view()->Deselect(true);
}
- delete dia;
+ currDoc->changed();
+ currDoc->view()->DrawNew();
+ }
+ delete dia;
+
+ //<<#9046
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
}
+ //>>#9046
return true;
}