Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 19 additions & 28 deletions src/engraving/dom/anchors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,10 +279,8 @@ void MoveElementAnchors::moveSegment(EngravingItem* element, Segment* newSeg, Fr
doMoveSegment(toFiguredBass(element), newSeg, tickDiff);
break;
case ElementType::HARMONY:
doMoveSegment(toHarmony(element), newSeg, tickDiff);
break;
case ElementType::FRET_DIAGRAM:
doMoveSegment(toFretDiagram(element), newSeg, tickDiff);
doMoveHarmonyOrFretDiagramSegment(element, newSeg, tickDiff);
break;
default:
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);
Expand Down Expand Up @@ -365,37 +363,30 @@ void MoveElementAnchors::doMoveSegment(FiguredBass* element, Segment* newSeg, Fr
}
}

void MoveElementAnchors::doMoveSegment(Harmony* element, Segment* newSeg, Fraction tickDiff)
void MoveElementAnchors::doMoveHarmonyOrFretDiagramSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff)
{
if (newSeg->isTimeTickType()) {
Measure* measure = newSeg->measure();
Segment* chordRestSegAtSameTick = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
newSeg = chordRestSegAtSameTick;
for (EngravingObject* item : element->linkList()) {
Score* score = item->score();
Measure* measure = score->tick2measure(newSeg->tick());
Segment* chordRestSeg = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
if (item == element) {
newSeg = chordRestSeg;
}
}

Segment* oldSegment = toSegment(element->parent());
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);

oldSegment->checkEmpty();
if (oldSegment->empty()) {
element->score()->undoRemoveElement(oldSegment);
}
}
Fraction oldTick = element->tick();

void MoveElementAnchors::doMoveSegment(FretDiagram* element, Segment* newSeg, Fraction tickDiff)
{
if (newSeg->isTimeTickType()) {
Measure* measure = newSeg->measure();
Segment* chordRestSegAtSameTick = measure->undoGetSegment(SegmentType::ChordRest, newSeg->tick());
newSeg = chordRestSegAtSameTick;
}

Segment* oldSegment = toSegment(element->parent());
doMoveSegment(toEngravingItem(element), newSeg, tickDiff);

oldSegment->checkEmpty();
if (oldSegment->empty()) {
element->score()->undoRemoveElement(oldSegment);
for (EngravingObject* item : element->linkList()) {
Score* score = item->score();
Segment* oldSegment = score->tick2segment(oldTick, true, SegmentType::ChordRest, false);
if (oldSegment) {
oldSegment->checkEmpty();
if (oldSegment->empty()) {
score->undoRemoveElement(oldSegment);
}
}
}
}

Expand Down
3 changes: 1 addition & 2 deletions src/engraving/dom/anchors.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ class MoveElementAnchors

static void doMoveSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff);
static void doMoveSegment(FiguredBass* element, Segment* newSeg, Fraction tickDiff);
static void doMoveSegment(Harmony* element, Segment* newSeg, Fraction tickDiff);
static void doMoveSegment(FretDiagram* element, Segment* newSeg, Fraction tickDiff);
static void doMoveHarmonyOrFretDiagramSegment(EngravingItem* element, Segment* newSeg, Fraction tickDiff);

static void moveSnappedItems(EngravingItem* element, Segment* newSeg, Fraction tickDiff);
static void rebaseOffsetOnMoveSegment(EngravingItem* element, const PointF& curOffset, Segment* newSeg, Segment* oldSeg);
Expand Down
3 changes: 3 additions & 0 deletions src/engraving/dom/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2800,6 +2800,9 @@ Segment* Measure::searchSegment(double x, SegmentType st, track_idx_t strack, tr
if (!segment->hasElements(strack, lastTrack)) {
continue;
}
if (segment->isTimeTickType() && segment->rtick() == ticks()) {
continue;
}
Segment* ns = segment->next(st);
for (; ns; ns = ns->next(st)) {
if (ns->hasElements(strack, lastTrack)) {
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1132,7 +1132,7 @@ Measure* Score::searchMeasure(const PointF& p, const System* preferredSystem, do
for (System* system : systems) {
double x = p.x() - system->canvasPos().x();
for (MeasureBase* mb : system->measures()) {
if (mb->isMeasure() && (x < (mb->x() + mb->ldata()->bbox().width()))) {
if (mb->isMeasure() && !toMeasure(mb)->isMMRest() && (x < (mb->x() + mb->ldata()->bbox().width()))) {
return toMeasure(mb);
}
}
Expand Down
26 changes: 8 additions & 18 deletions src/engraving/rw/read460/measureread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
TRead::read(expr, e, ctx);
segment->add(expr);
} else if (tag == "Harmony") {
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
// for symbols attached to anything but a measure
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
Harmony* el = Factory::createHarmony(segment);

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

Expand All @@ -454,8 +450,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
}
segment->add(el);
} else if (tag == "TremoloBar") {
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
// for symbols attached to anything but a measure
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
TremoloBar* el = Factory::createTremoloBar(segment);
el->setTrack(ctx.track());
Expand All @@ -465,8 +459,6 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
}
segment->add(el);
} else if (tag == "Symbol") {
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
// for symbols attached to anything but a measure
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
Symbol* el = Factory::createSymbol(segment);

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

el->setTrack(ctx.track());
Expand All @@ -489,9 +479,7 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
}
segment->add(el);
} else if (tag == "StaffText") {
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
// for symbols attached to anything but a measure
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
segment = measure->getChordRestOrTimeTickSegment(ctx.tick());
StaffText* el = Factory::createStaffText(segment);
el->setTrack(ctx.track());
TRead::read(el, e, ctx);
Expand All @@ -510,10 +498,12 @@ void MeasureRead::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, in
|| tag == "FiguredBass"
|| tag == "HarpPedalDiagram"
) {
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
// for symbols attached to anything but a measure
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
EngravingItem* el = Factory::createItemByName(tag, segment);
EngravingItem* el = Factory::createItemByName(tag, ctx.dummy());
if (el->allowTimeAnchor()) {
segment = measure->getChordRestOrTimeTickSegment(ctx.tick());
} else {
segment = measure->getSegment(SegmentType::ChordRest, ctx.tick());
}

el->setTrack(ctx.track());
TRead::readItem(el, e, ctx);
Expand Down
Loading