View Issue Details

IDProjectCategoryView StatusLast Update
0010807ScribusUndo/Redopublic2012-07-01 20:37
Reportercezaryece Assigned ToChelen  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version1.5.0svn 
Fixed in Version1.5.0svn 
Summary0010807: Changing paragraph style properties produce undo step for each selected paragraph
DescriptionOpen 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.
TagsNo tags attached.
Patch

Activities

Chelen

2012-06-27 19:37

developer  

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 */
aggregateTextUndo.diff (12,644 bytes)   

Issue History

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