MuseScore/mscore/preferences.cpp
2015-06-03 20:34:09 +05:00

1935 lines
76 KiB
C++

//=============================================================================
// MuseScore
// Linux Music Score Editor
// $Id: preferences.cpp 5660 2012-05-22 14:17:39Z wschweer $
//
// Copyright (C) 2002-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 "config.h"
#include "libmscore/xml.h"
#include "libmscore/score.h"
#include "musescore.h"
#include "preferences.h"
#include "prefsdialog.h"
#include "seq.h"
#include "libmscore/note.h"
#include "icons.h"
#include "shortcutcapturedialog.h"
#include "scoreview.h"
#include "libmscore/sym.h"
#include "palette.h"
#include "pa.h"
#include "pm.h"
#include "libmscore/page.h"
#include "file.h"
#include "libmscore/mscore.h"
#include "shortcut.h"
#include "zerberus/zerberus.h"
#include "fluid/fluid.h"
#include "pathlistdialog.h"
#include "mstyle/mconfig.h"
#include "resourceManager.h"
#include "synthesizer/msynthesizer.h"
namespace Ms {
bool useALSA = false, useJACK = false, usePortaudio = false, usePulseAudio = false;
extern bool useFactorySettings;
extern bool externalStyle;
static int exportAudioSampleRates[2] = { 44100, 48000 };
//---------------------------------------------------------
// PeriodItem
//---------------------------------------------------------
struct PeriodItem {
int time;
const char* text;
PeriodItem(const int t, const char* txt) {
time = t;
text = txt;
}
};
static PeriodItem updatePeriods[] = {
PeriodItem(24, QT_TRANSLATE_NOOP("preferences","Every Day")),
PeriodItem(72, QT_TRANSLATE_NOOP("preferences","Every 3 Days")),
PeriodItem(7*24, QT_TRANSLATE_NOOP("preferences","Every Week")),
PeriodItem(2*7*24, QT_TRANSLATE_NOOP("preferences","Every 2 Weeks")),
PeriodItem(30*24, QT_TRANSLATE_NOOP("preferences","Every Month")),
PeriodItem(2*30*24, QT_TRANSLATE_NOOP("preferences","Every 2 Months")),
PeriodItem(-1, QT_TRANSLATE_NOOP("preferences","Never")),
};
//---------------------------------------------------------
// Preferences
//---------------------------------------------------------
Preferences preferences;
Preferences::Preferences()
{
}
//---------------------------------------------------------
// init
//---------------------------------------------------------
void Preferences::init()
{
// set fallback defaults:
bgUseColor = true;
fgUseColor = true;
bgWallpaper = QString();
fgWallpaper = ":/data/paper5.png";
fgColor.setNamedColor("#f9f9f9");
iconHeight = 24;
iconWidth = 28;
enableMidiInput = true;
playNotes = true;
playChordOnAddNote = true;
showNavigator = false;
showPlayPanel = false;
showSplashScreen = true;
showStartcenter = true;
showStatusBar = true;
// playPanelPos = QPoint(100, 300);
useAlsaAudio = false;
useJackAudio = false;
useJackMidi = false;
useJackTransport = false;
jackTimebaseMaster = false;
usePortaudioAudio = false;
usePulseAudio = false;
#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
usePortaudioAudio = true;
// Linux
#elif defined(USE_PULSEAUDIO)
usePulseAudio = true;
#elif defined(USE_ALSA)
useAlsaAudio = true;
#elif defined(USE_PORTAUDIO)
usePortaudioAudio = true;
#endif
rememberLastConnections = true;
alsaDevice = "default";
alsaSampleRate = 48000;
alsaPeriodSize = 1024;
alsaFragments = 3;
portaudioDevice = -1;
portMidiInput = "";
antialiasedDrawing = true;
sessionStart = SessionStart::SCORE;
startScore = ":/data/My_First_Score.mscz";
defaultStyleFile = "";
useMidiRemote = false;
for (int i = 0; i < MIDI_REMOTES; ++i)
midiRemote[i].type = MIDI_REMOTE_TYPE_INACTIVE;
midiExpandRepeats = true;
midiExportRPNs = false;
MScore::playRepeats = true;
MScore::panPlayback = true;
instrumentList1 = ":/data/instruments.xml";
instrumentList2 = "";
musicxmlImportLayout = true;
musicxmlImportBreaks = true;
musicxmlExportLayout = true;
musicxmlExportBreaks = MusicxmlExportBreaks::ALL;
alternateNoteEntryMethod = false;
proximity = 6;
autoSave = true;
autoSaveTime = 2; // minutes
pngResolution = 300.0;
pngTransparent = true;
language = "system";
mag = 1.0;
checkUpdateStartup = true;
followSong = true;
importCharsetOve = "GBK";
importCharsetGP = "UTF-8";
importStyleFile = "";
shortestNote = MScore::division/4;
useOsc = false;
oscPort = 5282;
singlePalette = false;
styleName = "light"; // ??
globalStyle = MuseScoreStyleType::LIGHT;
#ifdef Q_OS_MAC
animations = false;
#else
animations = true;
#endif
QString wd = QString("%1/%2").arg(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)).arg(QCoreApplication::applicationName());
myScoresPath = QFileInfo(QString("%1/%2").arg(wd).arg(QCoreApplication::translate("scores_directory", "Scores"))).absoluteFilePath();
myStylesPath = QFileInfo(QString("%1/%2").arg(wd).arg(QCoreApplication::translate("styles_directory", "Styles"))).absoluteFilePath();
myImagesPath = QFileInfo(QString("%1/%2").arg(wd).arg(QCoreApplication::translate("images_directory", "Images"))).absoluteFilePath();
myTemplatesPath = QFileInfo(QString("%1/%2").arg(wd).arg(QCoreApplication::translate("templates_directory", "Templates"))).absoluteFilePath();
myPluginsPath = QFileInfo(QString("%1/%2").arg(wd).arg(QCoreApplication::translate("plugins_directory", "Plugins"))).absoluteFilePath();
sfPath = QString("%1;%2").arg(QFileInfo(QString("%1%2").arg(mscoreGlobalShare).arg("sound")).absoluteFilePath()).arg(QFileInfo(QString("%2/%3").arg(wd).arg(QCoreApplication::translate("soundfonts_directory", "Soundfonts"))).absoluteFilePath());
MScore::setNudgeStep(.1); // cursor key (default 0.1)
MScore::setNudgeStep10(1.0); // Ctrl + cursor key (default 1.0)
MScore::setNudgeStep50(0.01); // Alt + cursor key (default 0.01)
MScore::setHRaster(2); // _spatium / value
MScore::setVRaster(2);
#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
// use system native file dialogs
// Qt file dialog is very slow on Windows and Mac
nativeDialogs = true;
#else
nativeDialogs = false; // don't use system native file dialogs
#endif
exportAudioSampleRate = exportAudioSampleRates[0];
workspace = "Basic";
exportPdfDpi = 300;
};
//---------------------------------------------------------
// write
//---------------------------------------------------------
void Preferences::write()
{
dirty = false;
QSettings s;
s.setValue("bgUseColor", bgUseColor);
s.setValue("fgUseColor", fgUseColor);
s.setValue("bgWallpaper", bgWallpaper);
s.setValue("fgWallpaper", fgWallpaper);
s.setValue("fgColor", fgColor);
s.setValue("bgColor", MScore::bgColor);
s.setValue("iconHeight", iconHeight);
s.setValue("iconWidth", iconWidth);
s.setValue("selectColor1", MScore::selectColor[0]);
s.setValue("selectColor2", MScore::selectColor[1]);
s.setValue("selectColor3", MScore::selectColor[2]);
s.setValue("selectColor4", MScore::selectColor[3]);
s.setValue("dropColor", MScore::dropColor);
s.setValue("defaultColor", MScore::defaultColor);
s.setValue("enableMidiInput", enableMidiInput);
s.setValue("playNotes", playNotes);
s.setValue("playChordOnAddNote", playChordOnAddNote);
s.setValue("showNavigator", showNavigator);
s.setValue("showPlayPanel", showPlayPanel);
s.setValue("showSplashScreen", showSplashScreen);
s.setValue("showStartcenter1", showStartcenter);
s.setValue("showStatusBar", showStatusBar);
s.setValue("useAlsaAudio", useAlsaAudio);
s.setValue("useJackAudio", useJackAudio);
s.setValue("useJackMidi", useJackMidi);
s.setValue("useJackTransport", useJackTransport);
s.setValue("jackTimebaseMaster", jackTimebaseMaster);
s.setValue("usePortaudioAudio", usePortaudioAudio);
s.setValue("usePulseAudio", usePulseAudio);
s.setValue("rememberLastMidiConnections", rememberLastConnections);
s.setValue("alsaDevice", alsaDevice);
s.setValue("alsaSampleRate", alsaSampleRate);
s.setValue("alsaPeriodSize", alsaPeriodSize);
s.setValue("alsaFragments", alsaFragments);
s.setValue("portaudioDevice", portaudioDevice);
s.setValue("portMidiInput", portMidiInput);
s.setValue("layoutBreakColor", MScore::layoutBreakColor);
s.setValue("frameMarginColor", MScore::frameMarginColor);
s.setValue("antialiasedDrawing", antialiasedDrawing);
switch(sessionStart) {
case SessionStart::EMPTY: s.setValue("sessionStart", "empty"); break;
case SessionStart::LAST: s.setValue("sessionStart", "last"); break;
case SessionStart::NEW: s.setValue("sessionStart", "new"); break;
case SessionStart::SCORE: s.setValue("sessionStart", "score"); break;
}
s.setValue("startScore", startScore);
s.setValue("defaultStyle", defaultStyleFile);
s.setValue("midiExpandRepeats", midiExpandRepeats);
s.setValue("midiExportRPNs", midiExportRPNs);
s.setValue("playRepeats", MScore::playRepeats);
s.setValue("panPlayback", MScore::panPlayback);
s.setValue("instrumentList", instrumentList1);
s.setValue("instrumentList2", instrumentList2);
s.setValue("musicxmlImportLayout", musicxmlImportLayout);
s.setValue("musicxmlImportBreaks", musicxmlImportBreaks);
s.setValue("musicxmlExportLayout", musicxmlExportLayout);
switch(musicxmlExportBreaks) {
case MusicxmlExportBreaks::ALL: s.setValue("musicxmlExportBreaks", "all"); break;
case MusicxmlExportBreaks::MANUAL: s.setValue("musicxmlExportBreaks", "manual"); break;
case MusicxmlExportBreaks::NO: s.setValue("musicxmlExportBreaks", "no"); break;
}
s.setValue("alternateNoteEntry", alternateNoteEntryMethod);
s.setValue("proximity", proximity);
s.setValue("autoSave", autoSave);
s.setValue("autoSaveTime", autoSaveTime);
s.setValue("pngResolution", pngResolution);
s.setValue("pngTransparent", pngTransparent);
s.setValue("language", language);
s.setValue("paperWidth", MScore::defaultStyle()->pageFormat()->width());
s.setValue("paperHeight", MScore::defaultStyle()->pageFormat()->height());
s.setValue("twosided", MScore::defaultStyle()->pageFormat()->twosided());
s.setValue("spatium", MScore::defaultStyle()->spatium() / MScore::DPI);
s.setValue("mag", mag);
s.setValue("defaultPlayDuration", MScore::defaultPlayDuration);
s.setValue("importStyleFile", importStyleFile);
s.setValue("shortestNote", shortestNote);
s.setValue("importCharsetOve", importCharsetOve);
s.setValue("importCharsetGP", importCharsetGP);
s.setValue("warnPitchRange", MScore::warnPitchRange);
s.setValue("followSong", followSong);
s.setValue("useOsc", useOsc);
s.setValue("oscPort", oscPort);
s.setValue("style", styleName);
s.setValue("animations", animations);
s.setValue("singlePalette", singlePalette);
s.setValue("myScoresPath", myScoresPath);
s.setValue("myStylesPath", myStylesPath);
s.setValue("myImagesPath", myImagesPath);
s.setValue("myTemplatesPath", myTemplatesPath);
s.setValue("myPluginsPath", myPluginsPath);
s.setValue("sfPath", sfPath);
s.setValue("hraster", MScore::hRaster());
s.setValue("vraster", MScore::vRaster());
s.setValue("nativeDialogs", nativeDialogs);
s.setValue("exportAudioSampleRate", exportAudioSampleRate);
s.setValue("workspace", workspace);
s.setValue("exportPdfDpi", exportPdfDpi);
//update
s.setValue("checkUpdateStartup", checkUpdateStartup);
s.setValue("useMidiRemote", useMidiRemote);
for (int i = 0; i < MIDI_REMOTES; ++i) {
if (midiRemote[i].type != MIDI_REMOTE_TYPE_INACTIVE) {
QChar t;
if (midiRemote[i].type == MIDI_REMOTE_TYPE_NOTEON)
t = QChar('P');
else
t = QChar('C');
s.setValue(QString("remote%1").arg(i),
QString("%1%2").arg(t).arg(midiRemote[i].data));
}
}
// s.beginGroup("PlayPanel");
// s.setValue("pos", playPanelPos);
// s.endGroup();
writePluginList();
if (Shortcut::dirty)
Shortcut::save();
Shortcut::dirty = false;
}
//---------------------------------------------------------
// read
//---------------------------------------------------------
void Preferences::read()
{
QSettings s;
bgUseColor = s.value("bgUseColor", bgUseColor).toBool();
fgUseColor = s.value("fgUseColor", fgUseColor).toBool();
bgWallpaper = s.value("bgWallpaper", bgWallpaper).toString();
fgWallpaper = s.value("fgWallpaper", fgWallpaper).toString();
fgColor = s.value("fgColor", fgColor).value<QColor>();
MScore::bgColor = s.value("bgColor", MScore::bgColor).value<QColor>();
iconHeight = s.value("iconHeight", iconHeight).toInt();
iconWidth = s.value("iconWidth", iconWidth).toInt();
MScore::selectColor[0] = s.value("selectColor1", MScore::selectColor[0]).value<QColor>();
MScore::selectColor[1] = s.value("selectColor2", MScore::selectColor[1]).value<QColor>();
MScore::selectColor[2] = s.value("selectColor3", MScore::selectColor[2]).value<QColor>();
MScore::selectColor[3] = s.value("selectColor4", MScore::selectColor[3]).value<QColor>();
MScore::defaultColor = s.value("defaultColor", MScore::defaultColor).value<QColor>();
MScore::dropColor = s.value("dropColor", MScore::dropColor).value<QColor>();
enableMidiInput = s.value("enableMidiInput", enableMidiInput).toBool();
playNotes = s.value("playNotes", playNotes).toBool();
playChordOnAddNote = s.value("playChordOnAddNote", playChordOnAddNote).toBool();
showNavigator = s.value("showNavigator", showNavigator).toBool();
showSplashScreen = s.value("showSplashScreen", showSplashScreen).toBool();
showStartcenter = s.value("showStartcenter1", showStartcenter).toBool();
showPlayPanel = s.value("showPlayPanel", showPlayPanel).toBool();
showStatusBar = s.value("showStatusBar", showStatusBar).toBool();
useAlsaAudio = s.value("useAlsaAudio", useAlsaAudio).toBool();
useJackAudio = s.value("useJackAudio", useJackAudio).toBool();
useJackMidi = s.value("useJackMidi", useJackMidi).toBool();
jackTimebaseMaster = s.value("jackTimebaseMaster", jackTimebaseMaster).toBool();
useJackTransport = s.value("useJackTransport", useJackTransport).toBool();
usePortaudioAudio = s.value("usePortaudioAudio", usePortaudioAudio).toBool();
usePulseAudio = s.value("usePulseAudio", usePulseAudio).toBool();
alsaDevice = s.value("alsaDevice", alsaDevice).toString();
alsaSampleRate = s.value("alsaSampleRate", alsaSampleRate).toInt();
alsaPeriodSize = s.value("alsaPeriodSize", alsaPeriodSize).toInt();
alsaFragments = s.value("alsaFragments", alsaFragments).toInt();
portaudioDevice = s.value("portaudioDevice", portaudioDevice).toInt();
portMidiInput = s.value("portMidiInput", portMidiInput).toString();
MScore::layoutBreakColor = s.value("layoutBreakColor", MScore::layoutBreakColor).value<QColor>();
MScore::frameMarginColor = s.value("frameMarginColor", MScore::frameMarginColor).value<QColor>();
antialiasedDrawing = s.value("antialiasedDrawing", antialiasedDrawing).toBool();
defaultStyleFile = s.value("defaultStyle", defaultStyleFile).toString();
midiExpandRepeats = s.value("midiExpandRepeats", midiExpandRepeats).toBool();
midiExportRPNs = s.value("midiExportRPNs", midiExportRPNs).toBool();
MScore::playRepeats = s.value("playRepeats", MScore::playRepeats).toBool();
MScore::panPlayback = s.value("panPlayback", MScore::panPlayback).toBool();
alternateNoteEntryMethod = s.value("alternateNoteEntry", alternateNoteEntryMethod).toBool();
rememberLastConnections = s.value("rememberLastMidiConnections", rememberLastConnections).toBool();
proximity = s.value("proximity", proximity).toInt();
autoSave = s.value("autoSave", autoSave).toBool();
autoSaveTime = s.value("autoSaveTime", autoSaveTime).toInt();
pngResolution = s.value("pngResolution", pngResolution).toDouble();
pngTransparent = s.value("pngTransparent", pngTransparent).toBool();
language = s.value("language", language).toString();
musicxmlImportLayout = s.value("musicxmlImportLayout", musicxmlImportLayout).toBool();
musicxmlImportBreaks = s.value("musicxmlImportBreaks", musicxmlImportBreaks).toBool();
musicxmlExportLayout = s.value("musicxmlExportLayout", musicxmlExportLayout).toBool();
QString br(s.value("musicxmlExportBreaks", "all").toString());
if (br == "all")
musicxmlExportBreaks = MusicxmlExportBreaks::ALL;
else if (br == "manual")
musicxmlExportBreaks = MusicxmlExportBreaks::MANUAL;
else if (br == "no")
musicxmlExportBreaks = MusicxmlExportBreaks::NO;
mag = s.value("mag", mag).toDouble();
MScore::defaultPlayDuration = s.value("defaultPlayDuration", MScore::defaultPlayDuration).toInt();
importStyleFile = s.value("importStyleFile", importStyleFile).toString();
shortestNote = s.value("shortestNote", shortestNote).toInt();
importCharsetOve = s.value("importCharsetOve", importCharsetOve).toString();
importCharsetGP = s.value("importCharsetGP", importCharsetGP).toString();
MScore::warnPitchRange = s.value("warnPitchRange", MScore::warnPitchRange).toBool();
followSong = s.value("followSong", followSong).toBool();
useOsc = s.value("useOsc", useOsc).toBool();
oscPort = s.value("oscPort", oscPort).toInt();
styleName = s.value("style", styleName).toString();
if (styleName == "dark")
globalStyle = MuseScoreStyleType::DARK;
else
globalStyle = MuseScoreStyleType::LIGHT;
animations = s.value("animations", animations).toBool();
singlePalette = s.value("singlePalette", singlePalette).toBool();
myScoresPath = s.value("myScoresPath", myScoresPath).toString();
myStylesPath = s.value("myStylesPath", myStylesPath).toString();
myImagesPath = s.value("myImagesPath", myImagesPath).toString();
myTemplatesPath = s.value("myTemplatesPath", myTemplatesPath).toString();
myPluginsPath = s.value("myPluginsPath", myPluginsPath).toString();
sfPath = s.value("sfPath", sfPath).toString();
//Create directories if they are missing
QDir dir;
dir.mkpath(myScoresPath);
dir.mkpath(myStylesPath);
dir.mkpath(myImagesPath);
dir.mkpath(myTemplatesPath);
dir.mkpath(myPluginsPath);
foreach (QString path, sfPath.split(";"))
dir.mkpath(path);
MScore::setHRaster(s.value("hraster", MScore::hRaster()).toInt());
MScore::setVRaster(s.value("vraster", MScore::vRaster()).toInt());
nativeDialogs = s.value("nativeDialogs", nativeDialogs).toBool();
exportAudioSampleRate = s.value("exportAudioSampleRate", exportAudioSampleRate).toInt();
workspace = s.value("workspace", workspace).toString();
exportPdfDpi = s.value("exportPdfDpi", exportPdfDpi).toInt();
checkUpdateStartup = s.value("checkUpdateStartup", checkUpdateStartup).toBool();
QString ss(s.value("sessionStart", "score").toString());
if (ss == "last")
sessionStart = SessionStart::LAST;
else if (ss == "new")
sessionStart = SessionStart::NEW;
else if (ss == "score")
sessionStart = SessionStart::SCORE;
else if (ss == "empty")
sessionStart = SessionStart::EMPTY;
startScore = s.value("startScore", startScore).toString();
instrumentList1 = s.value("instrumentList", instrumentList1).toString();
instrumentList2 = s.value("instrumentList2", instrumentList2).toString();
useMidiRemote = s.value("useMidiRemote", useMidiRemote).toBool();
for (int i = 0; i < MIDI_REMOTES; ++i) {
QString data = s.value(QString("remote%1").arg(i)).toString();
if (data.isEmpty())
midiRemote[i].type = MIDI_REMOTE_TYPE_INACTIVE;
else {
midiRemote[i].data = data.mid(1).toInt();
if (data[0] == QChar('P')) {
midiRemote[i].type = MIDI_REMOTE_TYPE_NOTEON;
}
else if (data[0] == QChar('C')) {
midiRemote[i].type = MIDI_REMOTE_TYPE_CTRL;
}
}
}
// s.beginGroup("PlayPanel");
// playPanelPos = s.value("pos", playPanelPos).toPoint();
// s.endGroup();
readPluginList();
}
//---------------------------------------------------------
// preferences
//---------------------------------------------------------
void MuseScore::startPreferenceDialog()
{
if (!preferenceDialog) {
preferenceDialog = new PreferenceDialog(this);
connect(preferenceDialog, SIGNAL(preferencesChanged()),
SLOT(preferencesChanged()));
}
preferenceDialog->setPreferences(preferences);
preferenceDialog->show();
}
//---------------------------------------------------------
// PreferenceDialog
//---------------------------------------------------------
PreferenceDialog::PreferenceDialog(QWidget* parent)
: QDialog(parent)
{
setupUi(this);
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
setModal(true);
startWithButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
instrumentList1Button->setIcon(*icons[int(Icons::fileOpen_ICON)]);
instrumentList2Button->setIcon(*icons[int(Icons::fileOpen_ICON)]);
defaultStyleButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
partStyleButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
myScoresButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
myStylesButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
myTemplatesButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
myPluginsButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
mySoundfontsButton->setIcon(*icons[int(Icons::edit_ICON)]);
myImagesButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
bgWallpaperSelect->setIcon(*icons[int(Icons::fileOpen_ICON)]);
fgWallpaperSelect->setIcon(*icons[int(Icons::fileOpen_ICON)]);
styleFileButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
shortcutsChanged = false;
#ifndef USE_JACK
jackDriver->setVisible(false);
#endif
#ifndef USE_ALSA
alsaDriver->setVisible(false);
#endif
#ifndef USE_PORTAUDIO
portaudioDriver->setVisible(false);
#endif
#ifndef USE_PORTMIDI
portMidiInput->setVisible(false);
portMidiInputLabel->setVisible(false);
#endif
#ifndef USE_PULSEAUDIO
pulseaudioDriver->setVisible(false);
#endif
tabIO->setEnabled(!noSeq);
QButtonGroup* fgButtons = new QButtonGroup(this);
fgButtons->setExclusive(true);
fgButtons->addButton(fgColorButton);
fgButtons->addButton(fgWallpaperButton);
connect(fgColorButton, SIGNAL(toggled(bool)), SLOT(fgClicked(bool)));
QButtonGroup* bgButtons = new QButtonGroup(this);
bgButtons->setExclusive(true);
bgButtons->addButton(bgColorButton);
bgButtons->addButton(bgWallpaperButton);
connect(bgColorButton, SIGNAL(toggled(bool)), SLOT(bgClicked(bool)));
connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(buttonBoxClicked(QAbstractButton*)));
connect(fgWallpaperSelect, SIGNAL(clicked()), SLOT(selectFgWallpaper()));
connect(bgWallpaperSelect, SIGNAL(clicked()), SLOT(selectBgWallpaper()));
connect(myScoresButton, SIGNAL(clicked()), SLOT(selectScoresDirectory()));
connect(myStylesButton, SIGNAL(clicked()), SLOT(selectStylesDirectory()));
connect(myTemplatesButton, SIGNAL(clicked()), SLOT(selectTemplatesDirectory()));
connect(myPluginsButton, SIGNAL(clicked()), SLOT(selectPluginsDirectory()));
connect(myImagesButton, SIGNAL(clicked()), SLOT(selectImagesDirectory()));
connect(mySoundfontsButton, SIGNAL(clicked()), SLOT(changeSoundfontPaths()));
connect(updateTranslation, SIGNAL(clicked()), SLOT(updateTranslationClicked()));
connect(defaultStyleButton, SIGNAL(clicked()), SLOT(selectDefaultStyle()));
connect(partStyleButton, SIGNAL(clicked()), SLOT(selectPartStyle()));
connect(styleFileButton, SIGNAL(clicked()), SLOT(styleFileButtonClicked()));
connect(instrumentList1Button, SIGNAL(clicked()), SLOT(selectInstrumentList1()));
connect(instrumentList2Button, SIGNAL(clicked()), SLOT(selectInstrumentList2()));
connect(startWithButton, SIGNAL(clicked()), SLOT(selectStartWith()));
connect(shortcutList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), SLOT(defineShortcutClicked()));
connect(resetShortcut, SIGNAL(clicked()), SLOT(resetShortcutClicked()));
connect(clearShortcut, SIGNAL(clicked()), SLOT(clearShortcutClicked()));
connect(defineShortcut, SIGNAL(clicked()), SLOT(defineShortcutClicked()));
connect(resetToDefault, SIGNAL(clicked()), SLOT(resetAllValues()));
connect(filterShortcuts, SIGNAL(textChanged(const QString&)), SLOT(filterShortcutsTextChanged(const QString &)));
connect(printShortcuts, SIGNAL(clicked()), SLOT(printShortcutsClicked()));
recordButtons = new QButtonGroup(this);
recordButtons->setExclusive(false);
recordButtons->addButton(recordRewind, RMIDI_REWIND);
recordButtons->addButton(recordTogglePlay, RMIDI_TOGGLE_PLAY);
recordButtons->addButton(recordPlay, RMIDI_PLAY);
recordButtons->addButton(recordStop, RMIDI_STOP);
recordButtons->addButton(rcr2, RMIDI_NOTE1);
recordButtons->addButton(rcr3, RMIDI_NOTE2);
recordButtons->addButton(rcr4, RMIDI_NOTE4);
recordButtons->addButton(rcr5, RMIDI_NOTE8);
recordButtons->addButton(rcr6, RMIDI_NOTE16);
recordButtons->addButton(rcr7, RMIDI_NOTE32);
recordButtons->addButton(rcr8, RMIDI_NOTE64);
recordButtons->addButton(rcr9, RMIDI_REST);
recordButtons->addButton(rcr10, RMIDI_DOT);
recordButtons->addButton(rcr11, RMIDI_DOTDOT);
recordButtons->addButton(rcr12, RMIDI_TIE);
recordButtons->addButton(recordUndo, RMIDI_UNDO);
recordButtons->addButton(recordEditMode, RMIDI_NOTE_EDIT_MODE);
int n = sizeof(exportAudioSampleRates)/sizeof(*exportAudioSampleRates);
exportAudioSampleRate->clear();
for (int idx = 0; idx < n; ++idx)
exportAudioSampleRate->addItem(QString("%1").arg(exportAudioSampleRates[idx]));
restartWarningLanguage->setText("");
connect(language, SIGNAL(currentIndexChanged(int)), SLOT(languageChanged(int)));
connect(recordButtons, SIGNAL(buttonClicked(int)), SLOT(recordButtonClicked(int)));
connect(midiRemoteControlClear, SIGNAL(clicked()), SLOT(midiRemoteControlClearClicked()));
connect(portaudioDriver, SIGNAL(toggled(bool)), SLOT(exclusiveAudioDriver(bool)));
connect(pulseaudioDriver, SIGNAL(toggled(bool)), SLOT(exclusiveAudioDriver(bool)));
connect(alsaDriver, SIGNAL(toggled(bool)), SLOT(exclusiveAudioDriver(bool)));
connect(jackDriver, SIGNAL(toggled(bool)), SLOT(exclusiveAudioDriver(bool)));
connect(useJackAudio, SIGNAL(toggled(bool)), SLOT(nonExclusiveJackDriver(bool)));
connect(useJackMidi, SIGNAL(toggled(bool)), SLOT(nonExclusiveJackDriver(bool)));
updateRemote();
}
//---------------------------------------------------------
// setPreferences
//---------------------------------------------------------
void PreferenceDialog::setPreferences(const Preferences& p)
{
prefs = p;
updateValues();
}
//---------------------------------------------------------
// ~PreferenceDialog
//---------------------------------------------------------
PreferenceDialog::~PreferenceDialog()
{
qDeleteAll(localShortcuts);
}
//---------------------------------------------------------
// recordButtonClicked
//---------------------------------------------------------
void PreferenceDialog::languageChanged(int /*val*/)
{
restartWarningLanguage->setText(tr("The language will be changed once you restart MuseScore."));
}
//---------------------------------------------------------
// recordButtonClicked
//---------------------------------------------------------
void PreferenceDialog::recordButtonClicked(int val)
{
foreach(QAbstractButton* b, recordButtons->buttons()) {
b->setChecked(recordButtons->id(b) == val);
}
mscore->setMidiRecordId(val);
}
//---------------------------------------------------------
// updateRemote
//---------------------------------------------------------
void PreferenceDialog::updateRemote()
{
rewindActive->setChecked(preferences.midiRemote[RMIDI_REWIND].type != -1);
togglePlayActive->setChecked(preferences.midiRemote[RMIDI_TOGGLE_PLAY].type != -1);
playActive->setChecked(preferences.midiRemote[RMIDI_PLAY].type != -1);
stopActive->setChecked(preferences.midiRemote[RMIDI_STOP].type != -1);
rca2->setChecked(preferences.midiRemote[RMIDI_NOTE1].type != -1);
rca3->setChecked(preferences.midiRemote[RMIDI_NOTE2].type != -1);
rca4->setChecked(preferences.midiRemote[RMIDI_NOTE4].type != -1);
rca5->setChecked(preferences.midiRemote[RMIDI_NOTE8].type != -1);
rca6->setChecked(preferences.midiRemote[RMIDI_NOTE16].type != -1);
rca7->setChecked(preferences.midiRemote[RMIDI_NOTE32].type != -1);
rca8->setChecked(preferences.midiRemote[RMIDI_NOTE64].type != -1);
rca9->setChecked(preferences.midiRemote[RMIDI_REST].type != -1);
rca10->setChecked(preferences.midiRemote[RMIDI_DOT].type != -1);
rca11->setChecked(preferences.midiRemote[RMIDI_DOTDOT].type != -1);
rca12->setChecked(preferences.midiRemote[RMIDI_TIE].type != -1);
recordUndoActive->setChecked(preferences.midiRemote[RMIDI_UNDO].type != -1);
editModeActive->setChecked(preferences.midiRemote[RMIDI_NOTE_EDIT_MODE].type != -1);
int id = mscore->midiRecordId();
recordRewind->setChecked(id == RMIDI_REWIND);
recordTogglePlay->setChecked(id == RMIDI_TOGGLE_PLAY);
recordPlay->setChecked(id == RMIDI_PLAY);
recordStop->setChecked(id == RMIDI_STOP);
rcr2->setChecked(id == RMIDI_NOTE1);
rcr3->setChecked(id == RMIDI_NOTE2);
rcr4->setChecked(id == RMIDI_NOTE4);
rcr5->setChecked(id == RMIDI_NOTE8);
rcr6->setChecked(id == RMIDI_NOTE16);
rcr7->setChecked(id == RMIDI_NOTE32);
rcr8->setChecked(id == RMIDI_NOTE64);
rcr9->setChecked(id == RMIDI_REST);
rcr10->setChecked(id == RMIDI_DOT);
rcr11->setChecked(id == RMIDI_DOTDOT);
rcr12->setChecked(id == RMIDI_TIE);
recordUndo->setChecked(id == RMIDI_UNDO);
recordEditMode->setChecked(id == RMIDI_NOTE_EDIT_MODE);
}
//---------------------------------------------------------
// updateValues
//---------------------------------------------------------
void PreferenceDialog::updateValues()
{
rcGroup->setChecked(prefs.useMidiRemote);
fgWallpaper->setText(prefs.fgWallpaper);
bgWallpaper->setText(prefs.bgWallpaper);
bgColorButton->setChecked(prefs.bgUseColor);
bgWallpaperButton->setChecked(!prefs.bgUseColor);
fgColorButton->setChecked(prefs.fgUseColor);
fgWallpaperButton->setChecked(!prefs.fgUseColor);
if (prefs.bgUseColor) {
bgColorLabel->setColor(MScore::bgColor);
bgColorLabel->setPixmap(0);
}
else {
bgColorLabel->setPixmap(new QPixmap(bgWallpaper->text()));
}
if (prefs.fgUseColor) {
fgColorLabel->setColor(prefs.fgColor);
fgColorLabel->setPixmap(0);
}
else {
fgColorLabel->setPixmap(new QPixmap(fgWallpaper->text()));
}
iconWidth->setValue(prefs.iconWidth);
iconHeight->setValue(prefs.iconHeight);
enableMidiInput->setChecked(prefs.enableMidiInput);
playNotes->setChecked(prefs.playNotes);
playChordOnAddNote->setChecked(prefs.playChordOnAddNote);
//Update
checkUpdateStartup->setChecked(prefs.checkUpdateStartup);
navigatorShow->setChecked(prefs.showNavigator);
playPanelShow->setChecked(prefs.showPlayPanel);
showSplashScreen->setChecked(prefs.showSplashScreen);
showStartcenter->setChecked(prefs.showStartcenter);
alsaDriver->setChecked(prefs.useAlsaAudio);
jackDriver->setChecked(prefs.useJackAudio || prefs.useJackMidi);
useJackAudio->setChecked(prefs.useJackAudio);
portaudioDriver->setChecked(prefs.usePortaudioAudio);
pulseaudioDriver->setChecked(prefs.usePulseAudio);
useJackMidi->setChecked(prefs.useJackMidi);
useJackTransport->setChecked(prefs.useJackTransport);
becomeTimebaseMaster->setChecked(prefs.jackTimebaseMaster);
alsaDevice->setText(prefs.alsaDevice);
int index = alsaSampleRate->findText(QString("%1").arg(prefs.alsaSampleRate));
alsaSampleRate->setCurrentIndex(index);
index = alsaPeriodSize->findText(QString("%1").arg(prefs.alsaPeriodSize));
alsaPeriodSize->setCurrentIndex(index);
alsaFragments->setValue(prefs.alsaFragments);
drawAntialiased->setChecked(prefs.antialiasedDrawing);
switch(prefs.sessionStart) {
case SessionStart::EMPTY: emptySession->setChecked(true); break;
case SessionStart::LAST: lastSession->setChecked(true); break;
case SessionStart::NEW: newSession->setChecked(true); break;
case SessionStart::SCORE: scoreSession->setChecked(true); break;
}
sessionScore->setText(prefs.startScore);
expandRepeats->setChecked(prefs.midiExpandRepeats);
exportRPNs->setChecked(prefs.midiExportRPNs);
instrumentList1->setText(prefs.instrumentList1);
instrumentList2->setText(prefs.instrumentList2);
importLayout->setChecked(prefs.musicxmlImportLayout);
importBreaks->setChecked(prefs.musicxmlImportBreaks);
exportLayout->setChecked(prefs.musicxmlExportLayout);
switch(prefs.musicxmlExportBreaks) {
case MusicxmlExportBreaks::ALL: exportAllBreaks->setChecked(true); break;
case MusicxmlExportBreaks::MANUAL: exportManualBreaks->setChecked(true); break;
case MusicxmlExportBreaks::NO: exportNoBreaks->setChecked(true); break;
}
rememberLastMidiConnections->setChecked(prefs.rememberLastConnections);
proximity->setValue(prefs.proximity);
autoSave->setChecked(prefs.autoSave);
autoSaveTime->setValue(prefs.autoSaveTime);
pngResolution->setValue(prefs.pngResolution);
pngTransparent->setChecked(prefs.pngTransparent);
language->blockSignals(true);
for (int i = 0; i < language->count(); ++i) {
if (language->itemText(i).startsWith(prefs.language)) {
language->setCurrentIndex(i);
break;
}
}
language->blockSignals(false);
//
// initialize local shortcut table
// we need a deep copy to be able to rewind all
// changes on "Abort"
//
qDeleteAll(localShortcuts);
localShortcuts.clear();
foreach(const Shortcut* s, Shortcut::shortcuts())
localShortcuts[s->key()] = new Shortcut(*s);
updateSCListView();
//
// initialize portaudio
//
#ifdef USE_PORTAUDIO
if (usePortaudio) {
Portaudio* audio = static_cast<Portaudio*>(seq->driver());
if (audio) {
QStringList apis = audio->apiList();
portaudioApi->clear();
portaudioApi->addItems(apis);
portaudioApi->setCurrentIndex(audio->currentApi());
QStringList devices = audio->deviceList(audio->currentApi());
portaudioDevice->clear();
portaudioDevice->addItems(devices);
portaudioDevice->setCurrentIndex(audio->currentDevice());
connect(portaudioApi, SIGNAL(activated(int)), SLOT(portaudioApiActivated(int)));
#ifdef USE_PORTMIDI
PortMidiDriver* midiDriver = static_cast<PortMidiDriver*>(audio->mididriver());
if(midiDriver){
QStringList midiInputs = midiDriver->deviceInList();
int curMidiInIdx = 0;
portMidiInput->clear();
for(int i = 0; i < midiInputs.size(); ++i) {
portMidiInput->addItem(midiInputs.at(i), i);
if (midiInputs.at(i) == prefs.portMidiInput)
curMidiInIdx = i;
}
portMidiInput->setCurrentIndex(curMidiInIdx);
}
#endif
}
}
#endif
#ifndef HAS_MIDI
enableMidiInput->setEnabled(false);
rcGroup->setEnabled(false);
#endif
//
// score settings
//
scale->setValue(prefs.mag*100.0);
defaultPlayDuration->setValue(MScore::defaultPlayDuration);
importStyleFile->setText(prefs.importStyleFile);
int shortestNoteIndex = 2;
int nn = (prefs.shortestNote * 16)/MScore::division;
switch(nn) {
case 16: shortestNoteIndex = 0; break;
case 8: shortestNoteIndex = 1; break;
case 4: shortestNoteIndex = 2; break;
case 2: shortestNoteIndex = 3; break;
case 1: shortestNoteIndex = 4; break;
}
shortestNote->setCurrentIndex(shortestNoteIndex);
useImportBuildinStyle->setChecked(prefs.importStyleFile.isEmpty());
useImportStyleFile->setChecked(!prefs.importStyleFile.isEmpty());
QList<QByteArray> charsets = QTextCodec::availableCodecs();
qSort(charsets.begin(), charsets.end());
int idx = 0;
importCharsetListOve->clear();
importCharsetListGP->clear();
foreach (QByteArray charset, charsets) {
importCharsetListOve->addItem(charset);
importCharsetListGP->addItem(charset);
if (charset == prefs.importCharsetOve)
importCharsetListOve->setCurrentIndex(idx);
if (charset == prefs.importCharsetGP)
importCharsetListGP->setCurrentIndex(idx);
idx++;
}
warnPitchRange->setChecked(MScore::warnPitchRange);
language->blockSignals(true);
language->clear();
int curIdx = 0;
for(int i = 0; i < mscore->languages().size(); ++i) {
language->addItem(mscore->languages().at(i).name, i);
if (mscore->languages().at(i).key == prefs.language)
curIdx = i;
}
language->setCurrentIndex(curIdx);
language->blockSignals(false);
oscServer->setChecked(prefs.useOsc);
oscPort->setValue(prefs.oscPort);
styleName->setCurrentIndex(int(prefs.globalStyle));
animations->setChecked(prefs.animations);
defaultStyle->setText(prefs.defaultStyleFile);
QSettings s;
partStyle->setText(s.value("partStyle").toString());
myScores->setText(prefs.myScoresPath);
myStyles->setText(prefs.myStylesPath);
myImages->setText(prefs.myImagesPath);
myTemplates->setText(prefs.myTemplatesPath);
myPlugins->setText(prefs.myPluginsPath);
sfPath->setText(prefs.sfPath);
idx = 0;
int n = sizeof(exportAudioSampleRates)/sizeof(*exportAudioSampleRates);
for (;idx < n; ++idx) {
if (exportAudioSampleRates[idx] == prefs.exportAudioSampleRate)
break;
}
if (idx == n) // if not found in table
idx = 0;
exportAudioSampleRate->setCurrentIndex(idx);
exportPdfDpi->setValue(prefs.exportPdfDpi);
sfChanged = false;
}
//---------------------------------------------------------
// portaudioApiActivated
//---------------------------------------------------------
#ifdef USE_PORTAUDIO
void PreferenceDialog::portaudioApiActivated(int idx)
{
Portaudio* audio = static_cast<Portaudio*>(seq->driver());
QStringList devices = audio->deviceList(idx);
portaudioDevice->clear();
portaudioDevice->addItems(devices);
}
#else
void PreferenceDialog::portaudioApiActivated(int) {}
#endif
//---------------------------------------------------------
// ShortcutITem
//---------------------------------------------------------
bool ShortcutItem::operator<(const QTreeWidgetItem& item) const
{
const QTreeWidget * pTree =treeWidget ();
int column = pTree ? pTree->sortColumn() : 0;
return QString::localeAwareCompare(text(column).toLower(), item.text(column).toLower()) > 0;
}
//---------------------------------------------------------
// updateSCListView
//---------------------------------------------------------
void PreferenceDialog::updateSCListView()
{
shortcutList->clear();
foreach (Shortcut* s, localShortcuts) {
if (!s)
continue;
ShortcutItem* newItem = new ShortcutItem;
newItem->setText(0, s->descr());
if (s->icon() != Icons::Invalid_ICON)
newItem->setIcon(0, *icons[int(s->icon())]);
newItem->setText(1, s->keysToString());
newItem->setData(0, Qt::UserRole, s->key());
QString accessibleInfo = tr("Action: %1; Shortcut: %2")
.arg(newItem->text(0)).arg(newItem->text(1).isEmpty()
? tr("No shortcut defined") : newItem->text(1));
newItem->setData(0, Qt::AccessibleTextRole, accessibleInfo);
newItem->setData(1, Qt::AccessibleTextRole, accessibleInfo);
if (enableExperimental
|| (!s->key().startsWith("media")
&& !s->key().startsWith("layer")
&& !s->key().startsWith("insert-fretframe"))) {
shortcutList->addTopLevelItem(newItem);
}
}
shortcutList->resizeColumnToContents(0);
}
//---------------------------------------------------------
// resetShortcutClicked
// reset selected shortcut to buildin default
//---------------------------------------------------------
void PreferenceDialog::resetShortcutClicked()
{
QTreeWidgetItem* active = shortcutList->currentItem();
if (!active)
return;
QString str = active->data(0, Qt::UserRole).toString();
if (str.isEmpty())
return;
Shortcut* shortcut = localShortcuts[str.toLatin1().data()];
shortcut->reset();
active->setText(1, shortcut->keysToString());
shortcutsChanged = true;
}
//---------------------------------------------------------
// clearShortcutClicked
//---------------------------------------------------------
void PreferenceDialog::clearShortcutClicked()
{
QTreeWidgetItem* active = shortcutList->currentItem();
if (!active)
return;
QString str = active->data(0, Qt::UserRole).toString();
if (str.isEmpty())
return;
Shortcut* s = localShortcuts[str.toLatin1().data()];
s->clear();
active->setText(1, "");
shortcutsChanged = true;
}
//--------------------------------------------------------
// filterShortcutsTextChanged
//--------------------------------------------------------
void PreferenceDialog::filterShortcutsTextChanged(const QString &query )
{
QTreeWidgetItem *item;
for(int i = 0; i < shortcutList->topLevelItemCount(); i++) {
item = shortcutList->topLevelItem(i);
if(item->text(0).toLower().contains(query.toLower()))
item->setHidden(false);
else
item->setHidden(true);
}
}
//---------------------------------------------------------
// selectFgWallpaper
//---------------------------------------------------------
void PreferenceDialog::selectFgWallpaper()
{
QString s = mscore->getWallpaper(tr("Choose Notepaper"));
if (!s.isNull())
fgWallpaper->setText(s);
}
//---------------------------------------------------------
// selectBgWallpaper
//---------------------------------------------------------
void PreferenceDialog::selectBgWallpaper()
{
QString s = mscore->getWallpaper(tr("Choose Background Wallpaper"));
if (!s.isNull())
bgWallpaper->setText(s);
}
//---------------------------------------------------------
// selectDefaultStyle
//---------------------------------------------------------
void PreferenceDialog::selectDefaultStyle()
{
QString s = mscore->getStyleFilename(true, tr("Choose Default Style"));
if (!s.isNull())
defaultStyle->setText(s);
}
//---------------------------------------------------------
// selectPartStyle
//---------------------------------------------------------
void PreferenceDialog::selectPartStyle()
{
QString s = mscore->getStyleFilename(true, tr("Choose Default Style for Parts"));
if (!s.isNull())
partStyle->setText(s);
}
//---------------------------------------------------------
// selectInstrumentList1
//---------------------------------------------------------
void PreferenceDialog::selectInstrumentList1()
{
QString s = QFileDialog::getOpenFileName(
this,
tr("Choose Instrument List"),
instrumentList1->text(),
tr("Instrument List (*.xml)")
);
if (!s.isNull())
instrumentList1->setText(s);
}
//---------------------------------------------------------
// selectInstrumentList2
//---------------------------------------------------------
void PreferenceDialog::selectInstrumentList2()
{
QString s = QFileDialog::getOpenFileName(
this,
tr("Choose Instrument List"),
instrumentList2->text(),
tr("Instrument List (*.xml)")
);
if (!s.isNull())
instrumentList2->setText(s);
}
//---------------------------------------------------------
// selectStartWith
//---------------------------------------------------------
void PreferenceDialog::selectStartWith()
{
QString s = QFileDialog::getOpenFileName(
this,
tr("Choose Starting Score"),
sessionScore->text(),
tr("MuseScore Files (*.mscz *.mscx);;All (*)")
);
if (!s.isNull())
sessionScore->setText(s);
}
//---------------------------------------------------------
// fgClicked
//---------------------------------------------------------
void PreferenceDialog::fgClicked(bool id)
{
fgWallpaper->setEnabled(!id);
fgWallpaperSelect->setEnabled(!id);
if (id) {
// fgColorLabel->setColor(p->fgColor);
fgColorLabel->setPixmap(0);
}
else {
fgColorLabel->setPixmap(new QPixmap(fgWallpaper->text()));
}
}
//---------------------------------------------------------
// bgClicked
//---------------------------------------------------------
void PreferenceDialog::bgClicked(bool id)
{
bgWallpaper->setEnabled(!id);
bgWallpaperSelect->setEnabled(!id);
if (id) {
// bgColorLabel->setColor(p->bgColor);
bgColorLabel->setPixmap(0);
}
else {
bgColorLabel->setPixmap(new QPixmap(bgWallpaper->text()));
}
}
//---------------------------------------------------------
// buttonBoxClicked
//---------------------------------------------------------
void PreferenceDialog::buttonBoxClicked(QAbstractButton* button)
{
switch(buttonBox->standardButton(button)) {
case QDialogButtonBox::Apply:
apply();
break;
case QDialogButtonBox::Ok:
apply();
case QDialogButtonBox::Cancel:
default:
hide();
break;
}
}
//---------------------------------------------------------
// apply
//---------------------------------------------------------
void PreferenceDialog::apply()
{
QSettings s;
if (partStyle->text() != s.value("partStyle").toString()) {
s.setValue("partStyle", partStyle->text());
MScore::defaultStyleForPartsHasChanged();
}
prefs.useMidiRemote = rcGroup->isChecked();
for (int i = 0; i < MIDI_REMOTES; ++i)
prefs.midiRemote[i] = preferences.midiRemote[i];
prefs.fgWallpaper = fgWallpaper->text();
prefs.bgWallpaper = bgWallpaper->text();
prefs.fgColor = fgColorLabel->color();
MScore::bgColor = bgColorLabel->color();
prefs.iconWidth = iconWidth->value();
prefs.iconHeight = iconHeight->value();
prefs.bgUseColor = bgColorButton->isChecked();
prefs.fgUseColor = fgColorButton->isChecked();
prefs.enableMidiInput = enableMidiInput->isChecked();
prefs.playNotes = playNotes->isChecked();
prefs.playChordOnAddNote = playChordOnAddNote->isChecked();
prefs.showNavigator = navigatorShow->isChecked();
prefs.showPlayPanel = playPanelShow->isChecked();
prefs.showSplashScreen = showSplashScreen->isChecked();
prefs.showStartcenter = showStartcenter->isChecked();
prefs.antialiasedDrawing = drawAntialiased->isChecked();
prefs.useJackTransport = jackDriver->isChecked() && useJackTransport->isChecked();
prefs.jackTimebaseMaster = becomeTimebaseMaster->isChecked();
prefs.rememberLastConnections = rememberLastMidiConnections->isChecked();
bool wasJack = (prefs.useJackMidi || prefs.useJackAudio);
prefs.useJackAudio = jackDriver->isChecked() && useJackAudio->isChecked();
prefs.useJackMidi = jackDriver->isChecked() && useJackMidi->isChecked();
bool nowJack = (prefs.useJackMidi || prefs.useJackAudio);
bool jackParametersChanged = (prefs.useJackAudio != preferences.useJackAudio
|| prefs.useJackMidi != preferences.useJackMidi
|| prefs.rememberLastConnections != preferences.rememberLastConnections
|| prefs.jackTimebaseMaster != preferences.jackTimebaseMaster)
&& (wasJack && nowJack);
if (jackParametersChanged) {
// Change parameters of JACK driver without unload
preferences = prefs;
if (seq) {
seq->driver()->init(true);
if (!seq->init(true))
qDebug("sequencer init failed");
}
}
else if (
(prefs.useAlsaAudio != alsaDriver->isChecked())
|| (wasJack != nowJack)
|| (prefs.usePortaudioAudio != portaudioDriver->isChecked())
|| (prefs.usePulseAudio != pulseaudioDriver->isChecked())
|| (prefs.alsaDevice != alsaDevice->text())
|| (prefs.alsaSampleRate != alsaSampleRate->currentText().toInt())
|| (prefs.alsaPeriodSize != alsaPeriodSize->currentText().toInt())
|| (prefs.alsaFragments != alsaFragments->value())
) {
if (seq)
seq->exit();
prefs.useAlsaAudio = alsaDriver->isChecked();
prefs.usePortaudioAudio = portaudioDriver->isChecked();
prefs.usePulseAudio = pulseaudioDriver->isChecked();
prefs.alsaDevice = alsaDevice->text();
prefs.alsaSampleRate = alsaSampleRate->currentText().toInt();
prefs.alsaPeriodSize = alsaPeriodSize->currentText().toInt();
prefs.alsaFragments = alsaFragments->value();
preferences = prefs;
if (seq) {
Driver* driver = driverFactory(seq, "");
if (driver) {
// Updating synthesizer's sample rate
if (seq->synti()) {
seq->synti()->setSampleRate(driver->sampleRate());
seq->synti()->init();
}
seq->setDriver(driver);
}
if (!seq->init())
qDebug("sequencer init failed");
}
}
#ifdef USE_PORTAUDIO
if (usePortaudio && !noSeq) {
Portaudio* audio = static_cast<Portaudio*>(seq->driver());
prefs.portaudioDevice = audio->deviceIndex(portaudioApi->currentIndex(),
portaudioDevice->currentIndex());
}
#endif
#ifdef USE_PORTMIDI
prefs.portMidiInput = portMidiInput->currentText();
#endif
if (lastSession->isChecked())
prefs.sessionStart = SessionStart::LAST;
else if (newSession->isChecked())
prefs.sessionStart = SessionStart::NEW;
else if (scoreSession->isChecked())
prefs.sessionStart = SessionStart::SCORE;
else if (emptySession->isChecked())
prefs.sessionStart = SessionStart::EMPTY;
prefs.startScore = sessionScore->text();
prefs.myScoresPath = myScores->text();
prefs.myStylesPath = myStyles->text();
prefs.myImagesPath = myImages->text();
prefs.myTemplatesPath = myTemplates->text();
prefs.myPluginsPath = myPlugins->text();
prefs.sfPath = sfPath->text();
int idx = exportAudioSampleRate->currentIndex();
prefs.exportAudioSampleRate = exportAudioSampleRates[idx];
prefs.midiExpandRepeats = expandRepeats->isChecked();
prefs.midiExportRPNs = exportRPNs->isChecked();
prefs.instrumentList1 = instrumentList1->text();
prefs.instrumentList2 = instrumentList2->text();
prefs.musicxmlImportLayout = importLayout->isChecked();
prefs.musicxmlImportBreaks = importBreaks->isChecked();
prefs.musicxmlExportLayout = exportLayout->isChecked();
if (exportAllBreaks->isChecked())
prefs.musicxmlExportBreaks = MusicxmlExportBreaks::ALL;
else if (exportManualBreaks->isChecked())
prefs.musicxmlExportBreaks = MusicxmlExportBreaks::MANUAL;
else if (exportNoBreaks->isChecked())
prefs.musicxmlExportBreaks = MusicxmlExportBreaks::NO;
prefs.proximity = proximity->value();
prefs.autoSave = autoSave->isChecked();
prefs.autoSaveTime = autoSaveTime->value();
prefs.pngResolution = pngResolution->value();
prefs.pngTransparent = pngTransparent->isChecked();
converterDpi = prefs.pngResolution;
prefs.exportPdfDpi = exportPdfDpi->value();
if (shortcutsChanged) {
shortcutsChanged = false;
foreach(const Shortcut* s, localShortcuts) {
Shortcut* os = Shortcut::getShortcut(s->key());
if (os) {
if (!os->compareKeys(*s))
os->setKeys(s->keys());
}
}
Shortcut::dirty = true;
}
int lang = language->itemData(language->currentIndex()).toInt();
QString l = lang == 0 ? "system" : mscore->languages().at(lang).key;
bool languageChanged = l != prefs.language;
prefs.language = l;
//update
prefs.checkUpdateStartup = checkUpdateStartup->isChecked();
prefs.mag = scale->value()/100.0;
MScore::defaultPlayDuration = defaultPlayDuration->value();
if (useImportStyleFile->isChecked())
prefs.importStyleFile = importStyleFile->text();
else
prefs.importStyleFile.clear();
int ticks = MScore::division/4;
switch(shortestNote->currentIndex()) {
case 0: ticks = MScore::division; break;
case 1: ticks = MScore::division/2; break;
case 2: ticks = MScore::division/4; break;
case 3: ticks = MScore::division/8; break;
case 4: ticks = MScore::division/16; break;
}
prefs.shortestNote = ticks;
prefs.importCharsetOve = importCharsetListOve->currentText();
prefs.importCharsetGP = importCharsetListGP->currentText();
MScore::warnPitchRange = warnPitchRange->isChecked();
prefs.useOsc = oscServer->isChecked();
prefs.oscPort = oscPort->value();
if (styleName->currentIndex() == int(MuseScoreStyleType::DARK)) {
prefs.styleName = "dark";
prefs.globalStyle = MuseScoreStyleType::DARK;
}
else {
prefs.styleName = "light";
prefs.globalStyle = MuseScoreStyleType::LIGHT;
}
prefs.animations = animations->isChecked();
MgStyleConfigData::animationsEnabled = prefs.animations;
if (languageChanged) {
setMscoreLocale(prefs.language);
mscore->update();
}
if (defaultStyle->text() != prefs.defaultStyleFile) {
prefs.defaultStyleFile = defaultStyle->text();
prefs.readDefaultStyle();
}
genIcons();
mscore->setIconSize(QSize(prefs.iconWidth * guiScaling, prefs.iconHeight * guiScaling));
preferences = prefs;
emit preferencesChanged();
preferences.write();
mscore->startAutoSave();
}
//---------------------------------------------------------
// readDefaultStyle
//---------------------------------------------------------
bool Preferences::readDefaultStyle()
{
if (defaultStyleFile.isEmpty())
return false;
MStyle* style = new MStyle(*MScore::defaultStyle());
QFile f(defaultStyleFile);
if (!f.open(QIODevice::ReadOnly))
return false;
bool rv = style->load(&f);
if (rv)
MScore::setDefaultStyle(style); // transfer ownership
f.close();
return rv;
}
//---------------------------------------------------------
// resetAllValues
//---------------------------------------------------------
void PreferenceDialog::resetAllValues()
{
prefs.init();
updateValues();
shortcutsChanged = true;
qDeleteAll(localShortcuts);
localShortcuts.clear();
Shortcut::resetToDefault();
foreach(const Shortcut* s, Shortcut::shortcuts())
localShortcuts[s->key()] = new Shortcut(*s);
updateSCListView();
}
//---------------------------------------------------------
// styleFileButtonClicked
//---------------------------------------------------------
void PreferenceDialog::styleFileButtonClicked()
{
QString fn = mscore->getStyleFilename(true, tr("Choose Default Style for Imports"));
if (fn.isEmpty())
return;
importStyleFile->setText(fn);
}
//---------------------------------------------------------
// midiRemoteControlClearClicked
//---------------------------------------------------------
void PreferenceDialog::midiRemoteControlClearClicked()
{
for (int i = 0; i < MIDI_REMOTES; ++i)
preferences.midiRemote[i].type = MIDI_REMOTE_TYPE_INACTIVE;
updateRemote();
}
//---------------------------------------------------------
// exclusiveAudioDriver
// Allow user to select only one audio driver, restrict
// to uncheck all drivers.
//---------------------------------------------------------
void PreferenceDialog::exclusiveAudioDriver(bool on)
{
if (on) {
if (portaudioDriver != QObject::sender())
portaudioDriver->setChecked(false);
if (pulseaudioDriver != QObject::sender())
pulseaudioDriver->setChecked(false);
if (alsaDriver != QObject::sender())
alsaDriver->setChecked(false);
if (jackDriver != QObject::sender())
jackDriver->setChecked(false);
if (jackDriver == QObject::sender() && !useJackMidi->isChecked() && !useJackAudio->isChecked()) {
useJackMidi->setChecked(true);
useJackAudio->setChecked(true);
}
}
else {
// True if QGroupBox is checked now or was checked before clicking on it
bool portAudioChecked = portaudioDriver->isVisible() && ((QObject::sender() != portaudioDriver && portaudioDriver->isChecked()) || QObject::sender() == portaudioDriver);
bool pulseaudioChecked = pulseaudioDriver->isVisible() && ((QObject::sender() != pulseaudioDriver && pulseaudioDriver->isChecked()) || QObject::sender() == pulseaudioDriver);
bool alsaChecked = alsaDriver->isVisible() && ((QObject::sender() != alsaDriver && alsaDriver->isChecked()) || QObject::sender() == alsaDriver);
bool jackChecked = jackDriver->isVisible() && ((QObject::sender() != jackDriver && jackDriver->isChecked()) || QObject::sender() == jackDriver);
// If nothing is checked, prevent looping (runned with -s, sequencer disabled)
if (!(portAudioChecked || pulseaudioChecked || alsaChecked || jackChecked))
return;
// Don't allow to uncheck all drivers
if (portaudioDriver == QObject::sender())
portaudioDriver->setChecked(!(pulseaudioChecked || alsaChecked || jackChecked));
if (pulseaudioDriver == QObject::sender())
pulseaudioDriver->setChecked(!(portAudioChecked || alsaChecked || jackChecked));
if (alsaDriver == QObject::sender())
alsaDriver->setChecked(!(portAudioChecked || pulseaudioChecked || jackChecked));
if (jackDriver == QObject::sender())
jackDriver->setChecked(!(portAudioChecked || pulseaudioChecked || alsaChecked));
}
}
//---------------------------------------------------------
// exclusiveJackDriver
// Allow user to select "use Jack Audio", "use Jack MIDI"
// or both, but forbid unchecking both.
// There is no need to select "JACK audio server" without
// checking any of them.
//---------------------------------------------------------
void PreferenceDialog::nonExclusiveJackDriver(bool on)
{
if (!on) {
if (QObject::sender() == useJackAudio)
useJackAudio->setChecked(!useJackMidi->isChecked());
else if (QObject::sender() == useJackMidi)
useJackMidi->setChecked(!useJackAudio->isChecked());
}
}
//---------------------------------------------------------
// selectScoresDirectory
//---------------------------------------------------------
void PreferenceDialog::selectScoresDirectory()
{
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose Score Folder"),
myScores->text()
);
if (!s.isNull())
myScores->setText(s);
}
//---------------------------------------------------------
// selectStylesDirectory
//---------------------------------------------------------
void PreferenceDialog::selectStylesDirectory()
{
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose Style Folder"),
myStyles->text()
);
if (!s.isNull())
myStyles->setText(s);
}
//---------------------------------------------------------
// selectTemplatesDirectory
//---------------------------------------------------------
void PreferenceDialog::selectTemplatesDirectory()
{
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose Template Folder"),
myTemplates->text()
);
if (!s.isNull())
myTemplates->setText(s);
}
//---------------------------------------------------------
// selectPluginsDirectory
//---------------------------------------------------------
void PreferenceDialog::selectPluginsDirectory()
{
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose Plugin Folder"),
myPlugins->text()
);
if (!s.isNull())
myPlugins->setText(s);
}
//---------------------------------------------------------
// selectImagesDirectory
//---------------------------------------------------------
void PreferenceDialog::selectImagesDirectory()
{
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose Image Folder"),
myImages->text()
);
if (!s.isNull())
myImages->setText(s);
}
//---------------------------------------------------------
// changeSoundfontPaths
//---------------------------------------------------------
void PreferenceDialog::changeSoundfontPaths()
{
PathListDialog pld(this);
pld.setWindowTitle(tr("SoundFont Folders"));
pld.setPath(sfPath->text());
if(pld.exec())
sfPath->setText(pld.path());
}
//---------------------------------------------------------
// updateLanguagesClicked
//---------------------------------------------------------
void PreferenceDialog::updateTranslationClicked()
{
ResourceManager r(0);
r.exec();
}
//---------------------------------------------------------
// defineShortcutClicked
//---------------------------------------------------------
void PreferenceDialog::defineShortcutClicked()
{
QTreeWidgetItem* active = shortcutList->currentItem();
if (!active)
return;
QString str = active->data(0, Qt::UserRole).toString();
if (str.isEmpty())
return;
Shortcut* s = localShortcuts[str.toLatin1().data()];
ShortcutCaptureDialog sc(s, localShortcuts, this);
int rv = sc.exec();
if (rv == 0)
return;
if (rv == 2)
s->clear();
s->addShortcut(sc.getKey());
active->setText(1, s->keysToString());
shortcutsChanged = true;
}
//---------------------------------------------------------
// readPluginList
//---------------------------------------------------------
bool Preferences::readPluginList()
{
QFile f(dataPath + "/plugins.xml");
if (!f.exists())
return false;
if (!f.open(QIODevice::ReadOnly)) {
qDebug("Cannot open plugins file <%s>", qPrintable(f.fileName()));
return false;
}
XmlReader e(&f);
while (e.readNextStartElement()) {
if (e.name() == "museScore") {
while (e.readNextStartElement()) {
const QStringRef& tag(e.name());
if (tag == "Plugin") {
PluginDescription d;
while (e.readNextStartElement()) {
const QStringRef& tag(e.name());
if (tag == "path")
d.path = e.readElementText();
else if (tag == "load")
d.load = e.readInt();
else if (tag == "SC")
d.shortcut.read(e);
else if (tag == "version")
d.version = e.readElementText();
else if (tag == "description")
d.description = e.readElementText();
else
e.unknown();
}
d.shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT |
STATE_ALLTEXTUAL_EDIT | STATE_PLAY | STATE_FOTO | STATE_LOCK );
if (d.path.endsWith(".qml"))
pluginList.append(d);
}
else
e.unknown();
}
}
else
e.unknown();
}
return true;
}
//---------------------------------------------------------
// writePluginList
//---------------------------------------------------------
void Preferences::writePluginList()
{
QDir dir;
dir.mkpath(dataPath);
QFile f(dataPath + "/plugins.xml");
if (!f.open(QIODevice::WriteOnly)) {
qDebug("cannot create plugin file <%s>", qPrintable(f.fileName()));
return;
}
Xml xml(&f);
xml.header();
xml.stag("museScore version=\"" MSC_VERSION "\"");
foreach(const PluginDescription& d, pluginList) {
xml.stag("Plugin");
xml.tag("path", d.path);
xml.tag("load", d.load);
xml.tag("version", d.version);
xml.tag("description", d.description);
if (!d.shortcut.keys().isEmpty())
d.shortcut.write(xml);
xml.etag();
}
xml.etag();
f.close();
}
//---------------------------------------------------------
// updatePluginList
// scan plugin folders for new plugins and update
// pluginList
//---------------------------------------------------------
#ifdef SCRIPT_INTERFACE
static void updatePluginList(QList<QString>& pluginPathList, const QString& pluginPath,
QList<PluginDescription>& pluginList)
{
QDirIterator it(pluginPath, QDir::NoDot|QDir::NoDotDot|QDir::Dirs|QDir::Files,
QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
QFileInfo fi = it.fileInfo();
QString path(fi.absoluteFilePath());
if (fi.isFile()) {
if (path.endsWith(".qml")) {
bool alreadyInList = false;
foreach (const PluginDescription& p, pluginList) {
if (p.path == path) {
alreadyInList = true;
break;
}
}
if (!alreadyInList) {
PluginDescription p;
p.path = path;
p.load = false;
collectPluginMetaInformation(&p);
pluginList.append(p);
}
}
}
else
updatePluginList(pluginPathList, path, pluginList);
}
}
#endif
void Preferences::updatePluginList()
{
#ifdef SCRIPT_INTERFACE
QList<QString> pluginPathList;
pluginPathList.append(dataPath + "/plugins");
pluginPathList.append(mscoreGlobalShare + "plugins");
pluginPathList.append(myPluginsPath);
foreach(QString pluginPath, pluginPathList) {
Ms::updatePluginList(pluginPathList, pluginPath, pluginList);
}
//remove non existing files
auto i = pluginList.begin();
while (i != pluginList.end()) {
PluginDescription d = *i;
QFileInfo fi(d.path);
if (!fi.exists())
i = pluginList.erase(i);
else
++i;
}
#endif
}
//---------------------------------------------------------
// printShortcutsClicked
//---------------------------------------------------------
void PreferenceDialog::printShortcutsClicked()
{
QPrinter printer(QPrinter::HighResolution);
MStyle* s = MScore::defaultStyle();
const PageFormat* pf = s->pageFormat();
printer.setPaperSize(pf->size(), QPrinter::Inch);
printer.setCreator("MuseScore Version: " VERSION);
printer.setFullPage(true);
printer.setColorMode(QPrinter::Color);
printer.setDocName(tr("MuseScore Shortcuts"));
printer.setOutputFormat(QPrinter::NativeFormat);
QPrintDialog pd(&printer, 0);
pd.setWindowTitle(tr("Print Shortcuts"));
if (!pd.exec())
return;
qreal dpmm = printer.logicalDpiY() / 25.4;
qreal ph = printer.height();
qreal tm = dpmm * 15;
qreal bm = dpmm * 15;
qreal lm = dpmm * 20;
QPainter p;
p.begin(&printer);
qreal y;
qreal lh = QFontMetricsF(p.font()).lineSpacing();
// get max width for description
QMapIterator<QString, Shortcut*> isc(localShortcuts);
qreal col1Width = 0.0;
while (isc.hasNext()) {
isc.next();
Shortcut* s = isc.value();
col1Width = qMax(col1Width, QFontMetricsF(p.font()).width(s->descr()));
}
int idx = 0;
QTreeWidgetItem* item = shortcutList->topLevelItem(0);
while (item) {
if (idx == 0 || y >= (ph - bm)) {
y = tm;
if (idx)
printer.newPage();
else {
p.save();
QFont font(p.font());
font.setPointSizeF(14.0);
font.setBold(true);
p.setFont(font);
p.drawText(lm, y, tr("MuseScore Shortcuts"));
p.restore();
y += QFontMetricsF(font).lineSpacing();
y += 5 * dpmm;
}
}
p.drawText(lm, y, item->text(0));
p.drawText(col1Width + lm + 5 * dpmm, y, item->text(1));
y += lh;
++idx;
item = shortcutList->itemBelow(item);
}
p.end();
}
}