6#include <QtGui/qtextdocument.h>
8#include "QtQuick/private/qquickitem_p.h"
9#include "QtQuick/private/qquicktext_p.h"
10#include <private/qquicktext_p_p.h>
12#include "QtQuick/private/qquicktextinput_p.h"
13#include "QtQuick/private/qquickaccessibleattached_p.h"
14#include "QtQuick/qquicktextdocument.h"
15#include "QtQuick/qquickrendercontrol.h"
18#if QT_CONFIG(accessibility)
20class QAccessibleHyperlink :
public QAccessibleInterface,
public QAccessibleHyperlinkInterface {
22 QAccessibleHyperlink(
QQuickItem *parentTextItem,
int linkIndex);
25 bool isValid()
const override;
30 QAccessibleInterface *parent()
const override;
31 QAccessibleInterface *
child(
int index)
const override;
32 int childCount()
const override;
33 int indexOfChild(
const QAccessibleInterface *iface)
const override;
34 QAccessibleInterface *childAt(
int x,
int y)
const override;
40 QAccessible::Role role()
const override;
43 void *interface_cast(QAccessible::InterfaceType
t)
override;
49 if (linkIndex < links.size())
50 return links.at(linkIndex).m_anchor;
54 QString anchorTarget()
const override
57 if (linkIndex < links.size())
58 return links.at(linkIndex).m_anchorTarget;
62 int startIndex()
const override
65 if (linkIndex < links.size())
66 return links.at(linkIndex).m_startIndex;
70 int endIndex()
const override
73 if (linkIndex < links.size())
74 return links.at(linkIndex).m_endIndex;
79 QQuickText *textItem()
const {
return qobject_cast<QQuickText*>(parentTextItem); }
83 friend class QAccessibleQuickItem;
87QAccessibleHyperlink::QAccessibleHyperlink(
QQuickItem *parentTextItem,
int linkIndex)
88 : parentTextItem(parentTextItem),
94bool QAccessibleHyperlink::isValid()
const
100QObject *QAccessibleHyperlink::object()
const
106QWindow *QAccessibleHyperlink::window()
const
108 return textItem()->window();
113QRect QAccessibleHyperlink::rect()
const
116 if (linkIndex < links.size()) {
117 const QPoint tl = itemScreenRect(textItem()).topLeft();
118 return links.at(linkIndex).rect.translated(tl);
124QAccessibleInterface *QAccessibleHyperlink::childAt(
int,
int)
const
130QAccessibleInterface *QAccessibleHyperlink::parent()
const
132 return QAccessible::queryAccessibleInterface(textItem());
136QAccessibleInterface *QAccessibleHyperlink::child(
int)
const
142int QAccessibleHyperlink::childCount()
const
148int QAccessibleHyperlink::indexOfChild(
const QAccessibleInterface *)
const
159 s.selectableText =
true;
165QAccessible::Role QAccessibleHyperlink::role()
const
167 return QAccessible::Link;
171QString QAccessibleHyperlink::text(QAccessible::Text
t)
const
181 if (
t == QAccessible::Name)
183 if (
t == QAccessible::Value)
184 return anchorTarget();
189void QAccessibleHyperlink::setText(QAccessible::Text,
const QString &)
195void *QAccessibleHyperlink::interface_cast(QAccessible::InterfaceType
t)
197 if (
t == QAccessible::HyperlinkInterface)
198 return static_cast<QAccessibleHyperlinkInterface*
>(
this);
213QWindow *QAccessibleQuickItem::window()
const
222 if (
QWindow *renderWindow = renderControl->renderWindow(
nullptr))
230int QAccessibleQuickItem::childCount()
const
237 cc += childItems().size();
241QRect QAccessibleQuickItem::rect()
const
247QRect QAccessibleQuickItem::viewRect()
const
260bool QAccessibleQuickItem::clipsChildren()
const
265QAccessibleInterface *QAccessibleQuickItem::childAt(
int x,
int y)
const
267 if (
item()->clip()) {
275 for (
auto i = 0;
i < hyperLinkChildCount;
i++) {
277 if (
iface->rect().contains(
x,
y)) {
284 const QList<QQuickItem*> kids = accessibleUnignoredChildren(
item(),
true);
285 for (
int i = kids.size() - 1;
i >= 0; --
i) {
286 QAccessibleInterface *childIface = QAccessible::queryAccessibleInterface(kids.at(
i));
287 if (QAccessibleInterface *childChild = childIface->childAt(
x,
y))
289 if (childIface && !childIface->state().invisible) {
290 if (childIface->rect().contains(
x,
y))
298QAccessibleInterface *QAccessibleQuickItem::parent()
const
302 QQuickItem *ci = itemWindow ? itemWindow->contentItem() :
nullptr;
309 return QAccessible::queryAccessibleInterface(
window());
311 while (parent && !parent->d_func()->isAccessible)
313 return QAccessible::queryAccessibleInterface(parent);
319QAccessibleInterface *QAccessibleQuickItem::child(
int index)
const
348 if (
index < hyperLinkChildCount) {
351 return QAccessible::accessibleInterface(
it.value());
353 QAccessibleHyperlink *
iface =
new QAccessibleHyperlink(
item(),
index);
354 QAccessible::Id
id = QAccessible::registerAccessibleInterface(iface);
355 m_childToId.insert(
index,
id);
358 index -= hyperLinkChildCount;
361 QList<QQuickItem *> children = childItems();
362 if (
index < children.size()) {
364 return QAccessible::queryAccessibleInterface(
child);
369int QAccessibleQuickItem::indexOfChild(
const QAccessibleInterface *iface)
const
371 int hyperLinkChildCount = 0;
374 if (QAccessibleHyperlinkInterface *hyperLinkIface =
const_cast<QAccessibleInterface *
>(iface)->hyperlinkInterface()) {
377 QAccessibleHyperlink *hyperLink =
static_cast<QAccessibleHyperlink*
>(hyperLinkIface);
379 return hyperLink->linkIndex;
383 QList<QQuickItem*> kids = childItems();
386 idx += hyperLinkChildCount;
390static void unignoredChildren(
QQuickItem *
item, QList<QQuickItem *> *
items,
bool paintOrder)
403QList<QQuickItem *> accessibleUnignoredChildren(
QQuickItem *
item,
bool paintOrder)
405 QList<QQuickItem *>
items;
406 unignoredChildren(
item, &
items, paintOrder);
410QList<QQuickItem *> QAccessibleQuickItem::childItems()
const
412 return accessibleUnignoredChildren(
item());
415static bool isTextRole(QAccessible::Role role)
417 return role == QAccessible::EditableText || role == QAccessible::StaticText;
422 QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(
item());
428 QRect viewRect_ = viewRect();
432 state.invisible =
true;
433 if (!viewRect_.intersects(itemRect))
434 state.offscreen =
true;
435 if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) &&
object()->
property(
"checked").
toBool())
436 state.checked =
true;
437 if (
item()->activeFocusOnTab() || isTextRole(role()))
438 state.focusable =
true;
439 if (
item()->hasActiveFocus())
440 state.focused =
true;
441 if (role() == QAccessible::EditableText)
442 if (
auto ti = qobject_cast<QQuickTextInput *>(
item()))
445 state.focusable =
false;
446 state.disabled =
true;
451QAccessible::Role QAccessibleQuickItem::role()
const
457 QAccessible::Role role = QAccessible::NoRole;
460 if (role == QAccessible::NoRole) {
462 role = QAccessible::StaticText;
463 else if (qobject_cast<QQuickTextInput*>(
const_cast<QQuickItem *
>(
item())))
464 role = QAccessible::EditableText;
466 role = QAccessible::Client;
472bool QAccessibleQuickItem::isAccessible()
const
474 return item()->d_func()->isAccessible;
477QStringList QAccessibleQuickItem::actionNames()
const
481 case QAccessible::Link:
482 case QAccessible::PushButton:
483 actions << QAccessibleActionInterface::pressAction();
485 case QAccessible::RadioButton:
486 case QAccessible::CheckBox:
487 actions << QAccessibleActionInterface::toggleAction()
488 << QAccessibleActionInterface::pressAction();
490 case QAccessible::Slider:
491 case QAccessible::SpinBox:
492 case QAccessible::ScrollBar:
493 actions << QAccessibleActionInterface::increaseAction()
494 << QAccessibleActionInterface::decreaseAction();
499 if (
state().focusable)
500 actions.append(QAccessibleActionInterface::setFocusAction());
503 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(
item()))
504 attached->availableActions(&actions);
508void QAccessibleQuickItem::doAction(
const QString &actionName)
510 bool accepted =
false;
511 if (actionName == QAccessibleActionInterface::setFocusAction()) {
512 item()->forceActiveFocus();
515 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(
item()))
516 accepted = attached->doAction(actionName);
534 case QAccessible::RadioButton:
535 case QAccessible::CheckBox: {
538 if (actionName == QAccessibleActionInterface::toggleAction() ||
539 actionName == QAccessibleActionInterface::pressAction()) {
546 case QAccessible::Slider:
547 case QAccessible::SpinBox:
548 case QAccessible::Dial:
549 case QAccessible::ScrollBar: {
550 if (actionName != QAccessibleActionInterface::increaseAction() &&
551 actionName != QAccessibleActionInterface::decreaseAction())
557 if (QAccessibleValueInterface *valueIface = valueInterface()) {
558 QVariant valueV = valueIface->currentValue();
563 if (actionName == QAccessibleActionInterface::increaseAction()) {
564 newValue += stepSize;
566 newValue -= stepSize;
569 QVariant minimumValueV = valueIface->minimumValue();
570 if (minimumValueV.isValid()) {
571 newValue =
qMax(newValue, minimumValueV.toReal());
573 QVariant maximumValueV = valueIface->maximumValue();
574 if (maximumValueV.isValid()) {
575 newValue =
qMin(newValue, maximumValueV.toReal());
578 valueIface->setCurrentValue(
QVariant(newValue));
587QStringList QAccessibleQuickItem::keyBindingsForAction(
const QString &actionName)
const
593QString QAccessibleQuickItem::text(QAccessible::Text textType)
const
597 case QAccessible::Name: {
598 QVariant accessibleName = QQuickAccessibleAttached::property(
object(),
"name");
599 if (!accessibleName.
isNull())
602 case QAccessible::Description: {
603 QVariant accessibleDecription = QQuickAccessibleAttached::property(
object(),
"description");
604 if (!accessibleDecription.isNull())
605 return accessibleDecription.toString();
607#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
608 case QAccessible::DebugDescription: {
615 case QAccessible::Value:
616 case QAccessible::Help:
617 case QAccessible::Accelerator:
623 if (role() == QAccessible::EditableText) {
624 if (textType == QAccessible::Value) {
625 if (
auto textInput = qobject_cast<QQuickTextInput *>(
item()))
626 return textInput->displayText();
628 return doc->toPlainText();
631 return text.toString();
638void QAccessibleQuickItem::setText(QAccessible::Text textType,
const QString &
text)
640 if (role() != QAccessible::EditableText)
642 if (textType != QAccessible::Value)
646 doc->setPlainText(
text);
649 auto textPropertyName =
"text";
650 if (
object()->
metaObject()->indexOfProperty(textPropertyName) >= 0)
651 object()->setProperty(textPropertyName,
text);
654void *QAccessibleQuickItem::interface_cast(QAccessible::InterfaceType
t)
656 QAccessible::Role
r = role();
657 if (
t == QAccessible::ActionInterface)
658 return static_cast<QAccessibleActionInterface*
>(
this);
659 if (
t == QAccessible::ValueInterface &&
660 (
r == QAccessible::Slider ||
661 r == QAccessible::SpinBox ||
662 r == QAccessible::Dial ||
663 r == QAccessible::ScrollBar))
664 return static_cast<QAccessibleValueInterface*
>(
this);
666 if (
t == QAccessible::TextInterface) {
667 if (
r == QAccessible::EditableText ||
668 r == QAccessible::StaticText)
669 return static_cast<QAccessibleTextInterface*
>(
this);
672 return QAccessibleObject::interface_cast(
t);
675QVariant QAccessibleQuickItem::currentValue()
const
677 return item()->property(
"value");
680void QAccessibleQuickItem::setCurrentValue(
const QVariant &
value)
685QVariant QAccessibleQuickItem::maximumValue()
const
687 return item()->property(
"maximumValue");
690QVariant QAccessibleQuickItem::minimumValue()
const
692 return item()->property(
"minimumValue");
695QVariant QAccessibleQuickItem::minimumStepSize()
const
697 return item()->property(
"stepSize");
715 if (itemSize.isEmpty()) {
716 itemSize =
QSize((
int)
item->implicitWidth(), (
int)
item->implicitHeight());
724 return QRect(screenPos, itemSize);
737int QAccessibleQuickItem::characterCount()
const
744 return text(QAccessible::Value).
size();
747int QAccessibleQuickItem::cursorPosition()
const
753void QAccessibleQuickItem::setCursorPosition(
int position)
758QString QAccessibleQuickItem::text(
int startOffset,
int endOffset)
const
762 cursor.setPosition(startOffset);
764 return cursor.selectedText();
766 return text(QAccessible::Value).
mid(startOffset, endOffset - startOffset);
769QString QAccessibleQuickItem::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
770 int *startOffset,
int *endOffset)
const
778 QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
779 cursor.setPosition(boundaries.first - 1);
780 boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
782 *startOffset = boundaries.first;
783 *endOffset = boundaries.second;
785 return text(boundaries.first, boundaries.second);
787 return QAccessibleTextInterface::textBeforeOffset(
offset, boundaryType, startOffset, endOffset);
791QString QAccessibleQuickItem::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
792 int *startOffset,
int *endOffset)
const
800 QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
801 cursor.setPosition(boundaries.second);
802 boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
804 *startOffset = boundaries.first;
805 *endOffset = boundaries.second;
807 return text(boundaries.first, boundaries.second);
809 return QAccessibleTextInterface::textAfterOffset(
offset, boundaryType, startOffset, endOffset);
813QString QAccessibleQuickItem::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
814 int *startOffset,
int *endOffset)
const
822 QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
824 *startOffset = boundaries.first;
825 *endOffset = boundaries.second;
826 return text(boundaries.first, boundaries.second);
828 return QAccessibleTextInterface::textAtOffset(
offset, boundaryType, startOffset, endOffset);
832void QAccessibleQuickItem::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
834 if (selectionIndex == 0) {
835 *startOffset =
item()->property(
"selectionStart").toInt();
836 *endOffset =
item()->property(
"selectionEnd").toInt();
843int QAccessibleQuickItem::selectionCount()
const
850void QAccessibleQuickItem::addSelection(
int ,
int )
854void QAccessibleQuickItem::removeSelection(
int )
858void QAccessibleQuickItem::setSelection(
int ,
int ,
int )
QList< QGraphicsItem * > childItems() const
QGraphicsWidget * window() const
QPointF mapToScene(const QPointF &point) const
Maps the point point, which is in this item's coordinate system, to the scene's coordinate system,...
QGraphicsItem * parentItem() const
Returns a pointer to this item's parent item.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
void append(parameter_type t)
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
QQuickItem * parentItem() const
The QQuickRenderControl class provides a mechanism for rendering the Qt Quick scenegraph onto an offs...
\qmltype TextDocument \instantiates QQuickTextDocument \inqmlmodule QtQuick
QTextDocument * textDocument() const
Returns a pointer to the QTextDocument object.
static QQuickTextPrivate * get(QQuickText *t)
static QQuickWindowPrivate * get(QQuickWindow *c)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
\inmodule QtCore\reentrant
constexpr bool isNull() const noexcept
Returns true if the rectangle is a null rectangle, otherwise returns false.
const_iterator constEnd() const noexcept
const_iterator constFind(const T &value) const
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString mid(qsizetype position, qsizetype n=-1) const &
qsizetype size() const noexcept
Returns the number of characters in this string.
\reentrant \inmodule QtGui
\reentrant \inmodule QtGui
qreal toReal(bool *ok=nullptr) const
Returns the variant as a qreal if the variant has userType() \l QMetaType::Double,...
bool isValid() const
Returns true if the storage type of this variant is not QMetaType::UnknownType; otherwise returns fal...
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
bool toBool() const
Returns the variant as a bool if the variant has userType() Bool.
bool isNull() const
Returns true if this is a null variant, false otherwise.
QSet< QString >::iterator it
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
QTextDocument * textDocument
QList< QString > QStringList
Constructs a string list that contains the given string, str.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyIsNull(qfloat16 f) noexcept
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
static bool contains(const QJsonArray &haystack, unsigned needle)
GLint GLint GLint GLint GLint x
[0]
GLenum GLuint GLintptr offset
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QLatin1StringView QLatin1String
static int toInt(const QChar &qc, int R)
const char className[16]
[1]
obj metaObject() -> className()
insertRed setText("insert red text")
\inmodule QtCore \reentrant
QT_BEGIN_NAMESPACE bool toBool(const QString &str)