Skip to content

Commit a494713

Browse files
authored
Merge pull request #26264 from miiizen/repeat-courtesies
Implement repeat courtesies
2 parents 2e93b7f + cbd93b6 commit a494713

File tree

101 files changed

+3033
-523
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+3033
-523
lines changed

src/engraving/dom/clef.cpp

Lines changed: 6 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ PropertyValue Clef::getProperty(Pid propertyId) const
287287
case Pid::SMALL: return isSmall();
288288
case Pid::CLEF_TO_BARLINE_POS: return m_clefToBarlinePosition;
289289
case Pid::IS_HEADER: return m_isHeader;
290+
case Pid::IS_COURTESY: return m_isCourtesy;
290291
default:
291292
return EngravingItem::getProperty(propertyId);
292293
}
@@ -326,6 +327,9 @@ bool Clef::setProperty(Pid propertyId, const PropertyValue& v)
326327
case Pid::IS_HEADER:
327328
m_isHeader = v.toBool();
328329
break;
330+
case Pid::IS_COURTESY:
331+
m_isCourtesy = v.toBool();
332+
break;
329333
default:
330334
return EngravingItem::setProperty(propertyId, v);
331335
}
@@ -342,7 +346,6 @@ void Clef::changeClefToBarlinePos(ClefToBarlinePosition newPos)
342346
}
343347

344348
Segment* seg = segment();
345-
Measure* meas = seg->measure();
346349

347350
staff_idx_t nStaves = score()->nstaves();
348351
for (staff_idx_t staffIndex = 0; staffIndex < nStaves; ++staffIndex) {
@@ -352,111 +355,9 @@ void Clef::changeClefToBarlinePos(ClefToBarlinePosition newPos)
352355
}
353356
}
354357

355-
Segment* endBarlineSeg = nullptr;
356-
Segment* endRepeatSeg = nullptr;
357-
Segment* startRepeatSeg = nullptr;
358-
359-
// Search first segment at this tick
360-
Segment* firstSegAtThisTick = seg;
361-
while (true) {
362-
Segment* prev1 = firstSegAtThisTick->prev1();
363-
if (prev1 && prev1->tick() == seg->tick()) {
364-
firstSegAtThisTick = prev1;
365-
} else {
366-
break;
367-
}
368-
}
369-
for (Segment* s = firstSegAtThisTick; s && s->tick() == seg->tick(); s = s->next1enabled()) {
370-
// Scan all segments at this tick looking for the ones we need
371-
if (s->isEndBarLineType() && s->measure()->repeatEnd()) {
372-
endRepeatSeg = s;
373-
} else if (s->isEndBarLineType()) {
374-
endBarlineSeg = s;
375-
} else if (s->isStartRepeatBarLineType()) {
376-
startRepeatSeg = s;
377-
}
378-
}
379-
380358
if (newPos == ClefToBarlinePosition::AFTER) {
381359
undoChangeProperty(Pid::SHOW_COURTESY, false, propertyFlags(Pid::SHOW_COURTESY));
382-
}
383-
384-
if (newPos == ClefToBarlinePosition::AUTO) {
385-
if (endBarlineSeg) {
386-
// Clef before the end bar line
387-
Measure* destMeas = endBarlineSeg->measure();
388-
meas->segments().remove(seg);
389-
destMeas->segments().insert(seg, endBarlineSeg);
390-
seg->setRtick(endBarlineSeg->rtick());
391-
seg->setParent(destMeas);
392-
} else if (endRepeatSeg) {
393-
// Clef after the end repeat
394-
Measure* destMeas = endRepeatSeg->measure();
395-
meas->segments().remove(seg);
396-
destMeas->segments().insert(seg, endRepeatSeg->next());
397-
seg->setRtick(endRepeatSeg->rtick());
398-
seg->setParent(destMeas);
399-
} else if (startRepeatSeg) {
400-
// End of previous measure
401-
Measure* destMeas = startRepeatSeg->measure()->prevMeasure();
402-
if (destMeas) {
403-
meas->segments().remove(seg);
404-
destMeas->segments().push_back(seg);
405-
seg->setRtick(destMeas->ticks());
406-
seg->setParent(destMeas);
407-
}
408-
}
409-
} else if (newPos == ClefToBarlinePosition::BEFORE) {
410-
if (endBarlineSeg || endRepeatSeg) {
411-
// Before the bar line
412-
Segment* refSeg = endBarlineSeg ? endBarlineSeg : endRepeatSeg;
413-
Measure* destMeas = refSeg->measure();
414-
meas->segments().remove(seg);
415-
destMeas->segments().insert(seg, refSeg);
416-
seg->setRtick(refSeg->rtick());
417-
seg->setParent(destMeas);
418-
} else if (startRepeatSeg) {
419-
// End of previous measure
420-
Measure* destMeas = startRepeatSeg->measure()->prevMeasure();
421-
if (destMeas) {
422-
meas->segments().remove(seg);
423-
destMeas->segments().push_back(seg);
424-
seg->setRtick(destMeas->ticks());
425-
seg->setParent(destMeas);
426-
}
427-
}
428-
} else if (newPos == ClefToBarlinePosition::AFTER) {
429-
bool isAtMeasureEnd = seg->rtick() == meas->ticks();
430-
if (startRepeatSeg) {
431-
// After the start repeat
432-
Measure* destMeas = startRepeatSeg->measure();
433-
meas->segments().remove(seg);
434-
destMeas->segments().insert(seg, startRepeatSeg->next());
435-
seg->setRtick(startRepeatSeg->rtick());
436-
seg->setParent(destMeas);
437-
} else if (isAtMeasureEnd) {
438-
Measure* destMeas = meas->nextMeasure();
439-
if (destMeas && !destMeas->header()) {
440-
meas->segments().remove(seg);
441-
destMeas->segments().push_front(seg);
442-
seg->setRtick(Fraction(0, 1));
443-
seg->setParent(destMeas);
444-
} else if (destMeas) {
445-
Segment* refSeg = destMeas->firstEnabled();
446-
while (refSeg && refSeg->header()) {
447-
refSeg = refSeg->nextEnabled();
448-
}
449-
if (refSeg) {
450-
meas->segments().remove(seg);
451-
destMeas->segments().insert(seg, refSeg);
452-
seg->setRtick(refSeg->rtick());
453-
seg->setParent(destMeas);
454-
}
455-
}
456-
}
457-
}
458-
459-
if ((newPos == ClefToBarlinePosition::AUTO || newPos == ClefToBarlinePosition::BEFORE)) {
360+
} else {
460361
undoChangeProperty(Pid::SHOW_COURTESY, true, PropertyFlags::STYLED);
461362
}
462363
}
@@ -511,6 +412,7 @@ PropertyValue Clef::propertyDefault(Pid id) const
511412
case Pid::SMALL: return false;
512413
case Pid::CLEF_TO_BARLINE_POS: return ClefToBarlinePosition::AUTO;
513414
case Pid::IS_HEADER: return false;
415+
case Pid::IS_COURTESY: return false;
514416
default: return EngravingItem::propertyDefault(id);
515417
}
516418
}

src/engraving/dom/clef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ class Clef final : public EngravingItem
113113
ClefType clefType() const;
114114
void setClefType(ClefType i);
115115

116+
bool isCourtesy() const { return m_isCourtesy; }
117+
void setIsCourtesy(const bool v) { m_isCourtesy = v; }
118+
116119
int subtype() const override { return int(clefType()); }
117120
TranslatableString subtypeUserName() const override;
118121

@@ -165,6 +168,7 @@ class Clef final : public EngravingItem
165168
bool m_isSmall = false;
166169
bool m_forInstrumentChange = false;
167170
bool m_isHeader = false;
171+
bool m_isCourtesy = false;
168172
ClefToBarlinePosition m_clefToBarlinePosition = ClefToBarlinePosition::AUTO;
169173
ClefTypeList m_clefTypes = ClefType::INVALID;
170174
};

src/engraving/dom/dom.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ set(DOM_SRC
224224
${CMAKE_CURRENT_LIST_DIR}/ottava.h
225225
${CMAKE_CURRENT_LIST_DIR}/page.cpp
226226
${CMAKE_CURRENT_LIST_DIR}/page.h
227+
${CMAKE_CURRENT_LIST_DIR}/parenthesis.cpp
228+
${CMAKE_CURRENT_LIST_DIR}/parenthesis.h
227229
${CMAKE_CURRENT_LIST_DIR}/partialtie.cpp
228230
${CMAKE_CURRENT_LIST_DIR}/partialtie.h
229231
${CMAKE_CURRENT_LIST_DIR}/palmmute.cpp

src/engraving/dom/engravingitem.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,15 @@ enum class ElementFlag {
113113
NO_BREAK = 0x00100000,
114114
HEADER = 0x00200000,
115115
TRAILER = 0x00400000, // also used in segment
116-
KEYSIG = 0x00800000,
116+
COURTESY_KEYSIG = 0x00800000,
117+
COURTESY_TIMESIG = 0x01000000,
118+
COURTESY_CLEF = 0x02000000,
117119

118120
// segment flags
119-
ENABLED = 0x01000000, // used for segments
120-
EMPTY = 0x02000000,
121-
WRITTEN = 0x04000000,
121+
ENABLED = 0x04000000, // used for segments
122+
EMPTY = 0x08000000,
123+
WRITTEN = 0x10000000,
124+
END_OF_MEASURE_CHANGE = 0x20000000
122125
};
123126

124127
typedef muse::Flags<ElementFlag> ElementFlags;

src/engraving/dom/engravingobject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class OttavaSegment;
125125
class Page;
126126
class PalmMute;
127127
class PalmMuteSegment;
128+
class Parenthesis;
128129
class Part;
129130
class PartialLyricsLine;
130131
class PartialLyricsLineSegment;
@@ -454,6 +455,7 @@ class EngravingObject
454455
CONVERT(FretCircle, FRET_CIRCLE)
455456
CONVERT(StringTunings, STRING_TUNINGS)
456457
CONVERT(TimeTickAnchor, TIME_TICK_ANCHOR)
458+
CONVERT(Parenthesis, PARENTHESIS)
457459
#undef CONVERT
458460

459461
virtual bool isEngravingItem() const { return false; } // overridden in element.h
@@ -868,5 +870,6 @@ CONVERT(LaissezVib)
868870
CONVERT(PartialTie)
869871
CONVERT(PartialLyricsLine)
870872
CONVERT(PartialLyricsLineSegment)
873+
CONVERT(Parenthesis)
871874
#undef CONVERT
872875
}

src/engraving/dom/factory.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
#include "ottava.h"
7676
#include "page.h"
7777
#include "palmmute.h"
78+
#include "parenthesis.h"
7879
#include "partialtie.h"
7980
#include "pedal.h"
8081
#include "pickscrape.h"
@@ -239,6 +240,7 @@ EngravingItem* Factory::doCreateItem(ElementType type, EngravingItem* parent)
239240
case ElementType::LAISSEZ_VIB: return new LaissezVib(parent->isNote() ? toNote(parent) : dummy->note());
240241
case ElementType::PARTIAL_TIE: return new PartialTie(parent->isNote() ? toNote(parent) : dummy->note());
241242
case ElementType::PARTIAL_LYRICSLINE: return new PartialLyricsLine(parent);
243+
case ElementType::PARENTHESIS: return new Parenthesis(parent->isSegment() ? toSegment(parent) : dummy->segment());
242244

243245
case ElementType::LYRICSLINE:
244246
case ElementType::TEXTLINE_BASE:
@@ -785,3 +787,6 @@ SystemLockIndicator* Factory::createSystemLockIndicator(System * parent, const S
785787
}
786788

787789
COPY_ITEM_IMPL(SystemLockIndicator)
790+
791+
CREATE_ITEM_IMPL(Parenthesis, ElementType::PARENTHESIS, Segment, isAccessibleEnabled);
792+
COPY_ITEM_IMPL(Parenthesis)

src/engraving/dom/factory.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ class Factory
143143

144144
static Page* createPage(RootItem* parent, bool isAccessibleEnabled = true);
145145

146+
static Parenthesis* createParenthesis(Segment* parent, bool isAccessibleEnabled = true);
147+
static Parenthesis* copyParenthesis(const Parenthesis& src);
148+
146149
static PartialTie* createPartialTie(Note* parent, bool isAccessibleEnabled = true);
147150
static PartialTie* copyPartialTie(const PartialTie& src);
148151

src/engraving/dom/keysig.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ PropertyValue KeySig::getProperty(Pid propertyId) const
212212
return int(showCourtesy());
213213
case Pid::KEYSIG_MODE:
214214
return int(mode());
215+
case Pid::IS_COURTESY:
216+
return _isCourtesy;
215217
default:
216218
return EngravingItem::getProperty(propertyId);
217219
}
@@ -249,6 +251,9 @@ bool KeySig::setProperty(Pid propertyId, const PropertyValue& v)
249251
setMode(KeyMode(v.toInt()));
250252
staff()->setKey(tick(), keySigEvent());
251253
break;
254+
case Pid::IS_COURTESY:
255+
_isCourtesy = v.toBool();
256+
break;
252257
default:
253258
if (!EngravingItem::setProperty(propertyId, v)) {
254259
return false;
@@ -275,6 +280,8 @@ PropertyValue KeySig::propertyDefault(Pid id) const
275280
return true;
276281
case Pid::KEYSIG_MODE:
277282
return int(KeyMode::UNKNOWN);
283+
case Pid::IS_COURTESY:
284+
return false;
278285
default:
279286
return EngravingItem::propertyDefault(id);
280287
}

src/engraving/dom/keysig.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class KeySig final : public EngravingItem
4242
OBJECT_ALLOCATOR(engraving, KeySig)
4343
DECLARE_CLASSOF(ElementType::KEYSIG)
4444

45+
M_PROPERTY2(bool, isCourtesy, setIsCourtesy, false)
46+
4547
public:
4648

4749
KeySig* clone() const override { return new KeySig(*this); }

src/engraving/dom/masterscore.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -620,15 +620,15 @@ MeasureBase* MasterScore::insertMeasure(MeasureBase* beforeMeasure, const Insert
620620
moveClef = initClef;
621621
} else {
622622
ClefToBarlinePosition clefPos = toClef(e)->clefToBarlinePosition();
623-
if (clefPos == ClefToBarlinePosition::AFTER) {
624-
// non header clef at the begining of the measure
625-
moveClef = true;
626-
} else if (isBeginning) {
623+
if (isBeginning) {
627624
// special case:
628625
// there is a non-header clef at global tick 0, and we are inserting at the beginning of the score.
629626
// this clef will be moved with the measure it accompanies, but it will be moved before the barline.
630627
specialCase = true;
631628
moveClef = true;
629+
} else if (clefPos == ClefToBarlinePosition::AFTER) {
630+
// non header clef at the begining of the measure
631+
moveClef = true;
632632
}
633633
}
634634
} else {

0 commit comments

Comments
 (0)