Implemented accessibility for menu
This commit is contained in:
parent
932ca4a2a9
commit
524d8367cf
14 changed files with 96 additions and 3 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -48,6 +48,8 @@ FlatButton {
|
|||
StyledMenuLoader {
|
||||
id: menuLoader
|
||||
|
||||
navigation: root.navigation
|
||||
|
||||
onHandleMenuItem: {
|
||||
root.handleMenuItem(item)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -195,6 +195,8 @@ FocusScope {
|
|||
StyledMenuLoader {
|
||||
id: contextMenuLoader
|
||||
|
||||
navigation: navPanel
|
||||
|
||||
onHandleMenuItem: function (item) {
|
||||
contextMenuModel.handleMenuItem(item.id)
|
||||
}
|
||||
|
|
|
@ -170,6 +170,9 @@ Rectangle {
|
|||
|
||||
StyledMenuLoader {
|
||||
id: menuLoader
|
||||
|
||||
navigation: btn.navigation
|
||||
|
||||
onHandleMenuItem: function(item) {
|
||||
noteInputModel.handleMenuItem(item.id)
|
||||
}
|
||||
|
|
|
@ -71,6 +71,8 @@ FlatButton {
|
|||
|
||||
menuAnchorItem: ui.rootItem
|
||||
|
||||
navigation: root.navigation
|
||||
|
||||
onHandleMenuItem: {
|
||||
Qt.callLater(root.changeCurrentViewModeRequested, item.id)
|
||||
}
|
||||
|
|
|
@ -122,6 +122,8 @@ RowLayout {
|
|||
|
||||
menuAnchorItem: ui.rootItem
|
||||
|
||||
navigation: menuButton.navigation
|
||||
|
||||
onHandleMenuItem: {
|
||||
root.changeZoomRequested(item.id)
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -127,6 +127,9 @@ Rectangle {
|
|||
|
||||
StyledMenuLoader {
|
||||
id: menuLoader
|
||||
|
||||
navigation: btn.navigation
|
||||
|
||||
onHandleMenuItem: playbackModel.handleMenuItem(item.id)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue