added accessible rect
This commit is contained in:
parent
b30a63ff38
commit
1b415fe66e
9 changed files with 74 additions and 13 deletions
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -277,3 +277,8 @@ bool NavigationPanel::accessibleState(State st) const
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
QRect NavigationPanel::accessibleRect() const
|
||||
{
|
||||
return QRect();
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -49,6 +49,7 @@ RadioDelegate {
|
|||
NavigationControl {
|
||||
id: keynavCtrl
|
||||
name: root.objectName
|
||||
accessibleItem: root
|
||||
|
||||
onActiveChanged: {
|
||||
if (keynavCtrl.active) {
|
||||
|
|
Loading…
Reference in a new issue