From e146e6a6a23c0f13476ba4b7de022555fd31bf69 Mon Sep 17 00:00:00 2001 From: James Thistlewood Date: Fri, 22 May 2020 23:14:03 +0100 Subject: [PATCH] fix #305717: chord symbols attached to fret diagrams don't link to parts This issue mainly comes from a linked version of the harmony not being created when a linked version of a fret diagram is created. To fix this, a few bits of special case logic, plus the implementation of this linked child harmony, needed to be added. --- libmscore/edit.cpp | 11 +++++++++-- libmscore/excerpt.cpp | 32 ++++++++++++++++++++++++-------- libmscore/excerpt.h | 1 + libmscore/fret.cpp | 16 ++++++++++++++++ libmscore/fret.h | 1 + 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/libmscore/edit.cpp b/libmscore/edit.cpp index 4cbdf6edf049..af9551d21edc 100644 --- a/libmscore/edit.cpp +++ b/libmscore/edit.cpp @@ -4579,6 +4579,14 @@ void Score::undoAddElement(Element* element) ne->setScore(score); ne->setSelected(false); ne->setTrack(staffIdx * VOICES + element->voice()); + + if (ne->isFretDiagram()) { + FretDiagram* fd = toFretDiagram(ne); + Harmony* fdHarmony = fd->harmony(); + fdHarmony->setScore(score); + fdHarmony->setSelected(false); + fdHarmony->setTrack(staffIdx * VOICES + element->voice()); + } } if (element->isArticulation()) { @@ -4664,8 +4672,7 @@ void Score::undoAddElement(Element* element) if (ne->isHarmony()) { for (Element* segel : segment->annotations()) { if (segel && segel->isFretDiagram() && segel->track() == ntrack) { - ne->setTrack(segel->track()); - ne->setParent(segel); + segel->add(ne); break; } } diff --git a/libmscore/excerpt.cpp b/libmscore/excerpt.cpp index 65c368d85d4d..2236231388fb 100644 --- a/libmscore/excerpt.cpp +++ b/libmscore/excerpt.cpp @@ -429,6 +429,22 @@ static void cloneTuplets(ChordRest* ocr, ChordRest* ncr, Tuplet* ot, TupletMap& ncr->setTuplet(nt); } +//--------------------------------------------------------- +// processLinkedClone +//--------------------------------------------------------- + +void Excerpt::processLinkedClone(Element* ne, Score* score, int strack) + { + // reset offset as most likely it will not fit + PropertyFlags f = ne->propertyFlags(Pid::OFFSET); + if (f == PropertyFlags::UNSTYLED) { + ne->setPropertyFlags(Pid::OFFSET, PropertyFlags::STYLED); + ne->resetProperty(Pid::OFFSET); + } + ne->setTrack(strack == -1 ? 0 : strack); + ne->setScore(score); + } + //--------------------------------------------------------- // cloneStaves //--------------------------------------------------------- @@ -489,14 +505,7 @@ void Excerpt::cloneStaves(Score* oscore, Score* score, const QList& map, QM continue; if ((e->track() == srcTrack && strack != -1) || (e->systemFlag() && srcTrack == 0)) { Element* ne = e->linkedClone(); - // reset offset as most likely it will not fit - PropertyFlags f = ne->propertyFlags(Pid::OFFSET); - if (f == PropertyFlags::UNSTYLED) { - ne->setPropertyFlags(Pid::OFFSET, PropertyFlags::STYLED); - ne->resetProperty(Pid::OFFSET); - } - ne->setTrack(strack == -1 ? 0 : strack); - ne->setScore(score); + processLinkedClone(ne, score, strack); if (!ns) ns = nm->getSegment(oseg->segmentType(), oseg->tick()); ns->add(ne); @@ -506,6 +515,13 @@ void Excerpt::cloneStaves(Score* oscore, Score* score, const QList& map, QM Harmony* h = toHarmony(ne); h->render(); } + else if (ne->isFretDiagram()) { + Harmony* h = toHarmony(toFretDiagram(ne)->harmony()); + if (h) { + processLinkedClone(h, score, strack); + h->render(); + } + } } } diff --git a/libmscore/excerpt.h b/libmscore/excerpt.h index 8aabc63d1b69..412f92bf9c4c 100644 --- a/libmscore/excerpt.h +++ b/libmscore/excerpt.h @@ -71,6 +71,7 @@ class Excerpt : public QObject { static void cloneStaves(Score* oscore, Score* score, const QList& map, QMultiMap& allTracks); static void cloneStaff(Staff* ostaff, Staff* nstaff); static void cloneStaff2(Staff* ostaff, Staff* nstaff, const Fraction& stick, const Fraction& etick); + static void processLinkedClone(Element* ne, Score* score, int strack); }; } // namespace Ms diff --git a/libmscore/fret.cpp b/libmscore/fret.cpp index 0f04ce711133..7bd08fa11d24 100644 --- a/libmscore/fret.cpp +++ b/libmscore/fret.cpp @@ -83,6 +83,22 @@ FretDiagram::~FretDiagram() delete _harmony; } +//--------------------------------------------------------- +// linkedClone +//--------------------------------------------------------- + +Element* FretDiagram::linkedClone() + { + FretDiagram* e = clone(); + e->setAutoplace(true); + if (_harmony) { + Element* newHarmony = _harmony->linkedClone(); + e->add(newHarmony); + } + score()->undo(new Link(e, this)); + return e; + } + //--------------------------------------------------------- // fromString /// Create diagram from string like "XO-123" diff --git a/libmscore/fret.h b/libmscore/fret.h index 3a3409b1dffb..f04ff01abc50 100644 --- a/libmscore/fret.h +++ b/libmscore/fret.h @@ -164,6 +164,7 @@ class FretDiagram final : public Element { ~FretDiagram(); void draw(QPainter*) const override; + Element* linkedClone() override; FretDiagram* clone() const override { return new FretDiagram(*this); } Segment* segment() { return toSegment(parent()); }