178 lines
7.3 KiB
C++
178 lines
7.3 KiB
C++
//=============================================================================
|
|
// MuseScore
|
|
// Linux Music Score Editor
|
|
//
|
|
// Copyright (C) 2011 Werner Schweer and others
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License version 2.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
//=============================================================================
|
|
|
|
#include "timesigproperties.h"
|
|
#include "libmscore/timesig.h"
|
|
#include "libmscore/mcursor.h"
|
|
#include "libmscore/durationtype.h"
|
|
#include "libmscore/score.h"
|
|
#include "libmscore/chord.h"
|
|
#include "libmscore/measure.h"
|
|
#include "libmscore/part.h"
|
|
#include "exampleview.h"
|
|
#include "menus.h"
|
|
#include "musescore.h"
|
|
#include "icons.h"
|
|
|
|
namespace Ms {
|
|
|
|
//---------------------------------------------------------
|
|
// TimeSigProperties
|
|
//---------------------------------------------------------
|
|
|
|
TimeSigProperties::TimeSigProperties(TimeSig* t, QWidget* parent)
|
|
: QDialog(parent)
|
|
{
|
|
setObjectName("TimeSigProperties");
|
|
setupUi(this);
|
|
fourfourButton->setIcon(*icons[int(Icons::timesig_common_ICON)]);
|
|
allaBreveButton->setIcon(*icons[int(Icons::timesig_allabreve_ICON)]);
|
|
|
|
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
|
timesig = t;
|
|
|
|
zText->setText(timesig->numeratorString());
|
|
nText->setText(timesig->denominatorString());
|
|
// set validators for numerator and denominator strings
|
|
// which only accept '+', '(', ')', digits and some time symb conventional representations
|
|
QRegExp rx("[0-9+CO()\\x00A2\\x00D8]*");
|
|
QValidator *validator = new QRegExpValidator(rx, this);
|
|
zText->setValidator(validator);
|
|
nText->setValidator(validator);
|
|
|
|
Fraction nominal = timesig->sig() / timesig->stretch();
|
|
nominal.reduce();
|
|
zNominal->setValue(nominal.numerator());
|
|
nNominal->setValue(nominal.denominator());
|
|
Fraction sig(timesig->sig());
|
|
zActual->setValue(sig.numerator());
|
|
nActual->setValue(sig.denominator());
|
|
zNominal->setEnabled(false);
|
|
nNominal->setEnabled(false);
|
|
|
|
// TODO: fix http://musescore.org/en/node/42341
|
|
// for now, editing of actual (local) time sig is disabled in dialog
|
|
// but more importantly, the dialog should make it clear that this is "local" change only
|
|
// and not normally the right way to add 7/4 to a score
|
|
zActual->setEnabled(false);
|
|
nActual->setEnabled(false);
|
|
switch (timesig->timeSigType()) {
|
|
case TimeSigType::NORMAL:
|
|
textButton->setChecked(true);
|
|
break;
|
|
case TimeSigType::FOUR_FOUR:
|
|
fourfourButton->setChecked(true);
|
|
break;
|
|
case TimeSigType::ALLA_BREVE:
|
|
allaBreveButton->setChecked(true);
|
|
break;
|
|
}
|
|
|
|
// set ID's of other symbols
|
|
struct ProlatioTable {
|
|
SymId id;
|
|
Icons icon;
|
|
};
|
|
static const std::vector<ProlatioTable> prolatioList = {
|
|
{ SymId::mensuralProlation1, Icons::timesig_prolatio01_ICON }, // tempus perfectum, prol. perfecta
|
|
{ SymId::mensuralProlation2, Icons::timesig_prolatio02_ICON }, // tempus perfectum, prol. imperfecta
|
|
{ SymId::mensuralProlation3, Icons::timesig_prolatio03_ICON }, // tempus perfectum, prol. imperfecta, dimin.
|
|
{ SymId::mensuralProlation4, Icons::timesig_prolatio04_ICON }, // tempus perfectum, prol. perfecta, dimin.
|
|
{ SymId::mensuralProlation5, Icons::timesig_prolatio05_ICON }, // tempus imperf. prol. perfecta
|
|
{ SymId::mensuralProlation7, Icons::timesig_prolatio07_ICON }, // tempus imperf., prol. imperfecta, reversed
|
|
{ SymId::mensuralProlation8, Icons::timesig_prolatio08_ICON }, // tempus imperf., prol. perfecta, dimin.
|
|
{ SymId::mensuralProlation10, Icons::timesig_prolatio10_ICON }, // tempus imperf., prol imperfecta, dimin., reversed
|
|
{ SymId::mensuralProlation11, Icons::timesig_prolatio11_ICON }, // tempus inperf., prol. perfecta, reversed
|
|
};
|
|
|
|
ScoreFont* scoreFont = gscore->scoreFont();
|
|
int idx = 0;
|
|
otherCombo->clear();
|
|
for (ProlatioTable pt : prolatioList) {
|
|
const QString& str = scoreFont->toString(pt.id);
|
|
if (str.size() > 0) {
|
|
otherCombo->addItem(*icons[int(pt.icon)],"", int(pt.id));
|
|
// if time sig matches this symbol string, set as selected
|
|
if (timesig->timeSigType() == TimeSigType::NORMAL && timesig->denominatorString().isEmpty()
|
|
&& timesig->numeratorString() == str) {
|
|
textButton->setChecked(false);
|
|
otherButton->setChecked(true);
|
|
otherCombo->setCurrentIndex(idx);
|
|
}
|
|
}
|
|
idx++;
|
|
}
|
|
|
|
Groups g = t->groups();
|
|
if (g.empty())
|
|
g = Groups::endings(timesig->sig()); // initialize with default
|
|
groups->setSig(timesig->sig(), g, timesig->numeratorString(), timesig->denominatorString());
|
|
|
|
MuseScore::restoreGeometry(this);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// accept
|
|
//---------------------------------------------------------
|
|
|
|
void TimeSigProperties::accept()
|
|
{
|
|
TimeSigType ts = TimeSigType::NORMAL;
|
|
if (textButton->isChecked())
|
|
ts = TimeSigType::NORMAL;
|
|
else if (fourfourButton->isChecked())
|
|
ts = TimeSigType::FOUR_FOUR;
|
|
else if (allaBreveButton->isChecked())
|
|
ts = TimeSigType::ALLA_BREVE;
|
|
else if (otherButton->isChecked()) {
|
|
// if other symbol, set as normal text...
|
|
ts = TimeSigType::NORMAL;
|
|
ScoreFont* scoreFont = timesig->score()->scoreFont();
|
|
SymId symId = (SymId)( otherCombo->itemData(otherCombo->currentIndex()).toInt() );
|
|
// ...and set numerator to font string for symbol and denominator to empty string
|
|
timesig->setNumeratorString(scoreFont->toString(symId));
|
|
timesig->setDenominatorString(QString());
|
|
}
|
|
|
|
Fraction actual(zActual->value(), nActual->value());
|
|
Fraction nominal(zNominal->value(), nNominal->value());
|
|
timesig->setSig(actual, ts);
|
|
timesig->setStretch(nominal / actual);
|
|
|
|
if (zText->text() != timesig->numeratorString())
|
|
timesig->setNumeratorString(zText->text());
|
|
if (nText->text() != timesig->denominatorString())
|
|
timesig->setDenominatorString(nText->text());
|
|
|
|
Groups g = groups->groups();
|
|
timesig->setGroups(g);
|
|
QDialog::accept();
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// hideEvent
|
|
//---------------------------------------------------------
|
|
|
|
void TimeSigProperties::hideEvent(QHideEvent* event)
|
|
{
|
|
MuseScore::saveGeometry(this);
|
|
QWidget::hideEvent(event);
|
|
}
|
|
}
|
|
|