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