Rev 17879 |
Rev 19217 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/
/**************************************************************************
* Copyright (C) 2008 by Franz Schmid *
* franz.schmid@altmuehlnet.de *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "transformdialog.h"
#include "commonstrings.h"
#include "selection.h"
#include "units.h"
#include "util_icon.h"
#if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
#define _USE_MATH_DEFINES
#endif
#include <cmath>
TransformItem::TransformItem(QString text, QListWidget* parent, int type, double val1, double val2) : QListWidgetItem(text, parent, type)
{
firstValue = val1;
secondValue = val2;
}
TransformDialog::TransformDialog(QWidget* parent, ScribusDoc *doc) : QDialog(parent)
{
setupUi(this);
setModal(true);
setWindowIcon(QIcon(loadIcon ( "AppIcon.png" )));
transformStack->setCurrentIndex(0);
newTransformMenu = new QMenu(buttonAdd);
newTransformMenu->addAction( tr("Scaling"), this, SLOT(newScaling()));
newTransformMenu->addAction( tr("Translation"), this, SLOT(newTranslation()));
newTransformMenu->addAction( tr("Rotation"), this, SLOT(newRotation()));
newTransformMenu->addAction( tr("Skewing"), this, SLOT(newSkewing()));
buttonAdd->setMenu(newTransformMenu);
scaleLink->setChecked(true);
buttonUp->setText( "" );
buttonUp->setIcon(loadIcon("16/go-up.png"));
buttonDown->setText( "" );
buttonDown->setIcon(loadIcon("16/go-down.png"));
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
m_doc = doc;
m_unitRatio = unitGetRatioFromIndex(m_doc->unitIndex());
m_suffix = unitGetSuffixFromIndex(m_doc->unitIndex());
translateHorizontal->setSuffix(m_suffix);
translateVertical->setSuffix(m_suffix);
rotationValue->setWrapping( true );
rotationValue->setValues( -180.0, 180.0, 1, 0);
rotationValue->setSuffix(unitGetSuffixFromIndex(6));
horizontalSkew->setSuffix(unitGetSuffixFromIndex(6));
verticalSkew->setSuffix(unitGetSuffixFromIndex(6));
linkSkew->setChecked(true);
numberOfCopies->setValue(0);
basePoint->setCheckedId(m_doc->RotMode());
connect(transformSelector, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(setCurrentTransform(QListWidgetItem*)));
connect(horizontalScale, SIGNAL(valueChanged(double)), this, SLOT(changeHScale(double)));
connect(verticalScale, SIGNAL(valueChanged(double)), this, SLOT(changeVScale(double)));
connect(scaleLink, SIGNAL(clicked()), this, SLOT(toggleLink()));
connect(translateHorizontal, SIGNAL(valueChanged(double)), this, SLOT(changeHTranslation(double)));
connect(translateVertical, SIGNAL(valueChanged(double)), this, SLOT(changeVTranslation(double)));
connect(rotationValue, SIGNAL(valueChanged(double)), this, SLOT(changeRotation(double)));
connect(horizontalSkew, SIGNAL(valueChanged(double)), this, SLOT(changeHSkew(double)));
connect(verticalSkew, SIGNAL(valueChanged(double)), this, SLOT(changeVSkew(double)));
connect(linkSkew, SIGNAL(clicked()), this, SLOT(toggleLinkSkew()));
connect(buttonUp, SIGNAL(clicked()), this, SLOT(moveTransformUp()));
connect(buttonDown, SIGNAL(clicked()), this, SLOT(moveTransformDown()));
connect(buttonRemove, SIGNAL(clicked()), this, SLOT(removeTransform()));
}
void TransformDialog::newScaling()
{
TransformItem *item = new TransformItem( tr("Scale"), transformSelector, 1001, 100.0, 100.0);
transformSelector->setCurrentItem(item);
setCurrentTransform(item);
item->setText( tr("Scale H = %1 % V = %2 %").arg(100.0).arg(100.0));
buttonRemove->setEnabled(true);
}
void TransformDialog::newTranslation()
{
TransformItem *item = new TransformItem( tr("Translate"), transformSelector, 1002, 0.0, 0.0);
transformSelector->setCurrentItem(item);
setCurrentTransform(item);
item->setText( tr("Translate H = %1%2 V = %3%4").arg(0.0).arg(m_suffix).arg(0.0).arg(m_suffix));
buttonRemove->setEnabled(true);
}
void TransformDialog::newRotation()
{
TransformItem *item = new TransformItem( tr("Rotate"), transformSelector, 1003, 0.0, 0.0);
transformSelector->setCurrentItem(item);
setCurrentTransform(item);
item->setText( tr("Rotate Angle = %1%2").arg(0.0).arg(unitGetSuffixFromIndex(6)));
buttonRemove->setEnabled(true);
}
void TransformDialog::newSkewing()
{
TransformItem *item = new TransformItem( tr("Skew"), transformSelector, 1004, 0.0, 0.0);
transformSelector->setCurrentItem(item);
setCurrentTransform(item);
item->setText( tr("Skew H = %1%2 V = %3%4").arg(0.0).arg(unitGetSuffixFromIndex(6)).arg(0.0).arg(unitGetSuffixFromIndex(6)));
buttonRemove->setEnabled(true);
}
void TransformDialog::setCurrentTransform(QListWidgetItem* item)
{
if (item != NULL)
{
TransformItem *ite = (TransformItem*)item;
switch (item->type())
{
case 1001:
transformStack->setCurrentIndex(1);
horizontalScale->setValue(ite->firstValue);
verticalScale->setValue(ite->secondValue);
break;
case 1002:
transformStack->setCurrentIndex(2);
translateHorizontal->setValue(ite->firstValue);
translateVertical->setValue(ite->secondValue);
break;
case 1003:
transformStack->setCurrentIndex(3);
rotationValue->setValue(ite->firstValue);
break;
case 1004:
transformStack->setCurrentIndex(4);
horizontalSkew->setValue(ite->firstValue);
verticalSkew->setValue(ite->secondValue);
break;
default:
transformStack->setCurrentIndex(0);
break;
}
if (transformSelector->count() > 1)
{
buttonUp->setEnabled(true);
buttonDown->setEnabled(true);
if (transformSelector->currentRow() == 0)
buttonUp->setEnabled(false);
if (transformSelector->currentRow() == transformSelector->count()-1)
buttonDown->setEnabled(false);
}
else
{
buttonUp->setEnabled(false);
buttonDown->setEnabled(false);
}
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
}
else
{
transformStack->setCurrentIndex(0);
buttonRemove->setEnabled(false);
buttonUp->setEnabled(false);
buttonDown->setEnabled(false);
}
}
void TransformDialog::changeHScale(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->firstValue = val;
if (scaleLink->isChecked())
{
verticalScale->setValue(horizontalScale->value());
ite->secondValue = val;
}
item->setText( tr("Scale H = %1 % V = %2 %").arg(ite->firstValue).arg(ite->secondValue));
}
void TransformDialog::changeVScale(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->secondValue = val;
if (scaleLink->isChecked())
{
horizontalScale->setValue(verticalScale->value());
ite->firstValue = val;
}
item->setText( tr("Scale H = %1 % V = %2 %").arg(ite->firstValue).arg(ite->secondValue));
}
void TransformDialog::toggleLink()
{
if (scaleLink->isChecked())
verticalScale->setValue(horizontalScale->value());
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
item->setText( tr("Scale H = %1 % V = %2 %").arg(ite->firstValue).arg(ite->secondValue));
}
void TransformDialog::changeHTranslation(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->firstValue = val;
item->setText( tr("Translate H = %1%2 V = %3%4").arg(ite->firstValue).arg(m_suffix).arg(ite->secondValue).arg(m_suffix));
}
void TransformDialog::changeVTranslation(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->secondValue = val;
item->setText( tr("Translate H = %1%2 V = %3%4").arg(ite->firstValue).arg(m_suffix).arg(ite->secondValue).arg(m_suffix));
}
void TransformDialog::changeRotation(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->firstValue = -val;
item->setText( tr("Rotate Angle = %1%2").arg(-ite->firstValue).arg(unitGetSuffixFromIndex(6)));
}
void TransformDialog::changeHSkew(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->firstValue = val;
if (linkSkew->isChecked())
{
verticalSkew->setValue(horizontalSkew->value());
ite->secondValue = val;
}
item->setText( tr("Skew H = %1%2 V = %3%4").arg(ite->firstValue).arg(unitGetSuffixFromIndex(6)).arg(ite->secondValue).arg(unitGetSuffixFromIndex(6)));
}
void TransformDialog::changeVSkew(double val)
{
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
ite->secondValue = val;
if (linkSkew->isChecked())
{
horizontalSkew->setValue(verticalSkew->value());
ite->firstValue = val;
}
item->setText( tr("Skew H = %1%2 V = %3%4").arg(ite->firstValue).arg(unitGetSuffixFromIndex(6)).arg(ite->secondValue).arg(unitGetSuffixFromIndex(6)));
}
void TransformDialog::toggleLinkSkew()
{
if (linkSkew->isChecked())
verticalSkew->setValue(horizontalSkew->value());
QListWidgetItem* item = transformSelector->currentItem();
TransformItem *ite = (TransformItem*)item;
item->setText( tr("Skew H = %1%2 V = %3%4").arg(ite->firstValue).arg(unitGetSuffixFromIndex(6)).arg(ite->secondValue).arg(unitGetSuffixFromIndex(6)));
}
void TransformDialog::moveTransformUp()
{
int curr = transformSelector->currentRow();
if (curr == 0)
return;
QListWidgetItem *it = transformSelector->takeItem(curr);
transformSelector->insertItem(curr-1, it);
transformSelector->setCurrentItem(it);
setCurrentTransform(it);
}
void TransformDialog::moveTransformDown()
{
int curr = transformSelector->currentRow();
if (curr == transformSelector->count()-1)
return;
QListWidgetItem *it = transformSelector->takeItem(curr);
transformSelector->insertItem(curr+1, it);
transformSelector->setCurrentItem(it);
setCurrentTransform(it);
}
void TransformDialog::removeTransform()
{
int curr = transformSelector->currentRow();
QListWidgetItem *it = transformSelector->takeItem(curr);
delete it;
transformSelector->clearSelection();
if (transformSelector->count() == 0)
{
transformStack->setCurrentIndex(0);
buttonRemove->setEnabled(false);
buttonUp->setEnabled(false);
buttonDown->setEnabled(false);
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
}
else
{
transformSelector->setCurrentItem(transformSelector->item(qMax(curr-1, 0)));
transformSelector->currentItem()->setSelected(true);
setCurrentTransform(transformSelector->currentItem());
buttonRemove->setEnabled(true);
}
}
QTransform TransformDialog::getTransformMatrix()
{
QTransform ret = QTransform();
for (int a = 0; a < transformSelector->count(); a++)
{
QListWidgetItem *it = transformSelector->item(a);
TransformItem *ite = (TransformItem*)it;
switch (it->type())
{
case 1001:
ret.scale(ite->firstValue / 100.0, ite->secondValue / 100.0);
break;
case 1002:
ret.translate(ite->firstValue / m_unitRatio, ite->secondValue / m_unitRatio);
break;
case 1003:
ret.rotate(ite->firstValue);
break;
case 1004:
ret.shear(-sin(ite->firstValue / 180.0 * M_PI), -sin(ite->secondValue / 180.0 * M_PI));
break;
default:
break;
}
}
return ret;
}
int TransformDialog::getCount()
{
return numberOfCopies->value();
}
int TransformDialog::getBasepoint()
{
return basePoint->checkedId();
}