Skip to content

Commit cbd93b6

Browse files
committed
Review changes
1 parent ec3f4fc commit cbd93b6

File tree

13 files changed

+126
-147
lines changed

13 files changed

+126
-147
lines changed

src/engraving/dom/clef.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +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 _isCourtesy;
290+
case Pid::IS_COURTESY: return m_isCourtesy;
291291
default:
292292
return EngravingItem::getProperty(propertyId);
293293
}
@@ -328,7 +328,7 @@ bool Clef::setProperty(Pid propertyId, const PropertyValue& v)
328328
m_isHeader = v.toBool();
329329
break;
330330
case Pid::IS_COURTESY:
331-
_isCourtesy = v.toBool();
331+
m_isCourtesy = v.toBool();
332332
break;
333333
default:
334334
return EngravingItem::setProperty(propertyId, v);

src/engraving/dom/clef.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ class Clef final : public EngravingItem
8989
OBJECT_ALLOCATOR(engraving, Clef)
9090
DECLARE_CLASSOF(ElementType::CLEF)
9191

92-
M_PROPERTY2(bool, isCourtesy, setIsCourtesy, false)
93-
9492
public:
9593

9694
Clef* clone() const override { return new Clef(*this); }
@@ -115,6 +113,9 @@ class Clef final : public EngravingItem
115113
ClefType clefType() const;
116114
void setClefType(ClefType i);
117115

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

@@ -167,6 +168,7 @@ class Clef final : public EngravingItem
167168
bool m_isSmall = false;
168169
bool m_forInstrumentChange = false;
169170
bool m_isHeader = false;
171+
bool m_isCourtesy = false;
170172
ClefToBarlinePosition m_clefToBarlinePosition = ClefToBarlinePosition::AUTO;
171173
ClefTypeList m_clefTypes = ClefType::INVALID;
172174
};

src/engraving/dom/engravingitem.h

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

120120
// segment flags
121121
ENABLED = 0x04000000, // used for segments

src/engraving/dom/measure.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,10 +1799,7 @@ void Measure::adjustToLen(Fraction nf, bool appendRestsIfNecessary)
17991799
if (nl > ol) {
18001800
// move EndBarLine, TimeSigAnnounce, KeySigAnnounce
18011801
for (Segment* seg = m->first(); seg; seg = seg->next()) {
1802-
if (seg->segmentType()
1803-
& (SegmentType::EndBarLine | SegmentType::TimeSigAnnounce | SegmentType::KeySigAnnounce
1804-
| SegmentType::TimeSigRepeatAnnounce | SegmentType::KeySigRepeatAnnounce | SegmentType::TimeSigStartRepeatAnnounce
1805-
| SegmentType::KeySigStartRepeatAnnounce)) {
1802+
if (seg->segmentType() & (SegmentType::EndBarLine | SegmentType::CourtesyTimeSigType | SegmentType::CourtesyKeySigType)) {
18061803
seg->setRtick(nl);
18071804
}
18081805
}

src/engraving/dom/measurebase.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,14 @@ class MeasureBase : public EngravingItem
173173
bool noBreak() const { return flag(ElementFlag::NO_BREAK); }
174174
void setNoBreak(bool v) { setFlag(ElementFlag::NO_BREAK, v); }
175175

176-
bool hasCourtesyKeySig() const { return flag(ElementFlag::KEYSIG); }
177-
void setHasCourtesyKeySig(bool v) { setFlag(ElementFlag::KEYSIG, v); }
176+
bool hasCourtesyKeySig() const { return flag(ElementFlag::COURTESY_KEYSIG); }
177+
void setHasCourtesyKeySig(bool v) { setFlag(ElementFlag::COURTESY_KEYSIG, v); }
178178

179-
bool hasCourtesyTimeSig() const { return flag(ElementFlag::TIMESIG); }
180-
void setHasCourtesyTimeSig(bool v) const { setFlag(ElementFlag::TIMESIG, v); }
179+
bool hasCourtesyTimeSig() const { return flag(ElementFlag::COURTESY_TIMESIG); }
180+
void setHasCourtesyTimeSig(bool v) const { setFlag(ElementFlag::COURTESY_TIMESIG, v); }
181181

182-
bool hasCourtesyClef() const { return flag(ElementFlag::CLEF); }
183-
void setHasCourtesyClef(bool v) const { setFlag(ElementFlag::CLEF, v); }
182+
bool hasCourtesyClef() const { return flag(ElementFlag::COURTESY_CLEF); }
183+
void setHasCourtesyClef(bool v) const { setFlag(ElementFlag::COURTESY_CLEF, v); }
184184

185185
bool endOfMeasureChange() const { return flag(ElementFlag::END_OF_MEASURE_CHANGE); }
186186
void setEndOfMeasureChange(bool val) const { setFlag(ElementFlag::END_OF_MEASURE_CHANGE, val); }

src/engraving/dom/parenthesis.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Parenthesis : public EngravingItem
3030
M_PROPERTY2(DirectionH, direction, setDirection, DirectionH::LEFT)
3131

3232
public:
33-
static constexpr double PARENTHESIS_END_WIDTH = 0.05;
33+
static constexpr double PARENTHESIS_END_WIDTH = 0.1;
3434

3535
Parenthesis(Segment* parent);
3636
Parenthesis(const Parenthesis& p);

src/engraving/dom/segment.cpp

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
#include "mscore.h"
4646
#include "note.h"
4747
#include "ornament.h"
48-
#include "parenthesis.h"
4948
#include "part.h"
5049
#include "rest.h"
5150
#include "score.h"
@@ -56,7 +55,6 @@
5655
#include "tuplet.h"
5756
#include "undo.h"
5857
#include "utils.h"
59-
#include "rendering/score/segmentlayout.h"
6058

6159
#include "navigate.h"
6260

@@ -769,9 +767,7 @@ void Segment::add(EngravingItem* el)
769767
break;
770768

771769
case ElementType::CLEF:
772-
assert(
773-
m_segmentType == SegmentType::Clef || m_segmentType == SegmentType::HeaderClef
774-
|| m_segmentType == SegmentType::ClefRepeatAnnounce || m_segmentType == SegmentType::ClefStartRepeatAnnounce);
770+
assert(m_segmentType & SegmentType::ClefType);
775771
checkElement(el, track);
776772
m_elist[track] = el;
777773
if (!el->generated()) {
@@ -781,31 +777,25 @@ void Segment::add(EngravingItem* el)
781777
break;
782778

783779
case ElementType::TIMESIG:
784-
assert(
785-
segmentType() == SegmentType::TimeSig || segmentType() == SegmentType::TimeSigAnnounce
786-
|| segmentType() == SegmentType::TimeSigRepeatAnnounce || segmentType() == SegmentType::TimeSigStartRepeatAnnounce);
780+
assert(segmentType() & SegmentType::TimeSigType);
787781
checkElement(el, track);
788782
m_elist[track] = el;
789783
el->staff()->addTimeSig(toTimeSig(el));
790784
setEmpty(false);
791-
if (segmentType() == SegmentType::TimeSigAnnounce
792-
|| segmentType() == SegmentType::TimeSigRepeatAnnounce || segmentType() == SegmentType::TimeSigStartRepeatAnnounce) {
785+
if (segmentType() & SegmentType::CourtesyTimeSigType) {
793786
toTimeSig(el)->setIsCourtesy(true);
794787
}
795788
break;
796789

797790
case ElementType::KEYSIG:
798-
assert(
799-
m_segmentType == SegmentType::KeySig || m_segmentType == SegmentType::KeySigAnnounce
800-
|| m_segmentType == SegmentType::KeySigRepeatAnnounce || m_segmentType == SegmentType::KeySigStartRepeatAnnounce);
791+
assert(m_segmentType & SegmentType::KeySigType);
801792
checkElement(el, track);
802793
m_elist[track] = el;
803794
if (!el->generated()) {
804795
el->staff()->setKey(tick(), toKeySig(el)->keySigEvent());
805796
}
806797
setEmpty(false);
807-
if (m_segmentType == SegmentType::KeySigAnnounce
808-
|| m_segmentType == SegmentType::KeySigRepeatAnnounce || m_segmentType == SegmentType::KeySigStartRepeatAnnounce) {
798+
if (m_segmentType == SegmentType::CourtesyKeySigType) {
809799
toKeySig(el)->setIsCourtesy(true);
810800
}
811801
break;
@@ -1952,25 +1942,7 @@ Spanner* Segment::lastSpanner(staff_idx_t activeStaff) const
19521942

19531943
bool Segment::notChordRestType() const
19541944
{
1955-
if (segmentType() == SegmentType::KeySig
1956-
|| segmentType() == SegmentType::TimeSig
1957-
|| segmentType() == SegmentType::Clef
1958-
|| segmentType() == SegmentType::HeaderClef
1959-
|| segmentType() == SegmentType::BeginBarLine
1960-
|| segmentType() == SegmentType::EndBarLine
1961-
|| segmentType() == SegmentType::BarLine
1962-
|| segmentType() == SegmentType::KeySigAnnounce
1963-
|| segmentType() == SegmentType::TimeSigAnnounce
1964-
|| segmentType() == SegmentType::ClefRepeatAnnounce
1965-
|| segmentType() == SegmentType::TimeSigRepeatAnnounce
1966-
|| segmentType() == SegmentType::KeySigRepeatAnnounce
1967-
|| segmentType() == SegmentType::ClefStartRepeatAnnounce
1968-
|| segmentType() == SegmentType::TimeSigStartRepeatAnnounce
1969-
|| segmentType() == SegmentType::KeySigStartRepeatAnnounce) {
1970-
return true;
1971-
} else {
1972-
return false;
1973-
}
1945+
return segmentType() != SegmentType::ChordRest;
19741946
}
19751947

19761948
//---------------------------------------------------------
@@ -2564,8 +2536,6 @@ void Segment::createShape(staff_idx_t staffIdx)
25642536
}
25652537
}
25662538

2567-
rendering::score::SegmentLayout::placeParentheses(this, staffIdx);
2568-
25692539
for (EngravingItem* e : m_annotations) {
25702540
if (!e || e->staffIdx() != staffIdx) {
25712541
continue;

src/engraving/dom/types.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,10 @@ enum class SegmentType {
429429
All = -1, ///< Includes all barline types
430430
/// Alias for `BeginBarLine | StartRepeatBarLine | BarLine | EndBarLine`
431431
BarLineType = BeginBarLine | StartRepeatBarLine | BarLine | EndBarLine,
432-
TimeSigType = TimeSig | TimeSigAnnounce | TimeSigRepeatAnnounce | TimeSigStartRepeatAnnounce,
433-
KeySigType = KeySig | KeySigAnnounce | KeySigRepeatAnnounce | KeySigStartRepeatAnnounce,
432+
CourtesyTimeSigType = TimeSigAnnounce | TimeSigRepeatAnnounce | TimeSigStartRepeatAnnounce,
433+
CourtesyKeySigType = KeySigAnnounce | KeySigRepeatAnnounce | KeySigStartRepeatAnnounce,
434+
TimeSigType = TimeSig | CourtesyTimeSigType,
435+
KeySigType = KeySig | CourtesyKeySigType,
434436
ClefType = Clef | HeaderClef | ClefRepeatAnnounce | ClefStartRepeatAnnounce,
435437
///\}
436438
};

src/engraving/rendering/score/measurelayout.cpp

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,91 @@ void MeasureLayout::setCourtesyClef(Measure* m, const Fraction& refClefTick, con
19271927
}
19281928
}
19291929

1930+
void MeasureLayout::placeParentheses(const Segment* segment, track_idx_t trackIdx, LayoutContext& ctx)
1931+
{
1932+
const EngravingItem* segItem = segment->elementAt(trackIdx);
1933+
const std::vector<EngravingItem*> parens = segment->findAnnotations(ElementType::PARENTHESIS, trackIdx, trackIdx);
1934+
assert(parens.size() <= 2);
1935+
if (parens.empty() || !segItem) {
1936+
return;
1937+
}
1938+
1939+
Shape dummySegShape = segment->staffShape(track2staff(trackIdx));
1940+
dummySegShape.remove_if([](ShapeElement& shapeEl) {
1941+
return shapeEl.item() && shapeEl.item()->isParenthesis();
1942+
});
1943+
1944+
if (parens.size() == 1) {
1945+
// 1 parenthesis
1946+
Parenthesis* paren = toParenthesis(parens.front());
1947+
const bool leftBracket = paren->direction() == DirectionH::LEFT;
1948+
TLayout::layoutParenthesis(paren, ctx);
1949+
if (!leftBracket) {
1950+
// Space against existing segment shape
1951+
const double minDist = HorizontalSpacing::minHorizontalDistance(dummySegShape, paren->shape().translated(
1952+
paren->pos()), paren->spatium());
1953+
paren->mutldata()->moveX(minDist);
1954+
} else {
1955+
// Space following segment shape against this
1956+
const double minDist = HorizontalSpacing::minHorizontalDistance(paren->shape().translated(
1957+
paren->pos()), dummySegShape, paren->spatium());
1958+
paren->mutldata()->moveX(-minDist);
1959+
}
1960+
return;
1961+
}
1962+
1963+
// 2 parentheses
1964+
Parenthesis* leftParen = nullptr;
1965+
Parenthesis* rightParen = nullptr;
1966+
for (EngravingItem* paren : parens) {
1967+
if (toParenthesis(paren)->direction() == DirectionH::LEFT) {
1968+
leftParen = toParenthesis(paren);
1969+
continue;
1970+
}
1971+
1972+
rightParen = toParenthesis(paren);
1973+
}
1974+
1975+
assert(leftParen && rightParen);
1976+
1977+
TLayout::layoutParenthesis(toParenthesis(leftParen), ctx);
1978+
TLayout::layoutParenthesis(toParenthesis(rightParen), ctx);
1979+
1980+
const double itemLeftX = segItem->pos().x();
1981+
const double itemRightX = itemLeftX + segItem->width();
1982+
1983+
const double leftParenPadding = HorizontalSpacing::minHorizontalDistance(leftParen->shape().translated(leftParen->pos()),
1984+
dummySegShape, leftParen->spatium());
1985+
leftParen->mutldata()->moveX(-leftParenPadding);
1986+
dummySegShape.add(leftParen->shape().translate(leftParen->pos() + leftParen->staffOffset()));
1987+
1988+
const double rightParenPadding = HorizontalSpacing::minHorizontalDistance(dummySegShape, rightParen->shape().translated(
1989+
rightParen->pos()), rightParen->spatium());
1990+
rightParen->mutldata()->moveX(rightParenPadding);
1991+
1992+
// If the right parenthesis has been padded against the left parenthesis, this means the parenthesis -> parenthesis padding distance
1993+
// is larger than the width of the item the parentheses surrounds. In this case, the result is visually unbalanced. Move both parens
1994+
// to the left (relative to the segment) in order to centre the item: (b ) -> ( b )
1995+
const double itemWidth = segItem->width();
1996+
const double parenPadding = segment->score()->paddingTable().at(ElementType::PARENTHESIS).at(ElementType::PARENTHESIS);
1997+
1998+
if (itemWidth >= parenPadding) {
1999+
return;
2000+
}
2001+
2002+
// Move parentheses to place item in the middle
2003+
const double leftParenX = leftParen->pos().x() + leftParen->ldata()->bbox().x() + leftParen->ldata()->thickness;
2004+
const double rightParenX = rightParen->pos().x() + rightParen->ldata()->bbox().x() + rightParen->width()
2005+
- rightParen->ldata()->thickness;
2006+
2007+
const double leftParenToItem = itemLeftX - leftParenX;
2008+
const double itemToRightParen = rightParenX - itemRightX;
2009+
const double parenToItemDist = (leftParenToItem + itemToRightParen) / 2;
2010+
2011+
leftParen->mutldata()->moveX(-std::abs(parenToItemDist - leftParenToItem));
2012+
rightParen->mutldata()->moveX(-std::abs(itemToRightParen - parenToItemDist));
2013+
}
2014+
19302015
Parenthesis* MeasureLayout::findOrCreateParenthesis(Segment* segment, const DirectionH direction, const track_idx_t track)
19312016
{
19322017
if (!segment || !segment->element(track)) {
@@ -2037,6 +2122,14 @@ void MeasureLayout::addRepeatCourtesyParentheses(Measure* m, const bool continua
20372122
leftParen->mutldata()->startY.set_value(top);
20382123
leftParen->mutldata()->height.set_value(height);
20392124
}
2125+
2126+
if (leftParen) {
2127+
placeParentheses(leftMostSeg, track2staff(track), ctx);
2128+
}
2129+
2130+
if (rightParen && rightMostSeg != leftMostSeg) {
2131+
placeParentheses(rightMostSeg, track2staff(track), ctx);
2132+
}
20402133
}
20412134
}
20422135

src/engraving/rendering/score/measurelayout.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ class MeasureLayout
6565
static void removeSystemHeader(Measure* m);
6666
static void addSystemTrailer(Measure* m, Measure* nm, LayoutContext& ctx);
6767
static void removeSystemTrailer(Measure* m);
68-
static void addRepeatCourtesies(Measure* m, LayoutContext& ctx);
69-
static void addRepeatContinuationCourtesies(Measure* m, LayoutContext& ctx);
70-
static void addRepeatCourtesyParentheses(Measure* m, const bool continuation, LayoutContext& ctx);
71-
static void removeRepeatCourtesyParenthesesMeasure(Measure* m, const bool continuation, LayoutContext& ctx);
7268

7369
static void setRepeatCourtesiesAndParens(Measure* m, LayoutContext& ctx);
7470

@@ -109,7 +105,12 @@ class MeasureLayout
109105
LayoutContext& ctx);
110106

111107
static Parenthesis* findOrCreateParenthesis(Segment* segment, const DirectionH direction, const track_idx_t track);
108+
static void removeRepeatCourtesyParenthesesMeasure(Measure* m, const bool continuation, LayoutContext& ctx);
112109
static void removeRepeatCourtesyParenthesesSegment(Segment* seg, const track_idx_t track,
113110
const DirectionH direction = DirectionH::AUTO);
111+
static void addRepeatCourtesyParentheses(Measure* m, const bool continuation, LayoutContext& ctx);
112+
static void placeParentheses(const Segment* segment, track_idx_t trackIdx, LayoutContext& ctx);
113+
static void addRepeatCourtesies(Measure* m, LayoutContext& ctx);
114+
static void addRepeatContinuationCourtesies(Measure* m, LayoutContext& ctx);
114115
};
115116
}

0 commit comments

Comments
 (0)