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
1 change: 1 addition & 0 deletions src/engraving/dom/chord.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ class Chord final : public ChordRest
const std::vector<Chord*>& graceNotes() const { return m_graceNotes; }
std::vector<Chord*>& graceNotes() { return m_graceNotes; }
std::vector<Chord*> allGraceChordsOfMainChord();
void removeAllGraceNotes() { m_graceNotes.clear(); }

GraceNotesGroup& graceNotesBefore(bool filterUnplayable = false) const;
GraceNotesGroup& graceNotesAfter(bool filterUnplayable = false) const;
Expand Down
6 changes: 6 additions & 0 deletions src/engraving/dom/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,6 +1127,12 @@ Segment* Score::setNoteRest(Segment* segment, track_idx_t track, NoteVal nval, F
chord->setTicks(d.fraction());
chord->setStemDirection(stemDirection);
chord->add(note);
if (cr && cr->isChord()) {
std::vector<Chord*> graceNotes = toChord(cr)->graceNotes();
for (Chord* grace : graceNotes) {
undoChangeParent(grace, chord, chord->staffIdx());
}
}
note->setNval(nval, tick);
if (forceAccidental) {
int tpc = style().styleB(Sid::concertPitch) ? nval.tpc1 : nval.tpc2;
Expand Down
22 changes: 6 additions & 16 deletions src/engraving/dom/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,10 @@ ChordRest* Score::addClone(ChordRest* cr, const Fraction& tick, const TDuration&
newcr->setTicks(d.isMeasure() ? cr->measure()->ticks() : d.fraction());
newcr->setTuplet(cr->tuplet());
newcr->setSelected(false);
if (newcr->isChord()) {
muse::DeleteAll(toChord(newcr)->graceNotes());
toChord(newcr)->removeAllGraceNotes();
}

undoAddCR(newcr, cr->measure(), tick);
return newcr;
Expand Down Expand Up @@ -3970,7 +3974,7 @@ void Score::cmdDeleteSelection()
FretDiagram* fretDiagram = toFretDiagram(e);
Harmony* harmony = fretDiagram->harmony();
if (harmony) {
undo(new FretLinkHarmony(fretDiagram, harmony, true /* unlink */));
undoChangeParent(harmony, fretDiagram->segment(), track2staff(fretDiagram->track()));
elSelectedAfterDeletion = harmony;
}
} else if (e->isHarmony()) {
Expand Down Expand Up @@ -6980,21 +6984,7 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
ne->setTrack(linkedTrack);
ne->setParent(seg);

// make harmony child of fret diagram if possible
if (ne->isHarmony()) {
for (EngravingItem* segel : segment->annotations()) {
if (segel && segel->isFretDiagram() && segel->track() == linkedTrack && !toFretDiagram(segel)->harmony()) {
segel->add(ne);
break;
}
}
} else if (ne->isFretDiagram()) {
// update track of child harmony
FretDiagram* fd = toFretDiagram(ne);
if (fd->harmony()) {
fd->harmony()->setTrack(linkedTrack);
}
} else if (ne->isStringTunings()) {
if (ne->isStringTunings()) {
StringTunings* stringTunings = toStringTunings(ne);
if (stringTunings->stringData()->isNull()) {
const StringData* stringData = stringTunings->part()->stringData(tick, staff->idx());
Expand Down
48 changes: 4 additions & 44 deletions src/engraving/dom/fret.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -837,21 +837,6 @@ std::vector<String> FretDiagram::patternHarmonies(const String& pattern)
return muse::value(s_diagramPatternToHarmoniesMap, pattern);
}

void FretDiagram::applyAlignmentToHarmony()
{
if (m_harmony->propertyFlags(Pid::OFFSET) == PropertyFlags::STYLED) {
m_harmony->resetProperty(Pid::OFFSET);
}

m_harmony->setProperty(Pid::ALIGN, Align(AlignH::HCENTER, AlignV::BASELINE));
m_harmony->setPropertyFlags(Pid::ALIGN, PropertyFlags::UNSTYLED);
}

void FretDiagram::resetHarmonyAlignment()
{
m_harmony->resetProperty(Pid::ALIGN);
}

//---------------------------------------------------------
// clear
//---------------------------------------------------------
Expand Down Expand Up @@ -979,33 +964,6 @@ void FretDiagram::setHarmony(String harmonyText)
triggerLayout();
}

void FretDiagram::linkHarmony(Harmony* harmony)
{
m_harmony = harmony;

setParent(harmony->explicitParent());
harmony->setParent(this);

if (Segment* segment = this->segment()) {
segment->removeAnnotation(harmony);
}

m_harmony->setTrack(track());

applyAlignmentToHarmony();
}

void FretDiagram::unlinkHarmony()
{
m_harmony->setTrack(track());

resetHarmonyAlignment();

segment()->add(m_harmony);

m_harmony = nullptr;
}

//---------------------------------------------------------
// add
//---------------------------------------------------------
Expand All @@ -1032,7 +990,9 @@ void FretDiagram::add(EngravingItem* e)
}
}

applyAlignmentToHarmony();
m_harmony->resetProperty(Pid::OFFSET);
m_harmony->setProperty(Pid::ALIGN, Align(AlignH::HCENTER, AlignV::BASELINE));
m_harmony->setPropertyFlags(Pid::ALIGN, PropertyFlags::UNSTYLED);

e->added();
} else {
Expand Down Expand Up @@ -1380,7 +1340,7 @@ FretDiagram* FretDiagram::makeFromHarmonyOrFretDiagram(const EngravingItem* harm

fretDiagram->updateDiagram(harmony->plainText());

fretDiagram->linkHarmony(harmony);
fretDiagram->add(harmony);
} else if (harmonyOrFretDiagram->isHarmony() && harmonyOrFretDiagram->parentItem()->isFretDiagram()) {
fretDiagram = toFretDiagram(harmonyOrFretDiagram->parentItem())->clone();
} else if (harmonyOrFretDiagram->isFretDiagram()) {
Expand Down
5 changes: 0 additions & 5 deletions src/engraving/dom/fret.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,6 @@ class FretDiagram final : public EngravingItem
String harmonyText() const;
Harmony* harmony() const { return m_harmony; }
void setHarmony(String harmonyText);
void linkHarmony(Harmony* harmony);
void unlinkHarmony();

std::vector<FretItem::Dot> dot(int s, int f = 0) const;
FretItem::Marker marker(int s) const;
Expand Down Expand Up @@ -302,9 +300,6 @@ class FretDiagram final : public EngravingItem

static void applyDiagramPattern(FretDiagram* diagram, const String& pattern);

void applyAlignmentToHarmony();
void resetHarmonyAlignment();

int m_strings = 0;
int m_frets = 0;
int m_fretOffset = 0;
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/guitarbend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ void GuitarBend::setEndNotePitch(int pitch, QuarterOffset quarterOff)

bool GuitarBend::isReleaseBend() const
{
return endNote()->pitch() < startNote()->pitch();
return bendAmountInQuarterTones() < 0;
}

bool GuitarBend::isFullRelease() const
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
25 changes: 0 additions & 25 deletions src/engraving/dom/undo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3557,31 +3557,6 @@ void ChangeTieJumpPointActive::flip(EditData*)
m_active = oldActive;
}

FretLinkHarmony::FretLinkHarmony(FretDiagram* diagram, Harmony* harmony, bool unlink)
{
m_fretDiagram = diagram;
m_harmony = harmony;
m_unlink = unlink;
}

void FretLinkHarmony::undo(EditData*)
{
if (m_unlink) {
m_fretDiagram->linkHarmony(m_harmony);
} else {
m_fretDiagram->unlinkHarmony();
}
}

void FretLinkHarmony::redo(EditData*)
{
if (m_unlink) {
m_fretDiagram->unlinkHarmony();
} else {
m_fretDiagram->linkHarmony(m_harmony);
}
}

RemoveFretDiagramFromFretBox::RemoveFretDiagramFromFretBox(FretDiagram* f)
: m_fretDiagram(f)
{
Expand Down
20 changes: 0 additions & 20 deletions src/engraving/dom/undo.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ enum class CommandType : signed char {
FretMarker,
FretBarre,
FretClear,
FretLinkHarmony,
RemoveFretDiagramFromFretBox,

// Harmony
Expand Down Expand Up @@ -1806,25 +1805,6 @@ class FretClear : public UndoCommand
UNDO_CHANGED_OBJECTS({ diagram })
};

class FretLinkHarmony : public UndoCommand
{
OBJECT_ALLOCATOR(engraving, FretLinkHarmony)

FretDiagram* m_fretDiagram = nullptr;
Harmony* m_harmony = nullptr;
bool m_unlink = false;

void undo(EditData*) override;
void redo(EditData*) override;

public:
FretLinkHarmony(FretDiagram*, Harmony*, bool unlink = false);

UNDO_TYPE(CommandType::FretLinkHarmony)
UNDO_NAME("FretLinkHarmony")
UNDO_CHANGED_OBJECTS({ m_fretDiagram })
};

class RemoveFretDiagramFromFretBox : public UndoCommand
{
OBJECT_ALLOCATOR(engraving, RemoveFretDiagramFromFretBox)
Expand Down
6 changes: 5 additions & 1 deletion src/engraving/rendering/score/horizontalspacing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,11 @@ void HorizontalSpacing::moveRightAlignedSegments(std::vector<SegmentPosition>& p

if (x != DBL_MAX) {
placedSegments[i].xPosInSystemCoords = x;
double nextSegX = placedSegments[i + 1].xPosInSystemCoords;
SegmentPosition& nextSegPos = placedSegments[i + 1];
for (size_t j = i + 2; nextSegPos.ignoreForSpacing && j < placedSegments.size(); ++j) {
nextSegPos = placedSegments[j];
}
double nextSegX = nextSegPos.xPosInSystemCoords;
Segment* prevCRSeg = segment->prev(SegmentType::ChordRest);
if (prevCRSeg) {
prevCRSeg->addWidthOffset(-nextSegX + x);
Expand Down
4 changes: 2 additions & 2 deletions src/engraving/rendering/score/measurenumberlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void MeasureNumberLayout::layoutMeasureNumber(MeasureNumber* item, MeasureNumber
if (measure->header()) {
ldata->setPosX(measure->firstNoteRestSegmentX(true) - measure->systemPos().x());
} else {
double xRef = refBarline->pageX() - measure->pageX();
double xRef = refBarline ? refBarline->pageX() - measure->pageX() : 0.0;
ldata->setPosX(xRef);
}
} else if (hPlacement == AlignH::HCENTER) {
Expand Down Expand Up @@ -155,7 +155,7 @@ const Segment* MeasureNumberLayout::refBarlineSegment(const MeasureNumber* item,
Measure* measure = item->measure();
if (alignToBarline || hPlacement == AlignH::LEFT) {
for (Segment* seg = measure->first(); seg && seg->tick() == measure->tick() && seg->system() == measure->system();
seg = seg->prev1enabled()) {
seg = seg->prev1MMenabled()) {
if (seg->isType(SegmentType::BarLineType) && seg->isActive()) {
barlineSeg = seg;
break;
Expand Down
Loading
Loading