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