4#ifndef ACCESSIBLEINTERFACE_H
5#define ACCESSIBLEINTERFACE_H
8#include <QAccessibleWidget>
16#include <QApplication>
21inline QString getAccessibleName(QWidget *w, QAccessible::Role r,
const QString &fallback)
23 const QString lowerFallback = fallback.toLower();
25 static QMap< QObject *, QString > objnameMap;
26 if (!objnameMap[w].isEmpty())
29 static QMap< QAccessible::Role, QList< QString > > accessibleMap;
30 QString oldAccessName = w->accessibleName().toLower();
31 oldAccessName.replace(SEPARATOR,
"");
34 QMetaEnum metaEnum = QMetaEnum::fromType<QAccessible::Role>();
35 QByteArray prefix = metaEnum.valueToKeys(r);
37 case QAccessible::Form: prefix =
"Form";
break;
38 case QAccessible::Button: prefix =
"Btn";
break;
39 case QAccessible::StaticText: prefix =
"Label";
break;
40 case QAccessible::EditableText: prefix =
"Editable";
break;
41 case QAccessible::Slider: prefix =
"Slider";
break;
46 QString accessibleName = QString::fromLatin1(prefix) + SEPARATOR;
47 accessibleName += oldAccessName.isEmpty() ? lowerFallback : oldAccessName;
49 if (accessibleMap[r].contains(accessibleName)) {
51 int pos = accessibleName.indexOf(SEPARATOR);
52 int id = accessibleName.mid(pos + 1).toInt();
54 QString newAccessibleName;
57 newAccessibleName = accessibleName + SEPARATOR + QString::number(++
id);
58 }
while (accessibleMap[r].contains(newAccessibleName));
60 accessibleMap[r].append(newAccessibleName);
61 objnameMap.insert(w, newAccessibleName);
63 QObject::connect(w, &QWidget::destroyed, [ = ] (QObject *obj) {
64 objnameMap.remove(obj);
65 accessibleMap[r].removeOne(newAccessibleName);
67 return newAccessibleName;
69 accessibleMap[r].append(accessibleName);
70 objnameMap.insert(w, accessibleName);
72 QObject::connect(w, &QWidget::destroyed, [ = ] (QObject *obj) {
73 objnameMap.remove(obj);
74 accessibleMap[r].removeOne(accessibleName);
76 return accessibleName;
81#define FUNC_CREATE(classname,accessibletype,accessdescription) Accessible##classname(classname *w) \
82 : QAccessibleWidget(w,accessibletype,#classname)\
84 , m_description(accessdescription)\
87#define FUNC_TEXT(classname,accessiblename) inline QString Accessible##classname::text(QAccessible::Text t) const{\
89 case QAccessible::Name:\
90 return getAccessibleName(m_w, this->role(), accessiblename);\
91 case QAccessible::Description:\
92 return m_description;\
99#define FUNC_ACTIONNAMES(classname) inline QStringList Accessible##classname::actionNames() const{\
100 if(!m_w->isEnabled())\
101 return QStringList();\
102 return QStringList() << pressAction()<< showMenuAction();\
105#define FUNC_DOACTION(classname) inline void Accessible##classname::doAction(const QString &actionName){\
106 if(actionName == pressAction())\
108 QPointF localPos = m_w->geometry().center();\
109 QMouseEvent event(QEvent::MouseButtonPress,localPos,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);\
110 qApp->sendEvent(m_w,&event);\
111 QMouseEvent eventr(QEvent::MouseButtonRelease,localPos,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);\
112 qApp->sendEvent(m_w,&eventr);\
114 else if(actionName == showMenuAction())\
116 QPointF localPos = m_w->geometry().center();\
117 QMouseEvent event(QEvent::MouseButtonPress,localPos,Qt::RightButton,Qt::RightButton,Qt::NoModifier);\
118 qApp->sendEvent(m_w,&event);\
123#define FUNC_TEXT_(classname) inline QString Accessible##classname::text(int startOffset, int endOffset) const{\
124 Q_UNUSED(startOffset)\
129#define FUNC_CHILD_LABLE(classname) inline QAccessibleInterface *Accessible##classname::child(int index) const{\
130 return QAccessibleWidget::child(index);\
134#define FUNC_DELETETEXT(classname) inline void Accessible##classname::deleteText(int startOffset, int endOffset) {\
135 m_w->setText(m_w->text().remove(startOffset, endOffset - startOffset));\
138#define FUNC_INSERTTEXT(classname) inline void Accessible##classname::insertText(int startOffset, const QString &text) {\
139 m_w->setText(m_w->text().insert(startOffset, text));\
142#define FUNC_REPLACETEXT(classname) inline void Accessible##classname::replaceText(int startOffset, int endOffset, const QString &text) {\
143 m_w->setText(m_w->text().replace(startOffset, endOffset - startOffset, text));\
146#define FUNC_CHILD_EDITABLE(classname) QAccessibleInterface *Accessible##classname::child(int index) const{\
150#define FUNC_SELECTION(classname) inline void Accessible##classname::selection(int selectionIndex, int *startOffset, int *endOffset) const {\
151 m_w->setSelection(*startOffset, *endOffset);\
152 *startOffset = *endOffset = 0;\
153 if (selectionIndex != 0)\
155 *startOffset = m_w->selectionStart();\
156 *endOffset = *startOffset + m_w->selectedText().count();\
159#define FUNC_SELECTIONCOUNT(classname) inline int Accessible##classname::selectionCount() const {\
160 return m_w->hasSelectedText() ? 1 : 0;\
163#define FUNC_ADDSELECTION(classname) inline void Accessible##classname::addSelection(int startOffset, int endOffset) {\
164 setSelection(0, startOffset, endOffset);\
167#define FUNC_REMOVESELECTION(classname) inline void Accessible##classname::removeSelection(int selectionIndex) {\
168 if (selectionIndex != 0)\
173#define FUNC_SETSELECTION(classname) inline void Accessible##classname::setSelection(int selectionIndex, int startOffset, int endOffset) {\
174 if (selectionIndex != 0)\
176 m_w->setSelection(startOffset, endOffset - startOffset);\
179#define FUNC_CURORPOSITION(classname) inline int Accessible##classname::cursorPosition() const {\
180 return m_w->cursorPosition();\
183#define FUNC_SETCURORPOSITION(classname) inline void Accessible##classname::setCursorPosition(int position) {\
184 m_w->setCursorPosition(position);\
187#define FUNC_TEXT_LineEdit(classname) inline QString Accessible##classname::text(int startOffset, int endOffset) const{\
188 if (startOffset > endOffset)\
190 if (m_w->echoMode() != QLineEdit::Normal)\
192 return m_w->text().mid(startOffset, endOffset - startOffset);\
195#define FUNC_TEXTBEFOREOFFSET(classname) QString Accessible##classname::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\
196 if (m_w->echoMode() != QLineEdit::Normal) {\
197 *startOffset = *endOffset = -1;\
201 offset = cursorPosition();\
202 return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);\
205#define FUNC_TEXTAFTEROFFSET(classname) QString Accessible##classname::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\
206 if (lineEdit()->echoMode() != QLineEdit::Normal) {\
207 *startOffset = *endOffset = -1;\
211 offset = cursorPosition();\
212 return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);\
215#define FUNC_TEXTATOFFSET(classname) QString Accessible##classname::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\
216 if (m_w->echoMode() != QLineEdit::Normal) {\
217 *startOffset = *endOffset = -1;\
221 offset = cursorPosition();\
222 return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);\
225#define FUNC_CHARACTERCOUNT(classname) inline int Accessible##classname::characterCount() const {\
226 return m_w->text().count();\
229#define FUNC_CHARACTERRECT(classname) inline QRect Accessible##classname::characterRect(int offset) const {\
234#define FUNC_OFFSETATPOINT(classname) inline int Accessible##classname::offsetAtPoint(const QPoint &point) const {\
235 QPoint p = m_w->mapFromGlobal(point);\
236 return m_w->cursorPositionAt(p);\
239#define FUNC_SCROLLTOSUBSTRING(classname) inline void Accessible##classname::scrollToSubstring(int startIndex, int endIndex) {\
240 m_w->setCursorPosition(endIndex);\
241 m_w->setCursorPosition(startIndex);\
244#define FUNC_ATTRIBUTES(classname) inline QString Accessible##classname::attributes(int offset, int *startOffset, int *endOffset) const {\
245 *startOffset = *endOffset = offset;\
250#define FUNC_CURRENTVALUE(classname) inline QVariant Accessible##classname::currentValue() const{\
251 return m_w->value();\
254#define FUNC_SETCURRENTVALUE(classname) inline void Accessible##classname::setCurrentValue(const QVariant &value){\
255 return m_w->setValue(value.toInt());\
258#define FUNC_MAXMUMVALUE(classname) inline QVariant Accessible##classname::maximumValue() const{\
259 return QVariant(m_w->maximum());\
262#define FUNC_FUNC_MINIMUMVALUE(classname) inline QVariant Accessible##classname::minimumValue() const{\
263 return QVariant(m_w->minimum());\
266#define FUNC_FUNC_MINIMUMSTEPSIZE(classname) inline QVariant Accessible##classname::minimumStepSize() const{\
267 return QVariant(m_w->singleStep());\
270#define SET_FORM_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget\
273 FUNC_CREATE(classname,QAccessible::Form,accessdescription)\
274 QString text(QAccessible::Text t) const override;\
275 void *interface_cast(QAccessible::InterfaceType t) override{\
277 case QAccessible::ActionInterface:\
278 return static_cast<QAccessibleActionInterface*>(this);\
285 QString m_description;\
287 FUNC_TEXT(classname,accessiblename)\
289#define SET_BUTTON_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget\
292 FUNC_CREATE(classname,QAccessible::Button,accessdescription)\
293 QString text(QAccessible::Text t) const override;\
294 void *interface_cast(QAccessible::InterfaceType t) override{\
296 case QAccessible::ActionInterface:\
297 return static_cast<QAccessibleActionInterface*>(this);\
302 QStringList actionNames() const override;\
303 void doAction(const QString &actionName) override;\
306 QString m_description;\
308 FUNC_TEXT(classname,accessiblename)\
309 FUNC_ACTIONNAMES(classname)\
310 FUNC_DOACTION(classname)\
312#define SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,type,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleTextInterface\
315 FUNC_CREATE(classname,type,accessdescription)\
316 QString text(QAccessible::Text t) const override;\
317 void *interface_cast(QAccessible::InterfaceType t) override{\
319 case QAccessible::ActionInterface:\
320 return static_cast<QAccessibleActionInterface*>(this);\
321 case QAccessible::TextInterface:\
322 return static_cast<QAccessibleTextInterface*>(this);\
327 QAccessibleInterface *child(int index) const override;\
328 QString text(int startOffset, int endOffset) const override;\
329 void selection(int selectionIndex, int *startOffset, int *endOffset) const override {\
330 Q_UNUSED(selectionIndex)\
331 Q_UNUSED(startOffset)\
334 int selectionCount() const override { return 0; }\
335 void addSelection(int startOffset, int endOffset) override {\
336 Q_UNUSED(startOffset)\
339 void removeSelection(int selectionIndex) override {\
340 Q_UNUSED(selectionIndex)\
342 void setSelection(int selectionIndex, int startOffset, int endOffset) override {\
343 Q_UNUSED(selectionIndex)\
344 Q_UNUSED(startOffset)\
347 int cursorPosition() const override { return 0; }\
348 void setCursorPosition(int position) override {\
351 int characterCount() const override { return 0; }\
352 QRect characterRect(int offset) const override { \
356 int offsetAtPoint(const QPoint &point) const override { \
360 void scrollToSubstring(int startIndex, int endIndex) override {\
361 Q_UNUSED(startIndex)\
364 QString attributes(int offset, int *startOffset, int *endOffset) const override {\
365 Q_UNUSED(startOffset)\
372 QString m_description;\
374 FUNC_TEXT(classname,accessiblename)\
375 FUNC_TEXT_(classname)\
377#define SET_SLIDER_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleValueInterface\
380 FUNC_CREATE(classname,QAccessible::Slider,accessdescription)\
381 QString text(QAccessible::Text t) const override;\
382 void *interface_cast(QAccessible::InterfaceType t) override{\
384 case QAccessible::ActionInterface:\
385 return static_cast<QAccessibleActionInterface*>(this);\
386 case QAccessible::ValueInterface:\
387 return static_cast<QAccessibleValueInterface*>(this);\
392 QVariant currentValue() const override;\
393 void setCurrentValue(const QVariant &value) override;\
394 QVariant maximumValue() const override;\
395 QVariant minimumValue() const override;\
396 QVariant minimumStepSize() const override { return QVariant(); }\
399 QString m_description;\
401 FUNC_TEXT(classname,accessiblename)\
402 FUNC_CURRENTVALUE(classname)\
403 FUNC_SETCURRENTVALUE(classname)\
404 FUNC_MAXMUMVALUE(classname)\
405 FUNC_FUNC_MINIMUMVALUE(classname)\
407#define SET_EDITABLE_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleEditableTextInterface, public QAccessibleTextInterface\
410 FUNC_CREATE(classname,QAccessible::EditableText,accessdescription)\
411 QString text(QAccessible::Text t) const override;\
412 QAccessibleInterface *child(int index) const override { \
416 void *interface_cast(QAccessible::InterfaceType t) override{\
418 case QAccessible::ActionInterface:\
419 return static_cast<QAccessibleActionInterface*>(this);\
420 case QAccessible::TextInterface:\
421 return static_cast<QAccessibleTextInterface*>(this);\
422 case QAccessible::EditableTextInterface:\
423 return static_cast<QAccessibleEditableTextInterface*>(this);\
428 QAccessible::State state() const override {\
429 QAccessible::State state;\
433 QString text(int startOffset, int endOffset) const override;\
434 void selection(int selectionIndex, int *startOffset, int *endOffset) const override;\
435 int selectionCount() const override;\
436 void addSelection(int startOffset, int endOffset) override;\
437 void removeSelection(int selectionIndex) override;\
438 void setSelection(int selectionIndex, int startOffset, int endOffset) override;\
439 int cursorPosition() const override;\
440 void setCursorPosition(int position) override;\
441 int characterCount() const override;\
442 QRect characterRect(int offset) const override;\
443 int offsetAtPoint(const QPoint &point) const override;\
444 void scrollToSubstring(int startIndex, int endIndex) override;\
445 QString attributes(int offset, int *startOffset, int *endOffset) const override;\
446 void insertText(int offset, const QString &text) override;\
447 void deleteText(int startOffset, int endOffset) override;\
448 void replaceText(int startOffset, int endOffset, const QString &text) override;\
451 QString m_description;\
453 FUNC_TEXT(classname,accessiblename)\
454 FUNC_TEXT_LineEdit(classname)\
455 FUNC_DELETETEXT(classname)\
456 FUNC_INSERTTEXT(classname)\
457 FUNC_REPLACETEXT(classname)\
458 FUNC_SELECTION(classname)\
459 FUNC_SELECTIONCOUNT(classname)\
460 FUNC_ADDSELECTION(classname)\
461 FUNC_REMOVESELECTION(classname)\
462 FUNC_SETSELECTION(classname)\
463 FUNC_CURORPOSITION(classname)\
464 FUNC_SETCURORPOSITION(classname)\
465 FUNC_CHARACTERCOUNT(classname)\
466 FUNC_CHARACTERRECT(classname)\
467 FUNC_OFFSETATPOINT(classname)\
468 FUNC_SCROLLTOSUBSTRING(classname)\
469 FUNC_ATTRIBUTES(classname)\
471#define USE_ACCESSIBLE(classnamestring,classname) if (classnamestring == QLatin1String(#classname) && object && object->isWidgetType())\
473 interface = new Accessible##classname(static_cast<classname *>(object));\
477#define USE_ACCESSIBLE_BY_OBJECTNAME(classnamestring,classname,objectname) if (classnamestring == QLatin1String(#classname) && object && (object->objectName() == objectname) && object->isWidgetType())\
479 interface = new Accessible##classname(static_cast<classname *>(object));\
489 virtual QAccessibleInterface* createObject(QObject *
object) = 0;
498#define FactoryMacro(Key,ClassName)\
499class FactoryAccessible##ClassName :public AccessibleFactoryBase\
502 static AccessibleFactoryBase* s_Accessible##ClassName##instance;\
504 virtual QAccessibleInterface* createObject(QObject *object) override\
505 { return new Accessible##ClassName(static_cast<ClassName *>(object));}\
507inline AccessibleFactoryBase* FactoryAccessible##ClassName::s_Accessible##ClassName##instance = AccessibleFactoryManager::RegisterAccessibleFactory(Key, new FactoryAccessible##ClassName());
510#define SET_FORM_ACCESSIBLE(classname,accessiblename) SET_FORM_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\
511FactoryMacro(#classname, classname)
513#define SET_BUTTON_ACCESSIBLE(classname,accessiblename) SET_BUTTON_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\
514FactoryMacro(#classname, classname)
516#define SET_LABEL_ACCESSIBLE(classname,accessiblename) SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,QAccessible::StaticText,"") \
517FUNC_CHILD_LABLE(classname)\
518FactoryMacro(#classname, classname)
520#define SET_DTK_EDITABLE_ACCESSIBLE(classname,accessiblename) SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,QAccessible::EditableText,"") \
521FUNC_CHILD_EDITABLE(classname)\
522FactoryMacro(#classname, classname)
524#define SET_SLIDER_ACCESSIBLE(classname,accessiblename) SET_SLIDER_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\
525FactoryMacro(#classname, classname)
527#define SET_EDITABLE_ACCESSIBLE(classname,accessiblename) SET_EDITABLE_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\
528FactoryMacro(#classname, classname)
Definition accessibleinterface.h:485
Definition accessibleinterface.h:493