diff --git a/changes b/changes index 1fca2c9e4554f2249f414671536880bb609cb842..b97522884df97c665b9f7bd59397b0217e21ba33 100644 --- a/changes +++ b/changes @@ -2,6 +2,7 @@ Nootka plays melodies - updated on-line help - unlocked help button(s) to opening related help sites + - improved displaying accidentals and neutrals in melodies BUGS FIXES - fixed melody chart tip - correctly displays every attempt summary - fixed and improved animations of accidentals from note to key signature diff --git a/src/plugins/level/accidsettings.cpp b/src/plugins/level/accidsettings.cpp index 1c1d2f137afc17281a4e1ef86d07442d9ef2646a..735686bcd4d6519d3e551a6645ade58014dfd185 100644 --- a/src/plugins/level/accidsettings.cpp +++ b/src/plugins/level/accidsettings.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2012-2014 by Tomasz Bojczuk * + * Copyright (C) 2012-2015 by Tomasz Bojczuk * * tomaszbojczuk@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -26,99 +26,97 @@ accidSettings::accidSettings(TlevelCreatorDlg* creator) : TabstractLevelPage(creator) { - QVBoxLayout *mainLay = new QVBoxLayout; - mainLay->setAlignment(Qt::AlignHCenter); - - - QVBoxLayout *accLay = new QVBoxLayout; - m_sharpsChB = new QCheckBox(tr("# - sharps"),this); - m_sharpsChB->setStatusTip(tr("Sharps will be used in questions and answers.<br>It has to be checked, if keys with sharps are used.")); - m_sharpsChB->setChecked(true); - m_flatsChB = new QCheckBox(tr("b - flats"),this); - m_flatsChB->setStatusTip(tr("Flats will be used in questions and answers.<br>It has to be checked, if keys with flats are used.")); - m_flatsChB->setChecked(true); - m_doubleAccChB = new QCheckBox(tr("x, bb - double accidentals"),this); - accLay->addWidget(m_sharpsChB); - accLay->addWidget(m_flatsChB); - accLay->addWidget(m_doubleAccChB); - accLay->addStretch(1); - m_accidGr = new QGroupBox(accidsText(), this); - m_accidGr->setStatusTip(tr("Accidentals used in exam.")); - m_accidGr->setLayout(accLay); - m_forceAccChB = new QCheckBox(tr("force using appropriate accidental"),this); - m_forceAccChB->setStatusTip(tr("if checked, it is possible to select a note<br>with given accidental only.")); - QHBoxLayout *entireAccLay = new QHBoxLayout; - entireAccLay->addStretch(); - entireAccLay->addWidget(m_accidGr); - entireAccLay->addWidget(m_forceAccChB); - entireAccLay->addStretch(); - mainLay->addLayout(entireAccLay); - - QHBoxLayout *keyLay = new QHBoxLayout; - m_keySignGr = new QGroupBox(tr("use key signatures"),this); - m_keySignGr->setCheckable(true); - - QVBoxLayout *rangeLay = new QVBoxLayout; - rangeLay->setAlignment(Qt::AlignCenter); - m_singleKeyRadio = new QRadioButton(tr("single key"),this); - m_singleKeyRadio->setStatusTip(tr("only one, selected key signature<br>for whole exam.")); - m_rangeKeysRadio = new QRadioButton(tr("range of keys"),this); - m_rangeKeysRadio->setStatusTip(tr("random key signature from selected range.")); - m_rangeButGr = new QButtonGroup(this); - m_rangeButGr->addButton(m_singleKeyRadio); - m_rangeButGr->addButton(m_rangeKeysRadio); - m_rangeKeysRadio->setChecked(true); - rangeLay->addWidget(m_singleKeyRadio,0,Qt::AlignCenter); - rangeLay->addWidget(m_rangeKeysRadio,0,Qt::AlignCenter); - QHBoxLayout *comboLay = new QHBoxLayout; - m_fromKeyCombo = new TkeySignComboBox(this); - m_fromKeyCombo->setStatusTip(tr("Select a key signature.<br>Appropriate accidentals used in exam<br>will be automatically selected !")); - m_fromKeyCombo->setKeySignature(TkeySignature(0)); - m_toKeyCombo = new TkeySignComboBox(this); - m_toKeyCombo->setStatusTip(m_fromKeyCombo->statusTip()); - m_fromKeyCombo->setKeySignature(TkeySignature(0)); - comboLay->addWidget(m_fromKeyCombo); - QLabel *ll = new QLabel(" - ", this); - comboLay->addWidget(ll); - comboLay->addWidget(m_toKeyCombo); - rangeLay->addLayout(comboLay); - rangeLay->addStretch(1); - m_keyInAnswerChB = new QCheckBox(tr("select a key signature manually"),this); - m_keyInAnswerChB->setStatusTip(tr("if checked, in exam user have to select a key signature,<br>otherwise it is shown by application.")); - rangeLay->addWidget(m_keyInAnswerChB,0,Qt::AlignCenter); - keyLay->addLayout(rangeLay); - keyLay->addStretch(1); - - m_keySignGr->setLayout(keyLay); - m_keySignGr->setChecked(false); - mainLay->addWidget(m_keySignGr, 1, Qt::AlignCenter); - - m_currKeySignChBox = new QCheckBox(tr("notes in current key signature only"),this); - m_currKeySignChBox->setStatusTip(tr("Only notes from current key signature are taken.<br>If key signature is disabled accidentals are not used.")); - mainLay->addWidget(m_currKeySignChBox, 0, Qt::AlignCenter); - - setLayout(mainLay); - - connect(m_rangeButGr, SIGNAL(buttonClicked(int)), this, SLOT(keyRangeChanged())); - - connect(m_fromKeyCombo, SIGNAL(activated(int)), this, SLOT(keySignChanged())); - connect(m_toKeyCombo, SIGNAL(activated(int)), this, SLOT(keySignChanged())); - connect(m_sharpsChB, SIGNAL(clicked()), this, SLOT(keySignChanged())); - connect(m_flatsChB, SIGNAL(clicked()), this, SLOT(keySignChanged())); - connect(m_keySignGr, SIGNAL(clicked()), this, SLOT(keySignChanged())); - - connect(m_forceAccChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_sharpsChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_flatsChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_doubleAccChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_keySignGr, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_singleKeyRadio, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_rangeKeysRadio, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_fromKeyCombo, SIGNAL(activated(int)), this, SLOT(whenParamsChanged())); - connect(m_toKeyCombo, SIGNAL(activated(int)), this, SLOT(whenParamsChanged())); - connect(m_keyInAnswerChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - connect(m_currKeySignChBox, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); - + QVBoxLayout *mainLay = new QVBoxLayout; + mainLay->setAlignment(Qt::AlignHCenter); + + QVBoxLayout *accLay = new QVBoxLayout; + m_sharpsChB = new QCheckBox(tr("# - sharps"),this); + m_sharpsChB->setStatusTip(tr("Sharps will be used in questions and answers.<br>It has to be checked, if keys with sharps are used.")); + m_sharpsChB->setChecked(true); + m_flatsChB = new QCheckBox(tr("b - flats"),this); + m_flatsChB->setStatusTip(tr("Flats will be used in questions and answers.<br>It has to be checked, if keys with flats are used.")); + m_flatsChB->setChecked(true); + m_doubleAccChB = new QCheckBox(tr("x, bb - double accidentals"),this); + accLay->addWidget(m_sharpsChB); + accLay->addWidget(m_flatsChB); + accLay->addWidget(m_doubleAccChB); + accLay->addStretch(1); + m_accidGr = new QGroupBox(accidsText(), this); + m_accidGr->setStatusTip(tr("Accidentals used in exam.")); + m_accidGr->setLayout(accLay); + m_forceAccChB = new QCheckBox(tr("force using appropriate accidental"),this); + m_forceAccChB->setStatusTip(tr("if checked, it is possible to select a note<br>with given accidental only.")); + QHBoxLayout *entireAccLay = new QHBoxLayout; + entireAccLay->addStretch(); + entireAccLay->addWidget(m_accidGr); + entireAccLay->addWidget(m_forceAccChB); + entireAccLay->addStretch(); + mainLay->addLayout(entireAccLay); + + QHBoxLayout *keyLay = new QHBoxLayout; + m_keySignGr = new QGroupBox(tr("use key signatures"),this); + m_keySignGr->setCheckable(true); + + QVBoxLayout *rangeLay = new QVBoxLayout; + rangeLay->setAlignment(Qt::AlignCenter); + m_singleKeyRadio = new QRadioButton(tr("single key"),this); + m_singleKeyRadio->setStatusTip(tr("only one, selected key signature<br>for whole exam.")); + m_rangeKeysRadio = new QRadioButton(tr("range of keys"),this); + m_rangeKeysRadio->setStatusTip(tr("random key signature from selected range.")); + m_rangeButGr = new QButtonGroup(this); + m_rangeButGr->addButton(m_singleKeyRadio); + m_rangeButGr->addButton(m_rangeKeysRadio); + m_rangeKeysRadio->setChecked(true); + rangeLay->addWidget(m_singleKeyRadio,0,Qt::AlignCenter); + rangeLay->addWidget(m_rangeKeysRadio,0,Qt::AlignCenter); + QHBoxLayout *comboLay = new QHBoxLayout; + m_fromKeyCombo = new TkeySignComboBox(this); + m_fromKeyCombo->setStatusTip(tr("Select a key signature.<br>Appropriate accidentals used in exam<br>will be automatically selected !")); + m_fromKeyCombo->setKeySignature(TkeySignature(0)); + m_toKeyCombo = new TkeySignComboBox(this); + m_toKeyCombo->setStatusTip(m_fromKeyCombo->statusTip()); + m_fromKeyCombo->setKeySignature(TkeySignature(0)); + comboLay->addWidget(m_fromKeyCombo); + QLabel *ll = new QLabel(" - ", this); + comboLay->addWidget(ll); + comboLay->addWidget(m_toKeyCombo); + rangeLay->addLayout(comboLay); + rangeLay->addStretch(1); + m_keyInAnswerChB = new QCheckBox(tr("select a key signature manually"),this); + m_keyInAnswerChB->setStatusTip(tr("if checked, in exam user have to select a key signature,<br>otherwise it is shown by application.")); + rangeLay->addWidget(m_keyInAnswerChB,0,Qt::AlignCenter); + keyLay->addLayout(rangeLay); + keyLay->addStretch(1); + + m_keySignGr->setLayout(keyLay); + m_keySignGr->setChecked(false); + mainLay->addWidget(m_keySignGr, 1, Qt::AlignCenter); + + m_currKeySignChBox = new QCheckBox(tr("notes in current key signature only"),this); + m_currKeySignChBox->setStatusTip(tr("Only notes from current key signature are taken.<br>If key signature is disabled accidentals are not used.")); + mainLay->addWidget(m_currKeySignChBox, 0, Qt::AlignCenter); + + setLayout(mainLay); + + connect(m_rangeButGr, SIGNAL(buttonClicked(int)), this, SLOT(keyRangeChanged())); + + connect(m_fromKeyCombo, SIGNAL(activated(int)), this, SLOT(keySignChanged())); + connect(m_toKeyCombo, SIGNAL(activated(int)), this, SLOT(keySignChanged())); + connect(m_sharpsChB, SIGNAL(clicked()), this, SLOT(keySignChanged())); + connect(m_flatsChB, SIGNAL(clicked()), this, SLOT(keySignChanged())); + connect(m_keySignGr, SIGNAL(clicked()), this, SLOT(keySignChanged())); + + connect(m_forceAccChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_sharpsChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_flatsChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_doubleAccChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_keySignGr, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_singleKeyRadio, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_rangeKeysRadio, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_fromKeyCombo, SIGNAL(activated(int)), this, SLOT(whenParamsChanged())); + connect(m_toKeyCombo, SIGNAL(activated(int)), this, SLOT(whenParamsChanged())); + connect(m_keyInAnswerChB, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); + connect(m_currKeySignChBox, SIGNAL(clicked()), this, SLOT(whenParamsChanged())); } @@ -141,6 +139,7 @@ void accidSettings::loadLevel (Tlevel* level) { m_keyInAnswerChB->setChecked(level->manualKey); m_currKeySignChBox->setChecked(level->onlyCurrKey); keyRangeChanged(); + changed(); saveLevel(wLevel()); blockSignals(false); } @@ -151,12 +150,12 @@ void accidSettings::saveLevel (Tlevel* level) { level->withSharps = m_sharpsChB->isChecked(); level->withFlats = m_flatsChB->isChecked(); level->withDblAcc = m_doubleAccChB->isChecked(); - } else { // ignore checking when groupbox is disabled + } else { // ignore checking when group box is disabled level->withSharps = false; level->withFlats = false; level->withDblAcc = false; } - level->forceAccids = m_forceAccChB->isChecked(); + level->forceAccids = m_forceAccChB->isEnabled() && m_forceAccChB->isChecked(); if (m_keySignGr->isEnabled()) { level->useKeySign = m_keySignGr->isChecked(); if (m_singleKeyRadio->isChecked()) { @@ -178,8 +177,8 @@ void accidSettings::saveLevel (Tlevel* level) { level->loKey = m_fromKeyCombo->getKeySignature(); level->hiKey = m_toKeyCombo->getKeySignature(); } - } - level->manualKey = m_keyInAnswerChB->isChecked(); + } + level->manualKey = m_keyInAnswerChB->isEnabled() && m_keyInAnswerChB->isChecked(); } else { level->useKeySign = false; level->manualKey = false; @@ -191,40 +190,40 @@ void accidSettings::saveLevel (Tlevel* level) { void accidSettings::changed() { blockSignals(true); - // TODO: Is disabling whole accidentals box really necessary? - if (wLevel()->canBeScore()) + if (wLevel()->canBeScore()) enableKeys(true); - else + else enableKeys(false); - if ((wLevel()->canBeScore() || wLevel()->canBeName()) && + if ((wLevel()->answerIsNote() || wLevel()->answerIsName()) && (wLevel()->withDblAcc || wLevel()->withFlats || wLevel()->withSharps)) m_forceAccChB->setDisabled(false); else m_forceAccChB->setDisabled(true); + m_keyInAnswerChB->setDisabled(!wLevel()->answerIsNote()); // disable manual key check box if no score as an answer blockSignals(false); } void accidSettings::enableAccids(bool enable) { - if (enable) { // score and note names are enabled in the level - m_accidGr->setDisabled(false); - setStatusTip(""); - } else { - m_accidGr->setDisabled(true); - updateStatusTip(); - } + if (enable) { // score and note names are enabled in the level + m_accidGr->setDisabled(false); + setStatusTip(""); + } else { + m_accidGr->setDisabled(true); + updateStatusTip(); + } } void accidSettings::enableKeys(bool enable) { - if (enable) { // score is enabled in the level - m_keySignGr->setDisabled(false); - if (m_accidGr->isEnabled()) - setStatusTip(""); - } else { - m_keySignGr->setDisabled(true); - updateStatusTip(); - } + if (enable) { // score is enabled in the level + m_keySignGr->setDisabled(false); + if (m_accidGr->isEnabled()) + setStatusTip(""); + } else { + m_keySignGr->setDisabled(true); + updateStatusTip(); + } } @@ -232,19 +231,19 @@ void accidSettings::enableKeys(bool enable) { void accidSettings::keyRangeChanged() { - if (m_keySignGr->isChecked()) { // key signatures enabled - if (m_singleKeyRadio->isChecked()) { // single key signature - m_toKeyCombo->setKeySignature(TkeySignature(0)); // reset and disable hiKey of range - m_toKeyCombo->setDisabled(true); - m_keyInAnswerChB->setDisabled(true); - m_keyInAnswerChB->setChecked(false); - } - else { - m_toKeyCombo->setDisabled(false); - m_keyInAnswerChB->setDisabled(false); - } - } - keySignChanged(); + if (m_keySignGr->isChecked()) { // key signatures enabled + if (m_singleKeyRadio->isChecked()) { // single key signature + m_toKeyCombo->setKeySignature(TkeySignature(0)); // reset and disable hiKey of range + m_toKeyCombo->setDisabled(true); + m_keyInAnswerChB->setDisabled(true); + m_keyInAnswerChB->setChecked(false); + } + else { + m_toKeyCombo->setDisabled(false); + m_keyInAnswerChB->setDisabled(false); + } + } + keySignChanged(); } @@ -324,13 +323,14 @@ void accidSettings::keySignChanged() { blockSignals(false); } + void accidSettings::whenParamsChanged() { changedLocal(); } + void accidSettings::updateStatusTip() { - setStatusTip("<b>" + tr("Elements are disabled because appropriate types of questions or answers are not selected.") - + "</b>"); + setStatusTip("<b>" + tr("Elements are disabled because appropriate types of questions or answers are not selected.") + "</b>"); }