View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0008392 | Scribus | Shape Drawing | public | 2009-08-28 10:40 | 2010-06-22 23:58 |
Reporter | Mike | Assigned To | cbradney | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Platform | all | OS | all | OS Version | all |
Product Version | 1.3.5 | ||||
Target Version | 1.5.0 | Fixed in Version | 1.3.8svn | ||
Summary | 0008392: add resize to align and distribute | ||||
Description | add 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) | ||||
Tags | No tags attached. | ||||
Patch | |||||
|
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>&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(); } |
|
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.) |
|
Thanks for the patch pspencer!! I will review it and commit in the coming days |
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 |