Files
qt4-x11/tools/accessibilityinspector/accessibilityinspector.cpp
2025-08-24 20:55:26 +08:00

150 lines
4.8 KiB
C++

#include "accessibilityinspector.h"
#include "screenreader.h"
#include "optionswidget.h"
#include "accessibilityscenemanager.h"
#ifdef QT_ACCESSIBILITY_INSPECTOR_SCENE_GRAPH
#include <qsgview.h>
#include <qsgitem.h>
#endif
#include <qdeclarativeitem.h>
void MouseInterceptingGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
emit mousePressed(event->scenePos().toPoint());
QGraphicsScene::mousePressEvent(event);
}
void MouseInterceptingGraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
emit mouseDobleClicked();
QGraphicsScene::mouseDoubleClickEvent(event);
}
AccessibilitySceneManager *sceneManager = 0;
QAccessible::UpdateHandler previousUpdateHandler = 0;
bool updateHandlerRecursion = false;
void accessibilityUpdateHandler(QObject *object, int who, QAccessible::Event reason)
{
if (updateHandlerRecursion)
return;
if (
#ifdef QT_ACCESSIBILITY_INSPECTOR_SCENE_GRAPH
!qobject_cast<QSGItem *>(object) &&
#endif
!qobject_cast<QDeclarativeItem *>(object))
return;
updateHandlerRecursion = true;
if (sceneManager) {
sceneManager->handleUpdate(object, reason);
//qDebug() << "update";
}
if (previousUpdateHandler) // call prev just to be sure.
previousUpdateHandler(object, who, reason);
updateHandlerRecursion = false;
}
AccessibilityInspector::AccessibilityInspector(QObject *parent) :
QObject(parent)
{
}
AccessibilityInspector::~AccessibilityInspector()
{
delete optionsWidget;
delete accessibilityScene;
delete accessibilityView;
delete accessibilityTreeScene;
delete accessibilityTreeView;
delete screenReader;
}
void AccessibilityInspector::inspectWindow(QWidget *window)
{
optionsWidget = new OptionsWidget();
accessibilityScene = new MouseInterceptingGraphicsScene();
accessibilityView = new QGraphicsView();
accessibilityView->setScene(accessibilityScene);
accessibilityView->resize(1024, 768);
accessibilityView->scale(1.3, 1.3);
accessibilityTreeScene = new QGraphicsScene();
accessibilityTreeView = new QGraphicsView();
accessibilityTreeView->setScene(accessibilityTreeScene);
accessibilityTreeView->resize(1024, 768);
sceneManager = new AccessibilitySceneManager();
QObject::connect(optionsWidget, SIGNAL(optionsChanged()), sceneManager, SLOT(updateAccessibilitySceneItemFlags()));
QObject::connect(optionsWidget, SIGNAL(refreshClicked()), sceneManager, SLOT(populateAccessibilityScene()));
QObject::connect(optionsWidget, SIGNAL(refreshClicked()), sceneManager, SLOT(populateAccessibilityTreeScene()));
QObject::connect(optionsWidget, SIGNAL(scaleChanged(int)), sceneManager, SLOT(changeScale(int)));
sceneManager->setOptionsWidget(optionsWidget);
sceneManager->setRootWidget(window);
sceneManager->setScene(accessibilityScene);
sceneManager->setView(accessibilityView);
sceneManager->setTreeScene(accessibilityTreeScene);
sceneManager->setTreeView(accessibilityTreeView);
screenReader = new ScreenReader;
QObject::connect(accessibilityScene, SIGNAL(mousePressed(QPoint)), screenReader, SLOT(touchPoint(QPoint)));
QObject::connect(accessibilityScene, SIGNAL(mouseDobleClicked()), screenReader, SLOT(activate()));
QObject::connect(screenReader, SIGNAL(selected(QObject*)), sceneManager, SLOT(setSelected(QObject*)));
screenReader->setRootObject(window);
screenReader->setOptionsWidget(optionsWidget);
previousUpdateHandler = QAccessible::installUpdateHandler(accessibilityUpdateHandler);
QTimer::singleShot(100, sceneManager, SLOT(populateAccessibilityScene()));
QTimer::singleShot(100, sceneManager, SLOT(populateAccessibilityTreeScene()));
QSettings settings;
accessibilityView->restoreGeometry(settings.value("accessiblityGeometry").toByteArray());
accessibilityView->show();
accessibilityTreeView->restoreGeometry(settings.value("treeGeometry").toByteArray());
accessibilityTreeView->show();
optionsWidget->restoreGeometry(settings.value("optionsGeometry").toByteArray());
optionsWidget->show();
}
void AccessibilityInspector::saveWindowGeometry()
{
QSettings settings;
settings.setValue("accessiblityGeometry", accessibilityView->saveGeometry());
settings.setValue("treeGeometry", accessibilityTreeView->saveGeometry());
settings.setValue("optionsGeometry", optionsWidget->saveGeometry());
}
QString translateRole(QAccessible::Role role)
{
if (role == 0x2B)
return "PushButton";
if (role == 0x2C)
return "CheckBox";
if (role == 0x2D)
return "RadioButton";
if (role == 0xA)
return "Client";
if (role == 0x29)
return "Static Text";
if (role == 0x33)
return "Slider";
if (role == 0x33)
return "Slider";
if (role == 0x10)
return "Pane";
return QString::number(role, 16);
}