Skip to content

Commit 07498b9

Browse files
committed
Fix moveSegment for Harmony and FretDiagram
Need to guarantee that they can always attach to a ChordRest segment
1 parent 7ae8edb commit 07498b9

File tree

2 files changed

+20
-30
lines changed

2 files changed

+20
-30
lines changed

src/engraving/dom/anchors.cpp

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,8 @@ void MoveElementAnchors::moveSegment(EngravingItem* element, Segment* newSeg, Fr
279279
doMoveSegment(toFiguredBass(element), newSeg, tickDiff);
280280
break;
281281
case ElementType::HARMONY:
282-
doMoveSegment(toHarmony(element), newSeg, tickDiff);
283-
break;
284282
case ElementType::FRET_DIAGRAM:
285-
doMoveSegment(toFretDiagram(element), newSeg, tickDiff);
283+
doMoveHarmonyOrFretDiagramSegment(element, newSeg, tickDiff);
286284
break;
287285
default:
288286
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);
@@ -365,37 +363,30 @@ void MoveElementAnchors::doMoveSegment(FiguredBass* element, Segment* newSeg, Fr
365363
}
366364
}
367365

368-
void MoveElementAnchors::doMoveSegment(Harmony* element, Segment* newSeg, Fraction tickDiff)
366+
void MoveElementAnchors::doMoveHarmonyOrFretDiagramSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff)
369367
{
370-
if (newSeg->isTimeTickType()) {
371-
Measure* measure = newSeg->measure();
372-
Segment* chordRestSegAtSameTick = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
373-
newSeg = chordRestSegAtSameTick;
368+
for (EngravingObject* item : element->linkList()) {
369+
Score* score = item->score();
370+
Measure* measure = score->tick2measure(newSeg->tick());
371+
Segment* chordRestSeg = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
372+
if (item == element) {
373+
newSeg = chordRestSeg;
374+
}
374375
}
375376

376-
Segment* oldSegment = toSegment(element->parent());
377-
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);
378-
379-
oldSegment->checkEmpty();
380-
if (oldSegment->empty()) {
381-
element->score()->undoRemoveElement(oldSegment);
382-
}
383-
}
377+
Fraction oldTick = element->tick();
384378

385-
void MoveElementAnchors::doMoveSegment(FretDiagram* element, Segment* newSeg, Fraction tickDiff)
386-
{
387-
if (newSeg->isTimeTickType()) {
388-
Measure* measure = newSeg->measure();
389-
Segment* chordRestSegAtSameTick = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
390-
newSeg = chordRestSegAtSameTick;
391-
}
392-
393-
Segment* oldSegment = toSegment(element->parent());
394379
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);
395380

396-
oldSegment->checkEmpty();
397-
if (oldSegment->empty()) {
398-
element->score()->undoRemoveElement(oldSegment);
381+
for (EngravingObject* item : element->linkList()) {
382+
Score* score = item->score();
383+
Segment* oldSegment = score->tick2segment(oldTick, true, SegmentType::ChordRest, false);
384+
if (oldSegment) {
385+
oldSegment->checkEmpty();
386+
if (oldSegment->empty()) {
387+
score->undoRemoveElement(oldSegment);
388+
}
389+
}
399390
}
400391
}
401392

src/engraving/dom/anchors.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ class MoveElementAnchors
5353

5454
static void doMoveSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff);
5555
static void doMoveSegment(FiguredBass* element, Segment* newSeg, Fraction tickDiff);
56-
static void doMoveSegment(Harmony* element, Segment* newSeg, Fraction tickDiff);
57-
static void doMoveSegment(FretDiagram* element, Segment* newSeg, Fraction tickDiff);
56+
static void doMoveHarmonyOrFretDiagramSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff);
5857

5958
static void moveSnappedItems(EngravingItem* element, Segment* newSeg, Fraction tickDiff);
6059
static void rebaseOffsetOnMoveSegment(EngravingItem* element, const PointF& curOffset, Segment* newSeg, Segment* oldSeg);

0 commit comments

Comments
 (0)