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
98 const QMarginsF oldInset = getInset();
99 extra.value().topInset = value;
100 extra.value().hasTopInset = !reset;
101 if (!qFuzzyCompare(oldInset.top(), value)) {
102 emit q->topInsetChanged();
103 q->insetChange(getInset(), oldInset);
109 Q_Q(QQuickTextField);
110 const QMarginsF oldInset = getInset();
111 extra.value().leftInset = value;
112 extra.value().hasLeftInset = !reset;
113 if (!qFuzzyCompare(oldInset.left(), value)) {
114 emit q->leftInsetChanged();
115 q->insetChange(getInset(), oldInset);
121 Q_Q(QQuickTextField);
122 const QMarginsF oldInset = getInset();
123 extra.value().rightInset = value;
124 extra.value().hasRightInset = !reset;
125 if (!qFuzzyCompare(oldInset.right(), value)) {
126 emit q->rightInsetChanged();
127 q->insetChange(getInset(), oldInset);
133 Q_Q(QQuickTextField);
134 const QMarginsF oldInset = getInset();
135 extra.value().bottomInset = value;
136 extra.value().hasBottomInset = !reset;
137 if (!qFuzzyCompare(oldInset.bottom(), value)) {
138 emit q->bottomInsetChanged();
139 q->insetChange(getInset(), oldInset);
150 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
151 if (((!p->widthValid() || !extra.isAllocated() || !extra->hasBackgroundWidth) && qFuzzyIsNull(background->x()))
152 || (extra.isAllocated() && (extra->hasLeftInset || extra->hasRightInset))) {
153 const bool wasWidthValid = p->widthValid();
154 background->setX(getLeftInset());
155 background->setWidth(width - getLeftInset() - getRightInset());
158 p->widthValidFlag =
false;
160 if (((!p->heightValid() || !extra.isAllocated() || !extra->hasBackgroundHeight) && qFuzzyIsNull(background->y()))
161 || (extra.isAllocated() && (extra->hasTopInset || extra->hasBottomInset))) {
162 const bool wasHeightValid = p->heightValid();
163 background->setY(getTopInset());
164 background->setHeight(height - getTopInset() - getBottomInset());
166 p->heightValidFlag =
false;
173
174
175
176
177
178
179
182 Q_Q(QQuickTextField);
183 inheritFont(QQuickControlPrivate::parentFont(q));
188 QFont parentFont = extra.isAllocated() ? extra->requestedFont.resolve(font) : font;
189 parentFont.setResolveMask(extra.isAllocated() ? extra->requestedFont.resolveMask() | font.resolveMask() : font.resolveMask());
191 const QFont defaultFont = QQuickTheme::font(QQuickTheme::TextField);
192 QFont resolvedFont = parentFont.resolve(defaultFont);
194 setFont_helper(resolvedFont);
198
199
200
201
204 Q_Q(QQuickTextField);
205 QFont oldFont = sourceFont;
206 q->QQuickTextInput::setFont(font);
208 QQuickControlPrivate::updateFontRecur(q, font);
211 emit q->fontChanged();
214#if QT_CONFIG(quicktemplates2_hover)
215void QQuickTextFieldPrivate::updateHoverEnabled(
bool enabled,
bool xplicit)
217 Q_Q(QQuickTextField);
218 if (!xplicit && explicitHoverEnabled)
221 bool wasEnabled = q->isHoverEnabled();
222 explicitHoverEnabled = xplicit;
223 if (wasEnabled != enabled) {
224 q->setAcceptHoverEvents(enabled);
225 QQuickControlPrivate::updateHoverEnabledRecur(q, enabled);
226 emit q->hoverEnabledChanged();
233 return QQuickItemPrivate::getImplicitWidth();
238 return QQuickItemPrivate::getImplicitHeight();
243 Q_Q(QQuickTextField);
244 QQuickItemPrivate::implicitWidthChanged();
245 emit q->implicitWidthChanged3();
250 Q_Q(QQuickTextField);
251 QQuickItemPrivate::implicitHeightChanged();
252 emit q->implicitHeightChanged3();
257 QQuickTextInputPrivate::readOnlyChanged(isReadOnly);
259 q_func()->setCursor(isReadOnly && !selectByMouse ? Qt::ArrowCursor : Qt::IBeamCursor);
263#if QT_CONFIG(accessibility)
264void QQuickTextFieldPrivate::accessibilityActiveChanged(
bool active)
266 QQuickTextInputPrivate::accessibilityActiveChanged(active);
270 Q_Q(QQuickTextField);
271 QQuickAccessibleAttached *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(q,
true));
272 Q_ASSERT(accessibleAttached);
273 accessibleAttached->setDescriptionImplicitly(placeholder);
280 Q_Q(QQuickTextField);
281 quickCancelDeferred(q, backgroundName());
286 Q_Q(QQuickTextField);
287 if (background.wasExecuted())
290 if (!background || complete)
291 quickBeginDeferred(q, backgroundName(), background);
293 quickCompleteDeferred(q, backgroundName(), background);
299 if (resizingBackground || item != background || !change.sizeChange())
302 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
306 if (p->widthValid() || extra.isAllocated())
307 extra.value().hasBackgroundWidth = p->widthValid();
308 if (p->heightValid() || extra.isAllocated())
309 extra.value().hasBackgroundHeight = p->heightValid();
315 Q_Q(QQuickTextField);
316 if (item == background)
317 emit q->implicitBackgroundWidthChanged();
322 Q_Q(QQuickTextField);
323 if (item == background)
324 emit q->implicitBackgroundHeightChanged();
329 Q_Q(QQuickTextField);
330 if (item == background) {
331 background =
nullptr;
332 emit q->implicitBackgroundWidthChanged();
333 emit q->implicitBackgroundHeightChanged();
339 return QQuickTheme::palette(QQuickTheme::TextField);
344 Q_Q(QQuickTextField);
345 const auto focusReasonChanged = QQuickItemPrivate::setLastFocusChangeReason(reason);
346 if (focusReasonChanged)
347 emit q->focusReasonChanged();
349 return focusReasonChanged;
352QQuickTextField::QQuickTextField(QQuickItem *parent)
353 : QQuickTextInput(*(
new QQuickTextFieldPrivate), parent)
355 Q_D(QQuickTextField);
356 d->pressHandler.control =
this;
357 d->setImplicitResizeEnabled(
false);
358 setAcceptedMouseButtons(Qt::AllButtons);
359 setActiveFocusOnTab(
true);
361 setCursor(Qt::IBeamCursor);
363#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
364 if (qEnvironmentVariable(
"QT_QUICK_CONTROLS_TEXT_SELECTION_BEHAVIOR") == u"old"_s)
365 QQuickTextInput::setOldSelectionDefault();
369QQuickTextField::~QQuickTextField()
371 Q_D(QQuickTextField);
372 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
375QFont QQuickTextField::font()
const
377 Q_D(
const QQuickTextField);
378 QFont font = QQuickTextInput::font();
380 font.setResolveMask(d->extra.value().requestedFont.resolveMask());
384void QQuickTextField::setFont(
const QFont &font)
386 Q_D(QQuickTextField);
387 if (d->extra.value().requestedFont.resolveMask() == font.resolveMask() && d->extra.value().requestedFont == font)
390 d->extra.value().requestedFont = font;
395
396
397
398
399
400
401
402
403QQuickItem *QQuickTextField::background()
const
405 QQuickTextFieldPrivate *d =
const_cast<QQuickTextFieldPrivate *>(d_func());
407 d->executeBackground();
408 return d->background;
411void QQuickTextField::setBackground(QQuickItem *background)
413 Q_D(QQuickTextField);
414 if (d->background == background)
417 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
419 if (!d->background.isExecuting())
420 d->cancelBackground();
422 const qreal oldImplicitBackgroundWidth = implicitBackgroundWidth();
423 const qreal oldImplicitBackgroundHeight = implicitBackgroundHeight();
425 if (d->extra.isAllocated()) {
426 d->extra.value().hasBackgroundWidth =
false;
427 d->extra.value().hasBackgroundHeight =
false;
430 QQuickControlPrivate::removeImplicitSizeListener(d->background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
431 QQuickControlPrivate::hideOldItem(d->background);
432 d->background = background;
435 background->setParentItem(
this);
436 if (qFuzzyIsNull(background->z()))
437 background->setZ(-1);
438 QQuickItemPrivate *p = QQuickItemPrivate::get(background);
439 if (p->widthValid() || p->heightValid()) {
440 d->extra.value().hasBackgroundWidth = p->widthValid();
441 d->extra.value().hasBackgroundHeight = p->heightValid();
443 if (isComponentComplete())
444 d->resizeBackground();
445 QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
448 if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth()))
449 emit implicitBackgroundWidthChanged();
450 if (!qFuzzyCompare(oldImplicitBackgroundHeight, implicitBackgroundHeight()))
451 emit implicitBackgroundHeightChanged();
452 if (!d->background.isExecuting())
453 emit backgroundChanged();
457
458
459
460
461
462QString QQuickTextField::placeholderText()
const
464 Q_D(
const QQuickTextField);
465 return d->placeholder;
468void QQuickTextField::setPlaceholderText(
const QString &text)
470 Q_D(QQuickTextField);
471 if (d->placeholder == text)
474 d->placeholder = text;
475#if QT_CONFIG(accessibility)
476 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this))
477 accessibleAttached->setDescriptionImplicitly(text);
479 emit placeholderTextChanged();
483
484
485
486
487
488
489
490QColor QQuickTextField::placeholderTextColor()
const
492 Q_D(
const QQuickTextField);
493 return d->placeholderColor;
496void QQuickTextField::setPlaceholderTextColor(
const QColor &color)
498 Q_D(QQuickTextField);
499 if (d->placeholderColor == color)
502 d->placeholderColor = color;
503 emit placeholderTextColorChanged();
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525Qt::FocusReason QQuickTextField::focusReason()
const
527 Q_D(
const QQuickTextField);
528 return d->lastFocusChangeReason();
531void QQuickTextField::setFocusReason(Qt::FocusReason reason)
533 Q_D(QQuickTextField);
534 d->setLastFocusChangeReason(reason);
538
539
540
541
542
543
544
545
546bool QQuickTextField::isHovered()
const
548#if QT_CONFIG(quicktemplates2_hover)
549 Q_D(
const QQuickTextField);
556void QQuickTextField::setHovered(
bool hovered)
558#if QT_CONFIG(quicktemplates2_hover)
559 Q_D(QQuickTextField);
560 if (hovered == d->hovered)
563 d->hovered = hovered;
564 emit hoveredChanged();
571
572
573
574
575
576
577
578bool QQuickTextField::isHoverEnabled()
const
580#if QT_CONFIG(quicktemplates2_hover)
581 Q_D(
const QQuickTextField);
582 return d->hoverEnabled;
588void QQuickTextField::setHoverEnabled(
bool enabled)
590#if QT_CONFIG(quicktemplates2_hover)
591 Q_D(QQuickTextField);
592 if (d->explicitHoverEnabled && enabled == d->hoverEnabled)
595 d->updateHoverEnabled(enabled,
true);
601void QQuickTextField::resetHoverEnabled()
603#if QT_CONFIG(quicktemplates2_hover)
604 Q_D(QQuickTextField);
605 if (!d->explicitHoverEnabled)
608 d->explicitHoverEnabled =
false;
609 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
613void QQuickTextField::classBegin()
615 Q_D(QQuickTextField);
616 QQuickTextInput::classBegin();
621
622
623
624
625
626
627
628
629
630
631qreal QQuickTextField::implicitBackgroundWidth()
const
633 Q_D(
const QQuickTextField);
636 return d->background->implicitWidth();
640
641
642
643
644
645
646
647
648
649
650qreal QQuickTextField::implicitBackgroundHeight()
const
652 Q_D(
const QQuickTextField);
655 return d->background->implicitHeight();
659
660
661
662
663
664
665
666qreal QQuickTextField::topInset()
const
668 Q_D(
const QQuickTextField);
669 return d->getTopInset();
672void QQuickTextField::setTopInset(qreal inset)
674 Q_D(QQuickTextField);
675 d->setTopInset(inset);
678void QQuickTextField::resetTopInset()
680 Q_D(QQuickTextField);
681 d->setTopInset(0,
true);
685
686
687
688
689
690
691
692qreal QQuickTextField::leftInset()
const
694 Q_D(
const QQuickTextField);
695 return d->getLeftInset();
698void QQuickTextField::setLeftInset(qreal inset)
700 Q_D(QQuickTextField);
701 d->setLeftInset(inset);
704void QQuickTextField::resetLeftInset()
706 Q_D(QQuickTextField);
707 d->setLeftInset(0,
true);
711
712
713
714
715
716
717
718qreal QQuickTextField::rightInset()
const
720 Q_D(
const QQuickTextField);
721 return d->getRightInset();
724void QQuickTextField::setRightInset(qreal inset)
726 Q_D(QQuickTextField);
727 d->setRightInset(inset);
730void QQuickTextField::resetRightInset()
732 Q_D(QQuickTextField);
733 d->setRightInset(0,
true);
737
738
739
740
741
742
743
744qreal QQuickTextField::bottomInset()
const
746 Q_D(
const QQuickTextField);
747 return d->getBottomInset();
750void QQuickTextField::setBottomInset(qreal inset)
752 Q_D(QQuickTextField);
753 d->setBottomInset(inset);
756void QQuickTextField::resetBottomInset()
758 Q_D(QQuickTextField);
759 d->setBottomInset(0,
true);
762void QQuickTextField::componentComplete()
764 Q_D(QQuickTextField);
765 d->executeBackground(
true);
766 QQuickTextInput::componentComplete();
767 d->resizeBackground();
768#if QT_CONFIG(quicktemplates2_hover)
769 if (!d->explicitHoverEnabled)
770 setAcceptHoverEvents(QQuickControlPrivate::calcHoverEnabled(d->parentItem));
774void QQuickTextField::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &value)
776 Q_D(QQuickTextField);
777 QQuickTextInput::itemChange(change, value);
779 case ItemEnabledHasChanged:
781 case ItemSceneChange:
782 case ItemParentHasChanged:
783 if ((change == ItemParentHasChanged && value.item) || (change == ItemSceneChange && value.window)) {
785#if QT_CONFIG(quicktemplates2_hover)
786 if (!d->explicitHoverEnabled)
787 d->updateHoverEnabled(QQuickControlPrivate::calcHoverEnabled(d->parentItem),
false);
796void QQuickTextField::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
798 Q_D(QQuickTextField);
799 QQuickTextInput::geometryChange(newGeometry, oldGeometry);
800 d->resizeBackground();
803void QQuickTextField::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
805 Q_D(QQuickTextField);
808 d->resizeBackground();
810QSGNode *QQuickTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
812 QQuickDefaultClipNode *clipNode =
static_cast<QQuickDefaultClipNode *>(oldNode);
814 clipNode =
new QQuickDefaultClipNode(QRectF());
816 clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding()));
819 QSGNode *textNode = QQuickTextInput::updatePaintNode(clipNode->firstChild(), data);
820 if (!textNode->parent())
821 clipNode->appendChildNode(textNode);
826void QQuickTextField::focusInEvent(QFocusEvent *event)
828 QQuickTextInput::focusInEvent(event);
831void QQuickTextField::focusOutEvent(QFocusEvent *event)
833 QQuickTextInput::focusOutEvent(event);
836#if QT_CONFIG(quicktemplates2_hover)
837void QQuickTextField::hoverEnterEvent(QHoverEvent *event)
839 Q_D(QQuickTextField);
840 QQuickTextInput::hoverEnterEvent(event);
841 setHovered(d->hoverEnabled);
845void QQuickTextField::hoverLeaveEvent(QHoverEvent *event)
847 QQuickTextInput::hoverLeaveEvent(event);
853void QQuickTextField::mousePressEvent(QMouseEvent *event)
855 Q_D(QQuickTextField);
856 d->pressHandler.mousePressEvent(event);
857 if (d->pressHandler.isActive()) {
858 if (d->pressHandler.delayedMousePressEvent) {
859 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
860 d->pressHandler.clearDelayedMouseEvent();
862 if (event->buttons() != Qt::RightButton)
863 QQuickTextInput::mousePressEvent(event);
867void QQuickTextField::mouseMoveEvent(QMouseEvent *event)
869 Q_D(QQuickTextField);
870 d->pressHandler.mouseMoveEvent(event);
871 if (d->pressHandler.isActive()) {
872 if (d->pressHandler.delayedMousePressEvent) {
873 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
874 d->pressHandler.clearDelayedMouseEvent();
876 const bool isMouse = QQuickDeliveryAgentPrivate::isEventFromMouseOrTouchpad(event)
877 #if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
878 || d->selectByTouchDrag
881 if (event->buttons() != Qt::RightButton && isMouse)
882 QQuickTextInput::mouseMoveEvent(event);
886void QQuickTextField::mouseReleaseEvent(QMouseEvent *event)
888 Q_D(QQuickTextField);
889 d->pressHandler.mouseReleaseEvent(event);
890 if (d->pressHandler.isActive()) {
891 if (d->pressHandler.delayedMousePressEvent) {
892 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
893 d->pressHandler.clearDelayedMouseEvent();
895 if (event->buttons() != Qt::RightButton)
896 QQuickTextInput::mouseReleaseEvent(event);
900void QQuickTextField::mouseDoubleClickEvent(QMouseEvent *event)
902 Q_D(QQuickTextField);
903 if (d->pressHandler.delayedMousePressEvent) {
904 QQuickTextInput::mousePressEvent(d->pressHandler.delayedMousePressEvent.get());
905 d->pressHandler.clearDelayedMouseEvent();
907 if (event->buttons() != Qt::RightButton)
908 QQuickTextInput::mouseDoubleClickEvent(event);
911void QQuickTextField::timerEvent(QTimerEvent *event)
913 Q_D(QQuickTextField);
914 if (event->timerId() == d->pressHandler.timer.timerId())
915 d->pressHandler.timerEvent(event);
917 QQuickTextInput::timerEvent(event);
922#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.