From 05d267c11eb8ea1054e9daf5fe0ef85bc48c318a Mon Sep 17 00:00:00 2001 From: "J.G" Date: Tue, 1 Oct 2024 04:12:34 +0000 Subject: [PATCH] New Command: [Next/Previous Staff] without traversing voices. --- libmscore/cmd.cpp | 10 ++++++++++ libmscore/navigate.cpp | 23 ++++++++++++++++++----- libmscore/score.h | 4 ++-- mscore/scoreview.cpp | 2 ++ mscore/shortcut.cpp | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/libmscore/cmd.cpp b/libmscore/cmd.cpp index af2d67811ea4f..ae0e1dd38ca85 100644 --- a/libmscore/cmd.cpp +++ b/libmscore/cmd.cpp @@ -2616,6 +2616,16 @@ Element* Score::move(const QString& cmd) if (noteEntryMode()) _is.moveInputPos(el); } + else if (cmd == "next-staff" && cr) { + el = nextTrack(cr, true); + if (noteEntryMode()) + _is.moveInputPos(el); + } + else if (cmd == "prev-staff" && cr) { + el = prevTrack(cr, true); + if (noteEntryMode()) + _is.moveInputPos(el); + } else if (cmd == "top-staff") { el = cr ? cmdTopStaff(cr) : cmdTopStaff(); if (noteEntryMode()) diff --git a/libmscore/navigate.cpp b/libmscore/navigate.cpp index acee160595691..060438a1cf1e0 100644 --- a/libmscore/navigate.cpp +++ b/libmscore/navigate.cpp @@ -439,7 +439,7 @@ ChordRest* Score::downStaff(ChordRest* cr) // that contains such an element //--------------------------------------------------------- -ChordRest* Score::nextTrack(ChordRest* cr) +ChordRest* Score::nextTrack(ChordRest* cr, bool skipVoices) { if (!cr) return 0; @@ -452,9 +452,16 @@ ChordRest* Score::nextTrack(ChordRest* cr) while (!el) { // find next non-empty track while (++track < tracks) { - if (measure->hasVoice(track)) + if (skipVoices) { + // Disregard voices and directly refer to next staff + if ((track % 4) != 0) + continue; + break; + } + else if (measure->hasVoice(track)) break; } + // no more tracks, return original element if (track == tracks) return cr; @@ -475,7 +482,7 @@ ChordRest* Score::nextTrack(ChordRest* cr) // that contains such an element //--------------------------------------------------------- -ChordRest* Score::prevTrack(ChordRest* cr) +ChordRest* Score::prevTrack(ChordRest* cr, bool skipVoices) { if (!cr) return 0; @@ -486,8 +493,14 @@ ChordRest* Score::prevTrack(ChordRest* cr) while (!el) { // find next non-empty track - while (--track >= 0){ - if (measure->hasVoice(track)) + while (--track >= 0) { + if (skipVoices) { + // Disregard voices and directly refer to previous staff + if ((track % 4) != 0) + continue; + break; + } + else if (measure->hasVoice(track)) break; } // no more tracks, return original element diff --git a/libmscore/score.h b/libmscore/score.h index c23194ae581a9..ba2da0312ad4e 100644 --- a/libmscore/score.h +++ b/libmscore/score.h @@ -501,8 +501,8 @@ class Score : public QObject, public ScoreElement { Note* getSelectedNote(); ChordRest* upStaff(ChordRest* cr); ChordRest* downStaff(ChordRest* cr); - ChordRest* nextTrack(ChordRest* cr); - ChordRest* prevTrack(ChordRest* cr); + ChordRest* nextTrack(ChordRest* cr, bool skipVoices=false); + ChordRest* prevTrack(ChordRest* cr, bool skipVoices=false); void padToggle(Pad p, const EditData& ed); void addTempo(); diff --git a/mscore/scoreview.cpp b/mscore/scoreview.cpp index 1aed3dc88c379..340337d95e154 100644 --- a/mscore/scoreview.cpp +++ b/mscore/scoreview.cpp @@ -2416,6 +2416,8 @@ void ScoreView::cmd(const char* s) "prev-chord", "next-track", "prev-track", + "next-staff", + "prev-staff", "next-measure", "prev-measure", "next-system", diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 764a7d181daf9..1802a967f24ac 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -1128,6 +1128,13 @@ Shortcut Shortcut::_sc[] = { QT_TRANSLATE_NOOP("action","Previous Staff or Voice"), QT_TRANSLATE_NOOP("action","Previous staff or voice") }, + { + MsWidget::SCORE_TAB, + STATE_NORMAL | STATE_NOTE_ENTRY, + "prev-staff", + QT_TRANSLATE_NOOP("action","Previous Staff"), + QT_TRANSLATE_NOOP("action","Previous staff") + }, { MsWidget::SCORE_TAB, STATE_NORMAL | STATE_NOTE_ENTRY, @@ -1191,6 +1198,13 @@ Shortcut Shortcut::_sc[] = { QT_TRANSLATE_NOOP("action","Next Staff or Voice"), QT_TRANSLATE_NOOP("action","Next staff or voice") }, + { + MsWidget::SCORE_TAB, + STATE_NORMAL | STATE_NOTE_ENTRY, + "next-staff", + QT_TRANSLATE_NOOP("action","Next Staff"), + QT_TRANSLATE_NOOP("action","Next staff") + }, { MsWidget::SCORE_TAB, STATE_NORMAL,