From b3227815332e72f06e34e9f4d69c213ac9f4546c Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Fri, 7 Feb 2025 17:27:24 +0000 Subject: [PATCH 1/5] Percussion panel - use dispatcher to write notes --- .../view/percussionpanel/percussionpanelmodel.cpp | 12 ++++-------- .../view/percussionpanel/percussionpanelmodel.h | 2 ++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.cpp b/src/notation/view/percussionpanel/percussionpanelmodel.cpp index e035fb5bf92e8..dd375ad91f0a9 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelmodel.cpp @@ -452,17 +452,13 @@ void PercussionPanelModel::writePitch(int pitch) return; } - undoStack->prepareChanges(muse::TranslatableString("undoableAction", "Enter percussion note")); - interaction()->noteInput()->startNoteInput(configuration()->defaultNoteInputMethod(), /*focusNotation*/ false); - score()->addMidiPitch(pitch, false, /*transpose*/ false); - undoStack->commitChanges(); + NoteInputParams params; + params.drumPitch = pitch; - const mu::engraving::InputState& inputState = score()->inputState(); - if (inputState.cr()) { - interaction()->showItem(inputState.cr()); - } + const ActionData args = ActionData::make_arg2(params, NoteAddingMode::NextChord); + dispatcher()->dispatch("note-action", args); } void PercussionPanelModel::playPitch(int pitch) diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.h b/src/notation/view/percussionpanel/percussionpanelmodel.h index d7ee970f73e5d..f9e8494a5a924 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.h +++ b/src/notation/view/percussionpanel/percussionpanelmodel.h @@ -109,6 +109,8 @@ class PercussionPanelModel : public QObject, public muse::Injectable, public mus void padListModelChanged(); private: + using ActionData = muse::actions::ActionData; + void setUpConnections(); void setDrumset(mu::engraving::Drumset* drumset); From da116bc1848dbc9372f86e2b50fb206a8a79d2b2 Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Fri, 14 Feb 2025 12:30:28 +0000 Subject: [PATCH 2/5] Percussion panel - add support for different NoteAddingModes --- .../internal/PercussionPanelPadContent.qml | 4 ++-- .../percussionpanel/percussionpanelmodel.cpp | 20 +++++++++++++------ .../percussionpanel/percussionpanelmodel.h | 4 ++-- .../percussionpanelpadmodel.cpp | 12 +++++++++-- .../percussionpanel/percussionpanelpadmodel.h | 6 ++++-- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml b/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml index 164509d4a18c5..b139a50c8cf07 100644 --- a/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml +++ b/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml @@ -57,14 +57,14 @@ Column { enabled: mainContentArea.enabled hoverEnabled: true - onPressed: { + onPressed: function(event) { ui.tooltip.hide(root) if (!Boolean(root.padModel)) { return } - root.padModel.triggerPad() + root.padModel.triggerPad(event.modifiers) } onContainsMouseChanged: { diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.cpp b/src/notation/view/percussionpanel/percussionpanelmodel.cpp index dd375ad91f0a9..03892ef6d0d39 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelmodel.cpp @@ -42,6 +42,12 @@ using namespace muse; using namespace ui; using namespace mu::notation; +static const std::unordered_map WRITE_ACTION_MAP = { + { PercussionPanelPadModel::PadAction::TRIGGER_STANDARD, NoteAddingMode::NextChord }, + { PercussionPanelPadModel::PadAction::TRIGGER_ADD, NoteAddingMode::CurrentChord }, + { PercussionPanelPadModel::PadAction::TRIGGER_INSERT, NoteAddingMode::InsertChord } +}; + PercussionPanelModel::PercussionPanelModel(QObject* parent) : QObject(parent) { @@ -278,8 +284,10 @@ void PercussionPanelModel::setUpConnections() m_padListModel->padActionRequested().onReceive(this, [this](PercussionPanelPadModel::PadAction action, int pitch) { switch (action) { - case PercussionPanelPadModel::PadAction::TRIGGER: - onPadTriggered(pitch); + case PercussionPanelPadModel::PadAction::TRIGGER_STANDARD: + case PercussionPanelPadModel::PadAction::TRIGGER_ADD: + case PercussionPanelPadModel::PadAction::TRIGGER_INSERT: + onPadTriggered(pitch, action); break; case PercussionPanelPadModel::PadAction::DUPLICATE: onDuplicatePadRequested(pitch); @@ -361,11 +369,11 @@ bool PercussionPanelModel::eventFilter(QObject* watched, QEvent* event) return true; } -void PercussionPanelModel::onPadTriggered(int pitch) +void PercussionPanelModel::onPadTriggered(int pitch, const PercussionPanelPadModel::PadAction& action) { switch (currentPanelMode()) { case PanelMode::Mode::EDIT_LAYOUT: return; - case PanelMode::Mode::WRITE: writePitch(pitch); // fall through + case PanelMode::Mode::WRITE: writePitch(pitch, WRITE_ACTION_MAP.at(action)); // fall through case PanelMode::Mode::SOUND_PREVIEW: playPitch(pitch); default: break; } @@ -445,7 +453,7 @@ void PercussionPanelModel::onDefinePadShortcutRequested(int pitch) undoStack->commitChanges(); } -void PercussionPanelModel::writePitch(int pitch) +void PercussionPanelModel::writePitch(int pitch, const NoteAddingMode& addingMode) { INotationUndoStackPtr undoStack = notation()->undoStack(); if (!interaction() || !undoStack) { @@ -457,7 +465,7 @@ void PercussionPanelModel::writePitch(int pitch) NoteInputParams params; params.drumPitch = pitch; - const ActionData args = ActionData::make_arg2(params, NoteAddingMode::NextChord); + const ActionData args = ActionData::make_arg2(params, addingMode); dispatcher()->dispatch("note-action", args); } diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.h b/src/notation/view/percussionpanel/percussionpanelmodel.h index f9e8494a5a924..14b48b2110333 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.h +++ b/src/notation/view/percussionpanel/percussionpanelmodel.h @@ -119,12 +119,12 @@ class PercussionPanelModel : public QObject, public muse::Injectable, public mus bool eventFilter(QObject* watched, QEvent* event) override; - void onPadTriggered(int pitch); + void onPadTriggered(int pitch, const PercussionPanelPadModel::PadAction& action); void onDuplicatePadRequested(int pitch); void onDeletePadRequested(int pitch); void onDefinePadShortcutRequested(int pitch); - void writePitch(int pitch); + void writePitch(int pitch, const NoteAddingMode& addingMode); void playPitch(int pitch); void resetLayout(); diff --git a/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp b/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp index 4f7c5240524d2..6e4ebe36a456a 100644 --- a/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp @@ -115,7 +115,15 @@ void PercussionPanelPadModel::handleMenuItem(const QString& itemId) } } -void PercussionPanelPadModel::triggerPad() +void PercussionPanelPadModel::triggerPad(const Qt::KeyboardModifiers& mods) { - m_padActionTriggered.send(PadAction::TRIGGER); + PadAction action = PadAction::TRIGGER_STANDARD; + + if (mods & Qt::ShiftModifier && (mods & Qt::ControlModifier || mods & Qt::MetaModifier)) { + action = PadAction::TRIGGER_INSERT; + } else if (mods & Qt::ShiftModifier) { + action = PadAction::TRIGGER_ADD; + } + + m_padActionTriggered.send(action); } diff --git a/src/notation/view/percussionpanel/percussionpanelpadmodel.h b/src/notation/view/percussionpanel/percussionpanelpadmodel.h index 9ed63728fc363..a21b9969bc8dc 100644 --- a/src/notation/view/percussionpanel/percussionpanelpadmodel.h +++ b/src/notation/view/percussionpanel/percussionpanelpadmodel.h @@ -67,10 +67,12 @@ class PercussionPanelPadModel : public QObject, public muse::async::Asyncable QList footerContextMenuItems() const; Q_INVOKABLE void handleMenuItem(const QString& itemId); - Q_INVOKABLE void triggerPad(); + Q_INVOKABLE void triggerPad(const Qt::KeyboardModifiers& modifiers); enum class PadAction { - TRIGGER, + TRIGGER_STANDARD, + TRIGGER_ADD, + TRIGGER_INSERT, DUPLICATE, DELETE, DEFINE_SHORTCUT, From 29fecd5461eeda69b923cb6dc42fc0a2dfff081b Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Fri, 7 Feb 2025 18:16:39 +0000 Subject: [PATCH 3/5] Percussion panel - fix bug adding notes over inst change --- .../view/percussionpanel/percussionpanelmodel.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.cpp b/src/notation/view/percussionpanel/percussionpanelmodel.cpp index 03892ef6d0d39..6255bc251a345 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelmodel.cpp @@ -372,9 +372,12 @@ bool PercussionPanelModel::eventFilter(QObject* watched, QEvent* event) void PercussionPanelModel::onPadTriggered(int pitch, const PercussionPanelPadModel::PadAction& action) { switch (currentPanelMode()) { - case PanelMode::Mode::EDIT_LAYOUT: return; - case PanelMode::Mode::WRITE: writePitch(pitch, WRITE_ACTION_MAP.at(action)); // fall through - case PanelMode::Mode::SOUND_PREVIEW: playPitch(pitch); + case PanelMode::Mode::WRITE: + writePitch(pitch, WRITE_ACTION_MAP.at(action)); + break; + case PanelMode::Mode::SOUND_PREVIEW: + playPitch(pitch); + break; default: break; } } From 4ede47b49cd7875ecfbaa9c7d766959f15159fa4 Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Fri, 7 Feb 2025 20:29:28 +0000 Subject: [PATCH 4/5] Percussion panel - pad context menu tweaks --- .../internal/PercussionPanelPadContent.qml | 9 +++++++++ .../view/percussionpanel/percussionpanelpadmodel.cpp | 10 ++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml b/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml index b139a50c8cf07..c07366de460d6 100644 --- a/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml +++ b/src/notation/qml/MuseScore/NotationScene/internal/PercussionPanelPadContent.qml @@ -57,6 +57,8 @@ Column { enabled: mainContentArea.enabled hoverEnabled: true + acceptedButtons: Qt.LeftButton | Qt.RightButton + onPressed: function(event) { ui.tooltip.hide(root) @@ -64,6 +66,11 @@ Column { return } + if (event.button === Qt.RightButton) { + root.openFooterContextMenu() + return + } + root.padModel.triggerPad(event.modifiers) } @@ -168,6 +175,8 @@ Column { anchors.fill: parent enabled: root.panelMode !== PanelMode.EDIT_LAYOUT + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: { root.openFooterContextMenu() } diff --git a/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp b/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp index 6e4ebe36a456a..3bd4c57aa7652 100644 --- a/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelpadmodel.cpp @@ -83,22 +83,20 @@ const QVariant PercussionPanelPadModel::notationPreviewItemVariant() const QList PercussionPanelPadModel::footerContextMenuItems() const { + static constexpr int definePadShortcutIcon = static_cast(IconCode::Code::SHORTCUTS); // static constexpr int duplicatePadIcon = static_cast(IconCode::Code::COPY); static constexpr int deletePadIcon = static_cast(IconCode::Code::DELETE_TANK); - static constexpr int definePadShortcutIcon = static_cast(IconCode::Code::SHORTCUTS); QList menuItems = { + { { "id", DEFINE_PAD_SHORTCUT_CODE }, { "title", muse::qtrc("shortcuts", "Define keyboard shortcut") }, + { "icon", definePadShortcutIcon }, { "enabled", true } }, + //! NOTE: Disabled for now - will be re-introduced with new percussion mapping system... // { { "id", DUPLICATE_PAD_CODE }, { "title", muse::qtrc("global", "Duplicate") }, // { "icon", duplicatePadIcon }, { "enabled", true } }, { { "id", DELETE_PAD_CODE }, { "title", muse::qtrc("global", "Delete") }, { "icon", deletePadIcon }, { "enabled", true } }, - - { }, // separator - - { { "id", DEFINE_PAD_SHORTCUT_CODE }, { "title", muse::qtrc("shortcuts", "Define keyboard shortcut") }, - { "icon", definePadShortcutIcon }, { "enabled", true } }, }; return menuItems; From 50ae2c55baafc5ad86ad780dfa81aaec4d32b690 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Fri, 14 Feb 2025 20:24:50 +0100 Subject: [PATCH 5/5] Code review fix --- src/notation/view/percussionpanel/percussionpanelmodel.cpp | 3 ++- src/notation/view/percussionpanel/percussionpanelmodel.h | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.cpp b/src/notation/view/percussionpanel/percussionpanelmodel.cpp index 6255bc251a345..ce1c6936dc39b 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.cpp +++ b/src/notation/view/percussionpanel/percussionpanelmodel.cpp @@ -39,7 +39,8 @@ static const QString EDIT_LAYOUT_CODE("percussion-edit-layout"); static const QString RESET_LAYOUT_CODE("percussion-reset-layout"); using namespace muse; -using namespace ui; +using namespace muse::actions; +using namespace muse::ui; using namespace mu::notation; static const std::unordered_map WRITE_ACTION_MAP = { diff --git a/src/notation/view/percussionpanel/percussionpanelmodel.h b/src/notation/view/percussionpanel/percussionpanelmodel.h index 14b48b2110333..04b838a02824b 100644 --- a/src/notation/view/percussionpanel/percussionpanelmodel.h +++ b/src/notation/view/percussionpanel/percussionpanelmodel.h @@ -109,8 +109,6 @@ class PercussionPanelModel : public QObject, public muse::Injectable, public mus void padListModelChanged(); private: - using ActionData = muse::actions::ActionData; - void setUpConnections(); void setDrumset(mu::engraving::Drumset* drumset);