r17424 by craig - #9046: Undoing path operations doesn't work as expected
scribus-commit
scribus-commit at lists.scribus.net
Mon Apr 9 13:27:34 UTC 2012
Author: craig
Date: Mon Apr 9 13:27:34 2012
New Revision: 17424
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=17424
Log:
#9046: Undoing path operations doesn't work as expected
Modified:
trunk/Scribus/scribus/pageitem.cpp
trunk/Scribus/scribus/pageitem.h
trunk/Scribus/scribus/plugins/tools/pathfinder/pathfinder.cpp
trunk/Scribus/scribus/undomanager.cpp
trunk/Scribus/scribus/undomanager.h
Modified: trunk/Scribus/scribus/pageitem.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=17424&path=/trunk/Scribus/scribus/pageitem.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem.cpp (original)
+++ trunk/Scribus/scribus/pageitem.cpp Mon Apr 9 13:27:34 2012
@@ -4443,6 +4443,8 @@
restoreReverseText(ss, isUndo);
else if (ss->contains("CLEAR_IMAGE"))
restoreClearImage(ss,isUndo);
+ else if (ss->contains("PATH_OPERATION"))
+ restorePathOperation(ss, isUndo);
}
if (!OnMasterPage.isEmpty())
m_Doc->setCurrentPage(oldCurrentPage);
@@ -4843,6 +4845,37 @@
if (!isTextFrame())
return;
Reverse = !Reverse;
+}
+
+void PageItem::restorePathOperation(UndoState *state, bool isUndo)
+{//PATH_OPERATION
+ ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >*is = dynamic_cast<ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >*>(state);
+ if (is)
+ {
+ if (isUndo)
+ {
+ this->ClipEdited=is->getBool("PATH_OP_OLD_CLIPEDITED");
+ this->Frame=is->getBool("PATH_OP_OLD_FRAME");
+ this->FrameType=is->getInt("PATH_OP_OLD_FRAMETYPE");
+ this->OldB2=is->getDouble("PATH_OP_OLD_OLDB2");
+ this->OldH2=is->getDouble("PATH_OP_OLD_OLDH2");
+ QPair<FPointArray, FPointArray> oldLines=is->getItem().first;
+ this->PoLine = oldLines.first;
+ this->ContourLine = oldLines.second;
+ }
+ else
+ {
+ this->ClipEdited=is->getBool("PATH_OP_NEW_CLIPEDITED");
+ this->Frame=is->getBool("PATH_OP_NEW_FRAME");
+ this->FrameType=is->getInt("PATH_OP_NEW_FRAMETYPE");
+ this->OldB2=is->getDouble("PATH_OP_NEW_OLDB2");
+ this->OldH2=is->getDouble("PATH_OP_NEW_OLDH2");
+ QPair<FPointArray, FPointArray> newLines=is->getItem().second;
+ this->PoLine = newLines.first;
+ this->ContourLine = newLines.second;
+ }
+ this->updateClip();
+ }
}
void PageItem::restorePoly(SimpleState *state, bool isUndo, bool isContour)
Modified: trunk/Scribus/scribus/pageitem.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=17424&path=/trunk/Scribus/scribus/pageitem.h
==============================================================================
--- trunk/Scribus/scribus/pageitem.h (original)
+++ trunk/Scribus/scribus/pageitem.h Mon Apr 9 13:27:34 2012
@@ -1244,6 +1244,7 @@
void restoreLinkTextFrame(UndoState *state, bool isUndo);
void restoreUnlinkTextFrame(UndoState *state, bool isUndo);
void restoreReverseText(UndoState *state, bool isUndo);
+ void restorePathOperation(UndoState *state, bool isUndo);
/*@}*/
/**
Modified: trunk/Scribus/scribus/plugins/tools/pathfinder/pathfinder.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=17424&path=/trunk/Scribus/scribus/plugins/tools/pathfinder/pathfinder.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/tools/pathfinder/pathfinder.cpp (original)
+++ trunk/Scribus/scribus/plugins/tools/pathfinder/pathfinder.cpp Mon Apr 9 13:27:34 2012
@@ -32,6 +32,8 @@
#include "scribuscore.h"
#include "sccolorengine.h"
#include "ui/propertiespalette.h"
+#include "undomanager.h"
+#include "undostate.h"
#include "util_color.h"
#include "util_math.h"
#include "util_icon.h"
@@ -124,180 +126,293 @@
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;
+ PageItem *newItem;
+ if (dia->swapped)
+ {
+ newItem = new PageItem_Polygon(*Item2);
+ newItem->setSelected(false);
+ currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem);
+ }
+ else
+ {
+ newItem = new PageItem_Polygon(*Item1);
+ newItem->setSelected(false);
+ currDoc->Items->insert(currDoc->Items->indexOf(Item1), newItem);
+ }
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<PageItem*> *is = new ScItemState<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(currDoc->Items->indexOf(Item1), newItem);
+ }
+ else
+ {
+ newItem = new PageItem_Polygon(*Item2);
+ newItem->setSelected(false);
+ currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem);
+ }
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<PageItem*> *is = new ScItemState<PageItem*>("Create PageItem");
+ is->set("CREATE_ITEM", "create_item");
+ is->setItem(newItem);
+ UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
+ undoManager->action(target, is);
+ }
+ }
+ if (opMode != 4)
+ {
+ PageItem *currItem;
+ QPainterPath path;
+ FPointArray points;
+ if (dia->targetColor == 0)
+ {
+ currItem = Item1;
if (dia->swapped)
{
+ currItem = Item2;
+ currItem->setXYPos(Item1->xPos(), Item1->yPos());
+ currItem->setRotation(0.0);
+ }
+ }
+ else
+ {
+ if (dia->swapped)
+ currItem = Item1;
+ else
+ {
+ currItem = Item2;
+ currItem->setXYPos(Item1->xPos(), Item1->yPos());
+ currItem->setRotation(0.0);
+ }
+ }
+ path = dia->result;
+ points.fromQPainterPath(path);
+
+ //<<#9046
+ FPointArray oldPOLine=currItem->PoLine;
+ FPointArray oldContourLine=currItem->ContourLine;
+ ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
+ {
+ state = new ScItemState<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;
+ ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
+ {
+ state = new ScItemState<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);
+ }
+ //>>#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())
+ {
+ 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
+ }
+
+ path = QPainterPath();
+ path = dia->result1;
+ if (!path.isEmpty())
+ {
+ points.fromQPainterPath(path);
+ //<<#9046
+ FPointArray oldPOLine=Item2->PoLine;
+ FPointArray oldContourLine=Item2->ContourLine;
+ ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
+ if (UndoManager::undoEnabled())
+ {
+ state = new ScItemState<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);
+ }
+ //>>#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())
+ {
+ 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);
+ }
+ //>>#9046
+ }
+
+ path = QPainterPath();
+ path = dia->result2;
+ if (!path.isEmpty())
+ {
+ if (dia->targetColor == 0)
+ {
+ newItem = new PageItem_Polygon(*Item1);
+ newItem->setXYPos(i1x, i1y);
+ }
+ else
+ {
newItem = new PageItem_Polygon(*Item2);
- newItem->setSelected(false);
- currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem);
- }
- else
- {
- newItem = new PageItem_Polygon(*Item1);
- newItem->setSelected(false);
- currDoc->Items->insert(currDoc->Items->indexOf(Item1), newItem);
- }
- }
- if (dia->keepItem2)
- {
- PageItem *newItem;
- if (dia->swapped)
- {
- newItem = new PageItem_Polygon(*Item1);
- newItem->setSelected(false);
- currDoc->Items->insert(currDoc->Items->indexOf(Item1), newItem);
- }
- else
- {
- newItem = new PageItem_Polygon(*Item2);
- newItem->setSelected(false);
- currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem);
- }
- }
- if (dia->opMode != 4)
- {
- PageItem *currItem;
- QPainterPath path;
- FPointArray points;
- if (dia->targetColor == 0)
- {
- currItem = Item1;
- if (dia->swapped)
- {
- currItem = Item2;
- currItem->setXYPos(Item1->xPos(), Item1->yPos());
- currItem->setRotation(0.0);
- }
- }
- else
- {
- if (dia->swapped)
- currItem = Item1;
- else
- {
- currItem = Item2;
- currItem->setXYPos(Item1->xPos(), Item1->yPos());
- currItem->setRotation(0.0);
- }
- }
- path = dia->result;
+ newItem->setXYPos(i1x, i1y);
+ newItem->setRotation(0.0);
+ }
+ currDoc->Items->append(newItem);
+ newItem->setSelected(false);
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();
- }
- else
- {
- QPainterPath path;
- FPointArray points;
- PageItem *newItem;
- double i1x = Item1->xPos();
- double i1y = Item1->yPos();
- path = dia->result;
- if (!path.isEmpty())
- {
- 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();
- }
-
- path = QPainterPath();
- path = dia->result1;
- if (!path.isEmpty())
- {
- 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();
- }
-
- path = QPainterPath();
- path = dia->result2;
- if (!path.isEmpty())
- {
- 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->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);
- }
- }
- currDoc->m_Selection->clear();
- currDoc->view()->Deselect(true);
- }
- currDoc->changed();
- currDoc->view()->DrawNew();
+ 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);
+ }
+ }
+ 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;
}
Modified: trunk/Scribus/scribus/undomanager.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=17424&path=/trunk/Scribus/scribus/undomanager.cpp
==============================================================================
--- trunk/Scribus/scribus/undomanager.cpp (original)
+++ trunk/Scribus/scribus/undomanager.cpp Mon Apr 9 13:27:34 2012
@@ -971,6 +971,7 @@
UndoManager::LinkTextFrame = tr("Link text frame");
UndoManager::UnlinkTextFrame = tr("Unlink text frame");
UndoManager::ClearImage = tr("Clear image frame content");
+ UndoManager::PathOperation = tr("Path Operation");
}
void UndoManager::initIcons()
@@ -1183,6 +1184,7 @@
QString UndoManager::LinkTextFrame = "";
QString UndoManager::UnlinkTextFrame = "";
QString UndoManager::ClearImage = "";
+QString UndoManager::PathOperation = "";
/*** Icons for UndoObjects *******************************************/
QPixmap *UndoManager::IImageFrame = 0;
Modified: trunk/Scribus/scribus/undomanager.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=17424&path=/trunk/Scribus/scribus/undomanager.h
==============================================================================
--- trunk/Scribus/scribus/undomanager.h (original)
+++ trunk/Scribus/scribus/undomanager.h Mon Apr 9 13:27:34 2012
@@ -597,6 +597,7 @@
static QString LinkTextFrame;
static QString UnlinkTextFrame;
static QString ClearImage;
+ static QString PathOperation;
/*@}*/
/**
More information about the scribus-commit
mailing list