Skip to content

Commit 1d195a6

Browse files
authored
Merge pull request #29804 from mike-spa/fixDraggingAnchoringIssues
Fix dragging anchoring issues related to mmrests
2 parents 4dd2c1f + 01cf660 commit 1d195a6

File tree

5 files changed

+32
-49
lines changed

5 files changed

+32
-49
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);

src/engraving/dom/measure.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2800,6 +2800,9 @@ Segment* Measure::searchSegment(double x, SegmentType st, track_idx_t strack, tr
28002800
if (!segment->hasElements(strack, lastTrack)) {
28012801
continue;
28022802
}
2803+
if (segment->isTimeTickType() && segment->rtick() == ticks()) {
2804+
continue;
2805+
}
28032806
Segment* ns = segment->next(st);
28042807
for (; ns; ns = ns->next(st)) {
28052808
if (ns->hasElements(strack, lastTrack)) {

src/engraving/dom/score.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,7 @@ Measure* Score::searchMeasure(const PointF& p, const System* preferredSystem, do
11321132
for (System* system : systems) {
11331133
double x = p.x() - system->canvasPos().x();
11341134
for (MeasureBase* mb : system->measures()) {
1135-
if (mb->isMeasure() && (x < (mb->x() + mb->ldata()->bbox().width()))) {
1135+
if (mb->isMeasure() && !toMeasure(mb)->isMMRest() && (x < (mb->x() + mb->ldata()->bbox().width()))) {
11361136
return toMeasure(mb);
11371137
}
11381138
}

src/engraving/rw/read460/measureread.cpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
430430
TRead::read(expr, e, ctx);
431431
segment->add(expr);
432432
} else if (tag == "Harmony") {
433-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
434-
// for symbols attached to anything but a measure
435433
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
436434
Harmony* el = Factory::createHarmony(segment);
437435

@@ -442,8 +440,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
442440
}
443441
segment->add(el);
444442
} else if (tag == "FretDiagram") {
445-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
446-
// for symbols attached to anything but a measure
447443
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
448444
FretDiagram* el = Factory::createFretDiagram(segment);
449445

@@ -454,8 +450,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
454450
}
455451
segment->add(el);
456452
} else if (tag == "TremoloBar") {
457-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
458-
// for symbols attached to anything but a measure
459453
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
460454
TremoloBar* el = Factory::createTremoloBar(segment);
461455
el->setTrack(ctx.track());
@@ -465,8 +459,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
465459
}
466460
segment->add(el);
467461
} else if (tag == "Symbol") {
468-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
469-
// for symbols attached to anything but a measure
470462
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
471463
Symbol* el = Factory::createSymbol(segment);
472464

@@ -477,9 +469,7 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
477469
}
478470
segment->add(el);
479471
} else if (tag == "Tempo") {
480-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
481-
// for symbols attached to anything but a measure
482-
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
472+
segment = measure->getChordRestOrTimeTickSegment(ctx.tick());
483473
TempoText* el = Factory::createTempoText(segment);
484474

485475
el->setTrack(ctx.track());
@@ -489,9 +479,7 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
489479
}
490480
segment->add(el);
491481
} else if (tag == "StaffText") {
492-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
493-
// for symbols attached to anything but a measure
494-
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
482+
segment = measure->getChordRestOrTimeTickSegment(ctx.tick());
495483
StaffText* el = Factory::createStaffText(segment);
496484
el->setTrack(ctx.track());
497485
TRead::read(el, e, ctx);
@@ -510,10 +498,12 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
510498
|| tag == "FiguredBass"
511499
|| tag == "HarpPedalDiagram"
512500
) {
513-
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
514-
// for symbols attached to anything but a measure
515-
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
516-
EngravingItem* el = Factory::createItemByName(tag, segment);
501+
EngravingItem* el = Factory::createItemByName(tag, ctx.dummy());
502+
if (el->allowTimeAnchor()) {
503+
segment = measure->getChordRestOrTimeTickSegment(ctx.tick());
504+
} else {
505+
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
506+
}
517507

518508
el->setTrack(ctx.track());
519509
TRead::readItem(el, e, ctx);

0 commit comments

Comments
 (0)