11#include <QtQuick/private/qquickitem_p.h>
12#include <QtQuick/private/qquicktextinput_p.h>
13#include <QtQuick/private/qquickclipnode_p.h>
15#if QT_CONFIG(accessibility)
16#include <QtQuick/private/qquickaccessibleattached_p.h>
21using namespace Qt::StringLiterals;
24
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
54
55
56
57
58
59
60
61
64
65
66
67
68
69
70
71
72
73
76
77
78
79
80
81
82
83
84
85
89#if QT_CONFIG(accessibility)
90 QAccessible::installActivationObserver(
this);
96#if QT_CONFIG(accessibility)
97 QAccessible::removeActivationObserver(
this);
103 Q_Q(QQuickTextField);
104 const QMarginsF oldInset = getInset();
105 extra.value().topInset = value;
106 extra.value().hasTopInset = !reset;
107 if (!qFuzzyCompare(oldInset.top(), value)) {
108 emit q->topInsetChanged();
109 q->insetChange(getInset(), oldInset);
115 Q_Q(QQuickTextField);
116 const QMarginsF oldInset = getInset();
117 extra.value().leftInset = value;
118 extra.value().hasLeftInset = !reset;
119 if (!qFuzzyCompare(oldInset.left(), value)) {
120 emit q->leftInsetChanged();
121 q->insetChange(getInset(), oldInset);
127 Q_Q(QQuickTextField);
128 const QMarginsF oldInset = getInset();
129 extra.value().rightInset = value;
130 extra.value().hasRightInset = !reset;
131 if (!qFuzzyCompare(oldInset.right(), value)) {
132 emit q->rightInsetChanged();
133 q->insetChange(getInset(), oldInset);
139 Q_Q(QQuickTextField);
140 const QMarginsF oldInset = getInset();
141 extra.value().bottomInset = value;
142 extra.value().hasBottomInset = !reset;
143 if (!qFuzzyCompare(oldInset.bottom(), value)) {
144 emit q->bottomInsetChanged();
145 q->insetChange(getInset(), oldInset);
156 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
157 if (((!p->widthValid() || !extra.isAllocated() || !extra->hasBackgroundWidth) && qFuzzyIsNull(background->x()))
158 || (extra.isAllocated() && (extra->hasLeftInset || extra->hasRightInset))) {
159 const bool wasWidthValid = p->widthValid();
160 background->setX(getLeftInset());
161 background->setWidth(width - getLeftInset() - getRightInset());
164 p->widthValidFlag =
false;
166 if (((!p->heightValid() || !extra.isAllocated() || !extra->hasBackgroundHeight) && qFuzzyIsNull(background->y()))
167 || (extra.isAllocated() && (extra->hasTopInset || extra->hasBottomInset))) {
168 const bool wasHeightValid = p->heightValid();
169 background->setY(getTopInset());
170 background->setHeight(height - getTopInset() - getBottomInset());
172 p->heightValidFlag =
false;
179
180
181
182
183
184
185
188 Q_Q(QQuickTextField);
189 inheritFont(QQuickControlPrivate::parentFont(q));
194 QFont parentFont = extra.isAllocated() ? extra->requestedFont.resolve(font) : font;
195 parentFont.setResolveMask(extra.isAllocated() ? extra->requestedFont.resolveMask() | font.resolveMask() : font.resolveMask());
197 const QFont defaultFont = QQuickTheme::font(QQuickTheme::TextField);
198 QFont resolvedFont = parentFont.resolve(defaultFont);
200 setFont_helper(resolvedFont);
204
205
206
207
210 Q_Q(QQuickTextField);
211 QFont oldFont = sourceFont;
212 q->QQuickTextInput::setFont(font);
214 QQuickControlPrivate::updateFontRecur(q, font);
217 emit q->fontChanged();
220#if QT_CONFIG(quicktemplates2_hover)
221void QQuickTextFieldPrivate::updateHoverEnabled(
bool enabled,
bool xplicit)
223 Q_Q(QQuickTextField);
224 if (!xplicit && explicitHoverEnabled)
227 bool wasEnabled = q->isHoverEnabled();
228 explicitHoverEnabled = xplicit;
229 if (wasEnabled != enabled) {
230 q->setAcceptHoverEvents(enabled);
231 QQuickControlPrivate::updateHoverEnabledRecur(q, enabled);
232 emit q->hoverEnabledChanged();
239 return QQuickItemPrivate::getImplicitWidth();
244 return QQuickItemPrivate::getImplicitHeight();
249 Q_Q(QQuickTextField);
250 QQuickItemPrivate::implicitWidthChanged();
251 emit q->implicitWidthChanged3();
256 Q_Q(QQuickTextField);
257 QQuickItemPrivate::implicitHeightChanged();
258 emit q->implicitHeightChanged3();
263 Q_UNUSED(isReadOnly);
264#if QT_CONFIG(accessibility)
265 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func()))
266 accessibleAttached->set_readOnly(isReadOnly);
269 q_func()->setCursor(isReadOnly && !selectByMouse ? Qt::ArrowCursor : Qt::IBeamCursor);
275#if QT_CONFIG(accessibility)
276 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func()))
277 accessibleAttached->set_passwordEdit((echoMode == QQuickTextField::Password || echoMode == QQuickTextField::PasswordEchoOnEdit) ?
true :
false);
283#if QT_CONFIG(accessibility)
284void QQuickTextFieldPrivate::accessibilityActiveChanged(
bool active)
289 Q_Q(QQuickTextField);
290 QQuickAccessibleAttached *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(q,
true));
291 Q_ASSERT(accessibleAttached);
292 accessibleAttached->setRole(effectiveAccessibleRole());
293 accessibleAttached->set_readOnly(m_readOnly);
294 accessibleAttached->set_passwordEdit((m_echoMode == QQuickTextField::Password || m_echoMode == QQuickTextField::PasswordEchoOnEdit) ?
true :
false);
295 accessibleAttached->setDescription(placeholder);
298QAccessible::Role QQuickTextFieldPrivate::accessibleRole()
const
300 return QAccessible::EditableText;
306 Q_Q(QQuickTextField);
307 quickCancelDeferred(q, backgroundName());
312 Q_Q(QQuickTextField);
313 if (background.wasExecuted())
316 if (!background || complete)
317 quickBeginDeferred(q, backgroundName(), background);
319 quickCompleteDeferred(q, backgroundName(), background);
325 if (resizingBackground || item != background || !change.sizeChange())
328 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
332 if (p->widthValid() || extra.isAllocated())
333 extra.value().hasBackgroundWidth = p->widthValid();
334 if (p->heightValid() || extra.isAllocated())
335 extra.value().hasBackgroundHeight = p->heightValid();
341 Q_Q(QQuickTextField);
342 if (item == background)
343 emit q->implicitBackgroundWidthChanged();
348 Q_Q(QQuickTextField);
349 if (item == background)
350 emit q->implicitBackgroundHeightChanged();
355 Q_Q(QQuickTextField);
356 if (item == background) {
357 background =
nullptr;
358 emit q->implicitBackgroundWidthChanged();
359 emit q->implicitBackgroundHeightChanged();
365 return QQuickTheme::palette(QQuickTheme::TextField);
370 Q_Q(QQuickTextField);
371 const auto focusReasonChanged = QQuickItemPrivate::setLastFocusChangeReason(reason);
372 if (focusReasonChanged)
373 emit q->focusReasonChanged();
375 return focusReasonChanged;
378QQuickTextField::QQuickTextField(QQuickItem *parent)
379 : QQuickTextInput(*(
new QQuickTextFieldPrivate), parent)
381 Q_D(QQuickTextField);
382 d->pressHandler.control =
this;
383 d->setImplicitResizeEnabled(
false);
384 setAcceptedMouseButtons(Qt::AllButtons);
385 setActiveFocusOnTab(
true);
387 setCursor(Qt::IBeamCursor);
389 QObjectPrivate::connect(
this, &QQuickTextInput::readOnlyChanged, d, &QQuickTextFieldPrivate::readOnlyChanged);
390 QObjectPrivate::connect(
this, &QQuickTextInput::echoModeChanged, d, &QQuickTextFieldPrivate::echoModeChanged);
391#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
392 if (qEnvironmentVariable(
"QT_QUICK_CONTROLS_TEXT_SELECTION_BEHAVIOR") == u"old"_s)
393 QQuickTextInput::setOldSelectionDefault();
397QQuickTextField::~QQuickTextField()
399 Q_D(QQuickTextField);
400 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
403QFont QQuickTextField::font()
const
405 Q_D(
const QQuickTextField);
406 QFont font = QQuickTextInput::font();
408 font.setResolveMask(d->extra.value().requestedFont.resolveMask());
412void QQuickTextField::setFont(
const QFont &font)
414 Q_D(QQuickTextField);
415 if (d->extra.value().requestedFont.resolveMask() == font.resolveMask() && d->extra.value().requestedFont == font)
418 d->extra.value().requestedFont = font;
423
424
425
426
427
428
429
430
431QQuickItem *QQuickTextField::background()
const
433 QQuickTextFieldPrivate *d =
const_cast<QQuickTextFieldPrivate *>(d_func());
435 d->executeBackground();
436 return d->background;
439void QQuickTextField::setBackground(QQuickItem *background)
441 Q_D(QQuickTextField);
442 if (d->background == background)
445 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
447 if (!d->background.isExecuting())
448 d->cancelBackground();
450 const qreal oldImplicitBackgroundWidth = implicitBackgroundWidth();
451 const qreal oldImplicitBackgroundHeight = implicitBackgroundHeight();
453 if (d->extra.isAllocated()) {
454 d->extra.value().hasBackgroundWidth =
false;
455 d->extra.value().hasBackgroundHeight =
false;
458 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
459 QQuickControlPrivate::hideOldItem(d->background);
460 d->background = background;
463 background->setParentItem(
this);
464 if (qFuzzyIsNull(background->z()))
465 background->setZ(-1);
466 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
467 if (p->widthValid() || p->heightValid()) {
468 d->extra.value().hasBackgroundWidth = p->widthValid();
469 d->extra.value().hasBackgroundHeight = p->heightValid();
471 if (isComponentComplete())
472 d->resizeBackground();
473 QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
476 if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth()))
477 emit implicitBackgroundWidthChanged();
478 if (!qFuzzyCompare(oldImplicitBackgroundHeight, implicitBackgroundHeight()))
479 emit implicitBackgroundHeightChanged();
480 if (!d->background.isExecuting())
481 emit backgroundChanged();
485
486
487
488
489
490QString QQuickTextField::placeholderText()
const
492 Q_D(
const QQuickTextField);
493 return d->placeholder;
496void QQuickTextField::setPlaceholderText(
const QString &text)
498 Q_D(QQuickTextField);
499 if (d->placeholder == text)
502 d->placeholder = text;
503#if QT_CONFIG(accessibility)
504 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this))
505 accessibleAttached->setDescription(text);
507 emit placeholderTextChanged();
511
512
513
514
515
516
517
518QColor QQuickTextField::placeholderTextColor()
const
520 Q_D(
const QQuickTextField);
521 return d->placeholderColor;
524void QQuickTextField::setPlaceholderTextColor(
const QColor &color)
526 Q_D(QQuickTextField);
527 if (d->placeholderColor == color)
530 d->placeholderColor = color;
531 emit placeholderTextColorChanged();
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553Qt::FocusReason QQuickTextField::focusReason()
const
555 Q_D(
const QQuickTextField);
556 return d->lastFocusChangeReason();
559void QQuickTextField::setFocusReason(Qt::FocusReason reason)
561 Q_D(QQuickTextField);
562 d->setLastFocusChangeReason(reason);
566
567
568
569
570
571
572
573
574bool QQuickTextField::isHovered()
const
576#if QT_CONFIG(quicktemplates2_hover)
577 Q_D(
const QQuickTextField);
584void QQuickTextField::setHovered(
bool hovered)
586#if QT_CONFIG(quicktemplates2_hover)
587 Q_D(QQuickTextField);
588 if (hovered == d->hovered)
591 d->hovered = hovered;
592 emit hoveredChanged();
599
600
601
602
603
604
605
606bool QQuickTextField::isHoverEnabled()
const
608#if QT_CONFIG(quicktemplates2_hover)
609 Q_D(
const QQuickTextField);
610 return d->hoverEnabled;
616void QQuickTextField::setHoverEnabled(
bool enabled)
618#if QT_CONFIG(quicktemplates2_hover)
619 Q_D(QQuickTextField);
620 if (d->explicitHoverEnabled && enabled == d->hoverEnabled)
623 d->updateHoverEnabled(enabled,
true);
629void QQuickTextField::resetHoverEnabled()
631#if QT_CONFIG(quicktemplates2_hover)
632 Q_D(QQuickTextField);
633 if (!d->explicitHoverEnabled)
636 d->explicitHoverEnabled =
false;
637 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
641void QQuickTextField::classBegin()
643 Q_D(QQuickTextField);
644 QQuickTextInput::classBegin();
649
650
651
652
653
654
655
656
657
658
659qreal QQuickTextField::implicitBackgroundWidth()
const
661 Q_D(
const QQuickTextField);
664 return d->background->implicitWidth();
668
669
670
671
672
673
674
675
676
677
678qreal QQuickTextField::implicitBackgroundHeight()
const
680 Q_D(
const QQuickTextField);
683 return d->background->implicitHeight();
687
688
689
690
691
692
693
694qreal QQuickTextField::topInset()
const
696 Q_D(
const QQuickTextField);
697 return d->getTopInset();
700void QQuickTextField::setTopInset(qreal inset)
702 Q_D(QQuickTextField);
703 d->setTopInset(inset);
706void QQuickTextField::resetTopInset()
708 Q_D(QQuickTextField);
709 d->setTopInset(0,
true);
713
714
715
716
717
718
719
720qreal QQuickTextField::leftInset()
const
722 Q_D(
const QQuickTextField);
723 return d->getLeftInset();
726void QQuickTextField::setLeftInset(qreal inset)
728 Q_D(QQuickTextField);
729 d->setLeftInset(inset);
732void QQuickTextField::resetLeftInset()
734 Q_D(QQuickTextField);
735 d->setLeftInset(0,
true);
739
740
741
742
743
744
745
746qreal QQuickTextField::rightInset()
const
748 Q_D(
const QQuickTextField);
749 return d->getRightInset();
752void QQuickTextField::setRightInset(qreal inset)
754 Q_D(QQuickTextField);
755 d->setRightInset(inset);
758void QQuickTextField::resetRightInset()
760 Q_D(QQuickTextField);
761 d->setRightInset(0,
true);
765
766
767
768
769
770
771
772qreal QQuickTextField::bottomInset()
const
774 Q_D(
const QQuickTextField);
775 return d->getBottomInset();
778void QQuickTextField::setBottomInset(qreal inset)
780 Q_D(QQuickTextField);
781 d->setBottomInset(inset);
784void QQuickTextField::resetBottomInset()
786 Q_D(QQuickTextField);
787 d->setBottomInset(0,
true);
790void QQuickTextField::componentComplete()
792 Q_D(QQuickTextField);
793 d->executeBackground(
true);
794 QQuickTextInput::componentComplete();
795 d->resizeBackground();
796#if QT_CONFIG(quicktemplates2_hover)
797 if (!d->explicitHoverEnabled)
798 setAcceptHoverEvents(QQuickControlPrivate::calcHoverEnabled(d->parentItem));
800#if QT_CONFIG(accessibility)
801 if (QAccessible::isActive())
802 d->accessibilityActiveChanged(
true);
806void QQuickTextField::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &value)
808 Q_D(QQuickTextField);
809 QQuickTextInput::itemChange(change, value);
811 case ItemEnabledHasChanged:
813 case ItemSceneChange:
814 case ItemParentHasChanged:
815 if ((change == ItemParentHasChanged && value.item) || (change == ItemSceneChange && value.window)) {
817#if QT_CONFIG(quicktemplates2_hover)
818 if (!d->explicitHoverEnabled)
819 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
828void QQuickTextField::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
830 Q_D(QQuickTextField);
831 QQuickTextInput::geometryChange(newGeometry, oldGeometry);
832 d->resizeBackground();
835void QQuickTextField::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
837 Q_D(QQuickTextField);
840 d->resizeBackground();
842QSGNode *QQuickTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
844 QQuickDefaultClipNode *clipNode =
static_cast<QQuickDefaultClipNode *>(oldNode);
846 clipNode =
new QQuickDefaultClipNode(QRectF());
848 clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding()));
851 QSGNode *textNode = QQuickTextInput::updatePaintNode(clipNode->firstChild(), data);
852 if (!textNode->parent())
853 clipNode->appendChildNode(textNode);
858void QQuickTextField::focusInEvent(QFocusEvent *event)
860 QQuickTextInput::focusInEvent(event);
863void QQuickTextField::focusOutEvent(QFocusEvent *event)
865 QQuickTextInput::focusOutEvent(event);
868#if QT_CONFIG(quicktemplates2_hover)
869void QQuickTextField::hoverEnterEvent(QHoverEvent *event)
871 Q_D(QQuickTextField);
872 QQuickTextInput::hoverEnterEvent(event);
873 setHovered(d->hoverEnabled);
877void QQuickTextField::hoverLeaveEvent(QHoverEvent *event)
879 QQuickTextInput::hoverLeaveEvent(event);
885void QQuickTextField::mousePressEvent(QMouseEvent *event)
887 Q_D(QQuickTextField);
888 d->pressHandler.mousePressEvent(event);
889 if (d->pressHandler.isActive()) {
890 if (d->pressHandler.delayedMousePressEvent) {
891 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
892 d->pressHandler.clearDelayedMouseEvent();
894 if (event->buttons() != Qt::RightButton)
895 QQuickTextInput::mousePressEvent(event);
899void QQuickTextField::mouseMoveEvent(QMouseEvent *event)
901 Q_D(QQuickTextField);
902 d->pressHandler.mouseMoveEvent(event);
903 if (d->pressHandler.isActive()) {
904 if (d->pressHandler.delayedMousePressEvent) {
905 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
906 d->pressHandler.clearDelayedMouseEvent();
908 const bool isMouse = QQuickDeliveryAgentPrivate::isEventFromMouseOrTouchpad(event)
909 #if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
910 || d->selectByTouchDrag
913 if (event->buttons() != Qt::RightButton && isMouse)
914 QQuickTextInput::mouseMoveEvent(event);
918void QQuickTextField::mouseReleaseEvent(QMouseEvent *event)
920 Q_D(QQuickTextField);
921 d->pressHandler.mouseReleaseEvent(event);
922 if (d->pressHandler.isActive()) {
923 if (d->pressHandler.delayedMousePressEvent) {
924 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
925 d->pressHandler.clearDelayedMouseEvent();
927 if (event->buttons() != Qt::RightButton)
928 QQuickTextInput::mouseReleaseEvent(event);
932void QQuickTextField::mouseDoubleClickEvent(QMouseEvent *event)
934 Q_D(QQuickTextField);
935 if (d->pressHandler.delayedMousePressEvent) {
936 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
937 d->pressHandler.clearDelayedMouseEvent();
939 if (event->buttons() != Qt::RightButton)
940 QQuickTextInput::mouseDoubleClickEvent(event);
943void QQuickTextField::timerEvent(QTimerEvent *event)
945 Q_D(QQuickTextField);
946 if (event->timerId() == d->pressHandler.timer.timerId())
947 d->pressHandler.timerEvent(event);
949 QQuickTextInput::timerEvent(event);
954#include "moc_qquicktextfield_p.cpp"
void executeBackground(bool complete=false)
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override
void echoModeChanged(QQuickTextField::EchoMode echoMode)
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
void readOnlyChanged(bool isReadOnly)
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