415void QQuickRectangle::setGradient(
const QJSValue &gradient)
417 Q_D(QQuickRectangle);
418 if (d->gradient.equals(gradient))
421 static int updatedSignalIdx = QMetaMethod::fromSignal(&QQuickGradient::updated).methodIndex();
422 if (d->doUpdateSlotIdx < 0)
423 d->doUpdateSlotIdx = QQuickRectangle::staticMetaObject.indexOfSlot(
"doUpdate()");
425 if (
auto oldGradient = qobject_cast<QQuickGradient*>(d->gradient.toQObject()))
426 QMetaObject::disconnect(oldGradient, updatedSignalIdx,
this, d->doUpdateSlotIdx);
428 if (gradient.isQObject()) {
429 if (
auto newGradient = qobject_cast<QQuickGradient*>(gradient.toQObject())) {
430 d->gradient = gradient;
431 QMetaObject::connect(newGradient, updatedSignalIdx,
this, d->doUpdateSlotIdx);
433 qmlWarning(
this) <<
"Can't assign "
434 << QQmlMetaType::prettyTypeName(gradient.toQObject()) <<
" to gradient property";
435 d->gradient = QJSValue();
437 }
else if (gradient.isNumber() || gradient.isString()) {
438 static const QMetaEnum gradientPresetMetaEnum = QMetaEnum::fromType<QGradient::Preset>();
439 Q_ASSERT(gradientPresetMetaEnum.isValid());
447 if (gradient.isNumber()) {
448 const auto preset = QGradient::Preset(gradient.toInt());
449 if (preset != QGradient::NumPresets && gradientPresetMetaEnum.valueToKey(preset))
450 result = QGradient(preset);
451 }
else if (gradient.isString()) {
452 const auto presetName = gradient.toString();
453 if (presetName != QLatin1String(
"NumPresets")) {
455 const auto presetInt = gradientPresetMetaEnum.keyToValue(qPrintable(presetName), &ok);
457 result = QGradient(QGradient::Preset(presetInt));
461 if (result.type() != QGradient::NoGradient) {
462 d->gradient = gradient;
464 qmlWarning(
this) <<
"No such gradient preset '" << gradient.toString() <<
"'";
465 d->gradient = QJSValue();
467 }
else if (gradient.isNull() || gradient.isUndefined()) {
468 d->gradient = gradient;
470 qmlWarning(
this) <<
"Unknown gradient type. Expected int, string, or Gradient";
471 d->gradient = QJSValue();
499void QQuickRectangle::setRadius(qreal radius)
501 Q_D(QQuickRectangle);
502 if (d->radius == radius)
506 d->maybeSetImplicitAntialiasing();
509 emit radiusChanged();
511 if (d->extraRectangle.isAllocated()) {
512 if (!d->extraRectangle->isTopLeftRadiusSet)
513 emit topLeftRadiusChanged();
514 if (!d->extraRectangle->isTopRightRadiusSet)
515 emit topRightRadiusChanged();
516 if (!d->extraRectangle->isBottomLeftRadiusSet)
517 emit bottomLeftRadiusChanged();
518 if (!d->extraRectangle->isBottomRightRadiusSet)
519 emit bottomRightRadiusChanged();
521 emit topLeftRadiusChanged();
522 emit topRightRadiusChanged();
523 emit bottomLeftRadiusChanged();
524 emit bottomRightRadiusChanged();
765QSGNode *QQuickRectangle::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
768 Q_D(QQuickRectangle);
770 if (width() <= 0 || height() <= 0
771 || (d->gradient.isUndefined() && d->color.alpha() == 0 && (!d->pen || d->pen->width() == 0 || d->pen->color().alpha() == 0))) {
776 QSGInternalRectangleNode *rectangle =
static_cast<QSGInternalRectangleNode *>(oldNode);
777 if (!rectangle) rectangle = d->sceneGraphContext()->createInternalRectangleNode();
779 rectangle->setRect(QRectF(0, 0, width(), height()));
780 rectangle->setColor(d->color);
782 if (d->pen && d->pen->isValid()) {
783 rectangle->setPenColor(d->pen->color());
784 qreal penWidth = d->pen->width();
785 if (d->pen->pixelAligned()) {
786 qreal dpr = d->effectiveDevicePixelRatio();
787 penWidth = qRound(penWidth * dpr) / dpr;
789 rectangle->setPenWidth(penWidth);
790 rectangle->setAligned(
false);
792 rectangle->setPenWidth(0);
795 rectangle->setRadius(d->radius);
796 if (d->extraRectangle.isAllocated()) {
797 const auto &extra = d->extraRectangle.value();
798 if (extra.isTopLeftRadiusSet)
799 rectangle->setTopLeftRadius(extra.topLeftRadius);
801 rectangle->resetTopLeftRadius();
802 if (extra.isTopRightRadiusSet)
803 rectangle->setTopRightRadius(extra.topRightRadius);
805 rectangle->resetTopRightRadius();
806 if (extra.isBottomLeftRadiusSet)
807 rectangle->setBottomLeftRadius(extra.bottomLeftRadius);
809 rectangle->resetBottomLeftRadius();
810 if (extra.isBottomRightRadiusSet)
811 rectangle->setBottomRightRadius(extra.bottomRightRadius);
813 rectangle->resetBottomRightRadius();
815 rectangle->resetTopLeftRadius();
816 rectangle->resetTopRightRadius();
817 rectangle->resetBottomLeftRadius();
818 rectangle->resetBottomRightRadius();
820 rectangle->setAntialiasing(antialiasing());
822 QGradientStops stops;
823 bool vertical =
true;
824 if (d->gradient.isQObject()) {
825 auto gradient = qobject_cast<QQuickGradient*>(d->gradient.toQObject());
827 stops = gradient->gradientStops();
828 vertical = gradient->orientation() == QQuickGradient::Vertical;
829 }
else if (d->gradient.isNumber() || d->gradient.isString()) {
830 QGradient preset(d->gradient.toVariant().value<QGradient::Preset>());
831 if (preset.type() == QGradient::LinearGradient) {
832 auto linearGradient =
static_cast<QLinearGradient&>(preset);
833 const QPointF start = linearGradient.start();
834 const QPointF end = linearGradient.finalStop();
835 vertical = qAbs(start.y() - end.y()) >= qAbs(start.x() - end.x());
836 stops = linearGradient.stops();
837 if ((vertical && start.y() > end.y()) || (!vertical && start.x() > end.x())) {
840 QGradientStops reverseStops;
841 for (
auto it = stops.rbegin(); it != stops.rend(); ++it) {
843 stop.first = 1 - stop.first;
844 reverseStops.append(stop);
846 stops = reverseStops;
850 rectangle->setGradientStops(stops);
851 rectangle->setGradientVertical(vertical);