Make measure numbers deletable

This commit is contained in:
Marr11317 2020-03-10 02:50:48 -04:00
parent 316360b3a4
commit 8ea3e54ea0
3 changed files with 84 additions and 19 deletions

View file

@ -1622,7 +1622,7 @@ void Score::deleteItem(Element* el)
if (!el)
return;
// cannot remove generated elements
if (el->generated() && !(el->isBracket() || el->isBarLine() || el->isClef()))
if (el->generated() && !(el->isBracket() || el->isBarLine() || el->isClef() || el->isMeasureNumber()))
return;
// qDebug("%s", el->name());
@ -1933,6 +1933,29 @@ void Score::deleteItem(Element* el)
}
break;
case ElementType::MEASURE_NUMBER:
{
Measure* mea = toMeasure(el->parent());
switch (mea->measureNumberMode()) {
// If the user tries to remove an automatically generated measure number,
// we should force the measure not to show any measure number
case MeasureNumberMode::AUTO:
mea->undoChangeProperty(Pid::MEASURE_NUMBER_MODE, static_cast<int>(MeasureNumberMode::HIDE));
break;
// If the user tries to remove a measure number that he added manually,
// then we should set the MeasureNumberMode to AUTO only if will not show if set to auto.
// If after setting the MeasureNumberMode to AUTO, the measure number still shows,
// We need to force the measure to hide its measure number.
case MeasureNumberMode::SHOW:
if (mea->showsMeasureNumberInAutoMode())
mea->undoChangeProperty(Pid::MEASURE_NUMBER_MODE, static_cast<int>(MeasureNumberMode::HIDE));
else
mea->undoChangeProperty(Pid::MEASURE_NUMBER_MODE, static_cast<int>(MeasureNumberMode::AUTO));
break;
}
}
break;
case ElementType::REHEARSAL_MARK:
case ElementType::TEMPO_TEXT:
{

View file

@ -471,31 +471,70 @@ qreal Measure::tick2pos(Fraction tck) const
return x1 + pos().x();
}
//---------------------------------------------------------
// showsMeasureNumberInAutoMode
/// Wheter the measure will show measure number(s) when MeasureNumberMode is set to AUTO
//---------------------------------------------------------
bool Measure::showsMeasureNumberInAutoMode()
{
// Check wheter any measure number should be shown
if (!score()->styleB(Sid::showMeasureNumber))
return false;
// Measure numbers should not be shown on irregular measures.
if (irregular())
return false;
// Measure numbers should not show on first measure unless specified with Sid::showMeasureNumberOne
if (!no())
return score()->styleB(Sid::showMeasureNumberOne);
if (score()->styleB(Sid::measureNumberSystem))
// Show either if
// 1) This is the first measure of the system OR
// 2) The previous measure in the system is the first, and is irregular.
return (isFirstInSystem()
|| (prevMeasure() && prevMeasure()->irregular() && prevMeasure()->isFirstInSystem()));
else {
// In the case of an interval, we should show the measure number either if:
// 1) We should show them every measure
int interval = score()->styleI(Sid::measureNumberInterval);
if (interval == 1)
return true;
// 2) (measureNumber + 1) % interval == 0 (or 1 if measure number one is numbered.)
// If measure number 1 is numbered, and the interval is let's say 5, then we should number #1, 6, 11, 16, etc.
// If measure number 1 is not numbered, with the same interval (5), then we should number #5, 10, 15, 20, etc.
return (((no() + 1) % score()->styleI(Sid::measureNumberInterval)) == (score()->styleB(Sid::showMeasureNumberOne) ? 1 : 0));
}
}
//---------------------------------------------------------
// showsMeasureNumber
/// Wheter the Measure shows a MeasureNumber
//---------------------------------------------------------
bool Measure::showsMeasureNumber()
{
if (_noMode == MeasureNumberMode::SHOW)
return true;
else if (_noMode == MeasureNumberMode::HIDE)
return false;
else {
return showsMeasureNumberInAutoMode();
}
}
//---------------------------------------------------------
// layoutMeasureNumber
/// Layouts the Measure Numbers according to the Measure's MeasureNumberMode
//---------------------------------------------------------
void Measure::layoutMeasureNumber()
{
bool smn = false;
bool smn = showsMeasureNumber();
if (_noMode == MeasureNumberMode::SHOW)
smn = true;
else if (_noMode == MeasureNumberMode::HIDE)
smn = false;
else {
if (score()->styleB(Sid::showMeasureNumber)
&& !irregular()
&& (no() || score()->styleB(Sid::showMeasureNumberOne))) {
if (score()->styleB(Sid::measureNumberSystem))
smn = isFirstInSystem() || (prevMeasure() && prevMeasure()->irregular() && prevMeasure()->isFirstInSystem());
else {
smn = (no() == 0 && score()->styleB(Sid::showMeasureNumberOne)) ||
( ((no() + 1) % score()->styleI(Sid::measureNumberInterval)) == (score()->styleB(Sid::showMeasureNumberOne) ? 1 : 0) ) ||
(score()->styleI(Sid::measureNumberInterval) == 1);
}
}
}
QString s;
if (smn)
s = QString("%1").arg(no() + 1);

View file

@ -156,6 +156,9 @@ class Measure final : public MeasureBase {
void stretchMeasure(qreal stretch);
Fraction computeTicks();
void layout2();
bool showsMeasureNumber();
bool showsMeasureNumberInAutoMode();
void layoutMeasureNumber();
Chord* findChord(Fraction tick, int track);