1 //=============================================================================
2 // MuseScore
3 // Music Composition & Notation
4 // Copyright (C) 2017 Werner Schweer and others
5 //
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License version 2.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 //=============================================================================
18
19 #include "startupWizard.h"
20 #include "musescore.h"
21 #include "libmscore/mscore.h"
22 #include "shortcut.h"
23
24 namespace Ms {
25
26 const static QMap<QString, QString> layoutToShortcut = {
27 {QT_TRANSLATE_NOOP("keyboard-layout", "US-QWERTY"), ":/data/shortcuts.xml"},
28 {QT_TRANSLATE_NOOP("keyboard-layout", "UK-QWERTY"), ":/data/shortcuts.xml"},
29 {QT_TRANSLATE_NOOP("keyboard-layout", "QWERTZ"), ":/data/shortcuts.xml"},
30 {QT_TRANSLATE_NOOP("keyboard-layout", "AZERTY"), ":/data/shortcuts_AZERTY.xml"},
31 {QT_TRANSLATE_NOOP("keyboard-layout", "BEPO"), ":/data/shortcuts.xml"},
32 {QT_TRANSLATE_NOOP("keyboard-layout", "DVORAK"), ":/data/shortcuts.xml"},
33 {QT_TRANSLATE_NOOP("keyboard-layout", "JIS - Standard Japanese"), ":/data/shortcuts.xml"},
34 {QT_TRANSLATE_NOOP("keyboard-layout", "OYAYUBI SHIFUTO"), ":/data/shortcuts.xml"},
35 {QT_TRANSLATE_NOOP("keyboard-layout", "T1 - Standard German"), ":/data/shortcuts.xml"},
36 {QT_TRANSLATE_NOOP("keyboard-layout", "T2 - German"), ":/data/shortcuts.xml"},
37 {QT_TRANSLATE_NOOP("keyboard-layout", "Swiss German"), ":/data/shortcuts.xml"},
38 {QT_TRANSLATE_NOOP("keyboard-layout", "Belgian French"), ":/data/shortcuts.xml"},
39 {QT_TRANSLATE_NOOP("keyboard-layout", "Canadian French"), ":/data/shortcuts.xml"},
40 {QT_TRANSLATE_NOOP("keyboard-layout", "French French"), ":/data/shortcuts_AZERTY.xml"},
41 {QT_TRANSLATE_NOOP("keyboard-layout", "Swiss French"), ":/data/shortcuts.xml"},
42 {QT_TRANSLATE_NOOP("keyboard-layout", "Spanish"), ":/data/shortcuts.xml"},
43 {QT_TRANSLATE_NOOP("keyboard-layout", "Italian"), ":/data/shortcuts.xml"},
44 {QT_TRANSLATE_NOOP("keyboard-layout", "Brazilian Portuguese ABNT"), ":/data/shortcuts.xml"},
45 {QT_TRANSLATE_NOOP("keyboard-layout", "Portuguese"), ":/data/shortcuts.xml"},
46 {QT_TRANSLATE_NOOP("keyboard-layout", "US - International"), ":/data/shortcuts.xml"},
47 {QT_TRANSLATE_NOOP("keyboard-layout", "Dutch"), ":/data/shortcuts.xml"},
48 {QT_TRANSLATE_NOOP("keyboard-layout", "Korean - Dubeolsik"), ":/data/shortcuts.xml"},
49 {QT_TRANSLATE_NOOP("keyboard-layout", "Korean - Sebeolsik"), ":/data/shortcuts.xml"},
50 {QT_TRANSLATE_NOOP("keyboard-layout", "Other"), ":/data/shortcuts.xml"},
51 };
52
53 const static QMap<QString, QString> langToLayout = {
54 {"en", "US-QWERTY"},
55 {"ja", "JIS - Standard Japanese"},
56 {"de", "T1 - Standard German"},
57 {"fr", "French French"},
58 {"es", "Spanish"},
59 {"it", "Italian"},
60 {"pt", "Portuguese"},
61 {"nl", "Dutch"},
62 {"ko", "Korean - Dubeolsik"}
63 };
64
StartupWizardIntroPage(QWidget * parent)65 StartupWizardIntroPage::StartupWizardIntroPage(QWidget* parent)
66 : QWizardPage(parent)
67 {
68 setTitle(tr("Welcome to MuseScore!"));
69 QLabel* label = new QLabel(tr("This wizard will help you choose settings for MuseScore based on your locale,\n music level, and personal preferences."), this);
70 QVBoxLayout* layout = new QVBoxLayout(this);
71 layout->addWidget(label);
72 setLayout(layout);
73 }
74
StartupWizardPage1(QWidget * parent)75 StartupWizardPage1::StartupWizardPage1(QWidget* parent)
76 : QWizardPage(parent)
77 {
78 setTitle(tr("Language"));
79 QLabel* label = new QLabel(tr("Choose your language"), this);
80 _languages = new QComboBox(this);
81 int index = 0;
82 for (const auto &language : Ms::mscore->languages()) {
83 _languages->addItem(qApp->translate("language", language.name.toUtf8().constData()));
84 _languages->setItemData(index, language.key);
85 index++;
86 }
87 QString systemText = _languages->itemText(0) + " (" + mscore->getLocaleISOCode() + ")";
88 _languages->setItemText(0, systemText);
89 QVBoxLayout* layout = new QVBoxLayout(this);
90 layout->addWidget(label);
91 layout->addWidget(_languages);
92 setLayout(layout);
93 QWizardPage::registerField("langIndex", _languages, "currentIndex", "currentIndexChanged()");
94 }
95
language()96 QString StartupWizardPage1::language()
97 {
98 int index = _languages->currentIndex();
99 return _languages->itemData(index).toString();
100 }
101
getCurrentLangCode()102 QString StartupWizardPage1::getCurrentLangCode()
103 {
104 int index = QWizardPage::field("langIndex").toInt();
105 if (_languages->itemData(index).toString().compare("system") == 0)
106 return mscore->getLocaleISOCode();
107 return _languages->itemData(index).toString();
108 }
109
StartupWizardPage2(QWidget * parent)110 StartupWizardPage2::StartupWizardPage2(QWidget* parent)
111 : QWizardPage(parent)
112 {
113 setTitle(tr("Keyboard Layout"));
114 QLabel* label = new QLabel(tr("Enter your keyboard layout"), this);
115 QStringList layoutList;
116 QList<QString> keyboardLayouts = layoutToShortcut.keys();
117 for (const auto &layout : qAsConst(keyboardLayouts))
118 layoutList.append(qApp->translate("keyboard-layout", layout.toUtf8().constData()));
119 _keyLayouts = new QComboBox(this);
120 _keyLayouts->addItems(layoutList);
121 int targetIndex = layoutList.indexOf("US - International", 0);
122 _keyLayouts->setCurrentIndex(targetIndex);
123 QVBoxLayout* layout = new QVBoxLayout(this);
124 layout->addWidget(label);
125 layout->addWidget(_keyLayouts);
126 setLayout(layout);
127 this->setCurrentLayout(mscore->getLocaleISOCode());
128 }
129
setCurrentLayout(QString langCode)130 void StartupWizardPage2::setCurrentLayout(QString langCode)
131 {
132 langCode = langCode.left(2);
133 QString bestLayout = langToLayout.value(langCode, "US - International");
134 QStringList layoutList;
135 QList<QString> keyboardLayouts = layoutToShortcut.keys();
136 for (const auto &layout : qAsConst(keyboardLayouts))
137 layoutList.append(qApp->translate("keyboard-layout", layout.toUtf8().constData()));
138 int targetIndex = layoutList.indexOf(bestLayout);
139 _keyLayouts->setCurrentIndex(targetIndex);
140 }
141
StartupWizardPage4(QWidget * parent)142 StartupWizardPage4::StartupWizardPage4(QWidget* parent)
143 : QWizardPage(parent)
144 {
145 setTitle(tr("Tours"));
146 QLabel* label = new QLabel(tr("Tours will help guide you through the functionality of MuseScore.\n\n Would you like to see these tours?"), this);
147 QVBoxLayout* layout = new QVBoxLayout(this);
148 layout->addWidget(label);
149 yesButton = new QRadioButton(tr("Yes"), this);
150 noButton = new QRadioButton(tr("No"), this);
151
152 yesButton->setChecked(true);
153 QHBoxLayout* buttonLayout = new QHBoxLayout();
154 buttonLayout->addWidget(yesButton);
155 buttonLayout->addWidget(noButton);
156 layout->addLayout(buttonLayout);
157 setLayout(layout);
158 }
159
StartupWizardFinalPage(QWidget * parent)160 StartupWizardFinalPage::StartupWizardFinalPage(QWidget* parent)
161 : QWizardPage(parent)
162 {
163 setTitle(tr("Thank you!"));
164 QLabel* label = new QLabel(tr("Your preferences have been successfully saved. Enjoy MuseScore!"), this);
165 QVBoxLayout* layout = new QVBoxLayout(this);
166 layout->addWidget(label);
167 setLayout(layout);
168 }
169
StartupWizard(QWidget * parent)170 StartupWizard::StartupWizard(QWidget* parent)
171 : QWizard(parent)
172 {
173 setObjectName("StartupWizard");
174 auto wizardStyleValue = QWizard::ModernStyle; //Modern Windows look
175 #ifdef Q_OS_MAC
176 wizardStyleValue = QWizard::MacStyle;
177 setOption(QWizard::CancelButtonOnLeft, true);
178 #endif
179 setWizardStyle(wizardStyleValue);
180 setWindowTitle(tr("Startup Wizard"));
181
182 p0 = new StartupWizardIntroPage(this);
183 p1 = new StartupWizardPage1(this);
184 p2 = new StartupWizardPage2(this);
185 p4 = new StartupWizardPage4(this);
186 p5 = new StartupWizardFinalPage(this);
187
188 addPage(p0);
189 addPage(p1);
190 addPage(p2);
191 addPage(p4);
192 addPage(p5);
193
194 connect(p1->getLanguages(), SIGNAL(currentIndexChanged(int)), SLOT(langChanged()));
195 }
196
langChanged()197 void StartupWizard::langChanged()
198 {
199 QString langCode = p1->getCurrentLangCode();
200 p2->setCurrentLayout(langCode);
201 }
202
autoSelectShortcuts(QString keyboardLayout)203 void StartupWizard::autoSelectShortcuts(QString keyboardLayout)
204 {
205 QString fileLocation = layoutToShortcut.value(keyboardLayout, ":/data/shortcuts.xml");
206 Shortcut::loadFromNewFile(fileLocation);
207 }
208
209 }
210