Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

aligndistribute.cpp

Go to the documentation of this file.
00001 /*
00002 For general Scribus (>=1.3.2) copyright and licensing information please refer
00003 to the COPYING file provided with the program. Following this notice may exist
00004 a copyright and/or license notice that predates the release of Scribus 1.3.2
00005 for which a new license (GPL+exception) is in place.
00006 */
00007 /***************************************************************************
00008     begin                : June 2005
00009     copyright            : (C) 2005 by Craig Bradney
00010     email                : cbradney@zip.com.au
00011 ***************************************************************************/
00012 
00013 /***************************************************************************
00014 *                                                                         *
00015 *   ScMW program is free software; you can redistribute it and/or modify  *
00016 *   it under the terms of the GNU General Public License as published by  *
00017 *   the Free Software Foundation; either version 2 of the License, or     *
00018 *   (at your option) any later version.                                   *
00019 *                                                                         *
00020 ***************************************************************************/
00021 
00022 #include "aligndistribute.h"
00023 
00024 #include <QComboBox>
00025 #include <QEvent>
00026 #include <QImage>
00027 #include <QLabel>
00028 #include <QLayout>
00029 #include <QLineEdit>
00030 #include <QPixmap>
00031 #include <QPushButton>
00032 #include <QTabWidget>
00033 #include <QToolButton>
00034 #include <QToolTip>
00035 #include <QVariant>
00036 
00037 #include "commonstrings.h"
00038 #include "page.h"
00039 #include "scmessagebox.h"
00040 #include "scribusdoc.h"
00041 #include "scrspinbox.h"
00042 #include "selection.h"
00043 #include "undomanager.h"
00044 #include "units.h"
00045 #include "util_icon.h"
00046 #include "scribusstructs.h"
00047 
00048 //TODO Distribute with 
00049 
00050 AlignDistributePalette::AlignDistributePalette( QWidget* parent, const char* name, bool /*modal*/, Qt::WFlags /*fl*/ )
00051     : ScrPaletteBase( parent, name )
00052 {
00053     setupUi(this);
00054     currDoc=NULL;
00055     
00056     //hide spare controls 
00057     toolButtonDummy1->hide();
00058     toolButtonDummy2->hide();
00059 
00060     //set up scrspinboxes
00061     distributeDistSpinBox->setValues(-1000.0, 1000.0, 2, 0.0);
00062 
00063     // buddies
00064     alignRelativeToLabel->setBuddy( alignRelativeToCombo );
00065     alignGuideLabel->setBuddy( alignGuideLineEdit );
00066     distributeDistLabel->setBuddy( distributeDistSpinBox );
00067     
00068     resize( QSize(100, 100).expandedTo(minimumSizeHint()) );
00069     languageChange();
00070     init();
00071     setDoc(NULL);
00072 }
00073 
00074 AlignDistributePalette::~AlignDistributePalette()
00075 {
00076 }
00077 
00078 void AlignDistributePalette::changeEvent(QEvent *e)
00079 {
00080     if (e->type() == QEvent::LanguageChange)
00081     {
00082         languageChange();
00083     }
00084     else
00085         QWidget::changeEvent(e);
00086 }
00087 
00088 void AlignDistributePalette::languageChange()
00089 {
00090     setWindowTitle( tr( "Align and Distribute" ) );
00091     tabWidget->setTabText(0, tr( "Align"));
00092     tabWidget->setTabText(1, tr( "Distribute"));
00093     alignRelativeToLabel->setText( tr( "&Relative to:" ) );
00094     int alignComboValue=alignRelativeToCombo->currentIndex();
00095     alignRelativeToCombo->clear();
00096     alignRelativeToCombo->addItem( tr( "First Selected" ) );
00097     alignRelativeToCombo->addItem( tr( "Last Selected" ) );
00098     alignRelativeToCombo->addItem( tr( "Page" ) );
00099     alignRelativeToCombo->addItem( tr( "Margins" ) );
00100     alignRelativeToCombo->addItem( tr( "Guide" ) );     
00101     alignRelativeToCombo->addItem( tr( "Selection" ) );
00102     alignRelativeToCombo->setCurrentIndex(alignComboValue);
00103     alignToChanged(alignComboValue);
00104     alignLeftOutToolButton->setText( QString::null );
00105     alignLeftOutToolButton->setToolTip( tr( "Align right sides of items to left side of anchor" ) );
00106     alignRightOutToolButton->setText( QString::null );
00107     alignRightOutToolButton->setToolTip( tr( "Align left sides of items to right side of anchor" ) );
00108     alignBottomInToolButton->setText( QString::null );
00109     alignBottomInToolButton->setToolTip( tr( "Align bottoms" ) );
00110     alignRightInToolButton->setText( QString::null );
00111     alignRightInToolButton->setToolTip( tr( "Align right sides" ) );
00112     alignBottomOutToolButton->setText( QString::null );
00113     alignBottomOutToolButton->setToolTip( tr( "Align tops of items to bottom of anchor" ) );
00114     alignCenterHorToolButton->setText( QString::null );
00115     alignCenterHorToolButton->setToolTip( tr( "Center on vertical axis" ) );
00116     alignLeftInToolButton->setText( QString::null );
00117     alignLeftInToolButton->setToolTip( tr( "Align left sides" ) );
00118     alignCenterVerToolButton->setText( QString::null );
00119     alignCenterVerToolButton->setToolTip( tr( "Center on horizontal axis" ) );
00120     alignTopOutToolButton->setText( QString::null );
00121     alignTopOutToolButton->setToolTip( tr( "Align bottoms of items to top of anchor" ) );
00122     alignTopInToolButton->setText( QString::null );
00123     alignTopInToolButton->setToolTip( tr( "Align tops" ) );
00124     
00125     alignGuideLabel->setText( tr( "&Selected Guide:" ) );
00126     
00127     distributeDistHToolButton->setText( QString::null );
00128     distributeDistHToolButton->setToolTip( tr( "Make horizontal gaps between items equal" ) );
00129     distributeDistValueHToolButton->setText( QString::null );
00130     distributeDistValueHToolButton->setToolTip( tr( "Make horizontal gaps between items equal to the value specified" ) );
00131     
00132     distributeRightToolButton->setText( QString::null );
00133     distributeRightToolButton->setToolTip( tr( "Distribute right sides equidistantly" ) );
00134     distributeBottomToolButton->setText( QString::null );
00135     distributeBottomToolButton->setToolTip( tr( "Distribute bottoms equidistantly" ) );
00136     distributeCenterHToolButton->setText( QString::null );
00137     distributeCenterHToolButton->setToolTip( tr( "Distribute centers equidistantly horizontally" ) );
00138     distributeDistVToolButton->setText( QString::null );
00139     distributeDistVToolButton->setToolTip( tr( "Make vertical gaps between items equal" ) );
00140     distributeDistValueVToolButton->setText( QString::null );
00141     distributeDistValueVToolButton->setToolTip( tr( "Make vertical gaps between items equal to the value specified" ) );
00142     distributeLeftToolButton->setText( QString::null );
00143     distributeLeftToolButton->setToolTip( tr( "Distribute left sides equidistantly" ) );
00144     distributeCenterVToolButton->setText( QString::null );
00145     distributeCenterVToolButton->setToolTip( tr( "Distribute centers equidistantly vertically" ) );
00146     distributeTopToolButton->setText( QString::null );
00147     distributeTopToolButton->setToolTip( tr( "Distribute tops equidistantly" ) );
00148     distributeAcrossPageToolButton->setText( QString::null );
00149     distributeAcrossPageToolButton->setToolTip( tr( "Make horizontal gaps between items and sides of page equal" ) );
00150     distributeDownPageToolButton->setText( QString::null );
00151     distributeDownPageToolButton->setToolTip( tr( "Make vertical gaps between items and the top and bottom of page equal" ) );
00152     distributeAcrossMarginsToolButton->setText( QString::null );
00153     distributeAcrossMarginsToolButton->setToolTip( tr( "Make horizontal gaps between items and sides of page margins equal" ) );
00154     distributeDownMarginsToolButton->setText( QString::null );
00155     distributeDownMarginsToolButton->setToolTip( tr( "Make vertical gaps between items and the top and bottom of page margins equal" ) );
00156 
00157     distributeDistLabel->setText( tr( "&Distance:" ) );
00158     distributeDistSpinBox->setToolTip( tr( "Distribute the items with the distance specified" ) );
00159     
00160     guideInfoTextNone = tr("None Selected");
00161 }
00162 
00163 void AlignDistributePalette::init()
00164 {
00165     undoManager = UndoManager::instance();
00166 
00167 // GUI3-4 compile PV
00168     alignLeftOutToolButton->setIcon(QIcon(loadIcon("22/align-horizontal-left-out.png")));
00169     alignLeftInToolButton->setIcon(QIcon(loadIcon("22/align-horizontal-left.png")));
00170     alignCenterHorToolButton->setIcon(QIcon(loadIcon("22/align-horizontal-center.png")));
00171     alignRightInToolButton->setIcon(QIcon(loadIcon("22/align-horizontal-right.png")));
00172     alignRightOutToolButton->setIcon(QIcon(loadIcon("22/align-horizontal-right-out.png")));
00173     
00174     alignTopOutToolButton->setIcon(QIcon(loadIcon("22/align-vertical-top-out.png")));
00175     alignTopInToolButton->setIcon(QIcon(loadIcon("22/align-vertical-top.png")));
00176     alignCenterVerToolButton->setIcon(QIcon(loadIcon("22/align-vertical-center.png")));
00177     alignBottomInToolButton->setIcon(QIcon(loadIcon("22/align-vertical-bottom.png")));
00178     alignBottomOutToolButton->setIcon(QIcon(loadIcon("22/align-vertical-bottom-out.png")));
00179     
00180     distributeLeftToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-left.png")));
00181     distributeCenterHToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-center.png")));
00182     distributeRightToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-right.png")));
00183     distributeDistHToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-equal.png")));
00184     
00185     distributeBottomToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-bottom.png")));
00186     distributeCenterVToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-center.png")));
00187     distributeTopToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-top.png")));
00188     distributeDistVToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-equal.png")));
00189     
00190     
00191     distributeAcrossPageToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-page.png")));
00192     distributeDownPageToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-page.png")));
00193     distributeAcrossMarginsToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-margin.png")));
00194     distributeDownMarginsToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-margin.png")));
00195     distributeDistValueHToolButton->setIcon(QIcon(loadIcon("22/distribute-horizontal-x.png")));
00196     distributeDistValueVToolButton->setIcon(QIcon(loadIcon("22/distribute-vertical-y.png")));
00197 
00198     connect(alignLeftOutToolButton, SIGNAL(clicked()), this, SLOT(alignLeftOut()));
00199     connect(alignRightOutToolButton, SIGNAL(clicked()), this, SLOT(alignRightOut()));
00200     connect(alignBottomInToolButton, SIGNAL(clicked()), this, SLOT(alignBottomIn()));
00201     connect(alignRightInToolButton, SIGNAL(clicked()), this, SLOT(alignRightIn()));
00202     connect(alignBottomOutToolButton, SIGNAL(clicked()), this, SLOT(alignBottomOut()));
00203     connect(alignCenterHorToolButton, SIGNAL(clicked()), this, SLOT(alignCenterHor()));
00204     connect(alignLeftInToolButton, SIGNAL(clicked()), this, SLOT(alignLeftIn()));
00205     connect(alignCenterVerToolButton, SIGNAL(clicked()), this, SLOT(alignCenterVer()));
00206     connect(alignTopOutToolButton, SIGNAL(clicked()), this, SLOT(alignTopOut()));
00207     connect(alignTopInToolButton, SIGNAL(clicked()), this, SLOT(alignTopIn()));
00208     connect(distributeDistHToolButton, SIGNAL(clicked()), this, SLOT(distributeDistH()));
00209     connect(distributeDistValueHToolButton, SIGNAL(clicked()), this, SLOT(distributeDistValH()));
00210     connect(distributeRightToolButton, SIGNAL(clicked()), this, SLOT(distributeRight()));
00211     connect(distributeBottomToolButton, SIGNAL(clicked()), this, SLOT(distributeBottom()));
00212     connect(distributeCenterHToolButton, SIGNAL(clicked()), this, SLOT(distributeCenterH()));
00213     connect(distributeDistVToolButton, SIGNAL(clicked()), this, SLOT(distributeDistV()));
00214     connect(distributeDistValueVToolButton, SIGNAL(clicked()), this, SLOT(distributeDistValV()));
00215     connect(distributeLeftToolButton, SIGNAL(clicked()), this, SLOT(distributeLeft()));
00216     connect(distributeCenterVToolButton, SIGNAL(clicked()), this, SLOT(distributeCenterV()));
00217     connect(distributeTopToolButton, SIGNAL(clicked()), this, SLOT(distributeTop()));
00218     connect(distributeAcrossPageToolButton, SIGNAL(clicked()), this, SLOT(distributeDistAcrossPage()));
00219     connect(distributeDownPageToolButton, SIGNAL(clicked()), this, SLOT(distributeDistDownPage()));
00220     connect(distributeAcrossMarginsToolButton, SIGNAL(clicked()), this, SLOT(distributeDistAcrossMargins()));
00221     connect(distributeDownMarginsToolButton, SIGNAL(clicked()), this, SLOT(distributeDistDownMargins()));
00222     
00223     alignRelativeToCombo->setCurrentIndex(0);
00224     alignToChanged(0);
00225     connect(alignRelativeToCombo, SIGNAL(activated(int)), this, SLOT(alignToChanged(int)));
00226     
00227     unitRatio=1.0;
00228     guideDirection=-1;
00229     
00230     guideInfoText = guideInfoTextNone;
00231     alignGuideLineEdit->setText(guideInfoTextNone);
00232 }
00233 
00234 void AlignDistributePalette::unitChange()
00235 {
00236     if (currDoc!=NULL)
00237     {
00238         double oldValue=distributeDistSpinBox->value();
00239         double oldRatio=unitRatio;
00240         distributeDistSpinBox->setDecimals(unitGetPrecisionFromIndex(currDoc->unitIndex()));
00241         distributeDistSpinBox->setSuffix(unitGetSuffixFromIndex(currDoc->unitIndex()));
00242         unitRatio=unitGetRatioFromIndex(currDoc->unitIndex());
00243         double ratioDivisor =  unitRatio / oldRatio;
00244         distributeDistSpinBox->setValue(oldValue*ratioDivisor);
00245         enableGuideButtons();
00246     }
00247 }
00248 
00249 void AlignDistributePalette::setDoc( ScribusDoc* newDoc )
00250 {
00251     currDoc=newDoc;
00252     if (currDoc!=NULL)
00253         alignObjects=&(currDoc->AObjects);
00254     else
00255         alignObjects=NULL;
00256     unitChange();
00257 }
00258 
00259 void AlignDistributePalette::alignLeftOut()
00260 {
00261     if (currDoc!=NULL)
00262         currDoc->itemSelection_AlignLeftOut(currAlignTo, guidePosition);
00263 }
00264 
00265 void AlignDistributePalette::alignLeftIn()
00266 {
00267     if (currDoc!=NULL)
00268         currDoc->itemSelection_AlignLeftIn(currAlignTo, guidePosition);
00269 }
00270 
00271 void AlignDistributePalette::alignCenterHor()
00272 {
00273     if (currDoc!=NULL)
00274         currDoc->itemSelection_AlignCenterHor(currAlignTo, guidePosition);
00275 }
00276 
00277 void AlignDistributePalette::alignRightIn()
00278 {
00279     if (currDoc!=NULL)
00280         currDoc->itemSelection_AlignRightIn(currAlignTo, guidePosition);
00281 }
00282 
00283 void AlignDistributePalette::alignRightOut()
00284 {
00285     if (currDoc!=NULL)
00286         currDoc->itemSelection_AlignRightOut(currAlignTo, guidePosition);
00287 }
00288 
00289 void AlignDistributePalette::alignTopOut()
00290 {
00291     if (currDoc!=NULL)
00292         currDoc->itemSelection_AlignTopOut(currAlignTo, guidePosition);
00293 }
00294 
00295 void AlignDistributePalette::alignTopIn()
00296 {
00297     if (currDoc!=NULL)
00298         currDoc->itemSelection_AlignTopIn(currAlignTo, guidePosition);
00299 }
00300 
00301 
00302 void AlignDistributePalette::alignCenterVer()
00303 {
00304     if (currDoc!=NULL)
00305         currDoc->itemSelection_AlignCenterVer(currAlignTo, guidePosition);
00306 }
00307 
00308 
00309 void AlignDistributePalette::alignBottomIn()
00310 {
00311     if (currDoc!=NULL)
00312         currDoc->itemSelection_AlignBottomIn(currAlignTo, guidePosition);
00313 }
00314 
00315 void AlignDistributePalette::alignBottomOut()
00316 {
00317     if (currDoc!=NULL)
00318         currDoc->itemSelection_AlignBottomOut(currAlignTo, guidePosition);
00319 }
00320 
00321 void AlignDistributePalette::distributeLeft()
00322 {
00323     if (currDoc!=NULL)
00324         currDoc->itemSelection_DistributeLeft();
00325 }
00326 
00327 void AlignDistributePalette::distributeCenterH()
00328 {
00329     if (currDoc!=NULL)
00330         currDoc->itemSelection_DistributeCenterH();
00331 }
00332 
00333 void AlignDistributePalette::distributeRight()
00334 {
00335     if (currDoc!=NULL)
00336         currDoc->itemSelection_DistributeRight();
00337 }
00338 
00339 void AlignDistributePalette::distributeDistH(bool usingDistance)
00340 {
00341     if (currDoc!=NULL)
00342         currDoc->itemSelection_DistributeDistH(usingDistance, distributeDistSpinBox->value());
00343 }
00344 
00345 void AlignDistributePalette::distributeDistValH()
00346 {
00347     if (currDoc!=NULL)
00348         distributeDistH(true);
00349 }
00350 
00351 void AlignDistributePalette::distributeDistAcrossPage()
00352 {
00353     if (currDoc!=NULL)
00354         currDoc->itemSelection_DistributeAcrossPage();
00355 }
00356 
00357 void AlignDistributePalette::distributeDistDownPage()
00358 {
00359     if (currDoc!=NULL)
00360         currDoc->itemSelection_DistributeDownPage();
00361 }
00362 
00363 void AlignDistributePalette::distributeDistAcrossMargins()
00364 {
00365     if (currDoc!=NULL)
00366         currDoc->itemSelection_DistributeAcrossPage(true);
00367 }
00368 
00369 void AlignDistributePalette::distributeDistDownMargins()
00370 {
00371     if (currDoc!=NULL)
00372         currDoc->itemSelection_DistributeDownPage(true);
00373 }
00374 
00375 
00376 void AlignDistributePalette::distributeBottom()
00377 {
00378     if (currDoc!=NULL)
00379         currDoc->itemSelection_DistributeBottom();
00380 }
00381 
00382 void AlignDistributePalette::distributeCenterV()
00383 {
00384     if (currDoc!=NULL)
00385         currDoc->itemSelection_DistributeCenterV();
00386 }
00387 
00388 void AlignDistributePalette::distributeTop()
00389 {
00390     if (currDoc!=NULL)
00391         currDoc->itemSelection_DistributeTop();
00392 }
00393 
00394 void AlignDistributePalette::distributeDistV(bool usingDistance)
00395 {
00396     if (currDoc!=NULL)
00397         currDoc->itemSelection_DistributeDistV(usingDistance, distributeDistSpinBox->value());
00398 }
00399 
00400 void AlignDistributePalette::distributeDistValV()
00401 {
00402     if (currDoc!=NULL)
00403         distributeDistV(true);
00404 }
00405 
00406 void AlignDistributePalette::alignToChanged(int newAlignTo)
00407 {
00408     currAlignTo=(ScribusDoc::AlignTo)newAlignTo;
00409     enableGuideButtons();
00410 }
00411 
00412 void AlignDistributePalette::setGuide(int direction, double position)
00413 {
00414     //direction 0=H, 1=V
00415     guideDirection=direction;
00416     guidePosition=position;
00417     enableGuideButtons();
00418 }
00419 
00420 void AlignDistributePalette::enableGuideButtons()
00421 {
00422     QString suffix="";
00423     double unitRatio=1.0;
00424     int precision=1;
00425     if (currDoc!=NULL)
00426     {
00427         suffix=unitGetSuffixFromIndex(currDoc->unitIndex());
00428         unitRatio=unitGetRatioFromIndex(currDoc->unitIndex());
00429         precision=unitGetPrecisionFromIndex(currDoc->unitIndex());
00430     }
00431     bool setterH=true, setterV=true;
00432     switch(guideDirection)
00433     {
00434         case -1:
00435             guideInfoText = guideInfoTextNone;
00436             if (currAlignTo==ScribusDoc::alignGuide)
00437                 setterH=setterV=false;
00438             break;
00439         case 0:
00440             guideInfoText = tr("Y: %1%2").arg(guidePosition * unitRatio, 0, 'f', precision).arg(suffix);
00441             if (currAlignTo==ScribusDoc::alignGuide)
00442             {
00443                 setterV=false;
00444                 setterH=true;
00445             }
00446             break;
00447         case 1:
00448             guideInfoText = tr("X: %1%2").arg(guidePosition * unitRatio, 0, 'f', precision).arg(suffix);
00449             if (currAlignTo==ScribusDoc::alignGuide)
00450             {
00451                 setterV=true;
00452                 setterH=false;
00453             }
00454             break;
00455     }
00456     bool setterO=true;
00457     if (currAlignTo==ScribusDoc::alignGuide)
00458         setterO=false;
00459         
00460     alignLeftInToolButton->setEnabled(setterV);
00461     alignLeftOutToolButton->setEnabled(setterO);
00462     alignRightInToolButton->setEnabled(setterV);
00463     alignRightOutToolButton->setEnabled(setterO);   
00464     alignCenterHorToolButton->setEnabled(setterV);
00465 
00466     alignTopInToolButton->setEnabled(setterH);
00467     alignTopOutToolButton->setEnabled(setterO);
00468     alignBottomInToolButton->setEnabled(setterH);
00469     alignBottomOutToolButton->setEnabled(setterO);
00470     alignCenterVerToolButton->setEnabled(setterH);
00471     
00472     alignGuideLineEdit->setText(guideInfoText);
00473 }
Created with personalized Doxygen. This is documentation for GPL software Scribus - Open Source Desktop Publishing.