diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2023-10-23 16:02:08 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-11-02 15:55:41 +0000 |
commit | 70e62d69ea43078b4af41dee475a40937cc83ce6 (patch) | |
tree | 7465aa9d92b577618ac4d791af3b2ec834c60013 | |
parent | 59c77bc2fed8132f93ff648f2154d080ed64f8d3 (diff) |
QQuickTextArea: move accessibility handling into base QQuickTextEdit class
Move accessibility handling from QQuickTextArea into base
QQuickTextEdit class. This fixes an issue where the virtual keyboard
does not appear automatically when TextEdit initially gets focus on a
Windows touch device such as the MS Surface Pro X.
Fixes: QTBUG-108449
Change-Id: I37e0d197d4af04c832dfb5651bade9d39e079f2b
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
(cherry picked from commit 12517742fcbd40b2311b94abe840532eae3d8914)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 35 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p_p.h | 22 | ||||
-rw-r--r-- | src/quicktemplates/qquicktextarea.cpp | 38 | ||||
-rw-r--r-- | src/quicktemplates/qquicktextarea_p_p.h | 8 |
4 files changed, 60 insertions, 43 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 301547eb3b..990b6ec103 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -24,6 +24,10 @@ #include <private/qtextengine_p.h> #include <private/qsgadaptationlayer_p.h> +#if QT_CONFIG(accessibility) +#include <private/qquickaccessibleattached_p.h> +#endif + #include "qquicktextdocument.h" #include <algorithm> @@ -845,6 +849,25 @@ Qt::InputMethodHints QQuickTextEditPrivate::effectiveInputMethodHints() const } #endif +#if QT_CONFIG(accessibility) +void QQuickTextEditPrivate::accessibilityActiveChanged(bool active) +{ + if (!active) + return; + + Q_Q(QQuickTextEdit); + QQuickAccessibleAttached *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(q, true)); + Q_ASSERT(accessibleAttached); + accessibleAttached->setRole(effectiveAccessibleRole()); + accessibleAttached->set_readOnly(q->isReadOnly()); +} + +QAccessible::Role QQuickTextEditPrivate::accessibleRole() const +{ + return QAccessible::EditableText; +} +#endif + void QQuickTextEditPrivate::setTopPadding(qreal value, bool reset) { Q_Q(QQuickTextEdit); @@ -1538,6 +1561,11 @@ void QQuickTextEdit::componentComplete() if (d->cursorComponent && isCursorVisible()) QQuickTextUtil::createCursor(d); polish(); + +#if QT_CONFIG(accessibility) + if (QAccessible::isActive()) + d->accessibilityActiveChanged(true); +#endif } /*! @@ -1695,6 +1723,13 @@ void QQuickTextEdit::setReadOnly(bool r) } else if (hasActiveFocus()) { setCursorVisible(true); } + +#if QT_CONFIG(accessibility) + if (QAccessible::isActive()) { + if (QQuickAccessibleAttached *accessibleAttached = QQuickAccessibleAttached::attachedProperties(this)) + accessibleAttached->set_readOnly(r); + } +#endif } bool QQuickTextEdit::isReadOnly() const diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index 087a18734a..16e584055f 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -23,6 +23,10 @@ #include <QtCore/qlist.h> #include <private/qlazilyallocated_p.h> +#if QT_CONFIG(accessibility) +#include <QtGui/qaccessible.h> +#endif + #include <limits> QT_BEGIN_NAMESPACE @@ -33,6 +37,9 @@ class QQuickTextNode; class QQuickTextNodeEngine; class Q_QUICK_PRIVATE_EXPORT QQuickTextEditPrivate : public QQuickImplicitSizeItemPrivate +#if QT_CONFIG(accessibility) + , public QAccessible::ActivationObserver +#endif { public: Q_DECLARE_PUBLIC(QQuickTextEdit) @@ -97,6 +104,16 @@ public: , textCached(true), inLayout(false), selectByKeyboard(false), selectByKeyboardSet(false) , hadSelection(false), markdownText(false), inResize(false) { +#if QT_CONFIG(accessibility) + QAccessible::installActivationObserver(this); +#endif + } + + ~QQuickTextEditPrivate() + { +#if QT_CONFIG(accessibility) + QAccessible::removeActivationObserver(this); +#endif } static QQuickTextEditPrivate *get(QQuickTextEdit *item) { @@ -128,6 +145,11 @@ public: Qt::InputMethodHints effectiveInputMethodHints() const; #endif +#if QT_CONFIG(accessibility) + void accessibilityActiveChanged(bool active) override; + QAccessible::Role accessibleRole() const override; +#endif + inline qreal padding() const { return extra.isAllocated() ? extra->padding : 0.0; } void setTopPadding(qreal value, bool reset = false); void setLeftPadding(qreal value, bool reset = false); diff --git a/src/quicktemplates/qquicktextarea.cpp b/src/quicktemplates/qquicktextarea.cpp index dd4a908f5a..b281c9a02e 100644 --- a/src/quicktemplates/qquicktextarea.cpp +++ b/src/quicktemplates/qquicktextarea.cpp @@ -121,16 +121,10 @@ using namespace Qt::StringLiterals; QQuickTextAreaPrivate::QQuickTextAreaPrivate() { -#if QT_CONFIG(accessibility) - QAccessible::installActivationObserver(this); -#endif } QQuickTextAreaPrivate::~QQuickTextAreaPrivate() { -#if QT_CONFIG(accessibility) - QAccessible::removeActivationObserver(this); -#endif } void QQuickTextAreaPrivate::setTopInset(qreal value, bool reset) @@ -420,32 +414,12 @@ void QQuickTextAreaPrivate::implicitHeightChanged() emit q->implicitHeightChanged3(); } -void QQuickTextAreaPrivate::readOnlyChanged(bool isReadOnly) -{ - Q_UNUSED(isReadOnly); -#if QT_CONFIG(accessibility) - if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func())) - accessibleAttached->set_readOnly(isReadOnly); -#endif -} - #if QT_CONFIG(accessibility) void QQuickTextAreaPrivate::accessibilityActiveChanged(bool active) { - if (!active) - return; - - Q_Q(QQuickTextArea); - QQuickAccessibleAttached *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(q, true)); - Q_ASSERT(accessibleAttached); - accessibleAttached->setRole(effectiveAccessibleRole()); - accessibleAttached->set_readOnly(q->isReadOnly()); - accessibleAttached->setDescription(placeholder); -} - -QAccessible::Role QQuickTextAreaPrivate::accessibleRole() const -{ - return QAccessible::EditableText; + QQuickTextEditPrivate::accessibilityActiveChanged(active); + if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func())) + accessibleAttached->setDescription(placeholder); } #endif @@ -507,8 +481,6 @@ QQuickTextArea::QQuickTextArea(QQuickItem *parent) d->setImplicitResizeEnabled(false); d->pressHandler.control = this; - QObjectPrivate::connect(this, &QQuickTextEdit::readOnlyChanged, - d, &QQuickTextAreaPrivate::readOnlyChanged); #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) if (qEnvironmentVariable("QT_QUICK_CONTROLS_TEXT_SELECTION_BEHAVIOR") == u"old"_s) QQuickTextEdit::setOldSelectionDefault(); @@ -926,10 +898,6 @@ void QQuickTextArea::componentComplete() if (!d->explicitHoverEnabled) setAcceptHoverEvents(QQuickControlPrivate::calcHoverEnabled(d->parentItem)); #endif -#if QT_CONFIG(accessibility) - if (QAccessible::isActive()) - d->accessibilityActiveChanged(true); -#endif } void QQuickTextArea::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) diff --git a/src/quicktemplates/qquicktextarea_p_p.h b/src/quicktemplates/qquicktextarea_p_p.h index 243b350866..010c777ee9 100644 --- a/src/quicktemplates/qquicktextarea_p_p.h +++ b/src/quicktemplates/qquicktextarea_p_p.h @@ -24,18 +24,11 @@ #include <QtQuickTemplates2/private/qquicktextarea_p.h> -#if QT_CONFIG(accessibility) -#include <QtGui/qaccessible.h> -#endif - QT_BEGIN_NAMESPACE class QQuickFlickable; class QQuickTextAreaPrivate : public QQuickTextEditPrivate, public QQuickItemChangeListener -#if QT_CONFIG(accessibility) - , public QAccessible::ActivationObserver -#endif { public: Q_DECLARE_PUBLIC(QQuickTextArea) @@ -92,7 +85,6 @@ public: #if QT_CONFIG(accessibility) void accessibilityActiveChanged(bool active) override; - QAccessible::Role accessibleRole() const override; #endif void cancelBackground(); |