View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0010805 | Scribus | Undo/Redo | public | 2012-06-26 20:27 | 2012-07-01 20:34 |
| Reporter | Chelen | Assigned To | Chelen | ||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | closed | Resolution | fixed | ||
| Product Version | 1.5.0 | ||||
| Target Version | 1.5.0 | Fixed in Version | 1.5.0svn | ||
| Summary | 0010805: Text Undo | ||||
| Description | undo/redo for : delete text insert text replace text paste text paste inline frame insert lorem ipsum insert special char import text append text clean content of a textframe change char style change paragraph style change first line offset policy erase style columns and text distance in text frame tabs length ... | ||||
| Tags | No tags attached. | ||||
| Attached Files | Patch.diff (51,216 bytes)
diff --git a/Scribus/scribus/canvasmode.cpp b/Scribus/scribus/canvasmode.cpp
index 4f2b9c2..f7e6fb6 100644
--- a/Scribus/scribus/canvasmode.cpp
+++ b/Scribus/scribus/canvasmode.cpp
@@ -76,7 +76,8 @@ CanvasMode::CanvasMode (ScribusView* view) :
m_view(view),
m_canvas(view->m_canvas),
m_doc(view->Doc),
- m_panGesture(NULL)
+ m_panGesture(NULL),
+ undoManager(UndoManager::instance())
{
m_pen["outline"] = QPen(Qt::gray, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
m_pen["outline"].setCosmetic(true);
diff --git a/Scribus/scribus/canvasmode.h b/Scribus/scribus/canvasmode.h
index 98b7a26..29d2354 100644
--- a/Scribus/scribus/canvasmode.h
+++ b/Scribus/scribus/canvasmode.h
@@ -36,6 +36,7 @@ class QMouseEvent;
class QKeyEvent;
class QPainter;
+class UndoManager;
class Canvas;
struct CanvasViewMode;
class PanGesture;
@@ -140,6 +141,7 @@ public:
protected:
+ UndoManager* undoManager;
ScribusView * const m_view;
Canvas * const m_canvas;
ScribusDoc * const m_doc;
diff --git a/Scribus/scribus/canvasmode_edit.cpp b/Scribus/scribus/canvasmode_edit.cpp
index afac8d4..7eeca1c 100644
--- a/Scribus/scribus/canvasmode_edit.cpp
+++ b/Scribus/scribus/canvasmode_edit.cpp
@@ -487,6 +487,12 @@ void CanvasMode_Edit::mouseMoveEvent(QMouseEvent *m)
void CanvasMode_Edit::mousePressEvent(QMouseEvent *m)
{
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss)
+ ss->set("ETEA",QString(""));
+ }
// const double mouseX = m->globalX();
// const double mouseY = m->globalY();
const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
diff --git a/Scribus/scribus/gtaction.cpp b/Scribus/scribus/gtaction.cpp
index 16877f0..d9a34b0 100644
--- a/Scribus/scribus/gtaction.cpp
+++ b/Scribus/scribus/gtaction.cpp
@@ -43,6 +43,8 @@ for which a new license (GPL+exception) is in place.
#include "selection.h"
#include "sccolorengine.h"
#include "scribus.h"
+#include "undomanager.h"
+#include "pageitem_textframe.h"
#include "util_icon.h"
#include "ui/propertiespalette.h"
@@ -80,6 +82,7 @@ gtAction::gtAction(bool append, PageItem* pageitem)
doAppend = append;
updateParagraphStyles = false;
overridePStyleFont = true;
+ undoManager = UndoManager::instance();
}
void gtAction::setProgressInfo()
@@ -108,42 +111,54 @@ void gtAction::clearFrame()
void gtAction::writeUnstyled(const QString& text)
{
+ UndoTransaction* activeTransaction = NULL;
if (isFirstWrite)
{
if (!doAppend)
{
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::Selection, Um::IGroup, Um::ImportText, "", Um::IDelete));
if (it->nextInChain() != 0)
{
PageItem *nextItem = it->nextInChain();
while (nextItem != 0)
{
- nextItem->itemText.clear();
+ nextItem->itemText.selectAll();
+ nextItem->asTextFrame()->deleteSelectedTextFromFrame();
nextItem = nextItem->nextInChain();
}
}
- it->itemText.clear();
+ it->itemText.selectAll();
+ it->asTextFrame()->deleteSelectedTextFromFrame();
}
}
- QChar ch0(0), ch5(5), ch10(10), ch13(13);
- for (int a = 0; a < text.length(); ++a)
+ QChar ch0(0), ch5(5), ch10(10), ch13(13);
+ QString textStr = text;
+ textStr.remove(ch0);
+ textStr.remove(ch13);
+ textStr.replace(ch10,ch13);
+ textStr.replace(ch5,ch13);
+ textStr.replace(QString(0x2028),SpecialChars::LINEBREAK);
+ textStr.replace(QString(0x2029),SpecialChars::PARSEP);
+ int pos = it->itemText.length();
+ if (UndoManager::undoEnabled())
{
- if ((text.at(a) == ch0) || (text.at(a) == ch13))
- continue;
- QChar ch = text.at(a);
- if ((ch == ch10) || (ch == ch5))
- ch = ch13;
- else if (ch.unicode() == 0x2028)
- ch = SpecialChars::LINEBREAK;
- else if (ch.unicode() == 0x2029)
- ch = SpecialChars::PARSEP;
-
- int pos = it->itemText.length();
- it->itemText.insertChars(pos, QString(ch));
+ SimpleState *ss = new SimpleState(Um::AppendText,"",Um::ICreate);
+ ss->set("INSERT_FRAMETEXT", "insert_frametext");
+ ss->set("TEXT_STR",textStr);
+ ss->set("START", pos);
+ undoManager->action(it, ss);
}
-
+ it->itemText.insertChars(pos, textStr);
lastCharWasLineChange = text.right(1) == "\n";
isFirstWrite = false;
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
}
void gtAction::write(const QString& text, gtStyle *style)
diff --git a/Scribus/scribus/gtaction.h b/Scribus/scribus/gtaction.h
index 1ace66c..a8949ee 100644
--- a/Scribus/scribus/gtaction.h
+++ b/Scribus/scribus/gtaction.h
@@ -41,6 +41,7 @@ class CharStyle;
class ParagraphStyle;
class ScribusDoc;
class ScribusMainWindow;
+class UndoManager;
class gtStyle;
class gtParagraphStyle;
@@ -52,6 +53,7 @@ typedef QMap<QString, QString> FontFamilyMap;
class SCRIBUS_API gtAction
{
private:
+ UndoManager* undoManager;
ScribusMainWindow* m_ScMW;
PageItem *textFrame;
PageItem *it;
diff --git a/Scribus/scribus/pageitem.cpp b/Scribus/scribus/pageitem.cpp
index a8acc92..fb7e695 100644
--- a/Scribus/scribus/pageitem.cpp
+++ b/Scribus/scribus/pageitem.cpp
@@ -1376,34 +1376,83 @@ void PageItem::currentTextProps(ParagraphStyle& parStyle) const
void PageItem::setTextToFrameDistLeft(double newLeft)
{
+ if(Extra==newLeft)
+ return;
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = new SimpleState(Um::TextFrameDist, "", Um::ITextFrame);
+ ss->set("LEFT_TEXTFRAMEDIST", "left_textframedist");
+ ss->set("OLD_DIST",Extra);
+ ss->set("NEW_DIST",newLeft);
+ undoManager->action(this, ss);
+ }
Extra=newLeft;
//emit textToFrameDistances(Extra, TExtra, BExtra, RExtra);
}
void PageItem::setTextToFrameDistRight(double newRight)
{
+ if(RExtra==newRight)
+ return;
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = new SimpleState(Um::TextFrameDist, "", Um::ITextFrame);
+ ss->set("RIGHT_TEXTFRAMEDIST", "right_textframedist");
+ ss->set("OLD_DIST",RExtra);
+ ss->set("NEW_DIST",newRight);
+ undoManager->action(this, ss);
+ }
RExtra=newRight;
//emit textToFrameDistances(Extra, TExtra, BExtra, RExtra);
}
void PageItem::setTextToFrameDistTop(double newTop)
{
+ if(TExtra==newTop)
+ return;
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = new SimpleState(Um::TextFrameDist, "", Um::ITextFrame);
+ ss->set("TOP_TEXTFRAMEDIST", "top_textframedist");
+ ss->set("OLD_DIST",TExtra);
+ ss->set("NEW_DIST",newTop);
+ undoManager->action(this, ss);
+ }
TExtra=newTop;
//emit textToFrameDistances(Extra, TExtra, BExtra, RExtra);
}
void PageItem::setTextToFrameDistBottom(double newBottom)
{
+ if(BExtra==newBottom)
+ return;
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = new SimpleState(Um::TextFrameDist, "", Um::ITextFrame);
+ ss->set("BOTTOM_TEXTFRAMEDIST", "bottom_textframedist");
+ ss->set("OLD_DIST",BExtra);
+ ss->set("NEW_DIST",newBottom);
+ undoManager->action(this, ss);
+ }
BExtra=newBottom;
//emit textToFrameDistances(Extra, TExtra, BExtra, RExtra);
}
void PageItem::setTextToFrameDist(double newLeft, double newRight, double newTop, double newBottom)
{
- Extra=newLeft;
- RExtra=newRight;
- TExtra=newTop;
- BExtra=newBottom;
+ UndoTransaction* activeTransaction = NULL;
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::TextFrame, Um::IDocument, Um::TextFrameDist, "", Um::ITextFrame));
+ setTextToFrameDistLeft(newLeft);
+ setTextToFrameDistRight(newRight);
+ setTextToFrameDistTop(newTop);
+ setTextToFrameDistBottom(newBottom);
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
//emit textToFrameDistances(Extra, TExtra, BExtra, RExtra);
}
@@ -1414,11 +1463,29 @@ void PageItem::setGridOffset(double) { } // FIXME
void PageItem::setGridDistance(double) { } // FIXME
void PageItem::setColumns(int n)
{
- Cols = qMax(1, n); //FIXME: undo
+ if(Cols==n)
+ return;
+ if(UndoManager::undoEnabled()){
+ SimpleState *ss = new SimpleState(Um::Columns, "", Um::IBorder);
+ ss->set("COLUMNS", "columns");
+ ss->set("OLD_COLUMNS", Cols);
+ ss->set("NEW_COLUMNS",n);
+ undoManager->action(this, ss);
+ }
+ Cols = qMax(1, n);
}
void PageItem::setColumnGap(double gap)
{
- ColGap = gap; //FIXME: undo
+ if(ColGap==gap)
+ return;
+ if(UndoManager::undoEnabled()){
+ SimpleState *ss = new SimpleState(Um::Columns, "", Um::IBorder);
+ ss->set("COLUMNSGAP", "columnsgap");
+ ss->set("OLD_COLUMNS", ColGap);
+ ss->set("NEW_COLUMNS",gap);
+ undoManager->action(this, ss);
+ }
+ ColGap = gap;
}
void PageItem::setCornerRadius(double newRadius)
@@ -4361,8 +4428,40 @@ void PageItem::restore(UndoState *state, bool isUndo)
restoreShade(ss, isUndo);
else if (ss->contains("LINE_COLOR"))
restoreLineColor(ss, isUndo);
+ else if (ss->contains("COLUMNS"))
+ restoreColumns(ss, isUndo);
+ else if (ss->contains("COLUMNSGAP"))
+ restoreColumnsGap(ss, isUndo);
else if (ss->contains("LINE_SHADE"))
restoreLineShade(ss, isUndo);
+ else if (ss->contains("DELETE_FRAMETEXT"))
+ restoreDeleteFrameText(ss, isUndo);
+ else if (ss->contains("INSERT_FRAMETEXT"))
+ restoreInsertFrameText(ss,isUndo);
+ else if (ss->contains("LOREM_FRAMETEXT"))
+ restoreLoremIpsum(ss,isUndo);
+ else if (ss->contains("APPLY_CHARSTYLE"))
+ restoreCharStyle(ss,isUndo);
+ else if (ss->contains("SET_CHARSTYLE"))
+ restoreSetCharStyle(ss,isUndo);
+ else if (ss->contains("SET_PARASTYLE"))
+ restoreSetParagraphStyle(ss,isUndo);
+ else if (ss->contains("APPLY_PARASTYLE"))
+ restoreParagraphStyle(ss,isUndo);
+ else if (ss->contains("APPLY_DEFAULTPARASTYLE"))
+ restoreDefaultParagraphStyle(ss,isUndo);
+ else if (ss->contains("LEFT_TEXTFRAMEDIST"))
+ restoreLeftTextFrameDist(ss,isUndo);
+ else if (ss->contains("RIGHT_TEXTFRAMEDIST"))
+ restoreRightTextFrameDist(ss,isUndo);
+ else if (ss->contains("TOP_TEXTFRAMEDIST"))
+ restoreTopTextFrameDist(ss,isUndo);
+ else if (ss->contains("BOTTOM_TEXTFRAMEDIST"))
+ restoreBottomTextFrameDist(ss,isUndo);
+ else if (ss->contains("FIRSTLINEOFFSET"))
+ restoreFirstLineOffset(ss,isUndo);
+ else if (ss->contains("PASTE_TEXT"))
+ restorePasteText(ss,isUndo);
else if (ss->contains("IMAGEFLIPH"))
{
select();
@@ -4464,6 +4563,8 @@ void PageItem::restore(UndoState *state, bool isUndo)
restoreReverseText(ss, isUndo);
else if (ss->contains("CLEAR_IMAGE"))
restoreClearImage(ss,isUndo);
+ else if (ss->contains("PASTE_INLINE"))
+ restorePasteInline(ss,isUndo);
else if (ss->contains("PATH_OPERATION"))
restorePathOperation(ss, isUndo);
}
@@ -4474,6 +4575,191 @@ void PageItem::restore(UndoState *state, bool isUndo)
m_Doc->SnapGuides = SnapGuidesBackup;
}
+void PageItem::restorePasteInline(SimpleState *is, bool isUndo)
+{
+ int start = is->getInt("START");
+ if(isUndo){
+ itemText.select(start,1);
+ asTextFrame()->deleteSelectedTextFromFrame();
+ } else {
+ itemText.insertObject(is->getInt("INDEX"));
+ }
+}
+
+void PageItem::restorePasteText(SimpleState *ss, bool isUndo)
+{
+ ScItemState<StoryText> *is = dynamic_cast<ScItemState<StoryText>*>(ss);
+ int start = is->getInt("START");
+ if(isUndo){
+ itemText.select(start,is->getItem().length());
+ asTextFrame()->deleteSelectedTextFromFrame();
+ } else {
+ itemText.insert(is->getItem());
+ }
+}
+
+void PageItem::restoreColumnsGap(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ ColGap = ss->getInt("OLD_COLUMNS");
+ } else {
+ ColGap = ss->getInt("NEW_COLUMNS");
+ }
+ update();
+}
+
+void PageItem::restoreLeftTextFrameDist(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ Extra = ss->getInt("OLD_DIST");
+ } else {
+ Extra = ss->getInt("NEW_DIST");
+ }
+ update();
+}
+
+void PageItem::restoreRightTextFrameDist(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ RExtra = ss->getInt("OLD_DIST");
+ } else {
+ RExtra = ss->getInt("NEW_DIST");
+ }
+ update();
+}
+
+void PageItem::restoreTopTextFrameDist(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ TExtra = ss->getInt("OLD_DIST");
+ } else {
+ TExtra = ss->getInt("NEW_DIST");
+ }
+ update();
+}
+
+void PageItem::restoreBottomTextFrameDist(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ BExtra = ss->getInt("OLD_DIST");
+ } else {
+ BExtra = ss->getInt("NEW_DIST");
+ }
+ update();
+}
+
+void PageItem::restoreColumns(SimpleState *ss, bool isUndo)
+{
+ if(isUndo){
+ Cols = ss->getInt("OLD_COLUMNS");
+ } else {
+ Cols = ss->getInt("NEW_COLUMNS");
+ }
+ update();
+}
+
+void PageItem::restoreFirstLineOffset(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<FirstLineOffsetPolicy, FirstLineOffsetPolicy > > *is = dynamic_cast<ScItemState<QPair<FirstLineOffsetPolicy, FirstLineOffsetPolicy> >*>(ss);
+ if(isUndo){
+ firstLineOffsetP = is->getItem().first;
+ } else {
+ firstLineOffsetP = is->getItem().second;
+ }
+ update();
+}
+
+void PageItem::restoreDefaultParagraphStyle(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<ParagraphStyle, ParagraphStyle > > *is = dynamic_cast<ScItemState<QPair<ParagraphStyle, ParagraphStyle> >*>(ss);
+ if(isUndo){
+ itemText.setDefaultStyle(is->getItem().second);
+ } else {
+ itemText.setDefaultStyle(is->getItem().first);
+ }
+}
+
+void PageItem::restoreParagraphStyle(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<ParagraphStyle, ParagraphStyle > > *is = dynamic_cast<ScItemState<QPair<ParagraphStyle, ParagraphStyle> >*>(ss);
+ int pos = is->getInt("POS");
+ if(isUndo){
+ itemText.eraseStyle(pos,is->getItem().first);
+ itemText.applyStyle(pos,is->getItem().second);
+ } else {
+ itemText.applyStyle(pos,is->getItem().first);
+ }
+}
+
+void PageItem::restoreCharStyle(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<CharStyle, CharStyle > > *is = dynamic_cast<ScItemState<QPair<CharStyle, CharStyle> >*>(ss);
+ int length = is->getInt("LENGTH");
+ int start = is->getInt("START");
+ if(isUndo){
+ itemText.eraseCharStyle(start,length,is->getItem().first);
+ itemText.applyCharStyle(start,length,is->getItem().second);
+ } else {
+ itemText.applyCharStyle(start,length,is->getItem().first);
+ }
+}
+
+void PageItem::restoreSetCharStyle(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<CharStyle, CharStyle > > *is = dynamic_cast<ScItemState<QPair<CharStyle, CharStyle> >*>(ss);
+ int length = is->getInt("LENGTH");
+ int start = is->getInt("START");
+ if(isUndo){
+ itemText.setCharStyle(start,length,is->getItem().second);
+ } else {
+ itemText.setCharStyle(start,length,is->getItem().first);
+ }
+}
+
+void PageItem::restoreSetParagraphStyle(SimpleState *ss, bool isUndo)
+{
+ ScItemState<QPair<ParagraphStyle, ParagraphStyle > > *is = dynamic_cast<ScItemState<QPair<ParagraphStyle, ParagraphStyle> >*>(ss);
+ int pos = is->getInt("POS");
+ if(isUndo){
+ itemText.setStyle(pos,is->getItem().second);
+ } else {
+ itemText.setStyle(pos,is->getItem().first);
+ }
+}
+
+void PageItem::restoreLoremIpsum(SimpleState *ss, bool isUndo)
+{
+ QString sampleText = ss->get("TEXT_STR");
+ if(isUndo){
+ itemText.selectAll();
+ asTextFrame()->deleteSelectedTextFromFrame();
+ } else {
+ itemText.insertChars(0,sampleText);
+ }
+}
+
+void PageItem::restoreDeleteFrameText(SimpleState *ss, bool isUndo){
+ QString text = ss->get("TEXT_STR");
+ int start = ss->getInt("START");
+ if(isUndo){
+ itemText.insertChars(start,text);
+ } else {
+ itemText.select(start,text.length());
+ asTextFrame()->deleteSelectedTextFromFrame();
+ }
+}
+
+void PageItem::restoreInsertFrameText(SimpleState *ss, bool isUndo){
+ QString text = ss->get("TEXT_STR");
+ int start = ss->getInt("START");
+ if(isUndo){
+ itemText.select(start,text.length());
+ asTextFrame()->deleteSelectedTextFromFrame();
+ } else {
+ itemText.insertChars(start,text);
+ }
+}
+
void PageItem::restoreMove(SimpleState *state, bool isUndo)
{
double ox = state->getDouble("OLD_XPOS");
@@ -7348,6 +7634,13 @@ void PageItem::setFirstLineOffset(FirstLineOffsetPolicy flop)
{
if(firstLineOffsetP != flop)
{
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<FirstLineOffsetPolicy,FirstLineOffsetPolicy> > *is = new ScItemState<QPair <FirstLineOffsetPolicy,FirstLineOffsetPolicy> >(Um::FirstLineOffset);
+ is->set("FIRSTLINEOFFSET", "fisrtlineoffset");
+ is->setItem(QPair<FirstLineOffsetPolicy,FirstLineOffsetPolicy>(firstLineOffsetP, flop));
+ undoManager->action(this, is);
+ }
firstLineOffsetP = flop;
}
}
diff --git a/Scribus/scribus/pageitem.h b/Scribus/scribus/pageitem.h
index ea07fe7..d0fba00 100644
--- a/Scribus/scribus/pageitem.h
+++ b/Scribus/scribus/pageitem.h
@@ -1209,6 +1209,23 @@ protected:
* @author Riku Leino
*/
/*@{*/
+ void restorePasteInline(SimpleState *state, bool isUndo);
+ void restorePasteText(SimpleState *state, bool isUndo);
+ void restoreFirstLineOffset(SimpleState *state, bool isUndo);
+ void restoreParagraphStyle(SimpleState *state, bool isUndo);
+ void restoreDefaultParagraphStyle(SimpleState *state, bool isUndo);
+ void restoreCharStyle(SimpleState *state, bool isUndo);
+ void restoreLeftTextFrameDist(SimpleState *state, bool isUndo);
+ void restoreRightTextFrameDist(SimpleState *state, bool isUndo);
+ void restoreTopTextFrameDist(SimpleState *state, bool isUndo);
+ void restoreBottomTextFrameDist(SimpleState *state, bool isUndo);
+ void restoreSetCharStyle(SimpleState *state, bool isUndo);
+ void restoreColumns(SimpleState *state, bool isUndo);
+ void restoreColumnsGap(SimpleState *state, bool isUndo);
+ void restoreSetParagraphStyle(SimpleState *state, bool isUndo);
+ void restoreLoremIpsum(SimpleState *state, bool isUndo);
+ void restoreDeleteFrameText(SimpleState *state, bool isUndo);
+ void restoreInsertFrameText(SimpleState *state, bool isUndo);
void restoreMove(SimpleState *state, bool isUndo);
void restoreResize(SimpleState *state, bool isUndo);
void restoreRotate(SimpleState *state, bool isUndo);
diff --git a/Scribus/scribus/pageitem_textframe.cpp b/Scribus/scribus/pageitem_textframe.cpp
index 833e3c9..5386071 100644
--- a/Scribus/scribus/pageitem_textframe.cpp
+++ b/Scribus/scribus/pageitem_textframe.cpp
@@ -3301,7 +3301,10 @@ void PageItem_TextFrame::clearContents()
nextItem = nextItem->prevInChain();
ParagraphStyle defaultStyle = nextItem->itemText.defaultStyle();
- nextItem->itemText.clear();
+ nextItem->itemText.selectAll();
+ nextItem->asTextFrame()->deleteSelectedTextFromFrame();
+ if(UndoManager::undoEnabled())
+ undoManager->getLastUndo()->setName(Um::ClearText);
nextItem->itemText.setDefaultStyle(defaultStyle);
while (nextItem != 0)
@@ -3387,6 +3390,12 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
case Qt::Key_Down:
if ( (buttonModifiers & Qt::ShiftModifier) == 0 )
deselectAll();
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss)
+ ss->set("ETEA",QString(""));
+ }
}
if (unicodeTextEditMode)
@@ -3780,6 +3789,7 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
break;
default:
bool doUpdate = false;
+ UndoTransaction* activeTransaction = NULL;
if (itemText.lengthOfSelection() > 0) //(kk < 0x1000)
{
bool x11Hack=false;
@@ -3795,6 +3805,9 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
#endif
if (!controlCharHack && !x11Hack && !k->text().isEmpty())
{
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::Selection, Um::IGroup, Um::ReplaceText, "", Um::IDelete));
+
deleteSelectedTextFromFrame();
doUpdate = true;
}
@@ -3811,6 +3824,20 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
//if ((kk == Qt::Key_Tab) || ((kk == Qt::Key_Return) && (buttonState & Qt::ShiftButton)))
if (kk == Qt::Key_Tab)
{
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss && ss->get("ETEA") == "insert_frametext")
+ ss->set("TEXT_STR",ss->get("TEXT_STR") + QString(SpecialChars::TAB));
+ else {
+ ss = new SimpleState(Um::InsertText,"",Um::ICreate);
+ ss->set("INSERT_FRAMETEXT", "insert_frametext");
+ ss->set("ETEA", QString("insert_frametext"));
+ ss->set("TEXT_STR", QString(SpecialChars::TAB));
+ ss->set("START", itemText.cursorPosition());
+ undoManager->action(this, ss);
+ }
+ }
itemText.insertChars(QString(SpecialChars::TAB), true);
// Tinput = true;
// view->RefreshItem(this);
@@ -3818,6 +3845,20 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
}
else if ((uc[0] > QChar(31) && m_Doc->currentStyle.charStyle().font().canRender(uc[0])) || (as == 13) || (as == 30))
{
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss && ss->get("ETEA") == "insert_frametext")
+ ss->set("TEXT_STR",ss->get("TEXT_STR") + uc);
+ else {
+ ss = new SimpleState(Um::InsertText,"",Um::ICreate);
+ ss->set("INSERT_FRAMETEXT", "insert_frametext");
+ ss->set("ETEA", QString("insert_frametext"));
+ ss->set("TEXT_STR",uc);
+ ss->set("START", itemText.cursorPosition());
+ undoManager->action(this, ss);
+ }
+ }
itemText.insertChars(uc, true);
if ((m_Doc->docHyphenator->AutoCheck) && (itemText.cursorPosition() > 1))
{
@@ -3845,6 +3886,12 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
}
if (doUpdate)
{
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
// update layout immediately, we need MaxChars to be correct to detect
// if we need to move to next frame or not
updateLayout();
@@ -3873,6 +3920,24 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
void PageItem_TextFrame::deleteSelectedTextFromFrame()
{
if (itemText.lengthOfSelection() > 0) {
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss && ss->get("ETEA") == "delete_frametext"){
+ if(itemText.startOfSelection()<ss->getInt("START")){
+ ss->set("START",itemText.startOfSelection());
+ ss->set("TEXT_STR",itemText.text(itemText.startOfSelection(),itemText.lengthOfSelection()) + ss->get("TEXT_STR"));
+ } else
+ ss->set("TEXT_STR",ss->get("TEXT_STR") + itemText.text(itemText.startOfSelection(),itemText.lengthOfSelection()));
+ }else {
+ ss = new SimpleState(Um::DeleteText,"",Um::IDelete);
+ ss->set("DELETE_FRAMETEXT", "delete_frametext");
+ ss->set("ETEA", QString("delete_frametext"));
+ ss->set("TEXT_STR",itemText.text(itemText.startOfSelection(),itemText.lengthOfSelection()));
+ ss->set("START", itemText.startOfSelection());
+ undoManager->action(this, ss);
+ }
+ }
itemText.setCursorPosition( itemText.startOfSelection() );
itemText.removeSelection();
HasSel = false;
diff --git a/Scribus/scribus/scribus.cpp b/Scribus/scribus/scribus.cpp
index 7274e67..47011bd 100644
--- a/Scribus/scribus/scribus.cpp
+++ b/Scribus/scribus/scribus.cpp
@@ -1173,9 +1173,33 @@ void ScribusMainWindow::specialActionKeyEvent(const QString& actionName, int uni
{
if (unicodevalue!=-1)
{
- if (currItem->HasSel)
+ UndoTransaction* activeTransaction = NULL;
+ if (currItem->HasSel){
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::Selection, Um::IGroup, Um::ReplaceText, "", Um::IDelete));
currItem->deleteSelectedTextFromFrame();
+ }
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss && ss->get("ETEA") == "insert_frametext")
+ ss->set("TEXT_STR",ss->get("TEXT_STR") + QString(QChar(unicodevalue)));
+ else {
+ ss = new SimpleState(Um::InsertText,"",Um::ICreate);
+ ss->set("INSERT_FRAMETEXT", "insert_frametext");
+ ss->set("ETEA", QString("insert_frametext"));
+ ss->set("TEXT_STR", QString(QChar(unicodevalue)));
+ ss->set("START", currItem->itemText.cursorPosition());
+ undoManager->action(currItem, ss);
+ }
+ }
currItem->itemText.insertChars(QString(QChar(unicodevalue)), true);
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
}
else if (actionName=="unicodeSoftHyphen") //ignore the char as we use an attribute if the text item, for now.
{
@@ -1188,6 +1212,20 @@ void ScribusMainWindow::specialActionKeyEvent(const QString& actionName, int uni
fl |= ScStyle_HyphenationPossible;
currItem->itemText.item(qMax(currItem->CPos-1,0))->setEffects(fl);
#else
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+ if(ss && ss->get("ETEA") == "insert_frametext")
+ ss->set("TEXT_STR",ss->get("TEXT_STR") + QString(SpecialChars::SHYPHEN));
+ else {
+ ss = new SimpleState(Um::InsertText,"",Um::ICreate);
+ ss->set("INSERT_FRAMETEXT", "insert_frametext");
+ ss->set("ETEA", QString("insert_frametext"));
+ ss->set("TEXT_STR", QString(SpecialChars::SHYPHEN));
+ ss->set("START", currItem->itemText.cursorPosition());
+ undoManager->action(currItem, ss);
+ }
+ }
currItem->itemText.insertChars(QString(SpecialChars::SHYPHEN), true);
#endif
}
@@ -5111,7 +5149,14 @@ void ScribusMainWindow::slotEditPaste()
dig.parseMemory(xml, xml.length());
StoryText* story = dig.result<StoryText>();
-
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<StoryText> *is = new ScItemState<StoryText>(Um::Paste);
+ is->set("PASTE_TEXT", "paste_text");
+ is->set("START",currItem->itemText.cursorPosition());
+ is->setItem(*story);
+ undoManager->action(currItem, is);
+ }
currItem->itemText.insert(*story);
delete story;
@@ -5178,8 +5223,16 @@ void ScribusMainWindow::slotEditPaste()
doc->maxCanvasCoordinate = maxSize;
if (outlinePalette->isVisible())
outlinePalette->BuildTree();
- currItem->itemText.insertObject(fIndex);
undoManager->setUndoEnabled(true);
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *is = new SimpleState(Um::Paste,"",Um::IPaste);
+ is->set("PASTE_INLINE", "paste_inline");
+ is->set("START",currItem->itemText.cursorPosition());
+ is->set("INDEX",fIndex);
+ undoManager->action(currItem, is);
+ }
+ currItem->itemText.insertObject(fIndex);
doc->m_Selection->delaySignalsOff();
inlinePalette->unsetDoc();
inlinePalette->setDoc(doc);
diff --git a/Scribus/scribus/scribusdoc.cpp b/Scribus/scribus/scribusdoc.cpp
index d816fdb..3cde579 100644
--- a/Scribus/scribus/scribusdoc.cpp
+++ b/Scribus/scribus/scribusdoc.cpp
@@ -8400,8 +8400,8 @@ void ScribusDoc::itemSelection_SetParagraphStyle(const ParagraphStyle & newStyle
if (selectedItemCount == 0)
return;
UndoTransaction* activeTransaction = NULL;
- if (selectedItemCount > 1)
- activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, newStyle.displayName(), Um::IFont));
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::SetStyle, newStyle.displayName(), Um::IFont));
for (uint aa = 0; aa < selectedItemCount; ++aa)
{
PageItem *currItem = itemSelection->itemAt(aa);
@@ -8454,8 +8454,8 @@ void ScribusDoc::itemSelection_EraseParagraphStyle(Selection* customSelection)
if (selectedItemCount == 0)
return;
UndoTransaction* activeTransaction = NULL;
- if (selectedItemCount > 1)
- activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, tr( "remove direct paragraph formatting" ), Um::IFont));
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::RemoveTextStyle, tr( "remove direct paragraph formatting" ), Um::IFont));
for (uint aa = 0; aa < selectedItemCount; ++aa)
{
PageItem *currItem = itemSelection->itemAt(aa);
@@ -8479,17 +8479,40 @@ void ScribusDoc::itemSelection_EraseParagraphStyle(Selection* customSelection)
{
ParagraphStyle newStyle;
newStyle.setParent(currItem->itemText.paragraphStyle(pos).parent());
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("SET_PARASTYLE", "set_parastyle");
+ is->set("POS",pos);
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(newStyle, currItem->itemText.paragraphStyle(pos)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setStyle(pos, newStyle);
}
}
ParagraphStyle newStyle2;
newStyle2.setParent(currItem->itemText.paragraphStyle(stop).parent());
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("SET_PARASTYLE", "set_parastyle");
+ is->set("POS",stop);
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(newStyle2, currItem->itemText.paragraphStyle(stop)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setStyle(stop, newStyle2);
}
else
{
ParagraphStyle newStyle;
newStyle.setParent(currItem->itemText.defaultStyle().parent());
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_DEFAULTPARASTYLE", "apply_defaultparastyle");
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(newStyle, currItem->itemText.defaultStyle()));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setDefaultStyle(newStyle);
}
currItem->invalid = true;
@@ -8524,6 +8547,13 @@ void ScribusDoc::itemSelection_ApplyParagraphStyle(const ParagraphStyle & newSty
{
ParagraphStyle dstyle(currItem->itemText.defaultStyle());
dstyle.applyStyle(newStyle);
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_DEFAULTPARASTYLE", "apply_defaultparastyle");
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(dstyle, currItem->itemText.defaultStyle()));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setDefaultStyle(dstyle);
}
if (currItemTextCount > 0)
@@ -8541,9 +8571,25 @@ void ScribusDoc::itemSelection_ApplyParagraphStyle(const ParagraphStyle & newSty
{
if (currItem->itemText.text(pos) == SpecialChars::PARSEP)
{
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_PARASTYLE", "apply_parastyle");
+ is->set("POS",pos);
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(newStyle, currItem->itemText.paragraphStyle(pos)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.applyStyle(pos, newStyle, rmDirectFormatting);
}
}
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_PARASTYLE", "apply_parastyle");
+ is->set("POS",stop);
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(newStyle, currItem->itemText.paragraphStyle(stop)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.applyStyle(stop, newStyle, rmDirectFormatting);
currItem->invalid = true;
}
@@ -8569,7 +8615,7 @@ void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Select
if (selectedItemCount == 0)
return;
UndoTransaction* activeTransaction = NULL;
- if (selectedItemCount > 1)
+ if (UndoManager::undoEnabled())
activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, newStyle.asString(), Um::IFont));
for (uint aa = 0; aa < selectedItemCount; ++aa)
{
@@ -8595,6 +8641,15 @@ void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Select
length = start < currItem->itemText.length() ? 1 : 0;
}
}
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<CharStyle,CharStyle> > *is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ is->set("APPLY_CHARSTYLE", "apply_charstyle");
+ is->set("START",start);
+ is->set("LENGTH",qMax(0,length));
+ is->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(start)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.applyCharStyle(start, qMax(0, length), newStyle);
currItem->invalid = true;
}
@@ -8602,6 +8657,20 @@ void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Select
{
ParagraphStyle dstyle(currItem->itemText.defaultStyle());
dstyle.charStyle().applyCharStyle(newStyle);
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_DEFAULTPARASTYLE", "apply_defaultparastyle");
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(dstyle, currItem->itemText.defaultStyle()));
+ undoManager->action(currItem, is);
+
+ ScItemState<QPair<CharStyle,CharStyle> > *ist = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ ist->set("APPLY_CHARSTYLE", "apply_charstyle");
+ ist->set("START",0);
+ ist->set("LENGTH",currItem->itemText.length());
+ ist->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(0)));
+ undoManager->action(currItem, ist);
+ }
currItem->itemText.setDefaultStyle(dstyle);
// if (currItem->asPathText())
currItem->itemText.applyCharStyle(0, currItem->itemText.length(), newStyle);
@@ -8629,7 +8698,7 @@ void ScribusDoc::itemSelection_SetCharStyle(const CharStyle & newStyle, Selectio
if (selectedItemCount == 0)
return;
UndoTransaction* activeTransaction = NULL;
- if (selectedItemCount > 1)
+ if (UndoManager::undoEnabled())
activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, newStyle.asString(), Um::IFont));
for (uint aa = 0; aa < selectedItemCount; ++aa)
{
@@ -8655,6 +8724,15 @@ void ScribusDoc::itemSelection_SetCharStyle(const CharStyle & newStyle, Selectio
length = start < currItem->itemText.length() ? 1 : 0;
}
}
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<CharStyle,CharStyle> > *is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ is->set("SET_CHARSTYLE", "set_charstyle");
+ is->set("START",start);
+ is->set("LENGTH",length);
+ is->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(start)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setCharStyle(start, length, newStyle);
currItem->invalid = true;
}
@@ -8662,6 +8740,20 @@ void ScribusDoc::itemSelection_SetCharStyle(const CharStyle & newStyle, Selectio
{
ParagraphStyle dstyle(currItem->itemText.defaultStyle());
dstyle.charStyle().setStyle(newStyle);
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_DEFAULTPARASTYLE", "apply_defaultparastyle");
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(dstyle, currItem->itemText.defaultStyle()));
+ undoManager->action(currItem, is);
+
+ ScItemState<QPair<CharStyle,CharStyle> > *ist = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ ist->set("SET_CHARSTYLE", "set_charstyle");
+ ist->set("START",0);
+ ist->set("LENGTH",currItem->itemText.length());
+ ist->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(0)));
+ undoManager->action(currItem, ist);
+ }
currItem->itemText.setDefaultStyle(dstyle);
// if (currItem->asPathText())
currItem->itemText.setCharStyle(0, currItem->itemText.length(), newStyle);
@@ -8688,8 +8780,8 @@ void ScribusDoc::itemSelection_EraseCharStyle(Selection* customSelection)
if (selectedItemCount == 0)
return;
UndoTransaction* activeTransaction = NULL;
- if (selectedItemCount > 1)
- activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, tr( "remove direct char formatting" ), Um::IFont));
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::RemoveTextStyle, tr( "remove direct char formatting" ), Um::IFont));
for (uint aa = 0; aa < selectedItemCount; ++aa)
{
PageItem *currItem = itemSelection->itemAt(aa);
@@ -8726,6 +8818,15 @@ void ScribusDoc::itemSelection_EraseCharStyle(Selection* customSelection)
{
CharStyle newStyle;
newStyle.setParent(lastParent);
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<CharStyle,CharStyle> > *is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ is->set("SET_CHARSTYLE", "set_charstyle");
+ is->set("START",lastPos);
+ is->set("LENGTH",i-lastPos);
+ is->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(lastPos)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setCharStyle(lastPos, i-lastPos, newStyle);
lastPos = i;
}
@@ -8736,6 +8837,15 @@ void ScribusDoc::itemSelection_EraseCharStyle(Selection* customSelection)
{
CharStyle newStyle2;
newStyle2.setParent(lastParent);
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<CharStyle,CharStyle> > *is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle);
+ is->set("SET_CHARSTYLE", "set_charstyle");
+ is->set("START",lastPos);
+ is->set("LENGTH",stop-lastPos);
+ is->setItem(QPair<CharStyle,CharStyle>(newStyle2, currItem->itemText.charStyle(lastPos)));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setCharStyle(lastPos, stop-lastPos, newStyle2);
}
}
@@ -8745,6 +8855,13 @@ void ScribusDoc::itemSelection_EraseCharStyle(Selection* customSelection)
CharStyle newStyle;
newStyle.setParent(defStyle.charStyle().parent());
defStyle.charStyle() = newStyle;
+ if (UndoManager::undoEnabled())
+ {
+ ScItemState<QPair<ParagraphStyle,ParagraphStyle> > *is = new ScItemState<QPair <ParagraphStyle,ParagraphStyle> >(Um::SetStyle);
+ is->set("APPLY_DEFAULTPARASTYLE", "apply_defaultparastyle");
+ is->setItem(QPair<ParagraphStyle,ParagraphStyle>(defStyle, currItem->itemText.defaultStyle()));
+ undoManager->action(currItem, is);
+ }
currItem->itemText.setDefaultStyle(defStyle);
}
if (currItem->asPathText())
diff --git a/Scribus/scribus/ui/loremipsum.cpp b/Scribus/scribus/ui/loremipsum.cpp
index bd84fcc..acdb3f7 100644
--- a/Scribus/scribus/ui/loremipsum.cpp
+++ b/Scribus/scribus/ui/loremipsum.cpp
@@ -46,6 +46,7 @@ for which a new license (GPL+exception) is in place.
#include "commonstrings.h"
#include "hyphenator.h"
#include "util_icon.h"
+#include "undomanager.h"
QString getLoremLocation(QString fname)
{
@@ -135,6 +136,7 @@ QString LoremParser::createLorem(uint parCount, bool random)
LoremManager::LoremManager(ScribusDoc* doc, QWidget* parent) : QDialog( parent )
{
+ undoManager = UndoManager::instance();
m_Doc=doc;
setModal(true);
setWindowTitle( tr( "Lorem Ipsum" ) );
@@ -285,11 +287,17 @@ void LoremManager::insertLoremIpsum(QString name, int paraCount, bool random)
i2 = currItem->asTable()->activeCell().textFrame();
if (!i2->asTextFrame())
continue;
+ UndoTransaction* activeTransaction = NULL;
if (i2->itemText.length() != 0)
{
- Selection tempSelection(this, false);
- tempSelection.addItem(i2, true);
- m_Doc->itemSelection_ClearItem(&tempSelection);
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::Selection, Um::IGroup, Um::AddLoremIpsum, "", Um::ICreate));
+ i2->itemText.selectAll();
+ i2->asTextFrame()->deleteSelectedTextFromFrame();
+ //We don't need to open a dialog box as the user can undo this action.
+ //Selection tempSelection(this, false);
+ //tempSelection.addItem(i2, true);
+ //m_Doc->itemSelection_ClearItem(&tempSelection);
/* ClearItem() doesn't return true or false so
the following test has to be done */
if (i2->itemText.length() != 0)
@@ -320,7 +328,21 @@ void LoremManager::insertLoremIpsum(QString name, int paraCount, bool random)
#endif
// K.I.S.S.:
- i2->itemText.insertChars(0, lp->createLorem(paraCount, random));
+ QString sampleText = lp->createLorem(paraCount, random);
+ if (UndoManager::undoEnabled())
+ {
+ SimpleState *ss = new SimpleState(Um::AddLoremIpsum,"",Um::ICreate);
+ ss->set("LOREM_FRAMETEXT", "lorem_frametext");
+ ss->set("TEXT_STR",sampleText);
+ undoManager->action(i2, ss);
+ }
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
+ i2->itemText.insertChars(0, sampleText);
delete lp;
if (m_Doc->docHyphenator->AutoCheck)
m_Doc->docHyphenator->slotHyphenate(i2);
diff --git a/Scribus/scribus/ui/loremipsum.h b/Scribus/scribus/ui/loremipsum.h
index 8e9f5a1..aeccf4c 100644
--- a/Scribus/scribus/ui/loremipsum.h
+++ b/Scribus/scribus/ui/loremipsum.h
@@ -35,6 +35,7 @@ class QTreeWidget;
class QVBoxLayout;
class ScribusDoc;
+class UndoManager;
// class LanguageManager;
@@ -122,6 +123,7 @@ private:
QHBoxLayout* layout1;
QSpacerItem* buttonSpacer;
QString standardloremtext;
+ UndoManager* undoManager;
//! all lorems with Public Name -> filename structure
QMap<QString,QString> availableLorems;
diff --git a/Scribus/scribus/ui/propertywidget_distance.cpp b/Scribus/scribus/ui/propertywidget_distance.cpp
index a866566..f3a6f9c 100644
--- a/Scribus/scribus/ui/propertywidget_distance.cpp
+++ b/Scribus/scribus/ui/propertywidget_distance.cpp
@@ -44,6 +44,7 @@ PropertyWidget_Distance::PropertyWidget_Distance(QWidget* parent) : QFrame(paren
rightLabel->setBuddy(rightDistance);
columns->setDecimals(0);
+ columns->setSuffix("");
languageChange();
@@ -281,9 +282,10 @@ void PropertyWidget_Distance::handleColumns()
if (textItem)
{
- textItem->Cols = static_cast<int>(columns->value());
+ textItem->setColumns(static_cast<int>(columns->value()));
displayColumns(textItem->Cols, textItem->ColGap);
- if (static_cast<int>(columns->value()) == 1)
+ //this is already done in displayColumns()
+ /*if (static_cast<int>(columns->value()) == 1)
{
columnGap->setEnabled(false);
columnGapLabel->setEnabled(false);
@@ -292,7 +294,7 @@ void PropertyWidget_Distance::handleColumns()
{
columnGap->setEnabled(true);
columnGapLabel->setEnabled(true);
- }
+ }*/
textItem->update();
if (m_doc->appMode == modeEditTable)
m_item->asTable()->update();
@@ -311,7 +313,7 @@ void PropertyWidget_Distance::handleColumnGap()
if (!textItem) return;
if (columnGapLabel->currentIndex() == 0)
- textItem->ColGap = columnGap->value() / m_unitRatio;
+ textItem->setColumnGap(columnGap->value() / m_unitRatio);
else
{
double lineCorr;
@@ -321,7 +323,7 @@ void PropertyWidget_Distance::handleColumnGap()
lineCorr = 0;
double newWidth = columnGap->value() / m_unitRatio;
double newGap = qMax(((textItem->width() - textItem->textToFrameDistLeft() - textItem->textToFrameDistRight() - lineCorr) - (newWidth * textItem->Cols)) / (textItem->Cols - 1), 0.0);
- textItem->ColGap = newGap;
+ textItem->setColumnGap(newGap);
}
textItem->update();
if (m_doc->appMode == modeEditTable)
@@ -358,7 +360,9 @@ void PropertyWidget_Distance::handleTabs()
{
ParagraphStyle newStyle(m_item->itemText.defaultStyle());
newStyle.setTabValues(dia->tmpTab);
- m_item->itemText.setDefaultStyle(newStyle);
+ Selection tempSelection(this, false);
+ tempSelection.addItem(m_item, true);
+ m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
}
else
{
@@ -467,4 +471,4 @@ void PropertyWidget_Distance::unitChange()
topDistance->blockSignals(false);
bottomDistance->blockSignals(false);
rightDistance->blockSignals(false);
-}
\ No newline at end of file
+}
diff --git a/Scribus/scribus/undomanager.cpp b/Scribus/scribus/undomanager.cpp
index 6358cd4..6d3282e 100644
--- a/Scribus/scribus/undomanager.cpp
+++ b/Scribus/scribus/undomanager.cpp
@@ -526,6 +526,13 @@ void UndoManager::action(UndoObject* target, UndoState* state,
target->setUName(oldName);
}
+UndoState* UndoManager::getLastUndo(){
+ if(stacks_[currentDoc_].undoActions_.size()>0)
+ return stacks_[currentDoc_].undoActions_[0];
+ else
+ return 0;
+}
+
void UndoManager::undo(int steps)
{
if (!undoEnabled_)
@@ -928,7 +935,10 @@ void UndoManager::languageChange()
UndoManager::ImportOOoDraw = tr("Import OpenOffice.org Draw image");
UndoManager::ImportAI = tr("Import AI drawing");
UndoManager::ImportXfig = tr("Import XFig drawing");
+ UndoManager::Columns = tr("Change columns");
+ UndoManager::ColumnsGap = tr("Change columns gap");
UndoManager::ImportWMF = tr("Import WMF drawing");
+ UndoManager::TextFrameDist = tr("Change text to frame distance");
UndoManager::ScratchSpace = tr("Scratch space");
//UndoManager::TextFlow = tr("Text flows around the frame");
UndoManager::ObjectFrame = tr("Text flows around the frame");
@@ -951,6 +961,14 @@ void UndoManager::languageChange()
UndoManager::ResetContourLine = tr("Reset contour line");
UndoManager::AddPage = tr("Add page");
UndoManager::AddPages = tr("Add pages");
+ UndoManager::ReplaceText = tr("Replace text");
+ UndoManager::FirstLineOffset = tr("Change First Line Offset");
+ UndoManager::DeleteText = tr("Delete text");
+ UndoManager::InsertText = tr("Insert text");
+ UndoManager::AppendText = tr("Append text");
+ UndoManager::ImportText = tr("Import text");
+ UndoManager::ClearText = tr("Clear text");
+ UndoManager::AddLoremIpsum = tr("Add Lorem Ipsum");
UndoManager::DeletePage = tr("Delete page");
UndoManager::DeletePages = tr("Delete pages");
UndoManager::ChangePageProps = tr("Change page properties");
@@ -974,6 +992,7 @@ void UndoManager::languageChange()
UndoManager::ChangeFormula = tr("Change formula");
UndoManager::MultipleDuplicate = tr("Multiple duplicate");
UndoManager::ApplyTextStyle = tr("Apply text style");
+ UndoManager::RemoveTextStyle = tr("Remove text style");
UndoManager::MenuUndo = tr("&Undo: %1", "f.e. Undo: Move");
UndoManager::MenuUndoEmpty = tr("&Undo");
UndoManager::MenuRedo = tr("&Redo: %1", "f.e. Redo: Move");
@@ -1087,6 +1106,7 @@ QString UndoManager::ItemsInvolved = "";
QString UndoManager::ItemsInvolved2 = "";
uint UndoManager::ItemsInvolvedLimit = 20;
QString UndoManager::Cancel = "";
+QString UndoManager::TextFrameDist = "";
QString UndoManager::SetFill = "";
QString UndoManager::ColorFromTo = "";
QString UndoManager::SetShade = "";
@@ -1114,6 +1134,7 @@ QString UndoManager::Cut = "";
QString UndoManager::Transparency = "";
QString UndoManager::LineTransparency = "";
QString UndoManager::LineStyle = "";
+QString UndoManager::FirstLineOffset = "";
QString UndoManager::LineEnd = "";
QString UndoManager::LineJoin = "";
QString UndoManager::LineWidth = "";
@@ -1176,6 +1197,13 @@ QString UndoManager::ChangeShapeType = "";
QString UndoManager::ResetContourLine = "";
QString UndoManager::AddPage = "";
QString UndoManager::AddPages = "";
+QString UndoManager::DeleteText = "";
+QString UndoManager::AppendText = "";
+QString UndoManager::ImportText = "";
+QString UndoManager::ClearText = "";
+QString UndoManager::ReplaceText = "";
+QString UndoManager::InsertText = "";
+QString UndoManager::AddLoremIpsum = "";
QString UndoManager::DeletePage = "";
QString UndoManager::DeletePages = "";
QString UndoManager::ChangePageProps = "";
@@ -1199,11 +1227,14 @@ QString UndoManager::GetImage = "";
QString UndoManager::ChangeFormula = "";
QString UndoManager::MultipleDuplicate = "";
QString UndoManager::ApplyTextStyle = "";
+QString UndoManager::RemoveTextStyle = "";
QString UndoManager::MenuUndo = "";
QString UndoManager::MenuUndoEmpty = "";
QString UndoManager::MenuRedo = "";
QString UndoManager::MenuRedoEmpty = "";
QString UndoManager::EditContour = "";
+QString UndoManager::Columns = "";
+QString UndoManager::ColumnsGap = "";
QString UndoManager::ResetControlPoint = "";
QString UndoManager::ResetControlPoints = "";
QString UndoManager::ImageEffects = "";
diff --git a/Scribus/scribus/undomanager.h b/Scribus/scribus/undomanager.h
index fd4fe2e..9d5a898 100644
--- a/Scribus/scribus/undomanager.h
+++ b/Scribus/scribus/undomanager.h
@@ -353,6 +353,8 @@ public:
*/
bool isGlobalMode();
+ UndoState* getLastUndo();
+
private:
/**
* @brief The only instance of UndoManager available.
@@ -563,6 +565,14 @@ public:
static QString ResetContourLine;
static QString AddPage;
static QString AddPages;
+ static QString ReplaceText;
+ static QString FirstLineOffset;
+ static QString AppendText;
+ static QString ImportText;
+ static QString ClearText;
+ static QString AddLoremIpsum;
+ static QString DeleteText;
+ static QString InsertText;
static QString DeletePage;
static QString DeletePages;
static QString ChangePageProps;
@@ -586,6 +596,10 @@ public:
static QString ChangeFormula;
static QString MultipleDuplicate;
static QString ApplyTextStyle;
+ static QString RemoveTextStyle;
+ static QString Columns;
+ static QString ColumnsGap;
+ static QString TextFrameDist;
static QString MenuUndo;
static QString MenuUndoEmpty;
static QString MenuRedo;
| ||||
| Patch | |||||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2012-06-26 20:27 | Chelen | New Issue | |
| 2012-06-26 20:27 | Chelen | Status | new => assigned |
| 2012-06-26 20:27 | Chelen | Assigned To | => Chelen |
| 2012-06-26 20:27 | Chelen | File Added: Patch.diff | |
| 2012-06-26 20:54 | cbradney | Status | assigned => resolved |
| 2012-06-26 20:54 | cbradney | Fixed in Version | => 1.5.0svn |
| 2012-06-26 20:54 | cbradney | Resolution | open => fixed |
| 2012-06-26 22:34 | Chelen | Relationship added | related to 0010216 |
| 2012-06-26 22:34 | Chelen | Relationship added | related to 0010310 |
| 2012-06-26 22:35 | Chelen | Relationship added | related to 0009802 |
| 2012-07-01 20:34 | cbradney | Status | resolved => closed |