View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0010807 | Scribus | Undo/Redo | public | 2012-06-27 06:31 | 2012-07-01 20:37 |
Reporter | cezaryece | Assigned To | Chelen | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 1.5.0svn | ||||
Fixed in Version | 1.5.0svn | ||||
Summary | 0010807: Changing paragraph style properties produce undo step for each selected paragraph | ||||
Description | Open Action History panel. Select text frame with text. Change linespacing, justification, orphans/widows settings, optical margins... result: for each selected paragraph new undo step is created, if not in edit mode for each paragraph in story text. | ||||
Tags | No tags attached. | ||||
Patch | |||||
|
aggregateTextUndo.diff (12,644 bytes)
diff --git a/Scribus/scribus/canvasmode_edit.cpp b/Scribus/scribus/canvasmode_edit.cpp index 7eeca1c..718ed8c 100644 --- a/Scribus/scribus/canvasmode_edit.cpp +++ b/Scribus/scribus/canvasmode_edit.cpp @@ -492,6 +492,14 @@ void CanvasMode_Edit::mousePressEvent(QMouseEvent *m) SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo()); if(ss) ss->set("ETEA",QString("")); + else + { + TransactionState *ts = dynamic_cast<TransactionState*>(undoManager->getLastUndo()); + if(ts) + ss = dynamic_cast<SimpleState*>(ts->at(0)); + if(ss) + ss->set("ETEA",QString("")); + } } // const double mouseX = m->globalX(); // const double mouseY = m->globalY(); diff --git a/Scribus/scribus/pageitem_textframe.cpp b/Scribus/scribus/pageitem_textframe.cpp index 5386071..9a50485 100644 --- a/Scribus/scribus/pageitem_textframe.cpp +++ b/Scribus/scribus/pageitem_textframe.cpp @@ -3395,6 +3395,14 @@ void PageItem_TextFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat) SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo()); if(ss) ss->set("ETEA",QString("")); + else + { + TransactionState *ts = dynamic_cast<TransactionState*>(undoManager->getLastUndo()); + if(ts) + ss = dynamic_cast<SimpleState*>(ts->at(0)); + if(ss) + ss->set("ETEA",QString("")); + } } } diff --git a/Scribus/scribus/scribusdoc.cpp b/Scribus/scribus/scribusdoc.cpp index 7c5d164..a957538 100644 --- a/Scribus/scribus/scribusdoc.cpp +++ b/Scribus/scribus/scribusdoc.cpp @@ -7313,7 +7313,7 @@ void ScribusDoc::itemSelection_SetFont(QString fon, Selection* customSelection) { CharStyle newStyle; newStyle.setFont((*AllFonts)[fon]); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "FONT"); } @@ -7322,7 +7322,7 @@ void ScribusDoc::itemSelection_SetNamedCharStyle(const QString& name, Selection* { CharStyle newStyle; newStyle.setParent(name.isEmpty()? Style::INHERIT_PARENT : name); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "NAMED_STYLE"); } @@ -7402,14 +7402,14 @@ void ScribusDoc::itemSelection_SetFillColor(QString farbe, Selection* customSele farbe = CommonStrings::None; CharStyle newStyle; newStyle.setFillColor(farbe); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "FILL_COLOR"); } void ScribusDoc::itemSelection_SetFillShade(int sha, Selection* customSelection) { CharStyle newStyle; newStyle.setFillShade(sha); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "FILL_SHADE"); } void ScribusDoc::itemSelection_SetStrokeColor(QString farbe, Selection* customSelection) @@ -7418,28 +7418,28 @@ void ScribusDoc::itemSelection_SetStrokeColor(QString farbe, Selection* customSe farbe = CommonStrings::None; CharStyle newStyle; newStyle.setStrokeColor(farbe); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "STROKE_COLOR"); } void ScribusDoc::itemSelection_SetStrokeShade(int sha, Selection* customSelection) { CharStyle newStyle; newStyle.setStrokeShade(sha); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "STROKE_SHADE"); } void ScribusDoc::itemSelection_SetScaleV(int scale, Selection* customSelection) { CharStyle newStyle; newStyle.setScaleV(scale); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "SCALE_V"); } void ScribusDoc::itemSelection_SetScaleH(int scale, Selection* customSelection) { CharStyle newStyle; newStyle.setScaleH(scale); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "SCALE_H"); } void ScribusDoc::itemSelection_SetShadowOffsets(int shx, int shy, Selection* customSelection) @@ -7447,7 +7447,7 @@ void ScribusDoc::itemSelection_SetShadowOffsets(int shx, int shy, Selection* cus CharStyle newStyle; newStyle.setShadowXOffset(shx); newStyle.setShadowYOffset(shy); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "SHADOW_OFFSET"); } void ScribusDoc::itemSelection_SetUnderline(int pos, int wid, Selection* customSelection) @@ -7455,7 +7455,7 @@ void ScribusDoc::itemSelection_SetUnderline(int pos, int wid, Selection* customS CharStyle newStyle; newStyle.setUnderlineOffset(pos); newStyle.setUnderlineWidth(wid); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "UNDERLINE"); } void ScribusDoc::itemSelection_SetStrikethru(int pos, int wid, Selection* customSelection) @@ -7463,21 +7463,21 @@ void ScribusDoc::itemSelection_SetStrikethru(int pos, int wid, Selection* custom CharStyle newStyle; newStyle.setStrikethruOffset(pos); newStyle.setStrikethruWidth(wid); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "STRIKE_THRU"); } void ScribusDoc::itemSelection_SetBaselineOffset(int sha, Selection* customSelection) { CharStyle newStyle; newStyle.setBaselineOffset(sha); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "BASELINE_OFFSET"); } void ScribusDoc::itemSelection_SetOutlineWidth(int wid, Selection* customSelection) { CharStyle newStyle; newStyle.setOutlineWidth(wid); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "OUTLINE_WIDTH"); } void ScribusDoc::itemSelection_SetItemBrush(QString farbe) @@ -8264,10 +8264,10 @@ void ScribusDoc::itemSelection_SetEffects(int s, Selection* customSelection) { CharStyle newStyle; newStyle.setFeatures(static_cast<StyleFlag>(s).featureList()); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "EFFECTS"); return; - uint selectedItemCount=m_Selection->count(); + /*uint selectedItemCount=m_Selection->count(); if (selectedItemCount != 0 && s != ScStyle_None) { UndoTransaction* activeTransaction = NULL; @@ -8317,7 +8317,7 @@ void ScribusDoc::itemSelection_SetEffects(int s, Selection* customSelection) } m_updateManager.setUpdatesEnabled(); changed(); - } + }*/ } void ScribusDoc::itemSelection_SetOpticalMargins(int i, Selection* customSelection) @@ -8340,7 +8340,7 @@ void ScribusDoc::itemSelection_SetTracking(int kern, Selection* customSelection) { CharStyle newStyle; newStyle.setTracking(kern); - itemSelection_ApplyCharStyle(newStyle, customSelection); + itemSelection_ApplyCharStyle(newStyle, customSelection, "TRACKING"); } void ScribusDoc::itemSelection_SetLineSpacingMode(int m, Selection* customSelection) @@ -8352,12 +8352,12 @@ void ScribusDoc::itemSelection_SetLineSpacingMode(int m, Selection* customSelect void ScribusDoc::itemSelection_SetFontSize(int size, Selection* customSelection) { - if (true || ((appMode == modeEdit) || (appMode == modeEditTable))) - { + //if (true || ((appMode == modeEdit) || (appMode == modeEditTable))) + //{ CharStyle newStyle; newStyle.setFontSize(size); - itemSelection_ApplyCharStyle(newStyle, customSelection); - } + itemSelection_ApplyCharStyle(newStyle, customSelection, "FONT_SIZE"); + /*} else { ParagraphStyle storyStyle; @@ -8375,7 +8375,7 @@ void ScribusDoc::itemSelection_SetFontSize(int size, Selection* customSelection) storyStyle.setLineSpacing(docPrefsData.guidesPrefs.valueBaselineGrid-1); } itemSelection_ApplyParagraphStyle(storyStyle, customSelection); - } + }*/ } void ScribusDoc::itemSelection_SetParagraphStyle(const ParagraphStyle & newStyle, Selection* customSelection) @@ -8593,7 +8593,7 @@ void ScribusDoc::itemSelection_ApplyParagraphStyle(const ParagraphStyle & newSty regionsChanged()->update(QRectF()); } -void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Selection* customSelection) +void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Selection* customSelection, QString ETEA) { Selection* itemSelection = (customSelection!=0) ? customSelection : m_Selection; assert(itemSelection!=0); @@ -8637,12 +8637,29 @@ void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Select { if (UndoManager::undoEnabled()) { - ScItemState<QPair<CharStyle,CharStyle> > *is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle); - is->set("APPLY_CHARSTYLE", "apply_charstyle"); - is->set("START",lastPos); - is->set("LENGTH",i-lastPos); - is->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(lastPos))); - undoManager->action(currItem, is); + UndoState* state = undoManager->getLastUndo(); + ScItemState<QPair<CharStyle,CharStyle> > *is = NULL; + SimpleState *ss = NULL; + TransactionState *ts = dynamic_cast<TransactionState*>(state); + if(state && state->isTransaction()) + ss = dynamic_cast<SimpleState*>(ts->at(0)); + if(ss && ss->get("ETEA") == ETEA) + { + for(int i=0;i<ts->sizet();i++){ + is = dynamic_cast<ScItemState<QPair<CharStyle,CharStyle> > *>(ts->at(i)); + is->setItem(QPair<CharStyle,CharStyle>(newStyle, is->getItem().second)); + } + } + else + { + is = new ScItemState<QPair <CharStyle,CharStyle> >(Um::ApplyTextStyle); + is->set("APPLY_CHARSTYLE", "apply_charstyle"); + is->set("START",lastPos); + is->set("LENGTH",i-lastPos); + is->set("ETEA", ETEA); + is->setItem(QPair<CharStyle,CharStyle>(newStyle, currItem->itemText.charStyle(lastPos))); + undoManager->action(currItem, is); + } } lastPos = i; lastParent = curParent; diff --git a/Scribus/scribus/scribusdoc.h b/Scribus/scribus/scribusdoc.h index c9fe41a..8bccf4f 100644 --- a/Scribus/scribus/scribusdoc.h +++ b/Scribus/scribus/scribusdoc.h @@ -1027,7 +1027,7 @@ public: void itemSelection_ApplyParagraphStyle(const ParagraphStyle & newstyle, Selection* customSelection=0, bool rmDirectFormatting = false); void itemSelection_SetParagraphStyle(const ParagraphStyle & newstyle, Selection* customSelection=0); - void itemSelection_ApplyCharStyle(const CharStyle & newstyle, Selection* customSelection=0); + void itemSelection_ApplyCharStyle(const CharStyle & newstyle, Selection* customSelection=0, QString ETEA = ""); void itemSelection_SetCharStyle(const CharStyle & newstyle, Selection* customSelection=0); void itemSelection_EraseParagraphStyle(Selection* customSelection=0); void itemSelection_EraseCharStyle(Selection* customSelection=0); diff --git a/Scribus/scribus/undomanager.cpp b/Scribus/scribus/undomanager.cpp index d60577e..093a692 100644 --- a/Scribus/scribus/undomanager.cpp +++ b/Scribus/scribus/undomanager.cpp @@ -527,10 +527,8 @@ void UndoManager::action(UndoObject* target, UndoState* state, } UndoState* UndoManager::getLastUndo(){ - if(stacks_[currentDoc_].undoActions_.size()>0) - return stacks_[currentDoc_].undoActions_[0]; - else - return 0; + UndoState* state = stacks_[currentDoc_].getNextUndo(currentUndoObjectId_); + return state; } void UndoManager::undo(int steps) diff --git a/Scribus/scribus/undomanager.h b/Scribus/scribus/undomanager.h index 31eeff4..f418f29 100644 --- a/Scribus/scribus/undomanager.h +++ b/Scribus/scribus/undomanager.h @@ -73,6 +73,8 @@ public: TransactionState(); /** @brief Destroys the TransactionState instance */ ~TransactionState(); + /** @brief To know if the state is a Transaction */ + bool isTransaction(){return true;}; /** * @brief Add a new <code>UndoState</code> object to the transaction. diff --git a/Scribus/scribus/undostate.h b/Scribus/scribus/undostate.h index 69cbdd3..3d40892 100644 --- a/Scribus/scribus/undostate.h +++ b/Scribus/scribus/undostate.h @@ -108,7 +108,8 @@ public: /** @brief redo the state described by this UndoState, * @brief requires the related UndoObject */ virtual void redo(); - + /** @brief To know if the state is a transaction */ + virtual bool isTransaction(){ return false;}; /** @brief Set the UndoObject this state belongs to */ virtual void setUndoObject(UndoObject *object); /** @brief return the UndoObject this state belongs to */ |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-06-27 06:31 | cezaryece | New Issue | |
2012-06-27 06:31 | cezaryece | Status | new => assigned |
2012-06-27 06:31 | cezaryece | Assigned To | => Chelen |
2012-06-27 06:35 | cezaryece | Summary | Changing linespacing produce undo step for each selected paragraph => Changing paragraph style properties produce undo step for each selected paragraph |
2012-06-27 06:35 | cezaryece | Description Updated | |
2012-06-27 19:37 | Chelen | File Added: aggregateTextUndo.diff | |
2012-06-27 19:43 | cbradney | Status | assigned => resolved |
2012-06-27 19:43 | cbradney | Fixed in Version | => 1.5.0svn |
2012-06-27 19:43 | cbradney | Resolution | open => fixed |
2012-07-01 20:37 | cbradney | Status | resolved => closed |