Implemented accessibility for menu

This commit is contained in:
Eism 2021-08-25 15:55:11 +02:00
parent 932ca4a2a9
commit 524d8367cf
14 changed files with 96 additions and 3 deletions

View file

@ -26,6 +26,7 @@ import MuseScore.UiComponents 1.0
import MuseScore.AppShell 1.0
ListView {
id: root
property alias navigation: navPanel
@ -33,6 +34,8 @@ ListView {
width: contentWidth
orientation: Qt.Horizontal
interactive: false
model: appMenuModel.items
AppMenuModel {
@ -52,6 +55,8 @@ ListView {
NavigationPanel {
id: navPanel
name: "AppMenuBar"
enabled: root.enabled && root.visible
accessible.name: qsTrc("appshell", "App menu bar") + " " + navPanel.directionInfo
}
delegate: FlatButton {
@ -65,8 +70,12 @@ ListView {
hoveredStateColor: ui.theme.accentColor
text: Boolean(item) ? item.title : ""
navigation.name: text
navigation.panel: navPanel
navigation.order: index
navigation.accessible.name: {
return text.replace('&', '')
}
mouseArea.onContainsMouseChanged: {
if (!mouseArea.containsMouse || !prv.showedMenu ||
@ -98,6 +107,8 @@ ListView {
StyledMenuLoader {
id: menuLoader
navigation: radioButtonDelegate.navigation
onHandleMenuItem: {
Qt.callLater(appMenuModel.handleMenuItem, item.id)
}

View file

@ -41,6 +41,12 @@ Rectangle {
id: navSec
name: "AppTitleBar"
order: 0
onActiveChanged: {
if (active) {
root.forceActiveFocus()
}
}
}
Item {
@ -82,10 +88,23 @@ Rectangle {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
NavigationPanel {
id: navAppControlPanel
name: "AppControl"
section: navSec
order: 1
accessible.name: qsTrc("appshell", "App control") + " " + navAppControlPanel.directionInfo
}
FlatButton {
icon: IconCode.MINUS
normalStateColor: "transparent"
navigation.name: "AppControl"
navigation.panel: navAppControlPanel
navigation.order: 1
accessible.name: qsTrc("appshell", "Minimize")
onClicked: {
root.showWindowMinimizedRequested()
}
@ -95,6 +114,11 @@ Rectangle {
icon: IconCode.SPLIT_OUT_ARROWS
normalStateColor: "transparent"
navigation.name: "AppControl"
navigation.panel: navAppControlPanel
navigation.order: 2
accessible.name: qsTrc("appshell", "Maximize") // todo
onClicked: {
root.toggleWindowMaximizedRequested()
}
@ -106,6 +130,11 @@ Rectangle {
pressedStateColor: "red"
hoveredStateColor: "red"
navigation.name: "AppControl"
navigation.panel: navAppControlPanel
navigation.order: 3
accessible.name: qsTrc("appshell", "Quit")
onClicked: {
root.closeWindowRequested()
}

View file

@ -102,6 +102,10 @@ QVariant NotationStatusBarModel::currentViewMode() const
QVariantList NotationStatusBarModel::availableViewModeList() const
{
if (!notation()) {
return {};
}
static const QMap<ViewMode, ActionCode> allModeMap {
{ ViewMode::PAGE, "view-mode-page" },
{ ViewMode::LINE, "view-mode-continuous" },
@ -122,6 +126,8 @@ QVariantList NotationStatusBarModel::availableViewModeList() const
QVariantList result;
ViewMode currentViewMode = notation()->viewMode();
for (const ViewMode& viewMode: allModeMap.keys()) {
ActionCode code = allModeMap[viewMode];
UiAction action = actionsRegister()->action(code);
@ -131,6 +137,8 @@ QVariantList NotationStatusBarModel::availableViewModeList() const
viewModeObj[ID_KEY] = QString::fromStdString(code);
viewModeObj[TITLE_KEY] = correctedTitle(viewMode, action.title);
viewModeObj[ICON_KEY] = static_cast<int>(action.iconCode);
viewModeObj[SELECTABLE_KEY] = true;
viewModeObj[SELECTED_KEY] = currentViewMode == viewMode;
result << viewModeObj;
}
@ -170,10 +178,12 @@ void NotationStatusBarModel::load()
}
emit currentViewModeChanged();
emit availableViewModeListChanged();
emit zoomEnabledChanged();
notation()->notationChanged().onNotify(this, [this]() {
emit currentViewModeChanged();
emit availableViewModeListChanged();
});
listenChangesInAccessibility();

View file

@ -84,7 +84,7 @@ FocusScope {
enabled: root.enabled && root.visible
accessible.role: MUAccessible.Button
accessible.name: root.text
accessible.name: Boolean(root.text) ? root.text : root.toolTipTitle
accessible.visualItem: root
onTriggered: {

View file

@ -45,6 +45,8 @@ FocusableControl {
Accessible.selectable: true
Accessible.selected: isSelected
navigation.accessible.role: MUAccessible.ListItem
background.color: normalStateColor
background.opacity: root.enabled ? 1 : ui.theme.itemOpacityDisabled

View file

@ -48,6 +48,8 @@ FlatButton {
StyledMenuLoader {
id: menuLoader
navigation: root.navigation
onHandleMenuItem: {
root.handleMenuItem(item)
}

View file

@ -57,6 +57,26 @@ ListItemBlank {
isSelected: Boolean(itemPrv.showedSubMenu) || (itemPrv.isSelectable && itemPrv.isSelected) || navigation.active
navigation.name: titleLabel.text
navigation.accessible.name: {
var text = titleLabel.text
if (itemPrv.isCheckable) {
text += " " + (itemPrv.isChecked ? qsTrc("appshell", "checked") : qsTrc("appshell", "not checked"))
} else if (itemPrv.isSelectable) {
text += " " + (itemPrv.isSelected ? qsTrc("appshell", "selected") : qsTrc("appshell", "not selected"))
}
if (itemPrv.hasShortcut) {
text += " " + itemPrv.shortcut
}
if (itemPrv.hasSubMenu) {
text += " " + qsTrc("appshell", "menu")
}
return text.replace('&', '')
}
navigation.onNavigationEvent: {
switch (event.type) {
case NavigationEvent.Right:
@ -100,6 +120,7 @@ ListItemBlank {
id: itemPrv
property bool hasShortcut: Boolean(modelData) && Boolean(modelData.shortcut)
property string shortcut: hasShortcut ? modelData.shortcut : ""
property bool hasSubMenu: Boolean(modelData) && Boolean(modelData.subitems) && modelData.subitems.length > 0
property var showedSubMenu: null
@ -237,9 +258,9 @@ ListItemBlank {
StyledTextLabel {
id: shortcutLabel
Layout.alignment: Qt.AlignRight
text: itemPrv.hasShortcut ? modelData.shortcut : ""
text: itemPrv.shortcut
horizontalAlignment: Text.AlignRight
visible: !isEmpty || (root.reserveSpaceForShortcutOrSubmenuIndicator)
visible: !itemPrv.hasShortcut || (root.reserveSpaceForShortcutOrSubmenuIndicator)
}
StyledIconLabel {

View file

@ -31,6 +31,8 @@ Loader {
property bool isMenuOpened: Boolean(loader.menu) && loader.menu.isOpened
property var navigation: null
QtObject {
id: prv
@ -56,6 +58,8 @@ Loader {
}
menu.anchorItem = menuAnchorItem
menu.navigationParentControl = loader.navigation
update(model, x, y)
menu.open()
}

View file

@ -195,6 +195,8 @@ FocusScope {
StyledMenuLoader {
id: contextMenuLoader
navigation: navPanel
onHandleMenuItem: function (item) {
contextMenuModel.handleMenuItem(item.id)
}

View file

@ -170,6 +170,9 @@ Rectangle {
StyledMenuLoader {
id: menuLoader
navigation: btn.navigation
onHandleMenuItem: function(item) {
noteInputModel.handleMenuItem(item.id)
}

View file

@ -71,6 +71,8 @@ FlatButton {
menuAnchorItem: ui.rootItem
navigation: root.navigation
onHandleMenuItem: {
Qt.callLater(root.changeCurrentViewModeRequested, item.id)
}

View file

@ -122,6 +122,8 @@ RowLayout {
menuAnchorItem: ui.rootItem
navigation: menuButton.navigation
onHandleMenuItem: {
root.changeZoomRequested(item.id)
}

View file

@ -623,6 +623,8 @@ GridView {
property var modelIndex: null
property bool canEdit: true
navigation: paletteCell.navigation
property var items: [
{ id: "delete", title: qsTrc("palette", "Delete"), icon: IconCode.DELETE_TANK, enabled: contextMenu.canEdit },
{ id: "properties", title: qsTrc("palette", "Properties…"), enabled: contextMenu.canEdit }

View file

@ -127,6 +127,9 @@ Rectangle {
StyledMenuLoader {
id: menuLoader
navigation: btn.navigation
onHandleMenuItem: playbackModel.handleMenuItem(item.id)
}
}