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)) {
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
309 return QAccessible::queryAccessibleInterface(
window());
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;
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;
386 idx += hyperLinkChildCount;
406 unignoredChildren(
item, &
items, paintOrder);
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;
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();
571 newValue =
qMax(newValue, minimumValueV.
toReal());
573 QVariant maximumValueV = valueIface->maximumValue();
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) {
626 return doc->toPlainText();
629 return text.toString();
636void QAccessibleQuickItem::setText(QAccessible::Text textType,
const QString &
text)
638 if (role() != QAccessible::EditableText)
640 if (textType != QAccessible::Value)
644 doc->setPlainText(
text);
647 auto textPropertyName =
"text";
648 if (
object()->
metaObject()->indexOfProperty(textPropertyName) >= 0)
649 object()->setProperty(textPropertyName,
text);
652void *QAccessibleQuickItem::interface_cast(QAccessible::InterfaceType
t)
654 QAccessible::Role
r = role();
655 if (
t == QAccessible::ActionInterface)
656 return static_cast<QAccessibleActionInterface*
>(
this);
657 if (
t == QAccessible::ValueInterface &&
658 (
r == QAccessible::Slider ||
659 r == QAccessible::SpinBox ||
660 r == QAccessible::Dial ||
661 r == QAccessible::ScrollBar))
662 return static_cast<QAccessibleValueInterface*
>(
this);
664 if (
t == QAccessible::TextInterface) {
665 if (
r == QAccessible::EditableText ||
666 r == QAccessible::StaticText)
667 return static_cast<QAccessibleTextInterface*
>(
this);
670 return QAccessibleObject::interface_cast(
t);
673QVariant QAccessibleQuickItem::currentValue()
const
675 return item()->property(
"value");
678void QAccessibleQuickItem::setCurrentValue(
const QVariant &
value)
683QVariant QAccessibleQuickItem::maximumValue()
const
685 return item()->property(
"maximumValue");
688QVariant QAccessibleQuickItem::minimumValue()
const
690 return item()->property(
"minimumValue");
693QVariant QAccessibleQuickItem::minimumStepSize()
const
695 return item()->property(
"stepSize");
713 if (itemSize.isEmpty()) {
714 itemSize =
QSize((
int)
item->implicitWidth(), (
int)
item->implicitHeight());
722 return QRect(screenPos, itemSize);
735int QAccessibleQuickItem::characterCount()
const
742 return text(QAccessible::Value).
size();
745int QAccessibleQuickItem::cursorPosition()
const
751void QAccessibleQuickItem::setCursorPosition(
int position)
756QString QAccessibleQuickItem::text(
int startOffset,
int endOffset)
const
760 cursor.setPosition(startOffset);
762 return cursor.selectedText();
764 return text(QAccessible::Value).
mid(startOffset, endOffset - startOffset);
767QString QAccessibleQuickItem::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
768 int *startOffset,
int *endOffset)
const
777 cursor.setPosition(boundaries.first - 1);
778 boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
780 *startOffset = boundaries.first;
781 *endOffset = boundaries.second;
783 return text(boundaries.first, boundaries.second);
785 return QAccessibleTextInterface::textBeforeOffset(
offset, boundaryType, startOffset, endOffset);
789QString QAccessibleQuickItem::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
790 int *startOffset,
int *endOffset)
const
799 cursor.setPosition(boundaries.second);
800 boundaries = QAccessible::qAccessibleTextBoundaryHelper(
cursor, boundaryType);
802 *startOffset = boundaries.first;
803 *endOffset = boundaries.second;
805 return text(boundaries.first, boundaries.second);
807 return QAccessibleTextInterface::textAfterOffset(
offset, boundaryType, startOffset, endOffset);
811QString QAccessibleQuickItem::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
812 int *startOffset,
int *endOffset)
const
822 *startOffset = boundaries.first;
823 *endOffset = boundaries.second;
824 return text(boundaries.first, boundaries.second);
826 return QAccessibleTextInterface::textAtOffset(
offset, boundaryType, startOffset, endOffset);
830void QAccessibleQuickItem::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
832 if (selectionIndex == 0) {
833 *startOffset =
item()->property(
"selectionStart").toInt();
834 *endOffset =
item()->property(
"selectionEnd").toInt();
841int QAccessibleQuickItem::selectionCount()
const
848void QAccessibleQuickItem::addSelection(
int ,
int )
852void QAccessibleQuickItem::removeSelection(
int )
856void 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.
qsizetype size() const noexcept
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
\inmodule QtCore\reentrant
constexpr QPoint toPoint() const
Rounds the coordinates of this point to the nearest integer, and returns a QPoint object with the rou...
\inmodule QtCore\reentrant
QList< QQuickItem * > paintOrderChildItems() const
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
The QQuickRenderControl class provides a mechanism for rendering the Qt Quick scenegraph onto an offs...
The QQuickTextDocument class provides access to the QTextDocument of QQuickTextEdit....
QTextDocument * textDocument() const
Returns a pointer to the QTextDocument object.
QVector< LinkDesc > getLinks() const
static QQuickTextPrivate * get(QQuickText *t)
static QQuickWindowPrivate * get(QQuickWindow *c)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
QQuickItem * contentItem
\qmlattachedproperty Item Window::contentItem
\inmodule QtCore\reentrant
bool intersects(const QRect &r) const noexcept
Returns true if this rectangle intersects with the given rectangle (i.e., there is at least one pixel...
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...
qsizetype size() const
Returns the number of characters in this string.
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
\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.
bool canConvert(QMetaType targetType) const
QSet< QString >::iterator it
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
QTextDocument * textDocument
std::pair< T1, T2 > QPair
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
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent
QT_BEGIN_NAMESPACE bool toBool(const QString &str)