242void QtGradientWidget::mousePressEvent(QMouseEvent *e)
244 if (e->button() != Qt::LeftButton)
248 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
249 QPointF startPoint = d_ptr->toViewport(d_ptr->m_startLinear);
250 double x = p.x() - startPoint.x();
251 double y = p.y() - startPoint.y();
253 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
254 d_ptr->m_dragHandle = QtGradientWidgetPrivate::StartLinearHandle;
255 d_ptr->m_dragOffset = QPointF(x, y);
260 QPointF endPoint = d_ptr->toViewport(d_ptr->m_endLinear);
261 x = p.x() - endPoint.x();
262 y = p.y() - endPoint.y();
264 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
265 d_ptr->m_dragHandle = QtGradientWidgetPrivate::EndLinearHandle;
266 d_ptr->m_dragOffset = QPointF(x, y);
270 }
else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
271 QPointF focalPoint = d_ptr->toViewport(d_ptr->m_focalRadial);
272 double x = p.x() - focalPoint.x();
273 double y = p.y() - focalPoint.y();
275 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 9) > (x * x + y * y)) {
276 d_ptr->m_dragHandle = QtGradientWidgetPrivate::FocalRadialHandle;
277 d_ptr->m_dragOffset = QPointF(x, y);
282 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
283 x = p.x() - centralPoint.x();
284 y = p.y() - centralPoint.y();
286 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
287 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralRadialHandle;
288 d_ptr->m_dragOffset = QPointF(x, y);
293 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
294 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
295 QRectF r1(0, r.y(), size().width(), r.height());
296 QRectF r2(r.x(), 0, r.width(), r.y());
297 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
298 QPointF pF(p.x(), p.y());
299 if (r1.contains(pF) || r2.contains(pF) || r3.contains(pF)) {
300 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
301 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
302 const double clickRadius = hypot(x, y);
304 d_ptr->m_radiusFactor = d_ptr->m_radiusRadial / clickRadius;
305 if (d_ptr->m_radiusFactor == 0)
306 d_ptr->m_radiusFactor = 1;
307 d_ptr->m_dragRadius = d_ptr->m_radiusRadial;
308 d_ptr->m_dragHandle = QtGradientWidgetPrivate::RadiusRadialHandle;
313 }
else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
314 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
315 double x = p.x() - centralPoint.x();
316 double y = p.y() - centralPoint.y();
318 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
319 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralConicalHandle;
320 d_ptr->m_dragOffset = QPointF(x, y);
324 double radius = size().width();
325 if (size().height() < radius)
326 radius = size().height();
328 double corr = d_ptr->m_handleSize / 3;
330 QPointF vp = d_ptr->toViewport(d_ptr->m_centralConical);
333 if (((radius - corr) * (radius - corr) < (x * x + y * y)) &&
334 ((radius + corr) * (radius + corr) > (x * x + y * y))) {
335 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
336 QPointF current(e->pos().x(), e->pos().y());
337 x = current.x() - central.x();
338 y = current.y() - central.y();
339 x /= size().width() / 2;
340 y /= size().height() / 2;
343 d_ptr->m_angleOffset = d_ptr->m_angleConical - angle;
344 d_ptr->m_dragAngle = d_ptr->m_angleConical;
345 d_ptr->m_dragHandle = QtGradientWidgetPrivate::AngleConicalHandle;
359void QtGradientWidget::mouseMoveEvent(QMouseEvent *e)
361 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::NoHandle)
364 const QPointF newPos = e->position() - d_ptr->m_dragOffset;
365 QPointF newPoint = d_ptr->fromViewport(newPos);
366 if (newPoint.x() < 0)
368 else if (newPoint.x() > 1)
370 if (newPoint.y() < 0)
372 else if (newPoint.y() > 1)
375 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle) {
376 d_ptr->m_startLinear = newPoint;
377 emit startLinearChanged(newPoint);
378 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle) {
379 d_ptr->m_endLinear = newPoint;
380 emit endLinearChanged(newPoint);
381 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle) {
382 d_ptr->m_centralRadial = newPoint;
383 emit centralRadialChanged(newPoint);
384 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle) {
385 d_ptr->m_focalRadial = newPoint;
386 emit focalRadialChanged(newPoint);
387 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
388 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
389 QPointF pF(e->pos().x(), e->pos().y());
390 double x = pF.x() - centralPoint.x();
391 double y = pF.y() - centralPoint.y();
393 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
394 if (d_ptr->m_radiusRadial != d_ptr->m_dragRadius) {
395 d_ptr->m_radiusRadial = d_ptr->m_dragRadius;
396 emit radiusRadialChanged(d_ptr->m_radiusRadial);
399 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
400 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
401 const double moveRadius = hypot(x, y);
403 double newRadius = moveRadius * d_ptr->m_radiusFactor;
406 d_ptr->m_radiusRadial = newRadius;
407 emit radiusRadialChanged(d_ptr->m_radiusRadial);
409 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle) {
410 d_ptr->m_centralConical = newPoint;
411 emit centralConicalChanged(newPoint);
412 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
413 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
414 QPointF pF(e->pos().x(), e->pos().y());
415 double x = pF.x() - centralPoint.x();
416 double y = pF.y() - centralPoint.y();
418 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
419 if (d_ptr->m_angleConical != d_ptr->m_dragAngle) {
420 d_ptr->m_angleConical = d_ptr->m_dragAngle;
421 emit angleConicalChanged(d_ptr->m_angleConical);
424 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
425 QPointF current = pF;
426 x = current.x() - central.x();
427 y = current.y() - central.y();
428 x /= size().width() / 2;
429 y /= size().height() / 2;
431 const double angle = qRadiansToDegrees(atan2(-y, x)) + d_ptr->m_angleOffset;
432 d_ptr->setAngleConical(angle);
443void QtGradientWidget::paintEvent(QPaintEvent *e)
449 if (d_ptr->m_backgroundCheckered) {
451 QPixmap pm(2 * pixSize, 2 * pixSize);
454 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
455 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
456 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
457 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
459 p.setBrushOrigin((size().width() % pixSize + pixSize) / 2, (size().height() % pixSize + pixSize) / 2);
460 p.fillRect(rect(), pm);
461 p.setBrushOrigin(0, 0);
464 QGradient *gradient =
nullptr;
465 switch (d_ptr->m_gradientType) {
466 case QGradient::LinearGradient:
467 gradient =
new QLinearGradient(d_ptr->m_startLinear, d_ptr->m_endLinear);
469 case QGradient::RadialGradient:
470 gradient =
new QRadialGradient(d_ptr->m_centralRadial, d_ptr->m_radiusRadial, d_ptr->m_focalRadial);
472 case QGradient::ConicalGradient:
473 gradient =
new QConicalGradient(d_ptr->m_centralConical, d_ptr->m_angleConical);
481 gradient->setStops(d_ptr->m_gradientStops);
482 gradient->setSpread(d_ptr->m_gradientSpread);
485 p.scale(size().width(), size().height());
486 p.fillRect(QRect(0, 0, 1, 1), *gradient);
489 p.setRenderHint(QPainter::Antialiasing);
491 QColor c = QColor::fromRgbF(0.5, 0.5, 0.5, 0.5);
498 dragPen.setWidthF(2);
499 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
501 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle)
503 d_ptr->paintPoint(&p, d_ptr->m_startLinear, d_ptr->m_handleSize);
507 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle)
509 d_ptr->paintPoint(&p, d_ptr->m_endLinear, d_ptr->m_handleSize);
511 }
else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
512 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
515 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
516 QRectF r1(0, r.y(), size().width(), r.height());
517 QRectF r2(r.x(), 0, r.width(), r.y());
518 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
522 p.setBrush(Qt::NoBrush);
524 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle)
526 d_ptr->paintPoint(&p, d_ptr->m_centralRadial, d_ptr->m_handleSize);
529 const QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial * size().width(),
530 central.y() - d_ptr->m_radiusRadial * size().height(),
531 2 * d_ptr->m_radiusRadial * size().width(),
532 2 * d_ptr->m_radiusRadial * size().height());
533 QRegion region(r1.toRect());
534 region += r2.toRect();
535 region += r3.toRect();
536 p.setClipRegion(region);
539 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
542 QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
543 central.y() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height(),
544 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
545 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height());
553 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle)
555 d_ptr->paintPoint(&p, d_ptr->m_focalRadial, 2 * d_ptr->m_handleSize / 3);
557 }
else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
558 double radius = size().width();
559 if (size().height() < radius)
560 radius = size().height();
562 double corr = d_ptr->m_handleSize / 3;
564 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
567 p.setBrush(Qt::NoBrush);
569 pen2.setWidthF(2 * d_ptr->m_handleSize / 3);
571 p.drawEllipse(d_ptr->pointRect(central, 2 * radius));
575 p.setBrush(Qt::NoBrush);
577 for (
int i = 0; i < pointCount; i++) {
578 const qreal angle = qDegreesToRadians(i * 180.0 / pointCount + d_ptr->m_angleConical);
579 const QPointF ray(qCos(angle) * size().width() / 2,
580 -qSin(angle) * size().height() / 2);
581 const double mod = hypot(ray.x(), ray.y());
582 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
583 central.y() + ray.y() * (radius - corr) / mod),
584 QPointF(central.x() + ray.x() * (radius + corr) / mod,
585 central.y() + ray.y() * (radius + corr) / mod));
586 p.drawLine(QPointF(central.x() - ray.x() * (radius - corr) / mod,
587 central.y() - ray.y() * (radius - corr) / mod),
588 QPointF(central.x() - ray.x() * (radius + corr) / mod,
589 central.y() - ray.y() * (radius + corr) / mod));
591 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
594 const qreal angle = qDegreesToRadians(d_ptr->m_angleConical - d_ptr->m_angleOffset);
595 const QPointF ray(qCos(angle) * size().width() / 2,
596 -qSin(angle) * size().height() / 2);
597 const double mod = hypot(ray.x(), ray.y());
598 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
599 central.y() + ray.y() * (radius - corr) / mod),
600 QPointF(central.x() + ray.x() * (radius + corr) / mod,
601 central.y() + ray.y() * (radius + corr) / mod));
608 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle)
610 d_ptr->paintPoint(&p, d_ptr->m_centralConical, d_ptr->m_handleSize);