diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-04-09 13:26:22 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-04-09 13:26:22 +0000 |
| commit | b252275b0c7d1a59082e7f1c64d984c2acbe5beb (patch) | |
| tree | 12a1a61bd17239528f795473684b40f79017c565 /scribus/plugins/tools | |
| parent | 448972858a4deb471b2a00fe28613ea07d43eb17 (diff) | |
| download | scribus-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.cpp | 409 |
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; } |
