From 19f3e41645fefc8843954cae3500280c11933ab5 Mon Sep 17 00:00:00 2001 From: Eism Date: Fri, 16 Sep 2022 12:27:24 +0200 Subject: [PATCH] fixed #12966: Added voicing for changing note input mode --- .../accessibility/accessibleitem.cpp | 4 +++- .../accessibility/accessibleroot.cpp | 14 +++++++++++ src/engraving/accessibility/accessibleroot.h | 4 ++++ .../internal/accessibilitycontroller.cpp | 6 ++++- src/notation/inotationaccessibility.h | 2 ++ .../internal/notationaccessibility.cpp | 11 +++++++++ src/notation/internal/notationaccessibility.h | 2 ++ .../internal/notationactioncontroller.cpp | 24 +++++++++++++++++-- .../internal/notationactioncontroller.h | 18 +++++++++----- 9 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/engraving/accessibility/accessibleitem.cpp b/src/engraving/accessibility/accessibleitem.cpp index 2ea3bb36da9c8..0c083afcc0924 100644 --- a/src/engraving/accessibility/accessibleitem.cpp +++ b/src/engraving/accessibility/accessibleitem.cpp @@ -184,12 +184,14 @@ QString AccessibleItem::accessibleName() const } AccessibleRoot* root = accessibleRoot(); + QString commandInfo = root ? root->commandInfo() : ""; QString staffInfo = root ? root->staffInfo() : ""; QString barsAndBeats = m_element->formatBarsAndBeats(); barsAndBeats.remove(u';'); // Too many pauses in speech - QString name = QString("%1%2%3%4") + QString name = QString("%1%2%3%4%5") + .arg(!commandInfo.isEmpty() ? (commandInfo + "; ") : "") .arg(!staffInfo.isEmpty() ? (staffInfo + "; ") : "") .arg(m_element->screenReaderInfo().toQString()) .arg(m_element->visible() ? "" : " " + qtrc("engraving", "invisible")) diff --git a/src/engraving/accessibility/accessibleroot.cpp b/src/engraving/accessibility/accessibleroot.cpp index 8baac3a5c7252..b81c94aa52f91 100644 --- a/src/engraving/accessibility/accessibleroot.cpp +++ b/src/engraving/accessibility/accessibleroot.cpp @@ -152,6 +152,20 @@ void AccessibleRoot::updateStaffInfo(const AccessibleItemWeakPtr newAccessibleIt } } +QString AccessibleRoot::commandInfo() const +{ + return m_commandInfo; +} + +void AccessibleRoot::setCommandInfo(const QString& command) +{ + m_commandInfo = command; + + if (!m_commandInfo.isEmpty()) { + notifyAboutFocusedElementNameChanged(); + } +} + void AccessibleRoot::setMapToScreenFunc(const AccessibleMapToScreenFunc& func) { m_accessibleMapToScreenFunc = func; diff --git a/src/engraving/accessibility/accessibleroot.h b/src/engraving/accessibility/accessibleroot.h index 247cae1271db4..0e4cd580e6679 100644 --- a/src/engraving/accessibility/accessibleroot.h +++ b/src/engraving/accessibility/accessibleroot.h @@ -54,6 +54,9 @@ class AccessibleRoot : public AccessibleItem void updateStaffInfo(const AccessibleItemWeakPtr newAccessibleItem, const AccessibleItemWeakPtr oldAccessibleItem, bool voiceStaffInfoChange = true); + QString commandInfo() const; + void setCommandInfo(const QString& command); + private: bool m_enabled = false; @@ -63,6 +66,7 @@ class AccessibleRoot : public AccessibleItem AccessibleMapToScreenFunc m_accessibleMapToScreenFunc; QString m_staffInfo; + QString m_commandInfo; }; } diff --git a/src/framework/accessibility/internal/accessibilitycontroller.cpp b/src/framework/accessibility/internal/accessibilitycontroller.cpp index 526ffb14fe01b..34ef6431e5136 100644 --- a/src/framework/accessibility/internal/accessibilitycontroller.cpp +++ b/src/framework/accessibility/internal/accessibilitycontroller.cpp @@ -331,11 +331,15 @@ void AccessibilityController::triggerRevoicingOfChangedName(IAccessible* item) return; } + const IAccessible* itemPanel = panel(item); + if (!itemPanel) { + return; + } + m_ignorePanelChangingVoice = true; item->setState(State::Focused, false); - const IAccessible* itemPanel = panel(item); IAccessible* tmpFocusedItem = findSiblingItem(itemPanel, item); if (!tmpFocusedItem) { tmpFocusedItem = const_cast(itemPanel); diff --git a/src/notation/inotationaccessibility.h b/src/notation/inotationaccessibility.h index d67a42649a4be..7f7418458c4fd 100644 --- a/src/notation/inotationaccessibility.h +++ b/src/notation/inotationaccessibility.h @@ -39,6 +39,8 @@ class INotationAccessibility virtual void setMapToScreenFunc(const mu::engraving::AccessibleMapToScreenFunc& func) = 0; virtual void setEnabled(bool enabled) = 0; + + virtual void setTriggeredCommand(const std::string& command) = 0; }; using INotationAccessibilityPtr = std::shared_ptr; diff --git a/src/notation/internal/notationaccessibility.cpp b/src/notation/internal/notationaccessibility.cpp index 622d5894eaeb9..0533eeb2e9ae8 100644 --- a/src/notation/internal/notationaccessibility.cpp +++ b/src/notation/internal/notationaccessibility.cpp @@ -46,6 +46,7 @@ NotationAccessibility::NotationAccessibility(const Notation* notation) : m_getScore(notation) { notation->interaction()->selectionChanged().onNotify(this, [this]() { + setTriggeredCommand(""); updateAccessibilityInfo(); }); @@ -111,6 +112,16 @@ void NotationAccessibility::setEnabled(bool enabled) #endif } +void NotationAccessibility::setTriggeredCommand(const std::string& command) +{ +#ifndef ENGRAVING_NO_ACCESSIBILITY + score()->rootItem()->accessible()->accessibleRoot()->setCommandInfo(QString::fromStdString(command)); + score()->dummy()->rootItem()->accessible()->accessibleRoot()->setCommandInfo(QString::fromStdString(command)); +#else + UNUSED(command) +#endif +} + void NotationAccessibility::updateAccessibilityInfo() { if (!score()) { diff --git a/src/notation/internal/notationaccessibility.h b/src/notation/internal/notationaccessibility.h index 6d46453ce6ca9..71393947028f8 100644 --- a/src/notation/internal/notationaccessibility.h +++ b/src/notation/internal/notationaccessibility.h @@ -48,6 +48,8 @@ class NotationAccessibility : public INotationAccessibility, public async::Async void setEnabled(bool enabled) override; + void setTriggeredCommand(const std::string& command) override; + private: const engraving::Score* score() const; const engraving::Selection* selection() const; diff --git a/src/notation/internal/notationactioncontroller.cpp b/src/notation/internal/notationactioncontroller.cpp index 273a73ccd8dad..61ceb2c9c9766 100644 --- a/src/notation/internal/notationactioncontroller.cpp +++ b/src/notation/internal/notationactioncontroller.cpp @@ -28,6 +28,7 @@ #include "libmscore/note.h" #include "libmscore/text.h" +#include "translation.h" #include "log.h" using namespace mu::io; @@ -589,6 +590,16 @@ mu::async::Notification NotationActionController::currentNotationStyleChanged() return currentNotationStyle() ? currentNotationStyle()->styleChanged() : async::Notification(); } +INotationAccessibilityPtr NotationActionController::currentNotationAccessibility() const +{ + auto notation = currentNotation(); + if (!notation) { + return nullptr; + } + + return notation->accessibility(); +} + void NotationActionController::resetState() { TRACEFUNC; @@ -603,7 +614,7 @@ void NotationActionController::resetState() } if (noteInput->isNoteInputMode()) { - noteInput->endNoteInput(); + toggleNoteInput(); return; } @@ -635,6 +646,15 @@ void NotationActionController::toggleNoteInput() } else { noteInput->startNoteInput(); } + + auto notationAccessibility = currentNotationAccessibility(); + if (!notationAccessibility) { + return; + } + + ui::UiActionState state = actionRegister()->actionState("note-input"); + std::string stateTitle = state.checked ? trc("notation", "Note input mode") : trc("notation", "Normal mode"); + notationAccessibility->setTriggeredCommand(stateTitle); } void NotationActionController::toggleNoteInputMethod(NoteInputMethod method) @@ -648,7 +668,7 @@ void NotationActionController::toggleNoteInputMethod(NoteInputMethod method) if (!noteInput->isNoteInputMode()) { noteInput->startNoteInput(); } else if (noteInput->state().method == method) { - noteInput->endNoteInput(); + toggleNoteInput(); return; } diff --git a/src/notation/internal/notationactioncontroller.h b/src/notation/internal/notationactioncontroller.h index 1c46939dc0cd0..8e72a04d819e9 100644 --- a/src/notation/internal/notationactioncontroller.h +++ b/src/notation/internal/notationactioncontroller.h @@ -22,23 +22,27 @@ #ifndef MU_NOTATION_NOTATIONACTIONCONTROLLER_H #define MU_NOTATION_NOTATIONACTIONCONTROLLER_H -#include "modularity/ioc.h" -#include "actions/iactionsdispatcher.h" +#include "async/asyncable.h" #include "actions/actionable.h" #include "actions/actiontypes.h" -#include "async/asyncable.h" + +#include "modularity/ioc.h" +#include "iinteractive.h" +#include "actions/iactionsdispatcher.h" +#include "ui/iuiactionsregister.h" #include "context/iglobalcontext.h" #include "context/iuicontextresolver.h" -#include "inotation.h" -#include "iinteractive.h" #include "playback/iplaybackcontroller.h" -#include "inotationconfiguration.h" #include "engraving/iengravingconfiguration.h" +#include "inotationconfiguration.h" + +#include "inotation.h" namespace mu::notation { class NotationActionController : public actions::Actionable, public async::Asyncable { INJECT(notation, actions::IActionsDispatcher, dispatcher) + INJECT(notation, ui::IUiActionsRegister, actionRegister) INJECT(notation, context::IGlobalContext, globalContext) INJECT(notation, context::IUiContextResolver, uiContextResolver) INJECT(notation, framework::IInteractive, interactive) @@ -61,6 +65,8 @@ class NotationActionController : public actions::Actionable, public async::Async INotationStylePtr currentNotationStyle() const; async::Notification currentNotationStyleChanged() const; + INotationAccessibilityPtr currentNotationAccessibility() const; + using EngravingDebuggingOptions = engraving::IEngravingConfiguration::DebuggingOptions; static const std::unordered_map engravingDebuggingActions;