aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Belyavsky <belyavskyv@gmail.com>2023-10-23 16:02:08 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-11-02 15:55:41 +0000
commit70e62d69ea43078b4af41dee475a40937cc83ce6 (patch)
tree7465aa9d92b577618ac4d791af3b2ec834c60013
parent59c77bc2fed8132f93ff648f2154d080ed64f8d3 (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.cpp35
-rw-r--r--src/quick/items/qquicktextedit_p_p.h22
-rw-r--r--src/quicktemplates/qquicktextarea.cpp38
-rw-r--r--src/quicktemplates/qquicktextarea_p_p.h8
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();