MuseScore/mscore/newwizard.cpp

557 lines
18 KiB
C++
Raw Normal View History

2012-05-26 14:49:10 +02:00
//=============================================================================
// MusE Score
// Linux Music Score Editor
//
// Copyright (C) 2008 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 "newwizard.h"
#include "musescore.h"
#include "preferences.h"
#include "palette.h"
#include "instrdialog.h"
#include "templateBrowser.h"
#include "extension.h"
#include "icons.h"
#include "scoreaccessibility.h"
2012-05-26 14:49:10 +02:00
#include "libmscore/instrtemplate.h"
#include "libmscore/score.h"
#include "libmscore/staff.h"
#include "libmscore/clef.h"
#include "libmscore/part.h"
#include "libmscore/drumset.h"
#include "libmscore/keysig.h"
#include "libmscore/measure.h"
#include "libmscore/stafftype.h"
#include "libmscore/timesig.h"
#include "libmscore/sym.h"
2013-05-13 18:49:17 +02:00
namespace Ms {
2012-05-26 14:49:10 +02:00
extern Palette* newKeySigPalette();
extern void filterInstruments(QTreeWidget *instrumentList, const QString &searchPhrase = QString(""));
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
// TimesigWizard
//---------------------------------------------------------
TimesigWizard::TimesigWizard(QWidget* parent)
: QWidget(parent)
{
setupUi(this);
connect(tsCommonTime, SIGNAL(toggled(bool)), SLOT(commonTimeToggled(bool)));
connect(tsCutTime, SIGNAL(toggled(bool)), SLOT(cutTimeToggled(bool)));
connect(tsFraction, SIGNAL(toggled(bool)), SLOT(fractionToggled(bool)));
pickupMeasure->setChecked(false); // checked in the UI file to enable screen reader on pickup duration controls
tsCommonTime->setIcon(*icons[int(Icons::timesig_common_ICON)]);
tsCutTime->setIcon(*icons[int(Icons::timesig_allabreve_ICON)]);
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// measures
//---------------------------------------------------------
int TimesigWizard::measures() const
{
return measureCount->value();
}
//---------------------------------------------------------
// timesig
//---------------------------------------------------------
Fraction TimesigWizard::timesig() const
{
if (tsFraction->isChecked())
2012-07-26 14:55:30 +02:00
return Fraction(timesigZ->value(), 1 << timesigN->currentIndex());
2012-05-26 14:49:10 +02:00
else if (tsCommonTime->isChecked())
return Fraction(4, 4);
else
return Fraction(2, 2);
}
//---------------------------------------------------------
// pickupMeasure
//---------------------------------------------------------
bool TimesigWizard::pickup(int* z, int* n) const
{
*z = pickupTimesigZ->value();
*n = 1 << pickupTimesigN->currentIndex();
2012-05-26 14:49:10 +02:00
return pickupMeasure->isChecked();
}
//---------------------------------------------------------
// type
//---------------------------------------------------------
TimeSigType TimesigWizard::type() const
{
if (tsFraction->isChecked())
return TimeSigType::NORMAL;
2012-05-26 14:49:10 +02:00
if (tsCommonTime->isChecked())
return TimeSigType::FOUR_FOUR;
return TimeSigType::ALLA_BREVE;
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// commonTimeToggled
//---------------------------------------------------------
void TimesigWizard::commonTimeToggled(bool val)
{
if (val) {
// timesigZ->setValue(4);
// timesigN->setValue(4);
timesigZ->setEnabled(false);
timesigN->setEnabled(false);
}
}
//---------------------------------------------------------
// cutTimeToggled
//---------------------------------------------------------
void TimesigWizard::cutTimeToggled(bool val)
{
if (val) {
// timesigZ->setValue(2);
// timesigN->setValue(2);
timesigZ->setEnabled(false);
timesigN->setEnabled(false);
}
}
//---------------------------------------------------------
// fractionToggled
//---------------------------------------------------------
void TimesigWizard::fractionToggled(bool val)
{
if (val) {
timesigZ->setEnabled(true);
timesigN->setEnabled(true);
}
}
//---------------------------------------------------------
// TitleWizard
//---------------------------------------------------------
TitleWizard::TitleWizard(QWidget* parent)
: QWidget(parent)
{
setupUi(this);
}
//---------------------------------------------------------
// NewWizardInfoPage
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
NewWizardInfoPage::NewWizardInfoPage(QWidget* parent)
2012-05-26 14:49:10 +02:00
: QWizardPage(parent)
{
setTitle(tr("Create New Score"));
setSubTitle(tr("Enter score information:"));
setAccessibleName(QWizardPage::title());
setAccessibleDescription(QWizardPage::subTitle());
2012-05-26 14:49:10 +02:00
w = new TitleWizard;
QGridLayout* grid = new QGridLayout;
grid->addWidget(w, 0, 0);
setLayout(grid);
}
//---------------------------------------------------------
// initializePage
//---------------------------------------------------------
void NewWizardInfoPage::initializePage()
2012-05-26 14:49:10 +02:00
{
w->title->setText("");
w->subtitle->setText("");
}
//---------------------------------------------------------
// NewWizardInstrumentsPage
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
NewWizardInstrumentsPage::NewWizardInstrumentsPage(QWidget* parent)
2012-05-26 14:49:10 +02:00
: QWizardPage(parent)
{
setFinalPage(true);
setTitle(tr("Create New Score"));
setSubTitle(tr("Choose instruments on the left to add to instrument list on the right:"));
setAccessibleName(title());
setAccessibleDescription(subTitle());
instrumentsWidget = new InstrumentsWidget;
2012-05-26 14:49:10 +02:00
QGridLayout* grid = new QGridLayout;
grid->setSpacing(0);
grid->setContentsMargins(0, 0, 0, 0);
grid->addWidget(instrumentsWidget, 0, 0);
2012-05-26 14:49:10 +02:00
setLayout(grid);
connect(instrumentsWidget, SIGNAL(completeChanged(bool)), SLOT(setComplete(bool)));
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// initializePage
//---------------------------------------------------------
void NewWizardInstrumentsPage::initializePage()
2012-05-26 14:49:10 +02:00
{
complete = false;
instrumentsWidget->init();
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// setComplete
//---------------------------------------------------------
void NewWizardInstrumentsPage::setComplete(bool val)
2012-05-26 14:49:10 +02:00
{
complete = val;
emit completeChanged();
}
//---------------------------------------------------------
// isComplete
//---------------------------------------------------------
bool NewWizardInstrumentsPage::isComplete() const
{
return complete;
}
//---------------------------------------------------------
// createInstruments
//---------------------------------------------------------
void NewWizardInstrumentsPage::createInstruments(Score* s)
{
instrumentsWidget->createInstruments(s);
}
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
// NewWizardTimesigPage
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
NewWizardTimesigPage::NewWizardTimesigPage(QWidget* parent)
2012-05-26 14:49:10 +02:00
: QWizardPage(parent)
{
setFinalPage(true);
setTitle(tr("Create New Score"));
setSubTitle(tr("Choose time signature:"));
setAccessibleName(title());
setAccessibleDescription(subTitle());
2012-05-26 14:49:10 +02:00
w = new TimesigWizard;
QGridLayout* grid = new QGridLayout;
grid->addWidget(w, 0, 0);
setLayout(grid);
}
//---------------------------------------------------------
// NewWizardTemplatePage
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
NewWizardTemplatePage::NewWizardTemplatePage(QWidget* parent)
2012-05-26 14:49:10 +02:00
: QWizardPage(parent)
{
setFinalPage(true);
setTitle(tr("Create New Score"));
setSubTitle(tr("Choose template file:"));
setAccessibleName(title());
setAccessibleDescription(subTitle());
2012-05-26 14:49:10 +02:00
templateFileBrowser = new TemplateBrowser(this);
templateFileBrowser->setStripNumbers(true);
2012-05-26 14:49:10 +02:00
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(templateFileBrowser);
2012-05-26 14:49:10 +02:00
setLayout(layout);
connect(templateFileBrowser, SIGNAL(scoreSelected(const QString&)), SLOT(templateChanged(const QString&)));
connect(templateFileBrowser, SIGNAL(scoreActivated(const QString&)), SLOT(fileAccepted(const QString&)));
buildTemplatesList();
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// initializePage
//---------------------------------------------------------
void NewWizardTemplatePage::initializePage()
2012-05-26 14:49:10 +02:00
{
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// buildTemplatesList
//---------------------------------------------------------
void NewWizardTemplatePage::buildTemplatesList()
{
QDir dir(mscoreGlobalShare + "/templates");
QFileInfoList fil = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Readable | QDir::Dirs | QDir::Files, QDir::Name);
if(fil.isEmpty()){
fil.append(QFileInfo(QFile(":data/Empty_Score.mscz")));
}
QDir myTemplatesDir(preferences.getString(PREF_APP_PATHS_MYTEMPLATES));
fil.append(myTemplatesDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Readable | QDir::Dirs | QDir::Files, QDir::Name));
// append templates directories from extensions
QStringList extensionsDir = Extension::getDirectoriesByType(Extension::templatesDir);
for (QString extDir : extensionsDir) {
QDir extTemplateDir(extDir);
fil.append(extTemplateDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Readable | QDir::Dirs | QDir::Files, QDir::Name));
}
templateFileBrowser->setScores(fil);
}
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
// isComplete
//---------------------------------------------------------
bool NewWizardTemplatePage::isComplete() const
2012-05-26 14:49:10 +02:00
{
return !path.isEmpty();
}
//---------------------------------------------------------
// fileAccepted
//---------------------------------------------------------
void NewWizardTemplatePage::fileAccepted(const QString& s)
2012-05-26 14:49:10 +02:00
{
path = s;
templateFileBrowser->show();
if (wizard()->currentPage() == this)
wizard()->next();
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// templateChanged
//---------------------------------------------------------
void NewWizardTemplatePage::templateChanged(const QString& s)
2012-05-26 14:49:10 +02:00
{
setFinalPage(QFileInfo(s).completeBaseName() != "00-Blank");
2012-05-26 14:49:10 +02:00
path = s;
emit completeChanged();
}
//---------------------------------------------------------
// templatePath
//---------------------------------------------------------
QString NewWizardTemplatePage::templatePath() const
2012-05-26 14:49:10 +02:00
{
return path;
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// NewWizardKeysigPage
2012-05-26 14:49:10 +02:00
//---------------------------------------------------------
NewWizardKeysigPage::NewWizardKeysigPage(QWidget* parent)
2012-05-26 14:49:10 +02:00
: QWizardPage(parent)
{
setFinalPage(true);
setTitle(tr("Create New Score"));
setSubTitle(tr("Choose key signature and tempo:"));
setAccessibleName(title());
setAccessibleDescription(subTitle());
2012-05-26 14:49:10 +02:00
QGroupBox* b1 = new QGroupBox;
b1->setTitle(tr("Key Signature"));
b1->setAccessibleName(b1->title());
b1->setAccessibleDescription(tr("Choose a key signature"));
sp = MuseScore::newKeySigPalette();
sp->setMoreElements(false);
sp->setShowContextMenu(false);
2012-05-26 14:49:10 +02:00
sp->setSelectable(true);
sp->setDisableElementsApply(true);
int keysigCMajorIdx = 14;
sp->setSelected(keysigCMajorIdx);
2012-05-26 14:49:10 +02:00
PaletteScrollArea* sa = new PaletteScrollArea(sp);
// set widget name to include name of selected element
// we could set the description, but some screen readers ignore it
QString name = tr("Key Signature: %1").arg(qApp->translate("Palette", sp->cellAt(keysigCMajorIdx)->name.toUtf8()));
ScoreAccessibility::makeReadable(name);
sa->setAccessibleName(name);
QAccessibleEvent event(sa, QAccessible::NameChanged);
QAccessible::updateAccessibility(&event);
2012-05-26 14:49:10 +02:00
QVBoxLayout* l1 = new QVBoxLayout;
l1->addWidget(sa);
b1->setLayout(l1);
tempoGroup = new QGroupBox;
tempoGroup->setCheckable(true);
2013-04-10 17:31:56 +02:00
tempoGroup->setChecked(false);
2012-05-26 14:49:10 +02:00
tempoGroup->setTitle(tr("Tempo"));
tempoGroup->setAccessibleName(tempoGroup->title());
tempoGroup->setAccessibleDescription(tr("Add tempo marking to score"));
2012-05-26 14:49:10 +02:00
QLabel* bpm = new QLabel;
bpm->setText(tr("BPM:"));
_tempo = new QDoubleSpinBox;
_tempo->setAccessibleName(tr("Beats per minute"));
2012-05-26 14:49:10 +02:00
_tempo->setRange(20.0, 400.0);
_tempo->setValue(120.0);
_tempo->setDecimals(1);
2012-05-26 14:49:10 +02:00
QHBoxLayout* l2 = new QHBoxLayout;
l2->addWidget(bpm);
l2->addWidget(_tempo);
l2->addStretch(100);
tempoGroup->setLayout(l2);
QVBoxLayout* l3 = new QVBoxLayout;
l3->addWidget(b1);
l3->addWidget(tempoGroup);
l3->addStretch(100);
setLayout(l3);
2017-07-14 19:42:38 +02:00
setFocusPolicy(Qt::StrongFocus);
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// keysig
//---------------------------------------------------------
KeySigEvent NewWizardKeysigPage::keysig() const
2012-05-26 14:49:10 +02:00
{
int idx = sp->getSelectedIdx();
Element* e = sp->element(idx);
return static_cast<KeySig*>(e)->keySigEvent();
}
//---------------------------------------------------------
// NewWizard
//---------------------------------------------------------
NewWizard::NewWizard(QWidget* parent)
: QWizard(parent)
{
setObjectName("NewWizard");
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
auto wizardStyleValue = QWizard::ModernStyle; //Modern Winsows look
#ifdef Q_OS_MAC
wizardStyleValue = QWizard::MacStyle;
setOption(QWizard::CancelButtonOnLeft, true);
#endif
setWizardStyle(wizardStyleValue);
2012-05-26 14:49:10 +02:00
setPixmap(QWizard::LogoPixmap, QPixmap(":/data/mscore.png"));
2012-05-31 16:24:35 +02:00
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setWindowTitle(tr("New Score Wizard"));
2012-05-26 14:49:10 +02:00
setOption(QWizard::NoCancelButton, false);
setOption(QWizard::HaveFinishButtonOnEarlyPages, true);
setOption(QWizard::HaveNextButtonOnLastPage, true);
infoPage = new NewWizardInfoPage;
instrumentsPage = new NewWizardInstrumentsPage;
timesigPage = new NewWizardTimesigPage;
templatePage = new NewWizardTemplatePage;
keysigPage = new NewWizardKeysigPage;
2012-05-26 14:49:10 +02:00
// enum Page { Invalid = -1, Type, Instruments, Template, Keysig, Timesig};
setPage(Page::Type, infoPage);
setPage(Page::Instruments, instrumentsPage);
setPage(Page::Template, templatePage);
setPage(Page::Keysig, keysigPage);
setPage(Page::Timesig, timesigPage);
resize(QSize(840, 560)); //ensure default size if no geometry in settings
MuseScore::restoreGeometry(this);
connect(this, SIGNAL(currentIdChanged(int)), SLOT(idChanged(int)));
}
//---------------------------------------------------------
// idChanged
//---------------------------------------------------------
2016-10-08 17:47:52 +02:00
void NewWizard::idChanged(int /*id*/)
{
2018-12-18 14:55:54 +01:00
//printf("\n===\nWizard: id changed %d\n", id);
2012-05-26 14:49:10 +02:00
}
//---------------------------------------------------------
// nextId
//---------------------------------------------------------
int NewWizard::nextId() const
{
int next;
switch (Page(currentId())) {
case Page::Type:
next = Page::Template;
break;
case Page::Template:
next = emptyScore() ? Page::Instruments : Page::Keysig;
break;
case Page::Instruments:
next = Page::Keysig;
break;
case Page::Keysig:
next = Page::Timesig;
break;
case Page::Timesig:
2012-05-26 14:49:10 +02:00
default:
next = Page::Invalid;
break;
2012-05-26 14:49:10 +02:00
}
return next;
2012-05-26 14:49:10 +02:00
}
2014-12-22 14:43:00 +01:00
//---------------------------------------------------------
// emptyScore
//---------------------------------------------------------
bool NewWizard::emptyScore() const
{
QString p = templatePage->templatePath();
2014-12-22 14:43:00 +01:00
QFileInfo fi(p);
bool val = fi.completeBaseName() == "00-Blank";
return val;
2014-12-22 14:43:00 +01:00
}
//---------------------------------------------------------
// updateValues
//---------------------------------------------------------
void NewWizard::updateValues() const
{
//p2->buildInstrumentsList();
templatePage->buildTemplatesList();
}
//---------------------------------------------------------
// hideEvent
//---------------------------------------------------------
void NewWizard::hideEvent(QHideEvent* event)
{
MuseScore::saveGeometry(this);
QWidget::hideEvent(event);
}
2013-05-13 18:49:17 +02:00
}