1 /***************************************************************************
2 * Copyright (C) 2005 by Jorge Cuadrado *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "gradientviewer.h"
23 #include <dcore/debug.h>
24 #include <dgraphics/algorithm.h>
26 #include <QMouseEvent>
29 struct GradientViewer::Private
36 QRadialGradient
gradient(QPoint(5, 5), 10, QPoint(5,5) );
38 gradient
.setColorAt(0.5, Qt::gray
);
39 gradient
.setColorAt(0, Qt::blue
);
41 normalPoint
= QBrush(gradient
);
43 gradient
.setColorAt(0, Qt::red
);
44 selectedPoint
= QBrush(gradient
);
47 points
<< QPointF(10,50) << QPointF(60,50);
50 QVector
<QPointF
> points
;
53 void selectPoint(const QPointF
&point
)
56 QRectF
rect(point
- QPointF(rate
/2,rate
/2) , QSizeF(rate
, rate
));
58 QVector
<QPointF
>::const_iterator it
;
59 for (it
= points
.begin(); it
!= points
.end(); ++it
)
61 if( rect
.contains(*it
) )
63 currentIndex
= points
.indexOf(*it
);
68 void drawPoints(QPainter
*p
)
70 foreach(QPointF point
, points
)
72 QRectF
br( point
- QPoint(5,5), QSizeF(10,10) );
74 p
->setRenderHint(QPainter::Antialiasing
);
75 if(point
== points
[currentIndex
])
77 selectedPoint
.setMatrix(QMatrix().translate(br
.x(), br
.y()));
78 p
->setBrush(selectedPoint
);
82 normalPoint
.setMatrix(QMatrix().translate(br
.x(), br
.y()));
83 p
->setBrush(normalPoint
);
89 // p->drawPoint(point);
96 ControlPoint
*controlPoint
;
97 QGradientStops gradientStops
;
101 QGradient::Type type
;
102 QGradient::Spread spread
;
107 GradientViewer::GradientViewer(QWidget
*parent
)
108 : QFrame(parent
), d(new Private
)
112 d
->controlPoint
= new Private::ControlPoint();
113 d
->type
= QGradient::LinearGradient
;
114 d
->spread
= QGradient::PadSpread
;
117 setFrameStyle( QFrame::StyledPanel
| QFrame::Sunken
);
121 // setMinimumSize(sizeHint());
125 GradientViewer::~GradientViewer()
127 delete d
->controlPoint
;
131 void GradientViewer::paintEvent( QPaintEvent
* e
)
137 QBrush
brush(d
->gradient
);
140 m
.scale(100/rect().width(), 100/rect().height());
149 d
->controlPoint
->drawPoints(&p
);
153 QColor disabled
= palette().color(QPalette::Disabled
, QPalette::WindowText
);
154 disabled
.setAlpha(120);
155 p
.fillRect(rect(), disabled
);
160 QFrame::paintEvent(e
);
163 QSize
GradientViewer::sizeHint() const
165 return QSize(100,100);
168 void GradientViewer::resizeEvent ( QResizeEvent
* event
)
170 int s
= qMin(event
->size().width(), event
->size().height());
174 void GradientViewer::createGradient()
178 case QGradient::LinearGradient
:
180 d
->gradient
= QLinearGradient(d
->controlPoint
->points
[0], d
->controlPoint
->points
[1]);
183 case QGradient::RadialGradient
:
185 d
->gradient
= QRadialGradient(d
->controlPoint
->points
[0], d
->radius
, d
->controlPoint
->points
[1] );
188 case QGradient::ConicalGradient
:
190 d
->gradient
= QConicalGradient(d
->controlPoint
->points
[0], DGraphics::Algorithm::angleForPos( d
->controlPoint
->points
[1], d
->controlPoint
->points
[0 ])*180/M_PI
);
195 dFatal() << "Fatal error, the gradient type doesn't exists!";
198 d
->gradient
.setStops( d
->gradientStops
);
199 d
->gradient
.setSpread(d
->spread
);
202 void GradientViewer::changeGradientStops( const QGradientStops
& stops
)
204 d
->gradientStops
= stops
;
209 void GradientViewer::changeType(int type
)
211 d
->type
= QGradient::Type(type
);
216 void GradientViewer::setSpread(int spread
)
218 d
->spread
= QGradient::Spread(spread
);
224 QGradient
GradientViewer::gradient()
226 QGradient gradientNormalized
;
227 switch(d
->gradient
.type())
229 case QGradient::LinearGradient
:
231 gradientNormalized
= QLinearGradient(
232 normalizePoint(d
->controlPoint
->points
[0]), normalizePoint(d
->controlPoint
->points
[1]));
235 case QGradient::RadialGradient
:
237 gradientNormalized
= QRadialGradient(normalizePoint(d
->controlPoint
->points
[0]), d
->radius
, normalizePoint(d
->controlPoint
->points
[1]) );
240 case QGradient::ConicalGradient
:
242 gradientNormalized
= QConicalGradient(normalizePoint(d
->controlPoint
->points
[0]), DGraphics::Algorithm::angleForPos(normalizePoint(d
->controlPoint
->points
[1]), normalizePoint(d
->controlPoint
->points
[0]))*180/M_PI
);
247 dFatal() << "Fatal error, the gradient type doesn't exists!";
250 gradientNormalized
.setStops( d
->gradientStops
);
251 gradientNormalized
.setSpread(d
->spread
);
252 return gradientNormalized
;
255 void GradientViewer::mousePressEvent(QMouseEvent
*e
)
257 d
->controlPoint
->selectPoint(e
->pos());
262 void GradientViewer::mouseMoveEvent( QMouseEvent
* e
)
264 d
->controlPoint
->points
[d
->controlPoint
->currentIndex
] = e
->pos();
266 emit
gradientChanged();
269 void GradientViewer::changeRadius(int radius
)
273 emit
gradientChanged();
276 void GradientViewer::setGradient(const QGradient
* gradient
)
278 d
->gradientStops
= gradient
->stops();
279 d
->spread
= gradient
->spread();
280 d
->type
= gradient
->type();
283 case QGradient::LinearGradient
:
285 d
->controlPoint
->points
[0] = static_cast<const QLinearGradient
*>(gradient
)->start();
286 d
->controlPoint
->points
[1] = static_cast<const QLinearGradient
*>(gradient
)->finalStop();
289 case QGradient::RadialGradient
:
291 d
->controlPoint
->points
[0] = static_cast<const QRadialGradient
*>(gradient
)->center();
292 d
->controlPoint
->points
[1] = static_cast<const QRadialGradient
*>(gradient
)->focalPoint();
293 d
->radius
= static_cast<const QRadialGradient
*>(gradient
)->radius();
296 case QGradient::ConicalGradient
:
298 d
->controlPoint
->points
[0] = static_cast<const QConicalGradient
*>(gradient
)->center();
300 double angle
= static_cast<const QConicalGradient
*>(gradient
)->angle();
304 QPointF point
= m
.map(QPointF(10, 0));
306 d
->controlPoint
->points
[1] = point
+ d
->controlPoint
->points
[0];
313 dFatal() << "Fatal error, the gradient type doesn't exists!";
319 QPointF
GradientViewer::normalizePoint(const QPointF
& point
)
321 return QPointF(point
.x()*(100/width()), point
.y()*(100/height()));