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 | 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. | ||||
| Attached Files | 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 */
| ||||
| Patch | |||||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2012-06-27 06:31 |
|
New Issue | |
| 2012-06-27 06:31 |
|
Status | new => assigned |
| 2012-06-27 06:31 |
|
Assigned To | => Chelen |
| 2012-06-27 06:35 |
|
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 |
|
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 |