Warning, file /libraries/libqaccessibilityclient/examples/accessibleapps/mainwindow.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 SPDX-FileCopyrightText: 2012 Frederik Gladhorn <gladhorn@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "mainwindow.h" 0008 0009 #include <QDialog> 0010 #include <QDockWidget> 0011 #include <QMenuBar> 0012 #include <QPointer> 0013 #include <QSettings> 0014 #include <qurl.h> 0015 #include <QClipboard> 0016 0017 #include "qaccessibilityclient/registrycache_p.h" 0018 0019 #include "accessibleproperties.h" 0020 #include "accessibletree.h" 0021 #include "eventview.h" 0022 #include "uiview.h" 0023 0024 using namespace QAccessibleClient; 0025 0026 MainWindow::MainWindow(QWidget *parent) 0027 : QMainWindow(parent) 0028 { 0029 setWindowTitle(QLatin1String("Randamizer")); 0030 m_registry = new QAccessibleClient::Registry(this); 0031 0032 initUi(); 0033 initActions(); 0034 initMenu(); 0035 0036 QSettings settings(QStringLiteral("kde.org"), QStringLiteral("kdea11yapp")); 0037 QAccessibleClient::RegistryPrivateCacheApi cache(m_registry); 0038 cache.setCacheType(QAccessibleClient::RegistryPrivateCacheApi::CacheType(settings.value(QStringLiteral("cacheStrategy"), cache.cacheType()).toInt())); 0039 restoreGeometry(settings.value(QStringLiteral("geometry")).toByteArray()); 0040 restoreState(settings.value(QStringLiteral("windowState")).toByteArray()); 0041 0042 m_eventsWidget->loadSettings(settings); 0043 0044 connect(m_registry, SIGNAL(added(QAccessibleClient::AccessibleObject)), this, SLOT(added(QAccessibleClient::AccessibleObject))); 0045 connect(m_registry, SIGNAL(removed(QAccessibleClient::AccessibleObject)), this, SLOT(removed(QAccessibleClient::AccessibleObject))); 0046 connect(m_registry, SIGNAL(defunct(QAccessibleClient::AccessibleObject)), this, SLOT(defunct(QAccessibleClient::AccessibleObject))); 0047 0048 connect(m_registry, SIGNAL(windowCreated(QAccessibleClient::AccessibleObject)), this, SLOT(windowCreated(QAccessibleClient::AccessibleObject))); 0049 connect(m_registry, SIGNAL(windowDestroyed(QAccessibleClient::AccessibleObject)), this, SLOT(windowDestroyed(QAccessibleClient::AccessibleObject))); 0050 connect(m_registry, SIGNAL(windowClosed(QAccessibleClient::AccessibleObject)), this, SLOT(windowClosed(QAccessibleClient::AccessibleObject))); 0051 connect(m_registry, SIGNAL(windowReparented(QAccessibleClient::AccessibleObject)), this, SLOT(windowReparented(QAccessibleClient::AccessibleObject))); 0052 connect(m_registry, SIGNAL(windowMinimized(QAccessibleClient::AccessibleObject)), this, SLOT(windowMinimized(QAccessibleClient::AccessibleObject))); 0053 connect(m_registry, SIGNAL(windowMaximized(QAccessibleClient::AccessibleObject)), this, SLOT(windowMaximized(QAccessibleClient::AccessibleObject))); 0054 connect(m_registry, SIGNAL(windowRestored(QAccessibleClient::AccessibleObject)), this, SLOT(windowRestored(QAccessibleClient::AccessibleObject))); 0055 connect(m_registry, SIGNAL(windowActivated(QAccessibleClient::AccessibleObject)), this, SLOT(windowActivated(QAccessibleClient::AccessibleObject))); 0056 connect(m_registry, SIGNAL(windowDeactivated(QAccessibleClient::AccessibleObject)), this, SLOT(windowDeactivated(QAccessibleClient::AccessibleObject))); 0057 connect(m_registry, SIGNAL(windowDesktopCreated(QAccessibleClient::AccessibleObject)), this, SLOT(windowDesktopCreated(QAccessibleClient::AccessibleObject))); 0058 connect(m_registry, SIGNAL(windowDesktopDestroyed(QAccessibleClient::AccessibleObject)), this, SLOT(windowDesktopDestroyed(QAccessibleClient::AccessibleObject))); 0059 connect(m_registry, SIGNAL(windowRaised(QAccessibleClient::AccessibleObject)), this, SLOT(windowRaised(QAccessibleClient::AccessibleObject))); 0060 connect(m_registry, SIGNAL(windowLowered(QAccessibleClient::AccessibleObject)), this, SLOT(windowLowered(QAccessibleClient::AccessibleObject))); 0061 connect(m_registry, SIGNAL(windowMoved(QAccessibleClient::AccessibleObject)), this, SLOT(windowMoved(QAccessibleClient::AccessibleObject))); 0062 connect(m_registry, SIGNAL(windowResized(QAccessibleClient::AccessibleObject)), this, SLOT(windowResized(QAccessibleClient::AccessibleObject))); 0063 connect(m_registry, SIGNAL(windowShaded(QAccessibleClient::AccessibleObject)), this, SLOT(windowShaded(QAccessibleClient::AccessibleObject))); 0064 connect(m_registry, SIGNAL(windowUnshaded(QAccessibleClient::AccessibleObject)), this, SLOT(windowUnshaded(QAccessibleClient::AccessibleObject))); 0065 0066 connect(m_registry, SIGNAL(stateChanged(QAccessibleClient::AccessibleObject,QString,bool)), this, SLOT(stateChanged(QAccessibleClient::AccessibleObject,QString,bool))); 0067 connect(m_registry, SIGNAL(childAdded(QAccessibleClient::AccessibleObject,int)), this, SLOT(childAdded(QAccessibleClient::AccessibleObject,int))); 0068 connect(m_registry, SIGNAL(childRemoved(QAccessibleClient::AccessibleObject,int)), this, SLOT(childRemoved(QAccessibleClient::AccessibleObject,int))); 0069 connect(m_registry, SIGNAL(visibleDataChanged(QAccessibleClient::AccessibleObject)), this, SLOT(visibleDataChanged(QAccessibleClient::AccessibleObject))); 0070 connect(m_registry, SIGNAL(selectionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(selectionChanged(QAccessibleClient::AccessibleObject))); 0071 connect(m_registry, SIGNAL(modelChanged(QAccessibleClient::AccessibleObject)), this, SLOT(modelChanged(QAccessibleClient::AccessibleObject))); 0072 0073 connect(m_registry, SIGNAL(focusChanged(QAccessibleClient::AccessibleObject)), this, SLOT(focusChanged(QAccessibleClient::AccessibleObject))); 0074 connect(m_registry, SIGNAL(textCaretMoved(QAccessibleClient::AccessibleObject,int)), this, SLOT(textCaretMoved(QAccessibleClient::AccessibleObject,int))); 0075 connect(m_registry, SIGNAL(textSelectionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(textSelectionChanged(QAccessibleClient::AccessibleObject))); 0076 0077 connect(m_registry, SIGNAL(textInserted(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textInserted(QAccessibleClient::AccessibleObject,QString,int,int))); 0078 connect(m_registry, SIGNAL(textRemoved(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textRemoved(QAccessibleClient::AccessibleObject,QString,int,int))); 0079 connect(m_registry, SIGNAL(textChanged(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textChanged(QAccessibleClient::AccessibleObject,QString,int,int))); 0080 0081 connect(m_registry, SIGNAL(accessibleNameChanged(QAccessibleClient::AccessibleObject)), this, SLOT(accessibleNameChanged(QAccessibleClient::AccessibleObject))); 0082 connect(m_registry, SIGNAL(accessibleDescriptionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(accessibleDescriptionChanged(QAccessibleClient::AccessibleObject))); 0083 0084 m_registry->subscribeEventListeners(QAccessibleClient::Registry::AllEventListeners); 0085 } 0086 0087 MainWindow::~MainWindow() 0088 { 0089 delete m_registry; 0090 } 0091 0092 void MainWindow::MainWindow::closeEvent(QCloseEvent *event) 0093 { 0094 QSettings settings(QStringLiteral("kde.org"), QStringLiteral("kdea11yapp")); 0095 settings.setValue(QStringLiteral("cacheStrategy"), int(QAccessibleClient::RegistryPrivateCacheApi(m_registry).cacheType())); 0096 settings.setValue(QStringLiteral("geometry"), saveGeometry()); 0097 settings.setValue(QStringLiteral("windowState"), saveState()); 0098 0099 m_eventsWidget->saveSettings(settings); 0100 0101 settings.sync(); 0102 0103 QMainWindow::closeEvent(event); 0104 } 0105 0106 void MainWindow::MainWindow::initActions() 0107 { 0108 m_resetTreeAction = new QAction(this); 0109 m_resetTreeAction->setText(QStringLiteral("Reset Tree")); 0110 m_resetTreeAction->setShortcut(QKeySequence(QKeySequence::Refresh)); 0111 connect(m_resetTreeAction, SIGNAL(triggered()), m_accessibleObjectTreeModel, SLOT(resetModel())); 0112 0113 m_followFocusAction = new QAction(this); 0114 m_followFocusAction->setText(QStringLiteral("Follow Focus")); 0115 m_followFocusAction->setCheckable(true); 0116 m_followFocusAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_F)); 0117 0118 m_showClientCacheAction = new QAction(this); 0119 m_showClientCacheAction->setText(QStringLiteral("Cache...")); 0120 connect(m_showClientCacheAction, SIGNAL(triggered()), this, SLOT(showClientCache())); 0121 0122 m_enableA11yAction = new QAction(this); 0123 m_enableA11yAction->setText(QStringLiteral("Enable Accessibility")); 0124 m_enableA11yAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_E)); 0125 m_enableA11yAction->setCheckable(true); 0126 m_enableA11yAction->setChecked(m_registry->isEnabled()); 0127 connect(m_registry, SIGNAL(enabledChanged(bool)), m_enableA11yAction, SLOT(setChecked(bool))); 0128 connect(m_enableA11yAction, SIGNAL(toggled(bool)), m_registry, SLOT(setEnabled(bool))); 0129 0130 m_enableScreenReaderAction = new QAction(this); 0131 m_enableScreenReaderAction->setText(QStringLiteral("Enable Screen Reader")); 0132 m_enableScreenReaderAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R)); 0133 m_enableScreenReaderAction->setCheckable(true); 0134 m_enableScreenReaderAction->setChecked(m_registry->isScreenReaderEnabled()); 0135 connect(m_registry, SIGNAL(screenReaderEnabledChanged(bool)), m_enableScreenReaderAction, SLOT(setChecked(bool))); 0136 connect(m_enableScreenReaderAction, SIGNAL(toggled(bool)), m_registry, SLOT(setScreenReaderEnabled(bool))); 0137 0138 m_quitAction = new QAction(tr("&Quit"), this); 0139 m_quitAction->setShortcuts(QKeySequence::Quit); 0140 connect(m_quitAction, SIGNAL(triggered()), this, SLOT(close())); 0141 0142 m_copyValueAction = new QAction(tr("&Copy property value"), this); 0143 m_copyValueAction->setShortcuts(QKeySequence::Copy); 0144 connect(m_copyValueAction, SIGNAL(triggered()), this, SLOT(copyValue())); 0145 } 0146 0147 void MainWindow::copyValue() 0148 { 0149 QModelIndex selected = m_propertyView->currentIndex(); 0150 0151 if (!selected.isValid()) 0152 return; 0153 0154 if (selected.column() == 0) { 0155 selected = m_propertyView->model()->index(selected.row(), 1, selected.parent()); 0156 if (!selected.isValid()) 0157 return; 0158 } 0159 0160 QGuiApplication::clipboard()->setText(selected.data(Qt::DisplayRole).toString()); 0161 } 0162 0163 void MainWindow::MainWindow::initMenu() 0164 { 0165 QMenu *fileMenu = menuBar()->addMenu(QStringLiteral("&Tree")); 0166 fileMenu->addAction(m_resetTreeAction); 0167 fileMenu->addAction(m_followFocusAction); 0168 fileMenu->addSeparator(); 0169 fileMenu->addAction(m_quitAction); 0170 0171 QMenu *editMenu = menuBar()->addMenu(QStringLiteral("&Edit")); 0172 editMenu->addAction(m_copyValueAction); 0173 0174 QMenu *settingsMenu = menuBar()->addMenu(QStringLiteral("&Settings")); 0175 QMenu *dockerMenu = settingsMenu->addMenu(QStringLiteral("Docker")); 0176 for (const QDockWidget *docker : findChildren<QDockWidget*>()) { 0177 dockerMenu->addAction(docker->toggleViewAction()); 0178 } 0179 settingsMenu->addAction(m_showClientCacheAction); 0180 settingsMenu->addSeparator(); 0181 settingsMenu->addAction(m_enableA11yAction); 0182 settingsMenu->addAction(m_enableScreenReaderAction); 0183 } 0184 0185 void MainWindow::MainWindow::initUi() 0186 { 0187 setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks); 0188 //setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North); 0189 0190 QDockWidget *treeDocker = new QDockWidget(QStringLiteral("Tree"), this); 0191 treeDocker->setObjectName(QStringLiteral("tree")); 0192 treeDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); 0193 m_accessibleObjectTreeView = new QTreeView(treeDocker); 0194 m_accessibleObjectTreeView->setAccessibleName(QStringLiteral("Tree of accessibles")); 0195 m_accessibleObjectTreeView->setAccessibleDescription(QStringLiteral("Displays a hierachical tree of accessible objects")); 0196 m_accessibleObjectTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); 0197 m_accessibleObjectTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers); 0198 m_accessibleObjectTreeView->setAlternatingRowColors(true); 0199 treeDocker->setWidget(m_accessibleObjectTreeView); 0200 0201 m_accessibleObjectTreeModel = new AccessibleTree(this); 0202 m_accessibleObjectTreeModel->setRegistry(m_registry); 0203 m_accessibleObjectTreeView->setModel(m_accessibleObjectTreeModel); 0204 m_accessibleObjectTreeView->setColumnWidth(0, 240); 0205 m_accessibleObjectTreeView->setContextMenuPolicy(Qt::CustomContextMenu); 0206 connect(m_accessibleObjectTreeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(selectionChanged(QModelIndex,QModelIndex))); 0207 connect(m_accessibleObjectTreeView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(treeCustomContextMenuRequested(QPoint))); 0208 0209 QDockWidget *propertyDocker = new QDockWidget(QStringLiteral("&Properties"), this); 0210 propertyDocker->setObjectName(QStringLiteral("properties")); 0211 propertyDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); 0212 m_propertyView = new QTreeView(propertyDocker); 0213 propertyDocker->setWidget(m_propertyView); 0214 m_propertyView->setAccessibleName(QStringLiteral("List of properties")); 0215 m_propertyView->setAccessibleDescription(QStringLiteral("Displays a the properties of the selected accessible object")); 0216 m_propertyView->setRootIsDecorated(false); 0217 m_propertyView->setItemsExpandable(true); 0218 m_propertyView->setExpandsOnDoubleClick(false); 0219 m_propertyView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::AnyKeyPressed | QAbstractItemView::EditKeyPressed); 0220 m_propertyModel = new ObjectProperties(this); 0221 m_propertyView->setModel(m_propertyModel); 0222 m_propertyView->setAlternatingRowColors(true); 0223 connect(m_propertyView, SIGNAL(doubleClicked(QModelIndex)), m_propertyModel, SLOT(doubleClicked(QModelIndex))); 0224 0225 QDockWidget *uiDocker = new QDockWidget(QStringLiteral("&Boundaries"), this); 0226 uiDocker->setObjectName(QStringLiteral("boundaries")); 0227 uiDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); 0228 m_uiview = new UiView(uiDocker); 0229 m_uiview->setAccessibleName(QStringLiteral("Boundaries")); 0230 m_uiview->setAccessibleDescription(QStringLiteral("Visualize the component boundaries")); 0231 uiDocker->setWidget(m_uiview); 0232 0233 QDockWidget *eventsDocker = new QDockWidget(QStringLiteral("E&vents"), this); 0234 eventsDocker->setObjectName(QStringLiteral("events")); 0235 eventsDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); 0236 m_eventsWidget = new EventsWidget(m_registry, eventsDocker); 0237 connect(m_eventsWidget, SIGNAL(anchorClicked(QUrl)), this, SLOT(anchorClicked(QUrl))); 0238 eventsDocker->setWidget(m_eventsWidget); 0239 0240 addDockWidget(Qt::LeftDockWidgetArea, treeDocker); 0241 addDockWidget(Qt::RightDockWidgetArea, propertyDocker); 0242 addDockWidget(Qt::RightDockWidgetArea, uiDocker); 0243 addDockWidget(Qt::RightDockWidgetArea, eventsDocker); 0244 tabifyDockWidget(uiDocker, eventsDocker); 0245 tabifyDockWidget(uiDocker, propertyDocker); 0246 0247 resize(minimumSize().expandedTo(QSize(760,520))); 0248 } 0249 0250 void MainWindow::anchorClicked(const QUrl &url) 0251 { 0252 AccessibleObject object = m_registry->accessibleFromUrl(url); 0253 setCurrentObject(object); 0254 } 0255 0256 void MainWindow::showClientCache() 0257 { 0258 QPointer<ClientCacheDialog> dlg(new ClientCacheDialog(m_registry, this)); 0259 dlg->setWindowTitle(m_showClientCacheAction->text()); 0260 if (dlg->exec() == QDialog::Accepted && dlg) { 0261 } 0262 if (dlg) 0263 dlg->deleteLater(); 0264 } 0265 0266 void MainWindow::setCurrentObject(const QAccessibleClient::AccessibleObject &object) 0267 { 0268 QModelIndex index = m_accessibleObjectTreeModel->indexForAccessible(object); 0269 if (index.isValid()) { 0270 QModelIndex other = m_accessibleObjectTreeModel->index(index.row(), index.column()+1, index.parent()); 0271 Q_ASSERT(other.isValid()); 0272 m_accessibleObjectTreeView->selectionModel()->select(QItemSelection(index, other), QItemSelectionModel::SelectCurrent); 0273 m_accessibleObjectTreeView->scrollTo(index); 0274 0275 // Unlike calling setCurrentIndex the select call aboves doe not emit the selectionChanged signal. So, do explicit. 0276 selectionChanged(index, QModelIndex()); 0277 } else { 0278 qWarning() << "No such indexForAccessible=" << object; 0279 } 0280 } 0281 0282 void MainWindow::updateDetails(const AccessibleObject &object, bool force) 0283 { 0284 if (!force && object != m_propertyModel->currentObject()) 0285 return; 0286 0287 m_propertyModel->setAccessibleObject(object); 0288 for(int r = m_propertyModel->rowCount() - 1; r >= 0; --r) 0289 m_propertyView->setExpanded(m_propertyModel->indexFromItem(m_propertyModel->item(r, 0)), true); 0290 m_propertyView->resizeColumnToContents(0); 0291 } 0292 0293 void MainWindow::stateChanged(const QAccessibleClient::AccessibleObject &object, const QString &state, bool active) 0294 { 0295 if (state == QLatin1String("focused")) { 0296 m_eventsWidget->addLog(object, EventsWidget::Focus, (active ? QStringLiteral("true") : QStringLiteral("false"))); 0297 } else { 0298 QString s = state + QStringLiteral(": ") + (active ? QStringLiteral("true") : QStringLiteral("false")); 0299 m_eventsWidget->addLog(object, EventsWidget::StateChanged, s); 0300 } 0301 updateDetails(object); 0302 } 0303 0304 void MainWindow::childAdded(const QAccessibleClient::AccessibleObject &object, int childIndex) 0305 { 0306 updateDetails(object); 0307 m_eventsWidget->addLog(object, EventsWidget::Object, QLatin1String("ChildAdded ") + QString::number(childIndex)); 0308 } 0309 0310 void MainWindow::childRemoved(const QAccessibleClient::AccessibleObject &object, int childIndex) 0311 { 0312 updateDetails(object); 0313 m_eventsWidget->addLog(object, EventsWidget::Object, QLatin1String("ChildRemoved ") + QString::number(childIndex)); 0314 } 0315 0316 void MainWindow::visibleDataChanged(const QAccessibleClient::AccessibleObject &object) 0317 { 0318 updateDetails(object); 0319 m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("VisibleDataChanged")); 0320 } 0321 0322 void MainWindow::selectionChanged(const QAccessibleClient::AccessibleObject &object) 0323 { 0324 updateDetails(object); 0325 m_eventsWidget->addLog(object, EventsWidget::Table, QStringLiteral("SelectionChanged")); 0326 } 0327 0328 void MainWindow::modelChanged(const QAccessibleClient::AccessibleObject &object) 0329 { 0330 updateDetails(object); 0331 m_eventsWidget->addLog(object, EventsWidget::Table, QStringLiteral("ModelChanged")); 0332 } 0333 0334 void MainWindow::selectionChanged(const QModelIndex& current, const QModelIndex&) 0335 { 0336 QAccessibleClient::AccessibleObject acc; 0337 if (current.isValid() && current.internalPointer()) { 0338 acc = static_cast<AccessibleWrapper*>(current.internalPointer())->acc; 0339 } 0340 m_uiview->setAccessibleObject(acc); 0341 updateDetails(acc, true); 0342 } 0343 0344 void MainWindow::treeCustomContextMenuRequested(const QPoint &pos) 0345 { 0346 QModelIndex current = m_accessibleObjectTreeView->currentIndex(); 0347 if (!current.isValid()) 0348 return; 0349 QAccessibleClient::AccessibleObject acc = static_cast<AccessibleWrapper*>(current.internalPointer())->acc; 0350 QMenu *menu = new QMenu(this); 0351 connect(menu, SIGNAL(aboutToHide()), menu, SLOT(deleteLater())); 0352 for (const QSharedPointer<QAction> &a : acc.actions()) { 0353 menu->addAction(a.data()); 0354 } 0355 menu->popup(m_accessibleObjectTreeView->mapToGlobal(pos)); 0356 } 0357 0358 void MainWindow::added(const QAccessibleClient::AccessibleObject &object) 0359 { 0360 m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("Add Object")); 0361 m_accessibleObjectTreeModel->addAccessible(object); 0362 } 0363 0364 void MainWindow::removed(const QAccessibleClient::AccessibleObject &object) 0365 { 0366 m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("RemoveObject")); 0367 m_accessibleObjectTreeModel->removeAccessible(object); 0368 } 0369 0370 void MainWindow::defunct(const QAccessibleClient::AccessibleObject &object) 0371 { 0372 removed(object); 0373 } 0374 0375 void MainWindow::windowCreated(const QAccessibleClient::AccessibleObject &object) 0376 { 0377 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("Create")); 0378 m_accessibleObjectTreeModel->addAccessible(object); 0379 } 0380 0381 void MainWindow::windowDestroyed(const QAccessibleClient::AccessibleObject &object) 0382 { 0383 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("Destroy")); 0384 if (!m_accessibleObjectTreeModel->removeAccessible(object)) { 0385 // assume the app has gone 0386 m_accessibleObjectTreeModel->updateTopLevelApps(); 0387 } 0388 } 0389 0390 void MainWindow::windowClosed(const QAccessibleClient::AccessibleObject &object) 0391 { 0392 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowClose")); 0393 } 0394 0395 void MainWindow::windowReparented(const QAccessibleClient::AccessibleObject &object) 0396 { 0397 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowReparent")); 0398 } 0399 0400 void MainWindow::windowMinimized(const QAccessibleClient::AccessibleObject &object) 0401 { 0402 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMinimize")); 0403 } 0404 0405 void MainWindow::windowMaximized(const QAccessibleClient::AccessibleObject &object) 0406 { 0407 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMaximize")); 0408 } 0409 0410 void MainWindow::windowRestored(const QAccessibleClient::AccessibleObject &object) 0411 { 0412 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowRestore")); 0413 } 0414 0415 void MainWindow::windowActivated(const QAccessibleClient::AccessibleObject &object) 0416 { 0417 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowActivate")); 0418 } 0419 0420 void MainWindow::windowDeactivated(const QAccessibleClient::AccessibleObject &object) 0421 { 0422 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDeactivate")); 0423 } 0424 0425 void MainWindow::windowDesktopCreated(const QAccessibleClient::AccessibleObject &object) 0426 { 0427 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDesktopCreate")); 0428 } 0429 0430 void MainWindow::windowDesktopDestroyed(const QAccessibleClient::AccessibleObject &object) 0431 { 0432 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDesktopDestroy")); 0433 } 0434 0435 void MainWindow::windowRaised(const QAccessibleClient::AccessibleObject &object) 0436 { 0437 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowRaise")); 0438 } 0439 0440 void MainWindow::windowLowered(const QAccessibleClient::AccessibleObject &object) 0441 { 0442 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowLower")); 0443 } 0444 0445 void MainWindow::windowMoved(const QAccessibleClient::AccessibleObject &object) 0446 { 0447 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMove")); 0448 } 0449 0450 void MainWindow::windowResized(const QAccessibleClient::AccessibleObject &object) 0451 { 0452 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowResize")); 0453 } 0454 0455 void MainWindow::windowShaded(const QAccessibleClient::AccessibleObject &object) 0456 { 0457 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowShade")); 0458 } 0459 0460 void MainWindow::windowUnshaded(const QAccessibleClient::AccessibleObject &object) 0461 { 0462 m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowUnshade")); 0463 } 0464 0465 void MainWindow::focusChanged(const QAccessibleClient::AccessibleObject &object) 0466 { 0467 if (m_followFocusAction->isChecked()) { 0468 // We need to block the focus for the treeView while setting the current item 0469 // to prevent that setting that item would change focus to the treeView. 0470 Qt::FocusPolicy prevFocusPolicy = m_accessibleObjectTreeView->focusPolicy(); 0471 m_accessibleObjectTreeView->setFocusPolicy(Qt::NoFocus); 0472 0473 setCurrentObject(object); 0474 0475 m_accessibleObjectTreeView->setFocusPolicy(prevFocusPolicy); 0476 } else { 0477 updateDetails(object); 0478 } 0479 } 0480 0481 void MainWindow::MainWindow::textCaretMoved(const QAccessibleClient::AccessibleObject &object, int pos) 0482 { 0483 updateDetails(object); 0484 m_eventsWidget->addLog(object, EventsWidget::Text, QStringLiteral("Text caret moved (%1)").arg(pos)); 0485 } 0486 0487 void MainWindow::MainWindow::textSelectionChanged(const QAccessibleClient::AccessibleObject &object) 0488 { 0489 updateDetails(object); 0490 m_eventsWidget->addLog(object, EventsWidget::Text, QStringLiteral("TextSelectionChanged")); 0491 } 0492 0493 QString descriptionForText(const QString& type, const QString& text, int startOffset, int endOffset) 0494 { 0495 QString shortText = text; 0496 if (shortText.length() > 50) { 0497 shortText.truncate(50); 0498 shortText.append(QLatin1String("...")); 0499 } 0500 QString desc = QStringLiteral("Text %1 (%2, %3): \"%4\"").arg(type).arg(QString::number(startOffset)).arg(QString::number(endOffset)).arg(shortText); 0501 return desc; 0502 } 0503 0504 void MainWindow::textChanged(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset) 0505 { 0506 updateDetails(object); 0507 m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("changed"), text, startOffset, endOffset)); 0508 } 0509 0510 void MainWindow::textInserted(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset) 0511 { 0512 updateDetails(object); 0513 m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("inserted"), text, startOffset, endOffset)); 0514 } 0515 0516 void MainWindow::textRemoved(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset) 0517 { 0518 updateDetails(object); 0519 m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("removed"), text, startOffset, endOffset)); 0520 } 0521 0522 void MainWindow::accessibleNameChanged(const QAccessibleClient::AccessibleObject &object) 0523 { 0524 updateDetails(object); 0525 m_eventsWidget->addLog(object, EventsWidget::NameChanged); 0526 m_accessibleObjectTreeModel->updateAccessible(object); 0527 } 0528 0529 void MainWindow::accessibleDescriptionChanged(const QAccessibleClient::AccessibleObject &object) 0530 { 0531 updateDetails(object); 0532 m_eventsWidget->addLog(object, EventsWidget::DescriptionChanged); 0533 m_accessibleObjectTreeModel->updateAccessible(object); 0534 } 0535 0536 #include "moc_mainwindow.cpp"