From 6eabaf5f97f0fdc211242cd14827ca1080aaa691 Mon Sep 17 00:00:00 2001 From: ws Date: Mon, 25 Feb 2013 19:05:19 +0100 Subject: [PATCH] propagate rehearsal mark to all parts --- libmscore/rehearsalmark.h | 2 +- libmscore/undo.cpp | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/libmscore/rehearsalmark.h b/libmscore/rehearsalmark.h index 004c44f203fe6..9df13c14ac33f 100644 --- a/libmscore/rehearsalmark.h +++ b/libmscore/rehearsalmark.h @@ -23,11 +23,11 @@ class RehearsalMark : public Text { Q_OBJECT - public: RehearsalMark(Score* score); virtual RehearsalMark* clone() const { return new RehearsalMark(*this); } virtual ElementType type() const { return REHEARSAL_MARK; } + Segment* segment() const { return (Segment*)parent(); } }; #endif diff --git a/libmscore/undo.cpp b/libmscore/undo.cpp index 863ef2086161a..16c980a8e9bce 100644 --- a/libmscore/undo.cpp +++ b/libmscore/undo.cpp @@ -56,7 +56,6 @@ #include "articulation.h" #include "noteevent.h" #include "slur.h" -// #include "excerpt.h" #include "tempotext.h" #include "instrchange.h" #include "box.h" @@ -67,6 +66,8 @@ #include "sequencer.h" #include "breath.h" #include "fingering.h" +#include "rehearsalmark.h" +#include "excerpt.h" extern Measure* tick2measure(int tick); @@ -751,6 +752,42 @@ void Score::undoAddElement(Element* element) Element::ElementType et = element->type(); + + // some elements are replicated for all parts regardless of + // linking: + + if (et == Element::REHEARSAL_MARK) { + foreach(Excerpt* excerpt, rootScore()->excerpts()) + staffList.append(excerpt->score()->staff(0)); + + foreach(Staff* staff, staffList) { + Score* score = staff->score(); + int staffIdx = score->staffIdx(staff); + Element* ne; + if (staff == ostaff) + ne = element; + else { + ne = element->linkedClone(); + ne->setScore(score); + ne->setSelected(false); + ne->setTrack(staffIdx * VOICES + element->voice()); + } + if (element->type() == Element::REHEARSAL_MARK) { + RehearsalMark* d = static_cast(element); + Segment* segment = d->segment(); + int tick = segment->tick(); + Measure* m = score->tick2measure(tick); + Segment* seg = m->findSegment(Segment::SegChordRest, tick); + RehearsalMark* nd = static_cast(ne); + int ntrack = staffIdx * VOICES + d->voice(); + nd->setTrack(ntrack); + nd->setParent(seg); + undo(new AddElement(nd)); + } + } + return; + } + if (et == Element::FINGERING || et == Element::IMAGE || et == Element::SYMBOL