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.value().requestedFont.resolveMask());
388void QQuickTextField::setFont(
const QFont &font)
390 Q_D(QQuickTextField);
391 if (d->extra.value().requestedFont.resolveMask() == font.resolveMask() && d->extra.value().requestedFont == font)
394 d->extra.value().requestedFont = font;
399
400
401
402
403
404
405
406
407QQuickItem *QQuickTextField::background()
const
409 QQuickTextFieldPrivate *d =
const_cast<QQuickTextFieldPrivate *>(d_func());
411 d->executeBackground();
412 return d->background;
415void QQuickTextField::setBackground(QQuickItem *background)
417 Q_D(QQuickTextField);
418 if (d->background == background)
421 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
423 if (!d->background.isExecuting())
424 d->cancelBackground();
426 const qreal oldImplicitBackgroundWidth = implicitBackgroundWidth();
427 const qreal oldImplicitBackgroundHeight = implicitBackgroundHeight();
429 if (d->extra.isAllocated()) {
430 d->extra.value().hasBackgroundWidth =
false;
431 d->extra.value().hasBackgroundHeight =
false;
434 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
435 QQuickControlPrivate::hideOldItem(d->background);
436 d->background = background;
439 background->setParentItem(
this);
440 if (qFuzzyIsNull(background->z()))
441 background->setZ(-1);
442 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
443 if (p->widthValid() || p->heightValid()) {
444 d->extra.value().hasBackgroundWidth = p->widthValid();
445 d->extra.value().hasBackgroundHeight = p->heightValid();
447 if (isComponentComplete())
448 d->resizeBackground();
449 QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
452 if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth()))
453 emit implicitBackgroundWidthChanged();
454 if (!qFuzzyCompare(oldImplicitBackgroundHeight, implicitBackgroundHeight()))
455 emit implicitBackgroundHeightChanged();
456 if (!d->background.isExecuting())
457 emit backgroundChanged();
461
462
463
464
465
466QString QQuickTextField::placeholderText()
const
468 Q_D(
const QQuickTextField);
469 return d->placeholder;
472void QQuickTextField::setPlaceholderText(
const QString &text)
474 Q_D(QQuickTextField);
475 if (d->placeholder == text)
478 d->placeholder = text;
479#if QT_CONFIG(accessibility)
480 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this))
481 accessibleAttached->setDescriptionImplicitly(text);
483 emit placeholderTextChanged();
487
488
489
490
491
492
493
494QColor QQuickTextField::placeholderTextColor()
const
496 Q_D(
const QQuickTextField);
497 return d->placeholderColor;
500void QQuickTextField::setPlaceholderTextColor(
const QColor &color)
502 Q_D(QQuickTextField);
503 if (d->placeholderColor == color)
506 d->placeholderColor = color;
507 emit placeholderTextColorChanged();
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529Qt::FocusReason QQuickTextField::focusReason()
const
531 Q_D(
const QQuickTextField);
532 return d->lastFocusChangeReason();
535void QQuickTextField::setFocusReason(Qt::FocusReason reason)
537 Q_D(QQuickTextField);
538 d->setLastFocusChangeReason(reason);
542
543
544
545
546
547
548
549
550bool QQuickTextField::isHovered()
const
552#if QT_CONFIG(quicktemplates2_hover)
553 Q_D(
const QQuickTextField);
560void QQuickTextField::setHovered(
bool hovered)
562#if QT_CONFIG(quicktemplates2_hover)
563 Q_D(QQuickTextField);
564 if (hovered == d->hovered)
567 d->hovered = hovered;
568 emit hoveredChanged();
569 QQuickToolTipAttachedPrivate::maybeSetVisibleImplicitly(
this, hovered);
576
577
578
579
580
581
582
583bool QQuickTextField::isHoverEnabled()
const
585#if QT_CONFIG(quicktemplates2_hover)
586 Q_D(
const QQuickTextField);
587 return d->hoverEnabled;
593void QQuickTextField::setHoverEnabled(
bool enabled)
595#if QT_CONFIG(quicktemplates2_hover)
596 Q_D(QQuickTextField);
597 if (d->explicitHoverEnabled && enabled == d->hoverEnabled)
600 d->updateHoverEnabled(enabled,
true);
606void QQuickTextField::resetHoverEnabled()
608#if QT_CONFIG(quicktemplates2_hover)
609 Q_D(QQuickTextField);
610 if (!d->explicitHoverEnabled)
613 d->explicitHoverEnabled =
false;
614 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
618void QQuickTextField::classBegin()
620 Q_D(QQuickTextField);
621 QQuickTextInput::classBegin();
626
627
628
629
630
631
632
633
634
635
636qreal QQuickTextField::implicitBackgroundWidth()
const
638 Q_D(
const QQuickTextField);
641 return d->background->implicitWidth();
645
646
647
648
649
650
651
652
653
654
655qreal QQuickTextField::implicitBackgroundHeight()
const
657 Q_D(
const QQuickTextField);
660 return d->background->implicitHeight();
664
665
666
667
668
669
670
671qreal QQuickTextField::topInset()
const
673 Q_D(
const QQuickTextField);
674 return d->getTopInset();
677void QQuickTextField::setTopInset(qreal inset)
679 Q_D(QQuickTextField);
680 d->setTopInset(inset);
683void QQuickTextField::resetTopInset()
685 Q_D(QQuickTextField);
686 d->setTopInset(0,
true);
690
691
692
693
694
695
696
697qreal QQuickTextField::leftInset()
const
699 Q_D(
const QQuickTextField);
700 return d->getLeftInset();
703void QQuickTextField::setLeftInset(qreal inset)
705 Q_D(QQuickTextField);
706 d->setLeftInset(inset);
709void QQuickTextField::resetLeftInset()
711 Q_D(QQuickTextField);
712 d->setLeftInset(0,
true);
716
717
718
719
720
721
722
723qreal QQuickTextField::rightInset()
const
725 Q_D(
const QQuickTextField);
726 return d->getRightInset();
729void QQuickTextField::setRightInset(qreal inset)
731 Q_D(QQuickTextField);
732 d->setRightInset(inset);
735void QQuickTextField::resetRightInset()
737 Q_D(QQuickTextField);
738 d->setRightInset(0,
true);
742
743
744
745
746
747
748
749qreal QQuickTextField::bottomInset()
const
751 Q_D(
const QQuickTextField);
752 return d->getBottomInset();
755void QQuickTextField::setBottomInset(qreal inset)
757 Q_D(QQuickTextField);
758 d->setBottomInset(inset);
761void QQuickTextField::resetBottomInset()
763 Q_D(QQuickTextField);
764 d->setBottomInset(0,
true);
767void QQuickTextField::componentComplete()
769 Q_D(QQuickTextField);
770 d->executeBackground(
true);
771 QQuickTextInput::componentComplete();
772 d->resizeBackground();
773#if QT_CONFIG(quicktemplates2_hover)
774 if (!d->explicitHoverEnabled)
775 setAcceptHoverEvents(QQuickControlPrivate::calcHoverEnabled(d->parentItem));
779void QQuickTextField::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &value)
781 Q_D(QQuickTextField);
782 QQuickTextInput::itemChange(change, value);
784 case ItemEnabledHasChanged:
786 case ItemSceneChange:
787 case ItemParentHasChanged:
788 if ((change == ItemParentHasChanged && value.item) || (change == ItemSceneChange && value.window)) {
790#if QT_CONFIG(quicktemplates2_hover)
791 if (!d->explicitHoverEnabled)
792 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
801void QQuickTextField::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
803 Q_D(QQuickTextField);
804 QQuickTextInput::geometryChange(newGeometry, oldGeometry);
805 d->resizeBackground();
808void QQuickTextField::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
810 Q_D(QQuickTextField);
813 d->resizeBackground();
815QSGNode *QQuickTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
817 QQuickDefaultClipNode *clipNode =
static_cast<QQuickDefaultClipNode *>(oldNode);
819 clipNode =
new QQuickDefaultClipNode(QRectF());
821 clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding()));
824 QSGNode *textNode = QQuickTextInput::updatePaintNode(clipNode->firstChild(), data);
825 if (!textNode->parent())
826 clipNode->appendChildNode(textNode);
831void QQuickTextField::focusInEvent(QFocusEvent *event)
833 QQuickTextInput::focusInEvent(event);
836void QQuickTextField::focusOutEvent(QFocusEvent *event)
838 QQuickTextInput::focusOutEvent(event);
841#if QT_CONFIG(quicktemplates2_hover)
842void QQuickTextField::hoverEnterEvent(QHoverEvent *event)
844 Q_D(QQuickTextField);
845 QQuickTextInput::hoverEnterEvent(event);
846 setHovered(d->hoverEnabled);
850void QQuickTextField::hoverLeaveEvent(QHoverEvent *event)
852 QQuickTextInput::hoverLeaveEvent(event);
858void QQuickTextField::mousePressEvent(QMouseEvent *event)
860 Q_D(QQuickTextField);
861 d->pressHandler.mousePressEvent(event);
862 if (d->pressHandler.isActive()) {
863 if (d->pressHandler.delayedMousePressEvent) {
864 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
865 d->pressHandler.clearDelayedMouseEvent();
867 if (event->buttons() != Qt::RightButton)
868 QQuickTextInput::mousePressEvent(event);
872void QQuickTextField::mouseMoveEvent(QMouseEvent *event)
874 Q_D(QQuickTextField);
875 d->pressHandler.mouseMoveEvent(event);
876 if (d->pressHandler.isActive()) {
877 if (d->pressHandler.delayedMousePressEvent) {
878 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
879 d->pressHandler.clearDelayedMouseEvent();
881 const bool isMouse = QQuickDeliveryAgentPrivate::isEventFromMouseOrTouchpad(event)
882 #if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
883 || d->selectByTouchDrag
886 if (event->buttons() != Qt::RightButton && isMouse)
887 QQuickTextInput::mouseMoveEvent(event);
891void QQuickTextField::mouseReleaseEvent(QMouseEvent *event)
893 Q_D(QQuickTextField);
894 d->pressHandler.mouseReleaseEvent(event);
895 if (d->pressHandler.isActive()) {
896 if (d->pressHandler.delayedMousePressEvent) {
897 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
898 d->pressHandler.clearDelayedMouseEvent();
900 if (event->buttons() != Qt::RightButton)
901 QQuickTextInput::mouseReleaseEvent(event);
905void QQuickTextField::mouseDoubleClickEvent(QMouseEvent *event)
907 Q_D(QQuickTextField);
908 if (d->pressHandler.delayedMousePressEvent) {
909 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
910 d->pressHandler.clearDelayedMouseEvent();
912 if (event->buttons() != Qt::RightButton)
913 QQuickTextInput::mouseDoubleClickEvent(event);
916void QQuickTextField::timerEvent(QTimerEvent *event)
918 Q_D(QQuickTextField);
919 if (event->timerId() == d->pressHandler.timer.timerId())
920 d->pressHandler.timerEvent(event);
922 QQuickTextInput::timerEvent(event);
927#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.