12#include <QtQuick/private/qquickitem_p.h>
13#include <QtQuick/private/qquicktextinput_p.h>
14#include <QtQuick/private/qquickclipnode_p.h>
16#if QT_CONFIG(accessibility)
17#include <QtQuick/private/qquickaccessibleattached_p.h>
22using namespace Qt::StringLiterals;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
58
59
60
61
62
63
64
65
68
69
70
71
72
73
74
75
76
77
80
81
82
83
84
85
86
87
88
89
101 Q_Q(QQuickTextField);
102 const QMarginsF oldInset = getInset();
103 extra.value().topInset = value;
104 extra.value().hasTopInset = !reset;
105 if (!qFuzzyCompare(oldInset.top(), value)) {
106 emit q->topInsetChanged();
107 q->insetChange(getInset(), oldInset);
113 Q_Q(QQuickTextField);
114 const QMarginsF oldInset = getInset();
115 extra.value().leftInset = value;
116 extra.value().hasLeftInset = !reset;
117 if (!qFuzzyCompare(oldInset.left(), value)) {
118 emit q->leftInsetChanged();
119 q->insetChange(getInset(), oldInset);
125 Q_Q(QQuickTextField);
126 const QMarginsF oldInset = getInset();
127 extra.value().rightInset = value;
128 extra.value().hasRightInset = !reset;
129 if (!qFuzzyCompare(oldInset.right(), value)) {
130 emit q->rightInsetChanged();
131 q->insetChange(getInset(), oldInset);
137 Q_Q(QQuickTextField);
138 const QMarginsF oldInset = getInset();
139 extra.value().bottomInset = value;
140 extra.value().hasBottomInset = !reset;
141 if (!qFuzzyCompare(oldInset.bottom(), value)) {
142 emit q->bottomInsetChanged();
143 q->insetChange(getInset(), oldInset);
154 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
155 if (((!p->widthValid() || !extra.isAllocated() || !extra->hasBackgroundWidth) && qFuzzyIsNull(background->x()))
156 || (extra.isAllocated() && (extra->hasLeftInset || extra->hasRightInset))) {
157 const bool wasWidthValid = p->widthValid();
158 background->setX(getLeftInset());
159 background->setWidth(width - getLeftInset() - getRightInset());
162 p->widthValidFlag =
false;
164 if (((!p->heightValid() || !extra.isAllocated() || !extra->hasBackgroundHeight) && qFuzzyIsNull(background->y()))
165 || (extra.isAllocated() && (extra->hasTopInset || extra->hasBottomInset))) {
166 const bool wasHeightValid = p->heightValid();
167 background->setY(getTopInset());
168 background->setHeight(height - getTopInset() - getBottomInset());
170 p->heightValidFlag =
false;
177
178
179
180
181
182
183
186 Q_Q(QQuickTextField);
187 inheritFont(QQuickControlPrivate::parentFont(q));
192 QFont parentFont = extra.isAllocated() ? extra->requestedFont.resolve(font) : font;
193 parentFont.setResolveMask(extra.isAllocated() ? extra->requestedFont.resolveMask() | font.resolveMask() : font.resolveMask());
195 const QFont defaultFont = QQuickTheme::font(QQuickTheme::TextField);
196 QFont resolvedFont = parentFont.resolve(defaultFont);
198 setFont_helper(resolvedFont);
202
203
204
205
208 Q_Q(QQuickTextField);
209 QFont oldFont = sourceFont;
210 q->QQuickTextInput::setFont(font);
212 QQuickControlPrivate::updateFontRecur(q, font);
215 emit q->fontChanged();
218#if QT_CONFIG(quicktemplates2_hover)
219void QQuickTextFieldPrivate::updateHoverEnabled(
bool enabled,
bool xplicit)
221 Q_Q(QQuickTextField);
222 if (!xplicit && explicitHoverEnabled)
225 bool wasEnabled = q->isHoverEnabled();
226 explicitHoverEnabled = xplicit;
227 if (wasEnabled != enabled) {
228 q->setAcceptHoverEvents(enabled);
229 QQuickControlPrivate::updateHoverEnabledRecur(q, enabled);
230 emit q->hoverEnabledChanged();
237 return QQuickItemPrivate::getImplicitWidth();
242 return QQuickItemPrivate::getImplicitHeight();
247 Q_Q(QQuickTextField);
248 QQuickItemPrivate::implicitWidthChanged();
249 emit q->implicitWidthChanged3();
254 Q_Q(QQuickTextField);
255 QQuickItemPrivate::implicitHeightChanged();
256 emit q->implicitHeightChanged3();
261 QQuickTextInputPrivate::readOnlyChanged(isReadOnly);
263 q_func()->setCursor(isReadOnly && !selectByMouse ? Qt::ArrowCursor : Qt::IBeamCursor);
267#if QT_CONFIG(accessibility)
268void QQuickTextFieldPrivate::accessibilityActiveChanged(
bool active)
270 QQuickTextInputPrivate::accessibilityActiveChanged(active);
274 Q_Q(QQuickTextField);
275 QQuickAccessibleAttached *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(q,
true));
276 Q_ASSERT(accessibleAttached);
277 accessibleAttached->setDescriptionImplicitly(placeholder);
284 Q_Q(QQuickTextField);
285 quickCancelDeferred(q, backgroundName());
290 Q_Q(QQuickTextField);
291 if (background.wasExecuted())
294 if (!background || complete)
295 quickBeginDeferred(q, backgroundName(), background);
297 quickCompleteDeferred(q, backgroundName(), background);
303 if (resizingBackground || item != background || !change.sizeChange())
306 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
310 if (p->widthValid() || extra.isAllocated())
311 extra.value().hasBackgroundWidth = p->widthValid();
312 if (p->heightValid() || extra.isAllocated())
313 extra.value().hasBackgroundHeight = p->heightValid();
319 Q_Q(QQuickTextField);
320 if (item == background)
321 emit q->implicitBackgroundWidthChanged();
326 Q_Q(QQuickTextField);
327 if (item == background)
328 emit q->implicitBackgroundHeightChanged();
333 Q_Q(QQuickTextField);
334 if (item == background) {
335 background =
nullptr;
336 emit q->implicitBackgroundWidthChanged();
337 emit q->implicitBackgroundHeightChanged();
343 return QQuickTheme::palette(QQuickTheme::TextField);
348 Q_Q(QQuickTextField);
349 const auto focusReasonChanged = QQuickItemPrivate::setLastFocusChangeReason(reason);
350 if (focusReasonChanged)
351 emit q->focusReasonChanged();
353 return focusReasonChanged;
356QQuickTextField::QQuickTextField(QQuickItem *parent)
357 : QQuickTextInput(*(
new QQuickTextFieldPrivate), parent)
359 Q_D(QQuickTextField);
360 d->pressHandler.control =
this;
361 d->setImplicitResizeEnabled(
false);
362 setAcceptedMouseButtons(Qt::AllButtons);
363 setActiveFocusOnTab(
true);
365 setCursor(Qt::IBeamCursor);
367#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
368 if (qEnvironmentVariable(
"QT_QUICK_CONTROLS_TEXT_SELECTION_BEHAVIOR") == u"old"_s)
369 QQuickTextInput::setOldSelectionDefault();
373QQuickTextField::~QQuickTextField()
375 Q_D(QQuickTextField);
376 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
379QFont QQuickTextField::font()
const
381 Q_D(
const QQuickTextField);
382 QFont font = QQuickTextInput::font();
384 font.setResolveMask(d->extra.isAllocated() ? d->extra->requestedFont.resolveMask() : 0);
388void QQuickTextField::setFont(
const QFont &font)
390 Q_D(QQuickTextField);
391 if (d->extra.isAllocated()
392 && d->extra.value().requestedFont.resolveMask() == font.resolveMask()
393 && d->extra.value().requestedFont == font)
396 d->extra.value().requestedFont = font;
401
402
403
404
405
406
407
408
409QQuickItem *QQuickTextField::background()
const
411 QQuickTextFieldPrivate *d =
const_cast<QQuickTextFieldPrivate *>(d_func());
413 d->executeBackground();
414 return d->background;
417void QQuickTextField::setBackground(QQuickItem *background)
419 Q_D(QQuickTextField);
420 if (d->background == background)
423 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
425 if (!d->background.isExecuting())
426 d->cancelBackground();
428 const qreal oldImplicitBackgroundWidth = implicitBackgroundWidth();
429 const qreal oldImplicitBackgroundHeight = implicitBackgroundHeight();
431 if (d->extra.isAllocated()) {
432 d->extra.value().hasBackgroundWidth =
false;
433 d->extra.value().hasBackgroundHeight =
false;
436 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
437 QQuickControlPrivate::hideOldItem(d->background);
438 d->background = background;
441 background->setParentItem(
this);
442 if (qFuzzyIsNull(background->z()))
443 background->setZ(-1);
444 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
445 if (p->widthValid() || p->heightValid()) {
446 d->extra.value().hasBackgroundWidth = p->widthValid();
447 d->extra.value().hasBackgroundHeight = p->heightValid();
449 if (isComponentComplete())
450 d->resizeBackground();
451 QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
454 if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth()))
455 emit implicitBackgroundWidthChanged();
456 if (!qFuzzyCompare(oldImplicitBackgroundHeight, implicitBackgroundHeight()))
457 emit implicitBackgroundHeightChanged();
458 if (!d->background.isExecuting())
459 emit backgroundChanged();
463
464
465
466
467
468QString QQuickTextField::placeholderText()
const
470 Q_D(
const QQuickTextField);
471 return d->placeholder;
474void QQuickTextField::setPlaceholderText(
const QString &text)
476 Q_D(QQuickTextField);
477 if (d->placeholder == text)
480 d->placeholder = text;
481#if QT_CONFIG(accessibility)
482 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this))
483 accessibleAttached->setDescriptionImplicitly(text);
485 emit placeholderTextChanged();
489
490
491
492
493
494
495
496QColor QQuickTextField::placeholderTextColor()
const
498 Q_D(
const QQuickTextField);
499 return d->placeholderColor;
502void QQuickTextField::setPlaceholderTextColor(
const QColor &color)
504 Q_D(QQuickTextField);
505 if (d->placeholderColor == color)
508 d->placeholderColor = color;
509 emit placeholderTextColorChanged();
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531Qt::FocusReason QQuickTextField::focusReason()
const
533 Q_D(
const QQuickTextField);
534 return d->lastFocusChangeReason();
537void QQuickTextField::setFocusReason(Qt::FocusReason reason)
539 Q_D(QQuickTextField);
540 d->setLastFocusChangeReason(reason);
544
545
546
547
548
549
550
551
552bool QQuickTextField::isHovered()
const
554#if QT_CONFIG(quicktemplates2_hover)
555 Q_D(
const QQuickTextField);
562void QQuickTextField::setHovered(
bool hovered)
564#if QT_CONFIG(quicktemplates2_hover)
565 Q_D(QQuickTextField);
566 if (hovered == d->hovered)
569 d->hovered = hovered;
570 emit hoveredChanged();
571 QQuickToolTipAttachedPrivate::maybeSetVisibleImplicitly(
this, hovered);
578
579
580
581
582
583
584
585bool QQuickTextField::isHoverEnabled()
const
587#if QT_CONFIG(quicktemplates2_hover)
588 Q_D(
const QQuickTextField);
589 return d->hoverEnabled;
595void QQuickTextField::setHoverEnabled(
bool enabled)
597#if QT_CONFIG(quicktemplates2_hover)
598 Q_D(QQuickTextField);
599 if (d->explicitHoverEnabled && enabled == d->hoverEnabled)
602 d->updateHoverEnabled(enabled,
true);
608void QQuickTextField::resetHoverEnabled()
610#if QT_CONFIG(quicktemplates2_hover)
611 Q_D(QQuickTextField);
612 if (!d->explicitHoverEnabled)
615 d->explicitHoverEnabled =
false;
616 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
620void QQuickTextField::classBegin()
622 Q_D(QQuickTextField);
623 QQuickTextInput::classBegin();
628
629
630
631
632
633
634
635
636
637
638qreal QQuickTextField::implicitBackgroundWidth()
const
640 Q_D(
const QQuickTextField);
643 return d->background->implicitWidth();
647
648
649
650
651
652
653
654
655
656
657qreal QQuickTextField::implicitBackgroundHeight()
const
659 Q_D(
const QQuickTextField);
662 return d->background->implicitHeight();
666
667
668
669
670
671
672
673qreal QQuickTextField::topInset()
const
675 Q_D(
const QQuickTextField);
676 return d->getTopInset();
679void QQuickTextField::setTopInset(qreal inset)
681 Q_D(QQuickTextField);
682 d->setTopInset(inset);
685void QQuickTextField::resetTopInset()
687 Q_D(QQuickTextField);
688 d->setTopInset(0,
true);
692
693
694
695
696
697
698
699qreal QQuickTextField::leftInset()
const
701 Q_D(
const QQuickTextField);
702 return d->getLeftInset();
705void QQuickTextField::setLeftInset(qreal inset)
707 Q_D(QQuickTextField);
708 d->setLeftInset(inset);
711void QQuickTextField::resetLeftInset()
713 Q_D(QQuickTextField);
714 d->setLeftInset(0,
true);
718
719
720
721
722
723
724
725qreal QQuickTextField::rightInset()
const
727 Q_D(
const QQuickTextField);
728 return d->getRightInset();
731void QQuickTextField::setRightInset(qreal inset)
733 Q_D(QQuickTextField);
734 d->setRightInset(inset);
737void QQuickTextField::resetRightInset()
739 Q_D(QQuickTextField);
740 d->setRightInset(0,
true);
744
745
746
747
748
749
750
751qreal QQuickTextField::bottomInset()
const
753 Q_D(
const QQuickTextField);
754 return d->getBottomInset();
757void QQuickTextField::setBottomInset(qreal inset)
759 Q_D(QQuickTextField);
760 d->setBottomInset(inset);
763void QQuickTextField::resetBottomInset()
765 Q_D(QQuickTextField);
766 d->setBottomInset(0,
true);
769void QQuickTextField::componentComplete()
771 Q_D(QQuickTextField);
772 d->executeBackground(
true);
773 QQuickTextInput::componentComplete();
774 d->resizeBackground();
775#if QT_CONFIG(quicktemplates2_hover)
776 if (!d->explicitHoverEnabled)
777 setAcceptHoverEvents(QQuickControlPrivate::calcHoverEnabled(d->parentItem));
781void QQuickTextField::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &value)
783 Q_D(QQuickTextField);
784 QQuickTextInput::itemChange(change, value);
786 case ItemEnabledHasChanged:
788 case ItemSceneChange:
789 case ItemParentHasChanged:
790 if ((change == ItemParentHasChanged && value.item) || (change == ItemSceneChange && value.window)) {
792#if QT_CONFIG(quicktemplates2_hover)
793 if (!d->explicitHoverEnabled)
794 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
803void QQuickTextField::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
805 Q_D(QQuickTextField);
806 QQuickTextInput::geometryChange(newGeometry, oldGeometry);
807 d->resizeBackground();
810void QQuickTextField::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
812 Q_D(QQuickTextField);
815 d->resizeBackground();
817QSGNode *QQuickTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
819 QQuickDefaultClipNode *clipNode =
static_cast<QQuickDefaultClipNode *>(oldNode);
821 clipNode =
new QQuickDefaultClipNode(QRectF());
823 clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding()));
826 QSGNode *textNode = QQuickTextInput::updatePaintNode(clipNode->firstChild(), data);
827 if (!textNode->parent())
828 clipNode->appendChildNode(textNode);
833void QQuickTextField::focusInEvent(QFocusEvent *event)
835 QQuickTextInput::focusInEvent(event);
838void QQuickTextField::focusOutEvent(QFocusEvent *event)
840 QQuickTextInput::focusOutEvent(event);
843#if QT_CONFIG(quicktemplates2_hover)
844void QQuickTextField::hoverEnterEvent(QHoverEvent *event)
846 Q_D(QQuickTextField);
847 QQuickTextInput::hoverEnterEvent(event);
848 setHovered(d->hoverEnabled);
852void QQuickTextField::hoverLeaveEvent(QHoverEvent *event)
854 QQuickTextInput::hoverLeaveEvent(event);
860void QQuickTextField::mousePressEvent(QMouseEvent *event)
862 Q_D(QQuickTextField);
863 d->pressHandler.mousePressEvent(event);
864 if (d->pressHandler.isActive()) {
865 if (d->pressHandler.delayedMousePressEvent) {
866 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
867 d->pressHandler.clearDelayedMouseEvent();
869 if (event->buttons() != Qt::RightButton)
870 QQuickTextInput::mousePressEvent(event);
874void QQuickTextField::mouseMoveEvent(QMouseEvent *event)
876 Q_D(QQuickTextField);
877 d->pressHandler.mouseMoveEvent(event);
878 if (d->pressHandler.isActive()) {
879 if (d->pressHandler.delayedMousePressEvent) {
880 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
881 d->pressHandler.clearDelayedMouseEvent();
883 const bool isMouse = QQuickDeliveryAgentPrivate::isEventFromMouseOrTouchpad(event)
884 #if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
885 || d->selectByTouchDrag
888 if (event->buttons() != Qt::RightButton && isMouse)
889 QQuickTextInput::mouseMoveEvent(event);
893void QQuickTextField::mouseReleaseEvent(QMouseEvent *event)
895 Q_D(QQuickTextField);
896 d->pressHandler.mouseReleaseEvent(event);
897 if (d->pressHandler.isActive()) {
898 if (d->pressHandler.delayedMousePressEvent) {
899 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
900 d->pressHandler.clearDelayedMouseEvent();
902 if (event->buttons() != Qt::RightButton)
903 QQuickTextInput::mouseReleaseEvent(event);
907void QQuickTextField::mouseDoubleClickEvent(QMouseEvent *event)
909 Q_D(QQuickTextField);
910 if (d->pressHandler.delayedMousePressEvent) {
911 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
912 d->pressHandler.clearDelayedMouseEvent();
914 if (event->buttons() != Qt::RightButton)
915 QQuickTextInput::mouseDoubleClickEvent(event);
918void QQuickTextField::timerEvent(QTimerEvent *event)
920 Q_D(QQuickTextField);
921 if (event->timerId() == d->pressHandler.timer.timerId())
922 d->pressHandler.timerEvent(event);
924 QQuickTextInput::timerEvent(event);
929#include "moc_qquicktextfield_p.cpp"
void executeBackground(bool complete=false)
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override
qreal getImplicitHeight() const override
void setBottomInset(qreal value, bool reset=false)
~QQuickTextFieldPrivate()
void inheritFont(const QFont &font)
void setRightInset(qreal value, bool reset=false)
void itemImplicitWidthChanged(QQuickItem *item) override
virtual void readOnlyChanged(bool isReadOnly) override
void itemImplicitHeightChanged(QQuickItem *item) override
void setLeftInset(qreal value, bool reset=false)
qreal getImplicitWidth() const override
void implicitHeightChanged() override
void setTopInset(qreal value, bool reset=false)
void itemDestroyed(QQuickItem *item) override
void implicitWidthChanged() override
void updateFont(const QFont &font)
QPalette defaultPalette() const override
bool setLastFocusChangeReason(Qt::FocusReason reason) override
Combined button and popup list for selecting options.