View Issue Details

IDProjectCategoryView StatusLast Update
0008392ScribusShape Drawingpublic2010-06-22 23:58
ReporterMike Assigned Tocbradney  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
PlatformallOSallOS Versionall
Product Version1.3.5 
Target Version1.5.0Fixed in Version1.3.8svn 
Summary0008392: add resize to align and distribute
Descriptionadd resize to align and distribute

- create third item Resize

Relative to: Firt Selected, Last Selected, Page, Margins, Guide, Salection

Selected Guide:

 - according to width (denote by two-direction horizontal arrow)
 - according to height (denote by two-direction vertical arrow)
TagsNo tags attached.
Patch

Activities

pspencer

2010-04-14 22:15

reporter  

scribus-1.3.6-alignwidths.patch (16,700 bytes)   
--- scribus-1.3.6/scribus/aligndistribute.ui.orig	2008-12-20 02:36:06.000000000 -0500
+++ scribus-1.3.6/scribus/aligndistribute.ui	2010-04-14 17:56:25.000000000 -0400
@@ -105,6 +105,22 @@
            <item row="0" column="1" >
             <widget class="QComboBox" name="alignRelativeToCombo" />
            </item>
+           <item row="2" column="0" >
+            <widget class="QLabel" name="alignMoveOrResizeLabel" >
+             <property name="text" >
+              <string>&amp;Align Sides By:</string>
+             </property>
+             <property name="wordWrap" >
+              <bool>false</bool>
+             </property>
+             <property name="buddy" >
+              <cstring>alignMoveOrResizeCombo</cstring>
+             </property>
+            </widget>
+           </item>
+           <item row="2" column="1" >
+            <widget class="QComboBox" name="alignMoveOrResizeCombo" />
+           </item>
           </layout>
          </item>
          <item>
--- scribus-1.3.6/scribus/aligndistribute.h.orig	2009-02-07 18:08:53.000000000 -0500
+++ scribus-1.3.6/scribus/aligndistribute.h	2010-04-14 15:45:47.000000000 -0400
@@ -99,11 +99,13 @@
 	void distributeTop();
 	
 	void alignToChanged(int);
+	void alignMethodChanged(int);
 
 private:
 	void init();
 	UndoManager *undoManager;
 	ScribusDoc::AlignTo currAlignTo;
+	ScribusDoc::AlignMethod currAlignMethod;
 	QList<AlignObjs> *alignObjects;
 	ScribusDoc *currDoc;
 	qreal unitRatio;
--- scribus-1.3.6/scribus/aligndistribute.cpp.orig	2009-03-30 17:53:20.000000000 -0400
+++ scribus-1.3.6/scribus/aligndistribute.cpp	2010-04-14 17:59:57.000000000 -0400
@@ -102,6 +102,13 @@
 	alignRelativeToCombo->setCurrentIndex(alignComboValue);
 	alignRelativeToCombo->setToolTip( tr( "<qt>Align relative to the:<ul><li>First selected item</li><li>Second Selected Item</li><li>The current page</li><li>The margins of the current page</li><li>A Guide</li><li>The selection</ul></qt>" ) );
 	alignToChanged(alignComboValue);
+	alignMoveOrResizeLabel->setText( tr( "&Align Sides By:" ) );
+	int alignMethodValue=alignMoveOrResizeCombo->currentIndex();
+	alignMoveOrResizeCombo->clear();
+	alignMoveOrResizeCombo->addItem( tr("Moving (Preserve Size)") );
+	alignMoveOrResizeCombo->addItem( tr("Resizing (Preserve Opposite Side)") );
+	alignMoveOrResizeCombo->setToolTip( tr( "<qt>When aligning one side of an item:<ul><li>Always move the other side too (keep the same width and height), or </li><li>Keep the other side fixed (resize the item instead of moving it) whenever possible</li></ul></qt>" ));
+	alignMethodChanged(alignMethodValue);
 	alignGuideLineEdit->setToolTip( tr( "The location of the selected guide to align to" ) );
 	alignLeftOutToolButton->setText( QString::null );
 	alignLeftOutToolButton->setToolTip( tr( "Align right sides of items to left side of anchor" ) );
@@ -224,7 +231,9 @@
 	
 	alignRelativeToCombo->setCurrentIndex(0);
 	alignToChanged(0);
+	alignMethodChanged(0);
 	connect(alignRelativeToCombo, SIGNAL(activated(int)), this, SLOT(alignToChanged(int)));
+	connect(alignMoveOrResizeCombo, SIGNAL(activated(int)), this, SLOT(alignMethodChanged(int)));
 	
 	unitRatio=1.0;
 	guideDirection=-1;
@@ -256,63 +265,63 @@
 void AlignDistributePalette::alignLeftOut()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignLeftOut(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignLeftOut(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignLeftIn()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignLeftIn(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignLeftIn(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignCenterHor()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignCenterHor(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignCenterHor(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignRightIn()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignRightIn(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignRightIn(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignRightOut()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignRightOut(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignRightOut(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignTopOut()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignTopOut(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignTopOut(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignTopIn()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignTopIn(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignTopIn(currAlignTo, currAlignMethod, guidePosition);
 }
 
 
 void AlignDistributePalette::alignCenterVer()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignCenterVer(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignCenterVer(currAlignTo, currAlignMethod, guidePosition);
 }
 
 
 void AlignDistributePalette::alignBottomIn()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignBottomIn(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignBottomIn(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::alignBottomOut()
 {
 	if (currDoc!=NULL)
-		currDoc->itemSelection_AlignBottomOut(currAlignTo, guidePosition);
+		currDoc->itemSelection_AlignBottomOut(currAlignTo, currAlignMethod, guidePosition);
 }
 
 void AlignDistributePalette::distributeLeft()
@@ -407,6 +416,11 @@
 	currAlignTo = ScribusDoc::AlignTo(newAlignTo);
 	enableGuideButtons();
 }
+void AlignDistributePalette::alignMethodChanged(int newAlignMethod)
+{
+	currAlignMethod = ScribusDoc::AlignMethod(newAlignMethod);
+	enableGuideButtons();
+}
 
 void AlignDistributePalette::setGuide(int direction, qreal position)
 {
--- scribus-1.3.6/scribus/scribusdoc.h.orig	2010-01-17 05:24:19.000000000 -0500
+++ scribus-1.3.6/scribus/scribusdoc.h	2010-04-14 16:59:56.000000000 -0400
@@ -775,6 +775,7 @@
 	void updateAllItemQColors();
 	//! @brief Some internal align tools
 	typedef enum {alignFirst, alignLast, alignPage, alignMargins, alignGuide, alignSelection } AlignTo;
+	typedef enum {alignByMoving, alignByResizing } AlignMethod;
 	void buildAlignItemList(Selection* customSelection=0);
 	bool startAlign();
 	void endAlign();
@@ -1172,16 +1173,20 @@
 	void itemSelection_SetImageOffset(double x, double y, Selection* customSelection=0);
 	void itemSelection_SetImageScale(double x, double y, Selection* customSelection=0);
 	void itemSelection_SetImageScaleAndOffset(double ox, double oy, double sx, double sy, Selection* customSelection=0);
-	void itemSelection_AlignLeftOut(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignRightOut(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignBottomIn(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignRightIn(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignBottomOut(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignCenterHor(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignLeftIn(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignCenterVer(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignTopOut(AlignTo currAlignTo, double guidePosition);
-	void itemSelection_AlignTopIn(AlignTo currAlignTo, double guidePosition);
+	void itemSelection_AlignItemLeft(int i, double newX, AlignMethod how);
+	void itemSelection_AlignItemRight(int i, double newX, AlignMethod how);
+	void itemSelection_AlignItemTop(int i, double newY, AlignMethod how);
+	void itemSelection_AlignItemBottom(int i, double newY, AlignMethod how);
+	void itemSelection_AlignLeftOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignRightOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignBottomIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignRightIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignBottomOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignCenterHor(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignLeftIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignCenterVer(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignTopOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
+	void itemSelection_AlignTopIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition);
 	void itemSelection_DistributeDistH(bool usingDistance=false, double distance=0.0);
 	void itemSelection_DistributeAcrossPage(bool useMargins=false);
 	void itemSelection_DistributeRight();
--- scribus-1.3.6/scribus/scribusdoc.cpp.orig	2010-03-16 15:59:02.000000000 -0400
+++ scribus-1.3.6/scribus/scribusdoc.cpp	2010-04-14 17:38:42.000000000 -0400
@@ -7946,8 +7946,67 @@
 	regionsChanged()->update(QRectF());
 }
 
+void ScribusDoc::itemSelection_AlignItemRight(int i, double newX, AlignMethod how)
+{
+	double diff=newX-AObjects[i].x2;
+	double width=AObjects[i].x2-AObjects[i].x1;
+	bool resize = (how == alignByResizing && diff > -width);
+	for (int j = 0; j < AObjects[i].Objects.count(); ++j)
+		if (!AObjects[i].Objects.at(j)->locked()) {
+			if (resize) {
+				AObjects[i].Objects.at(j)->resizeBy(diff, 0.0);
+				AObjects[i].Objects.at(j)->updateClip();
+			}
+			else AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
+		}
+}
+
+void ScribusDoc::itemSelection_AlignItemLeft(int i, double newX, AlignMethod how)
+{
+	double diff=newX-AObjects[i].x1;
+	double width=AObjects[i].x2-AObjects[i].x1;
+	bool resize = (how == alignByResizing && -diff > -width);
+	for (int j = 0; j < AObjects[i].Objects.count(); ++j)
+		if (!AObjects[i].Objects.at(j)->locked()) {
+			AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
+			if (resize) {
+				AObjects[i].Objects.at(j)->resizeBy(-diff, 0.0);
+				AObjects[i].Objects.at(j)->updateClip();
+			}
+		}
+}
+
+void ScribusDoc::itemSelection_AlignItemBottom(int i, double newY, AlignMethod how)
+{
+	double diff=newY-AObjects[i].y2;
+	double height=AObjects[i].y2-AObjects[i].y1;
+	bool resize = (how == alignByResizing && diff > -height);
+	for (int j = 0; j < AObjects[i].Objects.count(); ++j)
+		if (!AObjects[i].Objects.at(j)->locked()) {
+			if (resize) {
+				AObjects[i].Objects.at(j)->resizeBy(0.0, diff);
+				AObjects[i].Objects.at(j)->updateClip();
+			}
+			else AObjects[i].Objects.at(j)->moveBy(0.0, diff);
+		}
+}
+
+void ScribusDoc::itemSelection_AlignItemTop(int i, double newY, AlignMethod how)
+{
+	double diff=newY-AObjects[i].y1;
+	double height=AObjects[i].y2-AObjects[i].y1;
+	bool resize = (how == alignByResizing && -diff > -height);
+	for (int j = 0; j < AObjects[i].Objects.count(); ++j)
+		if (!AObjects[i].Objects.at(j)->locked()) {
+			AObjects[i].Objects.at(j)->moveBy(0.0, diff);
+			if (resize) {
+				AObjects[i].Objects.at(j)->resizeBy(0.0, -diff);
+				AObjects[i].Objects.at(j)->updateClip();
+			}
+		}
+}
 
-void ScribusDoc::itemSelection_AlignLeftOut(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignLeftOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -7980,17 +8039,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newX-AObjects[i].x2;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
-	}
+		itemSelection_AlignItemRight(i, newX, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignLeftIn(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignLeftIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8023,17 +8077,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newX-AObjects[i].x1;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
-	}
+		itemSelection_AlignItemLeft(i, newX, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignCenterHor(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignCenterHor(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8086,7 +8135,7 @@
 }
 
 
-void ScribusDoc::itemSelection_AlignRightIn(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignRightIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8121,17 +8170,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newX-AObjects[i].x2;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
-	}
+		itemSelection_AlignItemRight(i, newX, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignRightOut(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignRightOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8166,17 +8210,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newX-AObjects[i].x1;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(diff, 0.0);
-	}
+		itemSelection_AlignItemLeft(i, newX, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignTopOut(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignTopOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8209,17 +8248,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newY-AObjects[i].y2;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(0.0, diff);
-	}
+		itemSelection_AlignItemBottom(i, newY, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignTopIn(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignTopIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8252,17 +8286,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newY-AObjects[i].y1;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(0.0, diff);
-	}
+		itemSelection_AlignItemTop(i, newY, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignCenterVer(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignCenterVer(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8315,7 +8344,7 @@
 }
 
 
-void ScribusDoc::itemSelection_AlignBottomIn(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignBottomIn(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8350,17 +8379,12 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newY-AObjects[i].y2;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(0.0, diff);
-	}
+		itemSelection_AlignItemBottom(i, newY, currAlignMethod);
 	endAlign();
 }
 
 
-void ScribusDoc::itemSelection_AlignBottomOut(AlignTo currAlignTo, double guidePosition)
+void ScribusDoc::itemSelection_AlignBottomOut(AlignTo currAlignTo, AlignMethod currAlignMethod, double guidePosition)
 {
 	if (!startAlign())
 		return;
@@ -8395,12 +8419,7 @@
 			break;
 	}
 	for (int i = loopStart; i <= loopEnd; ++i)
-	{
-		double diff=newY-AObjects[i].y1;
-		for (int j = 0; j < AObjects[i].Objects.count(); ++j)
-			if (!AObjects[i].Objects.at(j)->locked())
-				AObjects[i].Objects.at(j)->moveBy(0.0, diff);
-	}
+		itemSelection_AlignItemTop(i, newY, currAlignMethod);
 	endAlign();
 }
 
scribus-1.3.6-alignwidths.patch (16,700 bytes)   

pspencer

2010-04-14 22:21

reporter   ~0023696

We needed this functionality in our 1.3.6 installation, and have implemented something similar but a little simpler than the proposed feature in this issue report; a patch is attached if this is of any interest as an interim measure until the feature is complete.

The patch adds an option to the Align tab so that, when aligning item edges together, one can choose whether to do the alignment by moving both edges of the object (the current method) or by leaving the other edge fixed (resizing the object instead of moving it).

Thus one can set a group of vertically arranged objects to be the same width by choosing the "align by resizing" option then simply clicking the align-left and align-right buttons.

It doesn't help much the case where one wants to equalize the width of horizontally arranged objects, since after doing this the objects will be all on top of one another, but one could then re-distribute them relative to the page using the "distribute" tab.

(We chose to implement resizing in the scenario where we need to use it most, and couldn't wait until the feature comes out in 1.3.5.)

cbradney

2010-04-14 22:30

administrator   ~0023697

Thanks for the patch pspencer!! I will review it and commit in the coming days

Issue History

Date Modified Username Field Change
2009-08-28 10:40 Mike New Issue
2009-10-04 22:15 cbradney Target Version => 1.5.0
2009-10-04 22:15 cbradney Status new => assigned
2009-10-04 22:15 cbradney Assigned To => cbradney
2010-04-14 22:15 pspencer File Added: scribus-1.3.6-alignwidths.patch
2010-04-14 22:21 pspencer Note Added: 0023696
2010-04-14 22:30 cbradney Note Added: 0023697
2010-06-22 22:21 jghali Status assigned => resolved
2010-06-22 22:21 jghali Fixed in Version => 1.3.8svn
2010-06-22 22:21 jghali Resolution open => fixed
2010-06-22 23:58 christoph_s Status resolved => closed