Skip to content

Commit

Permalink
ported musescore#6935, musescore#6987: Add a style option to show mea…
Browse files Browse the repository at this point in the history
…sure number range at mmrests
  • Loading branch information
igorkorsukov committed Feb 4, 2021
1 parent 7262965 commit 16b3d8f
Show file tree
Hide file tree
Showing 21 changed files with 627 additions and 165 deletions.
4 changes: 4 additions & 0 deletions src/libmscore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,15 @@ set(MODULE_SRC
measure.h
measurenumber.cpp
measurenumber.h
measurenumberbase.cpp
measurenumberbase.h
measurerepeat.cpp
measurerepeat.h
midimapping.cpp
mmrest.cpp
mmrest.h
mmrestrange.cpp
mmrestrange.h
mscore.cpp
mscore.h
mscoreview.cpp
Expand Down
2 changes: 2 additions & 0 deletions src/libmscore/ambitus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,13 +485,15 @@ void Ambitus::draw(QPainter* p) const
qreal ledgerLineLength = score()->styleS(Sid::ledgerLineLength).val() * _spatium;
qreal ledgerLineWidth = score()->styleS(Sid::ledgerLineWidth).val() * _spatium;
p->setPen(QPen(curColor(), ledgerLineWidth, Qt::SolidLine, Qt::FlatCap));

if (_topPos.y() - stepTolerance <= -step) {
qreal xMin = _topPos.x() - ledgerLineLength;
qreal xMax = _topPos.x() + headWidth() + ledgerLineLength;
for (qreal y = -step; y >= _topPos.y() - stepTolerance; y -= step) {
p->drawLine(QPointF(xMin, y), QPointF(xMax, y));
}
}

if (_bottomPos.y() + stepTolerance >= numOfLines * step) {
qreal xMin = _bottomPos.x() - ledgerLineLength;
qreal xMax = _bottomPos.x() + headWidth() + ledgerLineLength;
Expand Down
2 changes: 2 additions & 0 deletions src/libmscore/element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
#include "textframe.h"
#include "text.h"
#include "measurenumber.h"
#include "mmrestrange.h"
#include "textline.h"
#include "tie.h"
#include "timesig.h"
Expand Down Expand Up @@ -1097,6 +1098,7 @@ Element* Element::create(ElementType type, Score* score)
case ElementType::DYNAMIC: return new Dynamic(score);
case ElementType::TEXT: return new Text(score);
case ElementType::MEASURE_NUMBER: return new MeasureNumber(score);
case ElementType::MMREST_RANGE: return new MMRestRange(score);
case ElementType::INSTRUMENT_NAME: return new InstrumentName(score);
case ElementType::STAFF_TEXT: return new StaffText(score);
case ElementType::SYSTEM_TEXT: return new SystemText(score);
Expand Down
2 changes: 2 additions & 0 deletions src/libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4306,6 +4306,8 @@ void Score::layoutSystemElements(System* system, LayoutContext& lc)
}
Measure* m = toMeasure(mb);
m->layoutMeasureNumber();
m->layoutMMRestRange();

// in continuous view, entire score is one system
// but we only need to process the range
if (lineMode() && (m->tick() < lc.startTick || m->tick() > lc.endTick)) {
Expand Down
89 changes: 87 additions & 2 deletions src/libmscore/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
#include "system.h"
#include "tempotext.h"
#include "measurenumber.h"
#include "mmrestrange.h"
#include "tie.h"
#include "tiemap.h"
#include "timesig.h"
Expand All @@ -94,6 +95,7 @@ namespace Ms {
MStaff::~MStaff()
{
delete m_noText;
delete m_mmRangeText;
delete m_lines;
delete m_vspacerUp;
delete m_vspacerDown;
Expand All @@ -102,6 +104,7 @@ MStaff::~MStaff()
MStaff::MStaff(const MStaff& m)
{
m_noText = 0;
m_mmRangeText = 0;
m_lines = new StaffLines(*m.m_lines);
m_hasVoices = m.m_hasVoices;
m_vspacerUp = 0;
Expand Down Expand Up @@ -132,6 +135,9 @@ void MStaff::setScore(Score* score)
if (m_noText) {
m_noText->setScore(score);
}
if (m_mmRangeText) {
m_mmRangeText->setScore(score);
}
}

//---------------------------------------------------------
Expand All @@ -152,6 +158,9 @@ void MStaff::setTrack(int track)
if (m_noText) {
m_noText->setTrack(track);
}
if (m_mmRangeText) {
m_mmRangeText->setTrack(track);
}
}

//---------------------------------------------------------
Expand Down Expand Up @@ -269,7 +278,6 @@ MStaff* Measure::mstaff(int staffIndex) const
bool Measure::hasVoices(int staffIdx) const
{
MStaff* staff = mstaff(staffIdx);

return staff ? staff->hasVoices() : false;
}

Expand Down Expand Up @@ -321,6 +329,16 @@ void Measure::setStaffStemless(int staffIdx, bool stemless)
}
}

void Measure::setMMRangeText(int staffIdx, MMRestRange* t)
{
m_mstaves[staffIdx]->setMMRangeText(t);
}

MMRestRange* Measure::mmRangeText(int staffIdx) const
{
return m_mstaves[staffIdx]->mmRangeText();
}

//---------------------------------------------------------
// Measure
//---------------------------------------------------------
Expand Down Expand Up @@ -464,7 +482,7 @@ AccidentalVal Measure::findAccidental(Segment* s, int staffIdx, int line, bool&

//---------------------------------------------------------
// tick2pos
// return x position for tick relative to System
/// return x position for tick relative to System
//---------------------------------------------------------

qreal Measure::tick2pos(Fraction tck) const
Expand Down Expand Up @@ -617,6 +635,51 @@ void Measure::layoutMeasureNumber()
}
}

void Measure::layoutMMRestRange()
{
if (!isMMRest() || !score()->styleB(Sid::mmRestShowMeasureNumberRange)) {
// Remove existing
for (unsigned staffIdx = 0; staffIdx < m_mstaves.size(); ++staffIdx) {
MStaff* ms = m_mstaves[staffIdx];
MMRestRange* rr = ms->mmRangeText();
if (rr) {
if (rr->generated()) {
score()->removeElement(rr);
} else {
score()->undo(new RemoveElement(rr));
}
}
}

return;
}

QString s;
if (mmRestCount() > 1) {
// middle char is an en dash (not em)
s = QString("%1–%2").arg(no() + 1).arg(no() + mmRestCount());
} else {
// If the minimum range to create a mmrest is set to 1,
// then simply show the measure number as there is no range
s = QString("%1").arg(no() + 1);
}

for (unsigned staffIdx = 0; staffIdx < m_mstaves.size(); ++staffIdx) {
MStaff* ms = m_mstaves[staffIdx];
MMRestRange* rr = ms->mmRangeText();
if (!rr) {
rr = new MMRestRange(score());
rr->setTrack(staffIdx * VOICES);
rr->setGenerated(true);
rr->setParent(this);
add(rr);
}
// setXmlText is reimplemented to take care of brackets
rr->setXmlText(s);
rr->layout();
}
}

//---------------------------------------------------------
// layout2
// called after layout of page
Expand Down Expand Up @@ -866,6 +929,15 @@ void Measure::add(Element* e)
}
break;

case ElementType::MMREST_RANGE:
if (e->staffIdx() < int(m_mstaves.size())) {
if (e->isStyled(Pid::OFFSET)) {
e->setOffset(e->propertyDefault(Pid::OFFSET).toPointF());
}
m_mstaves[e->staffIdx()]->setMMRangeText(toMMRestRange(e));
}
break;

case ElementType::SPACER:
{
Spacer* sp = toSpacer(e);
Expand Down Expand Up @@ -964,6 +1036,10 @@ void Measure::remove(Element* e)
m_mstaves[e->staffIdx()]->setNoText(nullptr);
break;

case ElementType::MMREST_RANGE:
m_mstaves[e->staffIdx()]->setMMRangeText(nullptr);
break;

case ElementType::SPACER:
switch (toSpacer(e)->spacerType()) {
case SpacerType::DOWN:
Expand Down Expand Up @@ -1932,6 +2008,10 @@ void Measure::write(XmlWriter& xml, int staff, bool writeSystemElements, bool fo
mstaff->noText()->write(xml);
}

if (mstaff->mmRangeText() && !mstaff->mmRangeText()->generated()) {
mstaff->mmRangeText()->write(xml);
}

if (mstaff->vspacerUp()) {
xml.tag("vspacerUp", mstaff->vspacerUp()->gap() / _spatium);
}
Expand Down Expand Up @@ -2085,6 +2165,11 @@ void Measure::read(XmlReader& e, int staffIdx)
noText->read(e);
noText->setTrack(e.track());
add(noText);
} else if (tag == "MMRestRange") {
MMRestRange* range = new MMRestRange(score());
range->read(e);
range->setTrack(e.track());
add(range);
} else if (MeasureBase::readProperties(e)) {
} else {
e.unknown();
Expand Down
9 changes: 9 additions & 0 deletions src/libmscore/measure.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class Tuplet;
class Staff;
class Chord;
class MeasureNumber;
class MMRestRange;
class ChordRest;
class Score;
class MuseScoreView;
Expand Down Expand Up @@ -69,6 +70,9 @@ class MStaff
MeasureNumber* noText() const { return m_noText; }
void setNoText(MeasureNumber* t) { m_noText = t; }

MMRestRange* mmRangeText() const { return m_mmRangeText; }
void setMMRangeText(MMRestRange* r) { m_mmRangeText = r; }

StaffLines* lines() const { return m_lines; }
void setLines(StaffLines* l) { m_lines = l; }

Expand Down Expand Up @@ -96,6 +100,7 @@ class MStaff

private:
MeasureNumber* m_noText { nullptr }; ///< Measure number text object
MMRestRange* m_mmRangeText { nullptr }; ///< Multi measure rest range text object
StaffLines* m_lines { nullptr };
Spacer* m_vspacerUp { nullptr };
Spacer* m_vspacerDown { nullptr };
Expand Down Expand Up @@ -166,6 +171,9 @@ class Measure final : public MeasureBase
MeasureNumber* noText(int staffIdx) const { return m_mstaves[staffIdx]->noText(); }
void setNoText(int staffIdx, MeasureNumber* t) { m_mstaves[staffIdx]->setNoText(t); }

void setMMRangeText(int staffIdx, MMRestRange*);
MMRestRange* mmRangeText(int staffIdx) const;

void createStaves(int);

MeasureNumberMode measureNumberMode() const { return m_noMode; }
Expand Down Expand Up @@ -195,6 +203,7 @@ class Measure final : public MeasureBase
bool showsMeasureNumber();
bool showsMeasureNumberInAutoMode();
void layoutMeasureNumber();
void layoutMMRestRange();

Chord* findChord(Fraction tick, int track);
ChordRest* findChordRest(Fraction tick, int track);
Expand Down
Loading

0 comments on commit 16b3d8f

Please sign in to comment.