added accessible rect

This commit is contained in:
Igor Korsukov 2021-05-20 20:11:04 +03:00
parent b30a63ff38
commit 1b415fe66e
9 changed files with 74 additions and 13 deletions

View file

@ -23,6 +23,7 @@
#define MU_ACCESSIBILITY_IACCESSIBILITY_H
#include <QString>
#include <QRect>
#include "async/notification.h"
namespace mu::accessibility {
@ -51,6 +52,7 @@ public:
virtual Role accessibleRole() const = 0;
virtual QString accessibleName() const = 0;
virtual bool accessibleState(State st) const = 0;
virtual QRect accessibleRect() const = 0;
};
}

View file

@ -23,6 +23,7 @@
#include <QGuiApplication>
#include <QAccessible>
#include <QWindow>
#include "accessibleobject.h"
#include "accessibleiteminterface.h"
@ -30,7 +31,7 @@
#include "async/async.h"
#include "log.h"
#define ACCESSIBILITY_LOGGING_ENABLED
//#define ACCESSIBILITY_LOGGING_ENABLED
#ifdef ACCESSIBILITY_LOGGING_ENABLED
#define MYLOG() LOGI()
@ -210,7 +211,7 @@ int AccessibilityController::childCount(const IAccessibility* item) const
IF_ASSERT_FAILED(it.isValid()) {
return 0;
}
return it.item->accessibleChildCount();
return static_cast<int>(it.item->accessibleChildCount());
}
QAccessibleInterface* AccessibilityController::child(const IAccessibility* item, int i) const
@ -295,3 +296,8 @@ bool AccessibilityController::accessibleState(State st) const
return false;
}
QRect AccessibilityController::accessibleRect() const
{
return mainWindow()->qWindow()->geometry();
}

View file

@ -31,6 +31,9 @@
#include "accessibleobject.h"
#include "async/asyncable.h"
#include "modularity/ioc.h"
#include "ui/imainwindow.h"
class QAccessibleInterface;
class QAccessibleEvent;
@ -38,6 +41,8 @@ namespace mu::accessibility {
class AccessibilityController : public IAccessibilityController, public IAccessibility, public async::Asyncable,
public std::enable_shared_from_this<AccessibilityController>
{
INJECT(accessibility, ui::IMainWindow, mainWindow)
public:
AccessibilityController() = default;
~AccessibilityController();
@ -64,6 +69,7 @@ public:
Role accessibleRole() const override;
QString accessibleName() const override;
bool accessibleState(State st) const override;
QRect accessibleRect() const override;
// -----
QAccessibleInterface* parentIface(const IAccessibility* item) const;

View file

@ -27,6 +27,14 @@
#include "log.h"
//#define ACCESSIBILITY_LOGGING_ENABLED
#ifdef ACCESSIBILITY_LOGGING_ENABLED
#define MYLOG() LOGI()
#else
#define MYLOG() LOGN()
#endif
using namespace mu::accessibility;
AccessibleItemInterface::AccessibleItemInterface(AccessibleObject* object)
@ -52,35 +60,34 @@ QWindow* AccessibleItemInterface::window() const
QRect AccessibleItemInterface::rect() const
{
NOT_IMPLEMENTED;
return QRect();
return m_object->item()->accessibleRect();
}
QAccessibleInterface* AccessibleItemInterface::parent() const
{
QAccessibleInterface* iface = m_object->controller()->parentIface(m_object->item());
LOGI() << "item: " << m_object->item()->accessibleName() << ", parent: " << (iface ? iface->text(QAccessible::Name) : "null");
MYLOG() << "item: " << m_object->item()->accessibleName() << ", parent: " << (iface ? iface->text(QAccessible::Name) : "null");
return iface;
}
int AccessibleItemInterface::childCount() const
{
int count = m_object->controller()->childCount(m_object->item());
LOGI() << "item: " << m_object->item()->accessibleName() << ", childCount: " << count;
MYLOG() << "item: " << m_object->item()->accessibleName() << ", childCount: " << count;
return count;
}
QAccessibleInterface* AccessibleItemInterface::child(int index) const
{
QAccessibleInterface* iface = m_object->controller()->child(m_object->item(), index);
LOGI() << "item: " << m_object->item()->accessibleName() << ", child: " << index << " " << iface->text(QAccessible::Name);
MYLOG() << "item: " << m_object->item()->accessibleName() << ", child: " << index << " " << iface->text(QAccessible::Name);
return iface;
}
int AccessibleItemInterface::indexOfChild(const QAccessibleInterface* iface) const
{
int idx = m_object->controller()->indexOfChild(m_object->item(), iface);
LOGI() << "item: " << m_object->item()->accessibleName() << ", indexOfChild: " << iface->text(QAccessible::Name) << " = " << idx;
MYLOG() << "item: " << m_object->item()->accessibleName() << ", indexOfChild: " << iface->text(QAccessible::Name) << " = " << idx;
return idx;
}
@ -136,8 +143,6 @@ QAccessible::Role AccessibleItemInterface::role() const
QString AccessibleItemInterface::text(QAccessible::Text textType) const
{
return m_object->item()->accessibleName();
switch (textType) {
case QAccessible::Name: return m_object->item()->accessibleName();
default: break;

View file

@ -20,6 +20,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "navigationcontrol.h"
#include <QQuickWindow>
#include "navigationpanel.h"
#include "log.h"
@ -191,3 +194,28 @@ bool NavigationControl::accessibleState(State st) const
return false;
}
QRect NavigationControl::accessibleRect() const
{
if (!m_accessibleItem || !m_accessibleItem->window()) {
return QRect();
}
QPointF scenePos = m_accessibleItem->mapToScene(QPointF(0, 0));
QPoint globalPos = m_accessibleItem->window()->mapToGlobal(scenePos.toPoint());
return QRect(globalPos.x(), globalPos.y(), m_accessibleItem->width(), m_accessibleItem->height());
}
void NavigationControl::setAccessibleItem(QQuickItem* item)
{
if (m_accessibleItem == item)
return;
m_accessibleItem = item;
emit accessibleItemChanged();
}
QQuickItem* NavigationControl::accessibleItem() const
{
return m_accessibleItem;
}

View file

@ -23,6 +23,7 @@
#define MU_UI_NAVIGATIONCONTROL_H
#include <QObject>
#include <QQuickItem>
#include "abstractnavigation.h"
#include "async/asyncable.h"
@ -33,17 +34,19 @@
namespace mu::ui {
class NavigationPanel;
class NavigationControl : public AbstractNavigation, public INavigationControl, public accessibility::IAccessibility,
public async::Asyncable
public async::Asyncable
{
Q_OBJECT
Q_PROPERTY(mu::ui::NavigationPanel* panel READ panel_property WRITE setPanel NOTIFY panelChanged)
Q_PROPERTY(QQuickItem* accessibleItem READ accessibleItem WRITE setAccessibleItem NOTIFY accessibleItemChanged)
INJECT(ui, accessibility::IAccessibilityController, accessibilityController)
public:
explicit NavigationControl(QObject* parent = nullptr);
public:
explicit NavigationControl(QObject* parent = nullptr);
~NavigationControl() override;
QQuickItem* accessibleItem() const;
NavigationPanel* panel_property() const;
INavigationPanel* panel() const override;
@ -78,13 +81,16 @@ public:
IAccessibility::Role accessibleRole() const override;
QString accessibleName() const override;
bool accessibleState(State st) const override;
QRect accessibleRect() const override;
// -----
public slots:
void setPanel(NavigationPanel* panel);
void setAccessibleItem(QQuickItem* item);
signals:
void panelChanged(NavigationPanel* panel);
void accessibleItemChanged();
void triggered();
private slots:
@ -96,6 +102,7 @@ private:
async::Channel<INavigationControl*> m_forceActiveRequested;
async::Notification m_accessibleParentChanged;
QQuickItem* m_accessibleItem = nullptr;
};
}

View file

@ -277,3 +277,8 @@ bool NavigationPanel::accessibleState(State st) const
return false;
}
QRect NavigationPanel::accessibleRect() const
{
return QRect();
}

View file

@ -95,6 +95,7 @@ public:
Role accessibleRole() const override;
QString accessibleName() const override;
bool accessibleState(State st) const override;
QRect accessibleRect() const override;
// -----
public slots:

View file

@ -49,6 +49,7 @@ RadioDelegate {
NavigationControl {
id: keynavCtrl
name: root.objectName
accessibleItem: root
onActiveChanged: {
if (keynavCtrl.active) {