184 lines
6.9 KiB
C++
184 lines
6.9 KiB
C++
/*!
|
|
@file GuiPreferencesDialog.cpp
|
|
|
|
@brief xxx.
|
|
|
|
@author L. J. Barman
|
|
|
|
Copyright (c) 2008-2020, L. J. Barman and others, all rights reserved
|
|
|
|
This file is part of the PianoBooster application
|
|
|
|
PianoBooster is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
PianoBooster 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 PianoBooster. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
#include <QDir>
|
|
#include <QFontInfo>
|
|
#include <QJsonObject>
|
|
#include <QJsonDocument>
|
|
#include <QJsonValue>
|
|
#include <QStringBuilder>
|
|
#include <QRegularExpression>
|
|
|
|
#include <functional>
|
|
|
|
#include "GuiPreferencesDialog.h"
|
|
#include "GlView.h"
|
|
|
|
#include "ui_GuiPreferencesDialog.h"
|
|
|
|
GuiPreferencesOptionPage::GuiPreferencesOptionPage(QObject *parent)
|
|
: QObject(parent)
|
|
, m_settings(nullptr)
|
|
, m_song(nullptr)
|
|
, m_glView(nullptr)
|
|
{
|
|
}
|
|
|
|
GuiPreferencesOptionPage::~GuiPreferencesOptionPage()
|
|
{
|
|
}
|
|
|
|
void GuiPreferencesOptionPage::initLanguageCombo() {
|
|
#ifndef NO_LANGS
|
|
|
|
// read langs.json
|
|
const auto localeDirectory = Util::dataDir(QStringLiteral("translations"));
|
|
auto file = QFile(localeDirectory + QStringLiteral("/langs.json"));
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
ppLogError("Error while opening langs.json");
|
|
return;
|
|
}
|
|
const auto document = QJsonDocument::fromJson(file.readAll());
|
|
file.close();
|
|
if (document.isEmpty()) {
|
|
ppLogError("langs.json is not valid");
|
|
return;
|
|
}
|
|
|
|
// load languages
|
|
const auto rootLangs = document.object();
|
|
ui()->languageCombo->clear();
|
|
ui()->languageCombo->addItem(QString(QChar('<') % tr("System Language") % QChar('>')), QString());
|
|
ui()->languageCombo->addItem(QStringLiteral("English"), QStringLiteral("en"));
|
|
if (m_settings->value(QStringLiteral("General/lang"), QString()).toString() == QLatin1String("en")){
|
|
ui()->languageCombo->setCurrentIndex(ui()->languageCombo->count() - 1);
|
|
}
|
|
|
|
auto dirLang = QDir(localeDirectory);
|
|
dirLang.setFilter(QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
|
|
const auto listLang = QFileInfoList(dirLang.entryInfoList());
|
|
static const auto rx = QRegularExpression(QStringLiteral("(pianobooster_)(.*)(.qm)"));
|
|
for (const QFileInfo &fileInfo : listLang) {
|
|
const auto match = rx.match(fileInfo.fileName());
|
|
if (!match.hasMatch()) {
|
|
continue;
|
|
}
|
|
const auto langCode = match.captured(2);
|
|
if (langCode == QLatin1String("blank")) {
|
|
continue;
|
|
}
|
|
auto langCodeLoc = langCode;
|
|
if (langCodeLoc.indexOf(QChar('_')) == -1) {
|
|
langCodeLoc += QChar('_') + langCodeLoc.toUpper();
|
|
}
|
|
|
|
auto languageName = QString();
|
|
if (rootLangs.value(langCode).toObject().value(QLatin1String("nativeName")).isString()) {
|
|
languageName = rootLangs.value(langCode).toObject().value(QLatin1String("nativeName")).toString();
|
|
}
|
|
if (languageName.isEmpty()){
|
|
auto loc = QLocale(langCodeLoc);
|
|
languageName = loc.nativeLanguageName();
|
|
if (languageName.isEmpty()){
|
|
languageName = QLocale::languageToString(loc.language());
|
|
}
|
|
}
|
|
languageName[0] = languageName[0].toUpper();
|
|
if (languageName.isEmpty() || languageName == QChar('C')) {
|
|
languageName=langCode;
|
|
}
|
|
|
|
ui()->languageCombo->addItem(languageName, langCode);
|
|
if (m_settings->value(QStringLiteral("General/lang"), QString()).toString() == langCode){
|
|
ui()->languageCombo->setCurrentIndex(ui()->languageCombo->count() - 1);
|
|
}
|
|
}
|
|
#else
|
|
// loading languages
|
|
languageCombo->clear();
|
|
languageCombo->addItem(QStringLiteral("English"), QStringLiteral("en"));
|
|
languageCombo->setCurrentIndex(0);
|
|
#endif
|
|
}
|
|
|
|
void GuiPreferencesOptionPage::init(CSong* song, CSettings* settings, CGLView * glView)
|
|
{
|
|
m_song = song;
|
|
m_settings = settings;
|
|
m_glView = glView;
|
|
}
|
|
|
|
bool GuiPreferencesOptionPage::apply()
|
|
{
|
|
Cfg::experimentalNoteLength = ui()->showNoteLengthCheck->isChecked();
|
|
m_settings->setValue("Score/ShowNoteLength", Cfg::experimentalNoteLength);
|
|
m_song->cfg_timingMarkersFlag = ui()->timingMarkersCheck->isChecked();
|
|
m_settings->setValue("Score/TimingMarkers", m_song->cfg_timingMarkersFlag );
|
|
m_settings->setNoteNamesEnabled( ui()->showNoteNamesCheck->isChecked());
|
|
m_settings->setCourtesyAccidentals( ui()->courtesyAccidentalsCheck->isChecked());
|
|
m_settings->setTutorPagesEnabled( ui()->showTutorPagesCheck->isChecked());
|
|
m_settings->setFollowThroughErrorsEnabled( ui()->followThroughErrorsCheck->isChecked());
|
|
m_settings->setColoredNotes( ui()->showColoredNotesCheck->isChecked());
|
|
m_song->cfg_stopPointMode = static_cast<stopPointMode_t>(ui()->followStopPointCombo->currentIndex());
|
|
m_settings->setValue("Score/StopPointMode", m_song->cfg_stopPointMode );
|
|
m_settings->setValue("General/lang", ui()->languageCombo->currentData().toString());
|
|
m_song->refreshScroll();
|
|
return true;
|
|
}
|
|
|
|
void GuiPreferencesOptionPage::reset()
|
|
{
|
|
ui()->showNoteLengthCheck->setChecked(Cfg::experimentalNoteLength);
|
|
ui()->timingMarkersCheck->setChecked(m_song->cfg_timingMarkersFlag);
|
|
ui()->showNoteNamesCheck->setChecked(m_settings->isNoteNamesEnabled());
|
|
ui()->courtesyAccidentalsCheck->setChecked(m_settings->displayCourtesyAccidentals());
|
|
ui()->showTutorPagesCheck->setChecked(m_settings->isTutorPagesEnabled());
|
|
ui()->followThroughErrorsCheck->setChecked(m_settings->isFollowThroughErrorsEnabled());
|
|
ui()->showColoredNotesCheck->setChecked(m_settings->isColoredNotesEnabled());
|
|
ui()->followStopPointCombo->setCurrentIndex(m_song->cfg_stopPointMode);
|
|
}
|
|
|
|
QWidget *GuiPreferencesOptionPage::setupWidget()
|
|
{
|
|
auto *widget = static_cast<QtUtilities::OptionPageWidget *>(GuiPreferencesOptionPageBase::setupWidget());
|
|
initFollowStopPointCombo();
|
|
initLanguageCombo();
|
|
QObject::connect(widget, &QtUtilities::OptionPageWidget::retranslationRequired, widget, std::bind(&GuiPreferencesOptionPage::initFollowStopPointCombo, this));
|
|
return widget;
|
|
}
|
|
|
|
void GuiPreferencesOptionPage::initFollowStopPointCombo()
|
|
{
|
|
auto *const combo = ui()->followStopPointCombo;
|
|
const auto index = combo->currentIndex();
|
|
combo->clear();
|
|
combo->addItem(tr("Automatic (Recommended)"));
|
|
combo->addItem(tr("On the Beat"));
|
|
combo->addItem(tr("After the Beat"));
|
|
combo->setCurrentIndex(index);
|
|
|
|
}
|