summaryrefslogtreecommitdiffstats
path: root/scribus/gradienteditor.cpp
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
commit7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch)
tree4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/gradienteditor.cpp
downloadscribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/gradienteditor.cpp')
-rw-r--r--scribus/gradienteditor.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/scribus/gradienteditor.cpp b/scribus/gradienteditor.cpp
new file mode 100644
index 0000000..c908e7e
--- /dev/null
+++ b/scribus/gradienteditor.cpp
@@ -0,0 +1,340 @@
+/*
+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.
+*/
+/***************************************************************************
+ gradienteditor - description
+ -------------------
+ begin : Mit Mai 26 2004
+ copyright : (C) 2004 by Franz Schmid
+ email : 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. *
+ * *
+ ***************************************************************************/
+
+#include "gradienteditor.h"
+
+#include <QApplication>
+#include <QCursor>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QPaintEvent>
+#include <QPainter>
+#include <QPixmap>
+#include <QPolygon>
+#include <QToolTip>
+
+
+#include "scpainter.h"
+#include "fpoint.h"
+#include "util_icon.h"
+
+GradientPreview::GradientPreview(QWidget *pa) : QFrame(pa)
+{
+ setFrameShape( QFrame::Panel );
+ setFrameShadow( QFrame::Sunken );
+ setLineWidth( 2 );
+ setMinimumSize(QSize(200, 70));
+ setMaximumSize(QSize(3000, 70));
+ setMouseTracking(true);
+ Mpressed = false;
+ outside = true;
+ onlyselect = true;
+ fill_gradient = VGradient(VGradient::linear);
+ fill_gradient.clearStops();
+
+ QColor color;
+ color = QColor(255,255,255);
+ fill_gradient.addStop( color, 0.0, 0.5, 1.0 );
+ color = QColor(0,0,0);
+ fill_gradient.addStop( color, 1.0, 0.5, 1.0 );
+
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ StopM.clear();
+ ActStop = 0;
+ for (uint a = 0; a < fill_gradient.Stops(); ++a)
+ {
+ int center = qRound(cstops.at(a)->rampPoint * (width()-20))+10;
+ StopM.append(center);
+ }
+}
+
+void GradientPreview::paintEvent(QPaintEvent *e)
+{
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ StopM.clear();
+ for (uint a = 0; a < fill_gradient.Stops(); ++a)
+ {
+ int center = qRound(cstops.at(a)->rampPoint * (width()-20))+10;
+ StopM.append(center);
+ }
+ QImage pixm(width()-20, 37, QImage::Format_ARGB32);
+ ScPainter *p = new ScPainter(&pixm, width()-20, 37);
+ p->clear(Qt::white);
+ p->setPen(Qt::black);
+ p->setLineWidth(1);
+ p->setFillMode(2);
+ p->fill_gradient = fill_gradient;
+ p->setGradient(VGradient::linear, FPoint(0,20), FPoint(width()-20,20));
+ p->drawRect(0, 0, width()-20, 37);
+ p->end();
+ delete p;
+ QPainter pw;
+ pw.begin(this);
+ pw.drawImage(10, 5, pixm);
+ for (uint a = 0; a < fill_gradient.Stops(); ++a)
+ {
+ int center = qRound(cstops.at(a)->rampPoint * (width()-20))+10;
+ pw.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
+ if (StopM[qMax(ActStop,0)] == center)
+ pw.setBrush(Qt::red);
+ else
+ pw.setBrush(Qt::blue);
+ QPolygon cr;
+ cr.setPoints(3, qRound(center), 43, qRound(center-4), 56, qRound(center+4), 56);
+ pw.drawPolygon(cr);
+ }
+ pw.end();
+ QFrame::paintEvent(e);
+}
+
+void GradientPreview::mousePressEvent(QMouseEvent *m)
+{
+ QRect fpo;
+ Mpressed = true;
+ ActStop = -1;
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ for (int yg = 0; yg < static_cast<int>(StopM.count()); ++yg)
+ {
+ fpo = QRect(static_cast<int>(StopM[yg])-4, 43, 8, 13);
+ if (fpo.contains(m->pos()))
+ {
+ ActStop = yg;
+ emit selectedColor(cstops.at(ActStop)->name, cstops.at(ActStop)->shade);
+ emit currTrans(cstops.at(ActStop)->opacity);
+ emit currStep(cstops.at(ActStop)->rampPoint);
+ repaint();
+ onlyselect = true;
+ return;
+ }
+ }
+}
+
+void GradientPreview::mouseReleaseEvent(QMouseEvent *m)
+{
+ QRect fpo;
+ if ((Mpressed) && (ActStop > 0) && (ActStop != static_cast<int>(StopM.count()-1)) && (outside || m->y() > 60))
+ {
+ onlyselect = false;
+ fill_gradient.removeStop(ActStop);
+ ActStop = 0;
+ repaint();
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ emit selectedColor(cstops.at(ActStop)->name, cstops.at(ActStop)->shade);
+ emit currTrans(cstops.at(ActStop)->opacity);
+ emit currStep(cstops.at(ActStop)->rampPoint);
+ }
+ if ((m->y() < height()) && (m->y() > 43) && (m->x() > 0) && (m->x() < width()) && (ActStop == -1))
+ {
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ double newStop = static_cast<double>((m->x() - 10)) / (static_cast<double>(width())-20);
+ QColor stopColor = (cstops.count() > 0) ? cstops.at(0)->color : QColor(255, 255, 255);
+ QString stopName = (cstops.count() > 0) ? cstops.at(0)->name : QString("White");
+ int stopShade = (cstops.count() > 0) ? cstops.at(0)->shade : 100;
+ fill_gradient.addStop(stopColor, newStop, 0.5, 1.0, stopName, stopShade);
+ repaint();
+ onlyselect = false;
+ cstops = fill_gradient.colorStops();
+ for (int yg = 0; yg < static_cast<int>(StopM.count()); ++yg)
+ {
+ fpo = QRect(static_cast<int>(StopM[yg])-4, 43, 8, 13);
+ if (fpo.contains(m->pos()))
+ {
+ ActStop = yg;
+ emit selectedColor(cstops.at(ActStop)->name, cstops.at(ActStop)->shade);
+ emit currTrans(cstops.at(ActStop)->opacity);
+ emit currStep(cstops.at(ActStop)->rampPoint);
+ repaint();
+ break;
+ }
+ }
+ }
+ Mpressed = false;
+ if (!onlyselect)
+ emit gradientChanged();
+}
+
+void GradientPreview::mouseMoveEvent(QMouseEvent *m)
+{
+ QRect fpo;
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ if ((!Mpressed) && (m->y() < height()) && (m->y() > 43) && (m->x() > 9) && (m->x() < width()-9))
+ {
+ qApp->changeOverrideCursor(QCursor(loadIcon("AddPoint.png"), 1, 1));
+ for (int yg = 0; yg < static_cast<int>(StopM.count()); ++yg)
+ {
+ fpo = QRect(static_cast<int>(StopM[yg])-4, 43, 8, 13);
+ if (fpo.contains(m->pos()))
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::SizeHorCursor));
+ return;
+ }
+ }
+ }
+ if ((Mpressed) && (m->y() < height()) && (m->y() > 43) && (m->x() > 9) && (m->x() < width()-9) && (ActStop != -1))
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::SizeHorCursor));
+ double newStop = static_cast<double>((m->x() - 10)) / (static_cast<double>(width())-20);
+ if (ActStop > 1)
+ {
+ if (StopM[ActStop-1]+2 >= m->x())
+ return;
+ }
+ if (ActStop < static_cast<int>(StopM.count()-2))
+ {
+ if (StopM[ActStop+1]-2 < m->x())
+ return;
+ }
+ StopM[ActStop] = m->x();
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ cstops.at(ActStop)->rampPoint = newStop;
+ emit currStep(cstops.at(ActStop)->rampPoint);
+ qSort(cstops.begin(), cstops.end());
+ onlyselect = false;
+ repaint();
+ }
+ if ((Mpressed) && (outside || m->y() > 60) && (ActStop > 0) && (ActStop != static_cast<int>(StopM.count()-1)))
+ qApp->changeOverrideCursor(QCursor(loadIcon("DelPoint.png"), 1, 1));
+}
+
+void GradientPreview::leaveEvent(QEvent*)
+{
+ if ((Mpressed) && (ActStop > 0) && (ActStop != static_cast<int>(StopM.count()-1)))
+ qApp->changeOverrideCursor(QCursor(loadIcon("DelPoint.png"), 1, 1));
+ else
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ outside = true;
+}
+
+void GradientPreview::enterEvent(QEvent*)
+{
+ outside = false;
+}
+
+void GradientPreview::updateDisplay()
+{
+ repaint();
+ ActStop = 0;
+ if (!fill_gradient.colorStops().isEmpty())
+ {
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ emit selectedColor(cstops.at(ActStop)->name, cstops.at(ActStop)->shade);
+ emit currTrans(cstops.at(ActStop)->opacity);
+ emit currStep(cstops.at(ActStop)->rampPoint);
+ }
+}
+
+void GradientPreview::setActColor(QColor c, QString n, int s)
+{
+ if (ActStop == -1)
+ return;
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ cstops.at(ActStop)->color = c;
+ cstops.at(ActStop)->name = n;
+ cstops.at(ActStop)->shade = s;
+ repaint();
+}
+
+void GradientPreview::setActTrans(double t)
+{
+ if (ActStop == -1)
+ return;
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ cstops.at(ActStop)->opacity = t;
+ repaint();
+}
+
+void GradientPreview::setActStep(double t)
+{
+ if (ActStop == -1)
+ return;
+ QList<VColorStop*> cstops = fill_gradient.colorStops();
+ cstops.at(ActStop)->rampPoint = t;
+ repaint();
+}
+
+GradientEditor::GradientEditor(QWidget *pa) : QFrame(pa)
+{
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum));
+ setFrameShape( QFrame::Panel );
+ setLineWidth( 1 );
+ QGridLayout *gridLayout = new QGridLayout(this);
+ gridLayout->setSpacing(2);
+ gridLayout->setMargin(2);
+
+ Preview = new GradientPreview(this);
+ gridLayout->addWidget(Preview, 0, 0, 1, 2);
+
+ Position = new QSpinBox( this );
+ Position->setMinimum(0);
+ Position->setMaximum(100);
+ Position->setSingleStep(1);
+ Position->setValue(0);
+ Desc = new QLabel( this );
+ languageChange();
+
+ gridLayout->addWidget(Desc, 1, 0, 1, 1);
+ gridLayout->addWidget(Position, 1, 1, 1, 1);
+
+ connect(Position, SIGNAL(valueChanged(int)), this, SLOT(changePos(int)));
+ connect(Preview, SIGNAL(currStep(double)), this, SLOT(setPos(double)));
+}
+
+void GradientEditor::setPos(double p)
+{
+ disconnect(Position, SIGNAL(valueChanged(int)), this, SLOT(changePos(int)));
+ Position->setValue(qRound(p * 100));
+ connect(Position, SIGNAL(valueChanged(int)), this, SLOT(changePos(int)));
+}
+
+void GradientEditor::changePos(int v)
+{
+ Preview->setActStep(static_cast<double>(v) / 100.0);
+ emit gradientChanged();
+}
+
+void GradientEditor::changeEvent(QEvent *e)
+{
+ if (e->type() == QEvent::LanguageChange)
+ {
+ languageChange();
+ }
+ else
+ QWidget::changeEvent(e);
+}
+
+void GradientEditor::languageChange()
+{
+ Desc->setText( tr( "Position:" ) );
+ Position->setSuffix( tr(" %") );
+}
+
+bool GradientEditor::event(QEvent * event)
+{
+ if (event->type() == QEvent::ToolTip)
+ {
+ QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
+ QToolTip::showText(helpEvent->globalPos(), tr( "Add, change or remove color stops here" ), Preview, QRect(10,43, Preview->width()-20, 13));
+ }
+ return QWidget::event(event);
+}
+