From ea736ea364726931dbec4d793702f5698028f009 Mon Sep 17 00:00:00 2001 From: lasconic Date: Fri, 3 Jun 2016 18:26:51 +0200 Subject: [PATCH] add debug menu option to hightlight corrupted measures --- libmscore/check.cpp | 9 +++++ libmscore/layout.cpp | 4 +++ libmscore/measure.cpp | 3 ++ libmscore/measure.h | 4 ++- libmscore/mscore.cpp | 1 + libmscore/mscore.h | 1 + libmscore/score.h | 2 +- mscore/musescore.cpp | 11 +++++++ mscore/scoreview.cpp | 76 ++++++++++++++++++++++++++++--------------- mscore/shortcut.cpp | 10 ++++++ 10 files changed, 92 insertions(+), 29 deletions(-) diff --git a/libmscore/check.cpp b/libmscore/check.cpp index 924a815aac..d3f892f354 100644 --- a/libmscore/check.cpp +++ b/libmscore/check.cpp @@ -178,6 +178,9 @@ bool Score::sanityCheck(const QString& name) for (int staffIdx = 0; staffIdx < endStaff; ++staffIdx) { Rest* fmrest0 = 0; // full measure rest in voice 0 Fraction voices[VOICES] = {}; +#ifndef NDEBUG + m->mstaff(staffIdx)->_corrupted = false; +#endif for (Segment* s = m->first(Segment::Type::ChordRest); s; s = s->next(Segment::Type::ChordRest)) { for (int v = 0; v < VOICES; ++v) { ChordRest* cr = toChordRest(s->element(staffIdx * VOICES + v)); @@ -196,6 +199,9 @@ bool Score::sanityCheck(const QString& name) QString msg = tr("Measure %1 Staff %2 incomplete. Expected: %3; Found: %4").arg(mNumber).arg( staffIdx+1).arg(mLen.print()).arg(voices[0].print()); qDebug() << msg; error += QString("%1\n").arg(msg); +#ifndef NDEBUG + m->mstaff(staffIdx)->_corrupted = true; +#endif result = false; // try to fix a bad full measure rest if (fmrest0) { @@ -210,6 +216,9 @@ bool Score::sanityCheck(const QString& name) QString msg = tr("Measure %1, staff %2, voice %3 too long. Expected: %4; Found: %5").arg( mNumber).arg(staffIdx + 1).arg(v+1).arg(mLen.print()).arg(voices[v].print()); qDebug() << msg; error += QString("%1\n").arg(msg); +#ifndef NDEBUG + m->mstaff(staffIdx)->_corrupted = true; +#endif result = false; } } diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 8dbe7e4781..c690a02af6 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -3539,6 +3539,10 @@ void Score::doLayout() // _mscVersion is used during read and first layout // but then it's used for drag and drop and should be set to new version _mscVersion = MSCVERSION; // for later drag & drop usage +#ifndef NDEBUG + if (MScore::showCorruptedMeasures) + sanityCheck(); +#endif } //--------------------------------------------------------- diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index 1d6b399bba..796031694e 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -100,6 +100,9 @@ MStaff::MStaff(const MStaff& m) _vspacerDown = 0; _visible = m._visible; _slashStyle = m._slashStyle; +#ifndef NDEBUG + _corrupted = m._corrupted; +#endif } //--------------------------------------------------------- diff --git a/libmscore/measure.h b/libmscore/measure.h index e14f9653a4..8fd19aa9a8 100644 --- a/libmscore/measure.h +++ b/libmscore/measure.h @@ -57,7 +57,9 @@ struct MStaff { ///< this changes some layout rules bool _visible { true }; bool _slashStyle { false }; - +#ifndef NDEBUG + bool _corrupted { false }; +#endif MStaff() {} ~MStaff(); MStaff(const MStaff&); diff --git a/libmscore/mscore.cpp b/libmscore/mscore.cpp index c5af31a16a..ea728e0858 100644 --- a/libmscore/mscore.cpp +++ b/libmscore/mscore.cpp @@ -68,6 +68,7 @@ bool MScore::showMeasureShapes = false; bool MScore::noHorizontalStretch = false; bool MScore::noVerticalStretch = false; bool MScore::showBoundingRect = false; +bool MScore::showCorruptedMeasures = true; // #endif bool MScore::saveTemplateMode = false; diff --git a/libmscore/mscore.h b/libmscore/mscore.h index 2c3cdb6d95..c0e9769582 100644 --- a/libmscore/mscore.h +++ b/libmscore/mscore.h @@ -491,6 +491,7 @@ class MScore : public QObject { static bool showSegmentShapes; static bool showMeasureShapes; static bool showBoundingRect; + static bool showCorruptedMeasures; // #endif static bool debugMode; static bool testMode; diff --git a/libmscore/score.h b/libmscore/score.h index 1001009d15..cea67771a9 100644 --- a/libmscore/score.h +++ b/libmscore/score.h @@ -1070,7 +1070,7 @@ class Score : public QObject, public ScoreElement { //@ ?? Q_INVOKABLE void cropPage(qreal margins); - bool sanityCheck(const QString& name); + bool sanityCheck(const QString& name = QString()); bool checkKeys(); bool checkClefs(); diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index 9ffc61bac7..ed9c24c9f9 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -1093,6 +1093,10 @@ MuseScore::MuseScore() a = getAction("show-bounding-rect"); a->setCheckable(true); menuDebug->addAction(a); + a = getAction("show-corrupted-measures"); + a->setCheckable(true); + a->setChecked(true); + menuDebug->addAction(a); #endif //--------------------- @@ -4695,6 +4699,13 @@ void MuseScore::cmd(QAction* a, const QString& cmd) cs->update(); } } + else if (cmd == "show-corrupted-measures") { + MScore::showCorruptedMeasures = a->isChecked(); + if (cs) { + cs->setLayoutAll(); + cs->update(); + } + } #endif else { if (cv) { diff --git a/mscore/scoreview.cpp b/mscore/scoreview.cpp index e897a594d4..8172ab126f 100644 --- a/mscore/scoreview.cpp +++ b/mscore/scoreview.cpp @@ -1929,40 +1929,62 @@ void ScoreView::paint(const QRect& r, QPainter& p) drawElements(p, ell); #ifndef NDEBUG - if (MScore::showSegmentShapes) { - for (const System* system : page->systems()) { - for (const MeasureBase* mb : system->measures()) { - if (mb->type() == Element::Type::MEASURE) { - const Measure* m = static_cast(mb); - p.setBrush(Qt::NoBrush); - p.setPen(QPen(QBrush(Qt::darkYellow), 0.5)); - for (const Segment* s = m->first(); s; s = s->next()) { - for (int i = 0; i < score()->nstaves(); ++i) { - QPointF pt(s->pos().x() + m->pos().x() + system->pos().x(), - system->staffYpage(i)); + if (!score()->printing()) { + if (MScore::showSegmentShapes) { + for (const System* system : page->systems()) { + for (const MeasureBase* mb : system->measures()) { + if (mb->type() == Element::Type::MEASURE) { + const Measure* m = static_cast(mb); + p.setBrush(Qt::NoBrush); + p.setPen(QPen(QBrush(Qt::darkYellow), 0.5)); + for (const Segment* s = m->first(); s; s = s->next()) { + for (int i = 0; i < score()->nstaves(); ++i) { + QPointF pt(s->pos().x() + m->pos().x() + system->pos().x(), + system->staffYpage(i)); + p.translate(pt); + s->shapes().at(i).draw(&p); + p.translate(-pt); + } + } + } + } + } + } + if (MScore::showMeasureShapes) { + for (const System* system : page->systems()) { + for (const MeasureBase* mb : system->measures()) { + if (mb->type() == Element::Type::MEASURE) { + const Measure* m = static_cast(mb); + p.setPen(Qt::NoPen); + p.setBrush(QBrush(QColor(0, 0, 255, 60))); + for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) { + const MStaff* ms = m->mstaff(staffIdx); + QPointF pt(m->pos().x() + system->pos().x(), 0); p.translate(pt); - s->shapes().at(i).draw(&p); + QPointF o(0.0, m->system()->staffYpage(staffIdx)); + ms->shape().translated(o).draw(&p); p.translate(-pt); } } } } } - } - if (MScore::showMeasureShapes) { - for (const System* system : page->systems()) { - for (const MeasureBase* mb : system->measures()) { - if (mb->type() == Element::Type::MEASURE) { - const Measure* m = static_cast(mb); - p.setPen(Qt::NoPen); - p.setBrush(QBrush(QColor(0, 0, 255, 60))); - for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) { - const MStaff* ms = m->mstaff(staffIdx); - QPointF pt(m->pos().x() + system->pos().x(), 0); - p.translate(pt); - QPointF o(0.0, m->system()->staffYpage(staffIdx)); - ms->shape().translated(o).draw(&p); - p.translate(-pt); + if (MScore::showCorruptedMeasures) { + double _spatium = score()->spatium(); + QPen pen; + pen.setColor(Qt::red); + pen.setWidthF(1); + pen.setStyle(Qt::SolidLine); + p.setPen(pen); + for (const System* system : page->systems()) { + for (const MeasureBase* mb : system->measures()) { + if (mb->type() == Element::Type::MEASURE) { + const Measure* m = static_cast(mb); + for (int staffIdx = 0; staffIdx < _score->nstaves(); staffIdx++) { + if (m->mstaff(staffIdx)->_corrupted) { + p.drawRect(m->staffabbox(staffIdx).adjusted(0, -_spatium, 0, _spatium)); + } + } } } } diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 15e3644b3f..7b61db77ab 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -3408,6 +3408,16 @@ Shortcut Shortcut::_sc[] = { 0, Icons::Invalid_ICON, Qt::ApplicationShortcut + }, + { + MsWidget::MAIN_WINDOW, + STATE_ALL, + "show-corrupted-measures", + QT_TRANSLATE_NOOP("action","Show Corrupted Measures"), + QT_TRANSLATE_NOOP("action","Show corrupted measures"), + 0, + Icons::Invalid_ICON, + Qt::ApplicationShortcut } #endif };