414void QQuickRectangle::setGradient(
const QJSValue &gradient)
416 Q_D(QQuickRectangle);
417 if (d->gradient.equals(gradient))
420 static int updatedSignalIdx = QMetaMethod::fromSignal(&QQuickGradient::updated).methodIndex();
421 if (d->doUpdateSlotIdx < 0)
422 d->doUpdateSlotIdx = QQuickRectangle::staticMetaObject.indexOfSlot(
"doUpdate()");
424 if (
auto oldGradient = qobject_cast<QQuickGradient*>(d->gradient.toQObject()))
425 QMetaObject::disconnect(oldGradient, updatedSignalIdx,
this, d->doUpdateSlotIdx);
427 if (gradient.isQObject()) {
428 if (
auto newGradient = qobject_cast<QQuickGradient*>(gradient.toQObject())) {
429 d->gradient = gradient;
430 QMetaObject::connect(newGradient, updatedSignalIdx,
this, d->doUpdateSlotIdx);
432 qmlWarning(
this) <<
"Can't assign "
433 << QQmlMetaType::prettyTypeName(gradient.toQObject()) <<
" to gradient property";
434 d->gradient = QJSValue();
436 }
else if (gradient.isNumber() || gradient.isString()) {
437 static const QMetaEnum gradientPresetMetaEnum = QMetaEnum::fromType<QGradient::Preset>();
438 Q_ASSERT(gradientPresetMetaEnum.isValid());
446 if (gradient.isNumber()) {
447 const auto preset = QGradient::Preset(gradient.toInt());
448 if (preset != QGradient::NumPresets && gradientPresetMetaEnum.valueToKey(preset))
449 result = QGradient(preset);
450 }
else if (gradient.isString()) {
451 const auto presetName = gradient.toString();
452 if (presetName != QLatin1String(
"NumPresets")) {
454 const auto presetInt = gradientPresetMetaEnum.keyToValue(qPrintable(presetName), &ok);
456 result = QGradient(QGradient::Preset(presetInt));
460 if (result.type() != QGradient::NoGradient) {
461 d->gradient = gradient;
463 qmlWarning(
this) <<
"No such gradient preset '" << gradient.toString() <<
"'";
464 d->gradient = QJSValue();
466 }
else if (gradient.isNull() || gradient.isUndefined()) {
467 d->gradient = gradient;
469 qmlWarning(
this) <<
"Unknown gradient type. Expected int, string, or Gradient";
470 d->gradient = QJSValue();
498void QQuickRectangle::setRadius(qreal radius)
500 Q_D(QQuickRectangle);
501 if (d->radius == radius)
505 d->maybeSetImplicitAntialiasing();
508 emit radiusChanged();
510 if (d->extraRectangle.isAllocated()) {
511 if (!d->extraRectangle->isTopLeftRadiusSet)
512 emit topLeftRadiusChanged();
513 if (!d->extraRectangle->isTopRightRadiusSet)
514 emit topRightRadiusChanged();
515 if (!d->extraRectangle->isBottomLeftRadiusSet)
516 emit bottomLeftRadiusChanged();
517 if (!d->extraRectangle->isBottomRightRadiusSet)
518 emit bottomRightRadiusChanged();
520 emit topLeftRadiusChanged();
521 emit topRightRadiusChanged();
522 emit bottomLeftRadiusChanged();
523 emit bottomRightRadiusChanged();
776QSGNode *QQuickRectangle::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
779 Q_D(QQuickRectangle);
781 if (width() <= 0 || height() <= 0
782 || (d->color.alpha() == 0 && (!d->pen || d->pen->width() == 0 || d->pen->color().alpha() == 0))) {
787 QSGInternalRectangleNode *rectangle =
static_cast<QSGInternalRectangleNode *>(oldNode);
788 if (!rectangle) rectangle = d->sceneGraphContext()->createInternalRectangleNode();
790 rectangle->setRect(QRectF(0, 0, width(), height()));
791 rectangle->setColor(d->color);
793 if (d->pen && d->pen->isValid()) {
794 rectangle->setPenColor(d->pen->color());
795 qreal penWidth = d->pen->width();
796 if (d->pen->pixelAligned()) {
797 qreal dpr = window() ? window()->effectiveDevicePixelRatio() : 1.0;
798 penWidth = qRound(penWidth * dpr) / dpr;
800 rectangle->setPenWidth(penWidth);
801 rectangle->setAligned(
false);
803 rectangle->setPenWidth(0);
806 rectangle->setRadius(d->radius);
807 if (d->extraRectangle.isAllocated()) {
808 const auto &extra = d->extraRectangle.value();
809 if (extra.isTopLeftRadiusSet)
810 rectangle->setTopLeftRadius(extra.topLeftRadius);
812 rectangle->resetTopLeftRadius();
813 if (extra.isTopRightRadiusSet)
814 rectangle->setTopRightRadius(extra.topRightRadius);
816 rectangle->resetTopRightRadius();
817 if (extra.isBottomLeftRadiusSet)
818 rectangle->setBottomLeftRadius(extra.bottomLeftRadius);
820 rectangle->resetBottomLeftRadius();
821 if (extra.isBottomRightRadiusSet)
822 rectangle->setBottomRightRadius(extra.bottomRightRadius);
824 rectangle->resetBottomRightRadius();
826 rectangle->resetTopLeftRadius();
827 rectangle->resetTopRightRadius();
828 rectangle->resetBottomLeftRadius();
829 rectangle->resetBottomRightRadius();
831 rectangle->setAntialiasing(antialiasing());
833 QGradientStops stops;
834 bool vertical =
true;
835 if (d->gradient.isQObject()) {
836 auto gradient = qobject_cast<QQuickGradient*>(d->gradient.toQObject());
838 stops = gradient->gradientStops();
839 vertical = gradient->orientation() == QQuickGradient::Vertical;
840 }
else if (d->gradient.isNumber() || d->gradient.isString()) {
841 QGradient preset(d->gradient.toVariant().value<QGradient::Preset>());
842 if (preset.type() == QGradient::LinearGradient) {
843 auto linearGradient =
static_cast<QLinearGradient&>(preset);
844 const QPointF start = linearGradient.start();
845 const QPointF end = linearGradient.finalStop();
846 vertical = qAbs(start.y() - end.y()) >= qAbs(start.x() - end.x());
847 stops = linearGradient.stops();
848 if ((vertical && start.y() > end.y()) || (!vertical && start.x() > end.x())) {
851 QGradientStops reverseStops;
852 for (
auto it = stops.rbegin(); it != stops.rend(); ++it) {
854 stop.first = 1 - stop.first;
855 reverseStops.append(stop);
857 stops = reverseStops;
861 rectangle->setGradientStops(stops);
862 rectangle->setGradientVertical(vertical);