summaryrefslogtreecommitdiff
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2020-11-21 19:33:29 +0100
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2020-11-22 14:43:01 +0100
commitc2dacf6736dfcde92a4ed947f06fd85c6b2087d4 (patch)
tree470852777cef90f4a2f1fb9a463653955261fcff /rbutil
parentad37655687cd4861681e561b2a84fabb5c307327 (diff)
downloadrockbox-c2dacf6736dfcde92a4ed947f06fd85c6b2087d4.tar.gz
rockbox-c2dacf6736dfcde92a4ed947f06fd85c6b2087d4.zip
rbutil: Add voice installation to main widget.
Add checkbox for installing the prerendered voice file to the main install widget. Current limitations: - only english for now. The available languages are available from the build server but are not yet taken into account. - only for releases. This is the same limitations we had before. We do have voices for daily builds, but that requires adding daily builds again (those have been removed some time back.) - Old voice installation dialog still present. Change-Id: Ia6443b0f15365196df86cc1b64d5e043dff70c4c
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/base/rbsettings.cpp1
-rw-r--r--rbutil/rbutilqt/base/rbsettings.h1
-rw-r--r--rbutil/rbutilqt/base/systeminfo.cpp8
-rw-r--r--rbutil/rbutilqt/base/systeminfo.h5
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.cpp119
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.h2
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidgetfrm.ui143
-rw-r--r--rbutil/rbutilqt/rbutil.ini7
-rw-r--r--rbutil/rbutilqt/rbutilqt.cpp1
9 files changed, 199 insertions, 88 deletions
diff --git a/rbutil/rbutilqt/base/rbsettings.cpp b/rbutil/rbutilqt/base/rbsettings.cpp
index 827c0f96fd..5baa53bee0 100644
--- a/rbutil/rbutilqt/base/rbsettings.cpp
+++ b/rbutil/rbutilqt/base/rbsettings.cpp
@@ -47,6 +47,7 @@ const static struct {
47 { RbSettings::InstallFonts, "install_fonts", "true" }, 47 { RbSettings::InstallFonts, "install_fonts", "true" },
48 { RbSettings::InstallThemes, "install_themes", "false" }, 48 { RbSettings::InstallThemes, "install_themes", "false" },
49 { RbSettings::InstallGamefiles, "install_gamefiles", "true" }, 49 { RbSettings::InstallGamefiles, "install_gamefiles", "true" },
50 { RbSettings::InstallVoice, "install_voice", "false" },
50#if defined(Q_OS_WIN32) 51#if defined(Q_OS_WIN32)
51 { RbSettings::Tts, "tts", "sapi" }, 52 { RbSettings::Tts, "tts", "sapi" },
52#elif defined(Q_OS_MACX) 53#elif defined(Q_OS_MACX)
diff --git a/rbutil/rbutilqt/base/rbsettings.h b/rbutil/rbutilqt/base/rbsettings.h
index 7406aab1ad..a25eabbcee 100644
--- a/rbutil/rbutilqt/base/rbsettings.h
+++ b/rbutil/rbutilqt/base/rbsettings.h
@@ -46,6 +46,7 @@ class RbSettings : public QObject
46 InstallFonts, 46 InstallFonts,
47 InstallThemes, 47 InstallThemes,
48 InstallGamefiles, 48 InstallGamefiles,
49 InstallVoice,
49 Tts, 50 Tts,
50 UseTtsCorrections, 51 UseTtsCorrections,
51 TalkFolders, 52 TalkFolders,
diff --git a/rbutil/rbutilqt/base/systeminfo.cpp b/rbutil/rbutilqt/base/systeminfo.cpp
index 2aece49110..2ad3c7a7d4 100644
--- a/rbutil/rbutilqt/base/systeminfo.cpp
+++ b/rbutil/rbutilqt/base/systeminfo.cpp
@@ -159,7 +159,7 @@ QStringList SystemInfo::platforms(enum SystemInfo::PlatformType type, QString va
159 return result; 159 return result;
160} 160}
161 161
162QMap<QString, QStringList> SystemInfo::languages(void) 162QMap<QString, QStringList> SystemInfo::languages(bool namesOnly)
163{ 163{
164 ensureSystemInfoExists(); 164 ensureSystemInfoExists();
165 165
@@ -168,7 +168,11 @@ QMap<QString, QStringList> SystemInfo::languages(void)
168 QStringList a = systemInfos->childKeys(); 168 QStringList a = systemInfos->childKeys();
169 for(int i = 0; i < a.size(); i++) 169 for(int i = 0; i < a.size(); i++)
170 { 170 {
171 result.insert(a.at(i), systemInfos->value(a.at(i), "null").toStringList()); 171 QStringList data = systemInfos->value(a.at(i), "null").toStringList();
172 if(namesOnly)
173 result.insert(data.at(0), QStringList(data.at(1)));
174 else
175 result.insert(a.at(i), data);
172 } 176 }
173 systemInfos->endGroup(); 177 systemInfos->endGroup();
174 return result; 178 return result;
diff --git a/rbutil/rbutilqt/base/systeminfo.h b/rbutil/rbutilqt/base/systeminfo.h
index 12b9eb4bfb..9bcfe6d253 100644
--- a/rbutil/rbutilqt/base/systeminfo.h
+++ b/rbutil/rbutilqt/base/systeminfo.h
@@ -90,8 +90,9 @@ class SystemInfo : public QObject
90 //! return a list of all platforms (rbutil internal names) 90 //! return a list of all platforms (rbutil internal names)
91 static QStringList platforms(enum PlatformType type = PlatformAll, 91 static QStringList platforms(enum PlatformType type = PlatformAll,
92 QString variant=""); 92 QString variant="");
93 //! returns a map of all languages 93 //! returns a map of all languages.
94 static QMap<QString, QStringList> languages(void); 94 //! Maps <language code> to (<language name>, <display name>)
95 static QMap<QString, QStringList> languages(bool namesOnly = false);
95 //! returns a map of usb-ids and their targets 96 //! returns a map of usb-ids and their targets
96 static QMap<int, QStringList> usbIdMap(enum MapType type); 97 static QMap<int, QStringList> usbIdMap(enum MapType type);
97 //! get a value from system settings 98 //! get a value from system settings
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
index c916e7a190..8a83c6ebc5 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
@@ -39,6 +39,7 @@ SelectiveInstallWidget::SelectiveInstallWidget(QWidget* parent) : QWidget(parent
39 ui.fontsCheckbox->setChecked(RbSettings::value(RbSettings::InstallFonts).toBool()); 39 ui.fontsCheckbox->setChecked(RbSettings::value(RbSettings::InstallFonts).toBool());
40 ui.themesCheckbox->setChecked(RbSettings::value(RbSettings::InstallThemes).toBool()); 40 ui.themesCheckbox->setChecked(RbSettings::value(RbSettings::InstallThemes).toBool());
41 ui.gamefileCheckbox->setChecked(RbSettings::value(RbSettings::InstallGamefiles).toBool()); 41 ui.gamefileCheckbox->setChecked(RbSettings::value(RbSettings::InstallGamefiles).toBool());
42 ui.voiceCheckbox->setChecked(RbSettings::value(RbSettings::InstallVoice).toBool());
42 43
43 // check if Rockbox is installed by looking after rockbox-info.txt. 44 // check if Rockbox is installed by looking after rockbox-info.txt.
44 // If installed uncheck bootloader installation. 45 // If installed uncheck bootloader installation.
@@ -62,17 +63,27 @@ SelectiveInstallWidget::SelectiveInstallWidget(QWidget* parent) : QWidget(parent
62 63
63void SelectiveInstallWidget::selectedVersionChanged(int index) 64void SelectiveInstallWidget::selectedVersionChanged(int index)
64{ 65{
65 QString current = ui.selectedVersion->itemData(index).toString(); 66 m_buildtype = ui.selectedVersion->itemData(index).toString();
66 if(current == "release") 67 bool voice = true;
68 if(m_buildtype == "release") {
67 ui.selectedDescription->setText(tr("This is the latest stable " 69 ui.selectedDescription->setText(tr("This is the latest stable "
68 "release available.")); 70 "release available."));
69 if(current == "development") 71 voice = true;
72 }
73 if(m_buildtype == "development") {
70 ui.selectedDescription->setText(tr("The development version is " 74 ui.selectedDescription->setText(tr("The development version is "
71 "updated on every code change. Last update was on %1").arg( 75 "updated on every code change. Last update was on %1").arg(
72 ServerInfo::instance()->platformValue(ServerInfo::BleedingDate).toString())); 76 ServerInfo::instance()->platformValue(ServerInfo::BleedingDate).toString()));
73 if(current == "rc") 77 voice = false;
78 }
79 if(m_buildtype == "rc") {
74 ui.selectedDescription->setText(tr("This will eventually become the " 80 ui.selectedDescription->setText(tr("This will eventually become the "
75 "next Rockbox version. Install it to help testing.")); 81 "next Rockbox version. Install it to help testing."));
82 voice = false;
83 }
84 ui.voiceCheckbox->setEnabled(voice);
85 ui.voiceCombobox->setEnabled(voice);
86 ui.voiceLabel->setEnabled(voice);
76} 87}
77 88
78 89
@@ -144,7 +155,27 @@ void SelectiveInstallWidget::updateVersion(void)
144 RockboxInfo info(m_mountpoint); 155 RockboxInfo info(m_mountpoint);
145 ui.bootloaderCheckbox->setChecked(!info.success()); 156 ui.bootloaderCheckbox->setChecked(!info.success());
146 } 157 }
147 158 // populate languages for voice file.
159 // FIXME: currently only english. Need to get the available languages from
160 // build-info later.
161 QVariant current = ui.voiceCombobox->currentData();
162 QMap<QString, QStringList> languages = SystemInfo::languages(true);
163 QStringList voicelangs;
164 voicelangs << "english";
165 ui.voiceCombobox->clear();
166 for(int i = 0; i < voicelangs.size(); i++) {
167 QString key = voicelangs.at(i);
168 if(!languages.contains(key)) {
169 LOG_WARNING() << "trying to add unknown language" << key;
170 continue;
171 }
172 ui.voiceCombobox->addItem(languages.value(key).at(0), key);
173 }
174 // try to select the previously selected one again (if still present)
175 // TODO: Fall back to system language if not found, or english.
176 int sel = ui.voiceCombobox->findData(current);
177 if(sel >= 0)
178 ui.voiceCombobox->setCurrentIndex(sel);
148 179
149} 180}
150 181
@@ -157,6 +188,8 @@ void SelectiveInstallWidget::saveSettings(void)
157 RbSettings::setValue(RbSettings::InstallFonts, ui.fontsCheckbox->isChecked()); 188 RbSettings::setValue(RbSettings::InstallFonts, ui.fontsCheckbox->isChecked());
158 RbSettings::setValue(RbSettings::InstallThemes, ui.themesCheckbox->isChecked()); 189 RbSettings::setValue(RbSettings::InstallThemes, ui.themesCheckbox->isChecked());
159 RbSettings::setValue(RbSettings::InstallGamefiles, ui.gamefileCheckbox->isChecked()); 190 RbSettings::setValue(RbSettings::InstallGamefiles, ui.gamefileCheckbox->isChecked());
191 RbSettings::setValue(RbSettings::InstallVoice, ui.voiceCheckbox->isChecked());
192 RbSettings::setValue(RbSettings::VoiceLanguage, ui.voiceCombobox->currentData().toString());
160} 193}
161 194
162 195
@@ -209,7 +242,8 @@ void SelectiveInstallWidget::continueInstall(bool error)
209 case 3: installFonts(); break; 242 case 3: installFonts(); break;
210 case 4: installThemes(); break; 243 case 4: installThemes(); break;
211 case 5: installGamefiles(); break; 244 case 5: installGamefiles(); break;
212 case 6: installBootloaderPost(); break; 245 case 6: installVoicefile(); break;
246 case 7: installBootloaderPost(); break;
213 default: break; 247 default: break;
214 } 248 }
215 249
@@ -381,15 +415,14 @@ void SelectiveInstallWidget::installRockbox(void)
381 LOG_INFO() << "installing Rockbox"; 415 LOG_INFO() << "installing Rockbox";
382 QString url; 416 QString url;
383 417
384 QString selected = ui.selectedVersion->itemData(ui.selectedVersion->currentIndex()).toString(); 418 RbSettings::setValue(RbSettings::Build, m_buildtype);
385 RbSettings::setValue(RbSettings::Build, selected);
386 RbSettings::sync(); 419 RbSettings::sync();
387 420
388 if(selected == "release") url = ServerInfo::instance()->platformValue( 421 if(m_buildtype == "release") url = ServerInfo::instance()->platformValue(
389 ServerInfo::CurReleaseUrl, m_target).toString(); 422 ServerInfo::CurReleaseUrl, m_target).toString();
390 else if(selected == "development") url = ServerInfo::instance()->platformValue( 423 else if(m_buildtype == "development") url = ServerInfo::instance()->platformValue(
391 ServerInfo::CurDevelUrl, m_target).toString(); 424 ServerInfo::CurDevelUrl, m_target).toString();
392 else if(selected == "rc") url = ServerInfo::instance()->platformValue( 425 else if(m_buildtype == "rc") url = ServerInfo::instance()->platformValue(
393 ServerInfo::RelCandidateUrl, m_target).toString(); 426 ServerInfo::RelCandidateUrl, m_target).toString();
394 427
395 //! install build 428 //! install build
@@ -399,7 +432,7 @@ void SelectiveInstallWidget::installRockbox(void)
399 m_zipinstaller->setLogSection("Rockbox (Base)"); 432 m_zipinstaller->setLogSection("Rockbox (Base)");
400 if(!RbSettings::value(RbSettings::CacheDisabled).toBool()) 433 if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
401 m_zipinstaller->setCache(true); 434 m_zipinstaller->setCache(true);
402 m_zipinstaller->setLogVersion(m_versions[selected]); 435 m_zipinstaller->setLogVersion(m_versions[m_buildtype]);
403 m_zipinstaller->setMountPoint(m_mountpoint); 436 m_zipinstaller->setMountPoint(m_mountpoint);
404 437
405 connect(m_zipinstaller, SIGNAL(done(bool)), this, SLOT(continueInstall(bool))); 438 connect(m_zipinstaller, SIGNAL(done(bool)), this, SLOT(continueInstall(bool)));
@@ -422,25 +455,71 @@ void SelectiveInstallWidget::installFonts(void)
422 if(ui.fontsCheckbox->isChecked()) { 455 if(ui.fontsCheckbox->isChecked()) {
423 LOG_INFO() << "installing Fonts"; 456 LOG_INFO() << "installing Fonts";
424 457
458 RockboxInfo installInfo(m_mountpoint);
459 QString fontsurl;
460 QString logversion;
461 QString relversion = installInfo.release();
462 if(relversion.isEmpty()) {
463 // release is empty for non-release versions (i.e. daily / current)
464 fontsurl = SystemInfo::value(SystemInfo::FontUrl, SystemInfo::BuildDaily).toString();
465 }
466 else {
467 fontsurl = SystemInfo::value(SystemInfo::FontUrl, SystemInfo::BuildRelease).toString();
468 logversion = installInfo.release();
469 }
470 fontsurl.replace("%RELEASEVER%", relversion);
471
472 // create new zip installer
473 if(m_zipinstaller != nullptr) m_zipinstaller->deleteLater();
474 m_zipinstaller = new ZipInstaller(this);
475 m_zipinstaller->setUrl(fontsurl);
476 m_zipinstaller->setLogSection("Fonts");
477 m_zipinstaller->setLogVersion(logversion);
478 m_zipinstaller->setMountPoint(m_mountpoint);
479 if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
480 m_zipinstaller->setCache(true);
481
482 connect(m_zipinstaller, SIGNAL(done(bool)), this, SLOT(continueInstall(bool)));
483 connect(m_zipinstaller, SIGNAL(logItem(QString, int)), m_logger, SLOT(addItem(QString, int)));
484 connect(m_zipinstaller, SIGNAL(logProgress(int, int)), m_logger, SLOT(setProgress(int, int)));
485 connect(m_logger, SIGNAL(aborted()), m_zipinstaller, SLOT(abort()));
486 m_zipinstaller->install();
487 }
488 else {
489 LOG_INFO() << "Fonts install disabled.";
490 emit installSkipped(false);
491 }
492}
493
494void SelectiveInstallWidget::installVoicefile(void)
495{
496 if(ui.voiceCheckbox->isChecked()) {
497 LOG_INFO() << "installing Voice file";
498 QString lang = ui.voiceCombobox->currentData().toString();
499
425 RockboxInfo installInfo(m_mountpoint); 500 RockboxInfo installInfo(m_mountpoint);
426 QString fontsurl; 501 QString voiceurl;
427 QString logversion; 502 QString logversion;
428 QString relversion = installInfo.release(); 503 QString relversion = installInfo.release();
429 if(relversion.isEmpty()) { 504 if(m_buildtype == "release") {
430 // release is empty for non-release versions (i.e. daily / current) 505 // release is empty for non-release versions (i.e. daily / current)
431 fontsurl = SystemInfo::value(SystemInfo::FontUrl, SystemInfo::BuildDaily).toString(); 506 voiceurl = SystemInfo::value(SystemInfo::VoiceUrl, SystemInfo::BuildRelease).toString();
432 } 507 }
433 else { 508 else {
434 fontsurl = SystemInfo::value(SystemInfo::FontUrl, SystemInfo::BuildRelease).toString(); 509 voiceurl = SystemInfo::value(SystemInfo::VoiceUrl, SystemInfo::BuildDaily).toString();
435 logversion = installInfo.release(); 510 logversion = installInfo.release();
436 } 511 }
437 fontsurl.replace("%RELEASEVER%", relversion); 512 voiceurl.replace("%RELVERSION%", m_versions[m_buildtype]);
513 voiceurl.replace("%MODEL%", m_target);
514 voiceurl.replace("%LANGUAGE%", lang);
515
516 LOG_INFO() << "voicurl" << voiceurl;
438 517
439 // create new zip installer 518 // create new zip installer
440 if(m_zipinstaller != nullptr) m_zipinstaller->deleteLater(); 519 if(m_zipinstaller != nullptr) m_zipinstaller->deleteLater();
441 m_zipinstaller = new ZipInstaller(this); 520 m_zipinstaller = new ZipInstaller(this);
442 m_zipinstaller->setUrl(fontsurl); 521 m_zipinstaller->setUrl(voiceurl);
443 m_zipinstaller->setLogSection("Fonts"); 522 m_zipinstaller->setLogSection("Voice (" + lang + ")");
444 m_zipinstaller->setLogVersion(logversion); 523 m_zipinstaller->setLogVersion(logversion);
445 m_zipinstaller->setMountPoint(m_mountpoint); 524 m_zipinstaller->setMountPoint(m_mountpoint);
446 if(!RbSettings::value(RbSettings::CacheDisabled).toBool()) 525 if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
@@ -453,7 +532,7 @@ void SelectiveInstallWidget::installFonts(void)
453 m_zipinstaller->install(); 532 m_zipinstaller->install();
454 } 533 }
455 else { 534 else {
456 LOG_INFO() << "Fonts install disabled."; 535 LOG_INFO() << "Voice install disabled.";
457 emit installSkipped(false); 536 emit installSkipped(false);
458 } 537 }
459} 538}
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.h b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
index 799829e066..ac07e24ab8 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.h
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
@@ -41,6 +41,7 @@ class SelectiveInstallWidget : public QWidget
41 void installBootloader(void); 41 void installBootloader(void);
42 void installRockbox(void); 42 void installRockbox(void);
43 void installFonts(void); 43 void installFonts(void);
44 void installVoicefile(void);
44 void installThemes(void); 45 void installThemes(void);
45 void installGamefiles(void); 46 void installGamefiles(void);
46 void installBootloaderPost(void); 47 void installBootloaderPost(void);
@@ -62,6 +63,7 @@ class SelectiveInstallWidget : public QWidget
62 ZipInstaller *m_zipinstaller; 63 ZipInstaller *m_zipinstaller;
63 QMap<QString, QString> m_versions; 64 QMap<QString, QString> m_versions;
64 ThemesInstallWindow *m_themesinstaller; 65 ThemesInstallWindow *m_themesinstaller;
66 QString m_buildtype;
65}; 67};
66 68
67#endif 69#endif
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidgetfrm.ui b/rbutil/rbutilqt/gui/selectiveinstallwidgetfrm.ui
index 5e7fe54ffe..a5bb023f2e 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidgetfrm.ui
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidgetfrm.ui
@@ -7,7 +7,7 @@
7 <x>0</x> 7 <x>0</x>
8 <y>0</y> 8 <y>0</y>
9 <width>663</width> 9 <width>663</width>
10 <height>369</height> 10 <height>399</height>
11 </rect> 11 </rect>
12 </property> 12 </property>
13 <property name="sizePolicy"> 13 <property name="sizePolicy">
@@ -54,22 +54,22 @@
54 <string>Rockbox components to install</string> 54 <string>Rockbox components to install</string>
55 </property> 55 </property>
56 <layout class="QGridLayout" name="gridLayout_2"> 56 <layout class="QGridLayout" name="gridLayout_2">
57 <item row="0" column="0"> 57 <item row="1" column="0">
58 <widget class="QCheckBox" name="bootloaderCheckbox"> 58 <widget class="QCheckBox" name="rockboxCheckbox">
59 <property name="text"> 59 <property name="text">
60 <string>&amp;Bootloader</string> 60 <string>&amp;Rockbox</string>
61 </property> 61 </property>
62 <property name="icon"> 62 <property name="icon">
63 <iconset resource="../rbutilqt.qrc"> 63 <iconset resource="../rbutilqt.qrc">
64 <normaloff>:/icons/preferences-system.svg</normaloff>:/icons/preferences-system.svg</iconset> 64 <normaloff>:/icons/multimedia-player.svg</normaloff>:/icons/multimedia-player.svg</iconset>
65 </property> 65 </property>
66 <property name="checked"> 66 <property name="checked">
67 <bool>true</bool> 67 <bool>true</bool>
68 </property> 68 </property>
69 </widget> 69 </widget>
70 </item> 70 </item>
71 <item row="1" column="1"> 71 <item row="0" column="1">
72 <widget class="QLabel" name="rockboxLabel"> 72 <widget class="QLabel" name="bootloaderLabel">
73 <property name="sizePolicy"> 73 <property name="sizePolicy">
74 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> 74 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
75 <horstretch>0</horstretch> 75 <horstretch>0</horstretch>
@@ -77,13 +77,51 @@
77 </sizepolicy> 77 </sizepolicy>
78 </property> 78 </property>
79 <property name="text"> 79 <property name="text">
80 <string>The main Rockbox firmware.</string> 80 <string>The bootloader is required for starting Rockbox. Only necessary for first time install.</string>
81 </property> 81 </property>
82 <property name="wordWrap"> 82 <property name="wordWrap">
83 <bool>true</bool> 83 <bool>true</bool>
84 </property> 84 </property>
85 </widget> 85 </widget>
86 </item> 86 </item>
87 <item row="3" column="0">
88 <widget class="QCheckBox" name="themesCheckbox">
89 <property name="text">
90 <string>Themes</string>
91 </property>
92 <property name="icon">
93 <iconset resource="../rbutilqt.qrc">
94 <normaloff>:/icons/preferences-desktop-theme.svg</normaloff>:/icons/preferences-desktop-theme.svg</iconset>
95 </property>
96 </widget>
97 </item>
98 <item row="3" column="3">
99 <widget class="QPushButton" name="themesCustomize">
100 <property name="text">
101 <string>Customize</string>
102 </property>
103 <property name="icon">
104 <iconset resource="../rbutilqt.qrc">
105 <normaloff>:/icons/preferences-system.svg</normaloff>:/icons/preferences-system.svg</iconset>
106 </property>
107 </widget>
108 </item>
109 <item row="1" column="2">
110 <spacer name="horizontalSpacer">
111 <property name="orientation">
112 <enum>Qt::Horizontal</enum>
113 </property>
114 <property name="sizeType">
115 <enum>QSizePolicy::Minimum</enum>
116 </property>
117 <property name="sizeHint" stdset="0">
118 <size>
119 <width>1</width>
120 <height>1</height>
121 </size>
122 </property>
123 </spacer>
124 </item>
87 <item row="2" column="0"> 125 <item row="2" column="0">
88 <widget class="QCheckBox" name="fontsCheckbox"> 126 <widget class="QCheckBox" name="fontsCheckbox">
89 <property name="text"> 127 <property name="text">
@@ -98,22 +136,19 @@
98 </property> 136 </property>
99 </widget> 137 </widget>
100 </item> 138 </item>
101 <item row="1" column="0"> 139 <item row="6" column="0">
102 <widget class="QCheckBox" name="rockboxCheckbox"> 140 <widget class="QCheckBox" name="gamefileCheckbox">
103 <property name="text"> 141 <property name="text">
104 <string>&amp;Rockbox</string> 142 <string>Game Files</string>
105 </property> 143 </property>
106 <property name="icon"> 144 <property name="icon">
107 <iconset resource="../rbutilqt.qrc"> 145 <iconset resource="../rbutilqt.qrc">
108 <normaloff>:/icons/multimedia-player.svg</normaloff>:/icons/multimedia-player.svg</iconset> 146 <normaloff>:/icons/input-gaming.svg</normaloff>:/icons/input-gaming.svg</iconset>
109 </property>
110 <property name="checked">
111 <bool>true</bool>
112 </property> 147 </property>
113 </widget> 148 </widget>
114 </item> 149 </item>
115 <item row="6" column="1"> 150 <item row="3" column="1">
116 <widget class="QLabel" name="gameLabel"> 151 <widget class="QLabel" name="themesLabel">
117 <property name="sizePolicy"> 152 <property name="sizePolicy">
118 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> 153 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
119 <horstretch>0</horstretch> 154 <horstretch>0</horstretch>
@@ -121,7 +156,7 @@
121 </sizepolicy> 156 </sizepolicy>
122 </property> 157 </property>
123 <property name="text"> 158 <property name="text">
124 <string>Some game plugins require additional files.</string> 159 <string>Themes allow adjusting the user interface of Rockbox. Use &quot;Customize&quot; to select themes.</string>
125 </property> 160 </property>
126 <property name="wordWrap"> 161 <property name="wordWrap">
127 <bool>true</bool> 162 <bool>true</bool>
@@ -144,8 +179,8 @@
144 </property> 179 </property>
145 </widget> 180 </widget>
146 </item> 181 </item>
147 <item row="0" column="1"> 182 <item row="6" column="1">
148 <widget class="QLabel" name="bootloaderLabel"> 183 <widget class="QLabel" name="gameLabel">
149 <property name="sizePolicy"> 184 <property name="sizePolicy">
150 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> 185 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
151 <horstretch>0</horstretch> 186 <horstretch>0</horstretch>
@@ -153,77 +188,63 @@
153 </sizepolicy> 188 </sizepolicy>
154 </property> 189 </property>
155 <property name="text"> 190 <property name="text">
156 <string>The bootloader is required for starting Rockbox. Only necessary for first time install.</string> 191 <string>Some game plugins require additional files.</string>
157 </property> 192 </property>
158 <property name="wordWrap"> 193 <property name="wordWrap">
159 <bool>true</bool> 194 <bool>true</bool>
160 </property> 195 </property>
161 </widget> 196 </widget>
162 </item> 197 </item>
163 <item row="6" column="0"> 198 <item row="1" column="1">
164 <widget class="QCheckBox" name="gamefileCheckbox"> 199 <widget class="QLabel" name="rockboxLabel">
200 <property name="sizePolicy">
201 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
202 <horstretch>0</horstretch>
203 <verstretch>0</verstretch>
204 </sizepolicy>
205 </property>
165 <property name="text"> 206 <property name="text">
166 <string>Game Files</string> 207 <string>The main Rockbox firmware.</string>
167 </property> 208 </property>
168 <property name="icon"> 209 <property name="wordWrap">
169 <iconset resource="../rbutilqt.qrc"> 210 <bool>true</bool>
170 <normaloff>:/icons/input-gaming.svg</normaloff>:/icons/input-gaming.svg</iconset>
171 </property> 211 </property>
172 </widget> 212 </widget>
173 </item> 213 </item>
174 <item row="3" column="3"> 214 <item row="0" column="0">
175 <widget class="QPushButton" name="themesCustomize"> 215 <widget class="QCheckBox" name="bootloaderCheckbox">
176 <property name="text"> 216 <property name="text">
177 <string>Customize</string> 217 <string>&amp;Bootloader</string>
178 </property> 218 </property>
179 <property name="icon"> 219 <property name="icon">
180 <iconset resource="../rbutilqt.qrc"> 220 <iconset resource="../rbutilqt.qrc">
181 <normaloff>:/icons/preferences-system.svg</normaloff>:/icons/preferences-system.svg</iconset> 221 <normaloff>:/icons/preferences-system.svg</normaloff>:/icons/preferences-system.svg</iconset>
182 </property> 222 </property>
223 <property name="checked">
224 <bool>true</bool>
225 </property>
183 </widget> 226 </widget>
184 </item> 227 </item>
185 <item row="3" column="0"> 228 <item row="7" column="0">
186 <widget class="QCheckBox" name="themesCheckbox"> 229 <widget class="QCheckBox" name="voiceCheckbox">
187 <property name="text"> 230 <property name="text">
188 <string>Themes</string> 231 <string>&amp;Voice File</string>
189 </property> 232 </property>
190 <property name="icon"> 233 <property name="icon">
191 <iconset resource="../rbutilqt.qrc"> 234 <iconset resource="../rbutilqt.qrc">
192 <normaloff>:/icons/preferences-desktop-theme.svg</normaloff>:/icons/preferences-desktop-theme.svg</iconset> 235 <normaloff>:/icons/audio-volume-high.svg</normaloff>:/icons/audio-volume-high.svg</iconset>
193 </property> 236 </property>
194 </widget> 237 </widget>
195 </item> 238 </item>
196 <item row="3" column="1"> 239 <item row="7" column="1">
197 <widget class="QLabel" name="themesLabel"> 240 <widget class="QLabel" name="voiceLabel">
198 <property name="sizePolicy">
199 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
200 <horstretch>0</horstretch>
201 <verstretch>0</verstretch>
202 </sizepolicy>
203 </property>
204 <property name="text"> 241 <property name="text">
205 <string>Themes allow adjusting the user interface of Rockbox. Use &quot;Customize&quot; to select themes.</string> 242 <string>Install prerendered voice file.</string>
206 </property>
207 <property name="wordWrap">
208 <bool>true</bool>
209 </property> 243 </property>
210 </widget> 244 </widget>
211 </item> 245 </item>
212 <item row="1" column="2"> 246 <item row="7" column="3">
213 <spacer name="horizontalSpacer"> 247 <widget class="QComboBox" name="voiceCombobox"/>
214 <property name="orientation">
215 <enum>Qt::Horizontal</enum>
216 </property>
217 <property name="sizeType">
218 <enum>QSizePolicy::Minimum</enum>
219 </property>
220 <property name="sizeHint" stdset="0">
221 <size>
222 <width>1</width>
223 <height>1</height>
224 </size>
225 </property>
226 </spacer>
227 </item> 248 </item>
228 </layout> 249 </layout>
229 </widget> 250 </widget>
diff --git a/rbutil/rbutilqt/rbutil.ini b/rbutil/rbutilqt/rbutil.ini
index e0d60e797e..f680a15fe2 100644
--- a/rbutil/rbutilqt/rbutil.ini
+++ b/rbutil/rbutilqt/rbutil.ini
@@ -22,7 +22,7 @@ download_url=http://download.rockbox.org/bootloader
22 22
23[release] 23[release]
24build_url=https://download.rockbox.org/release/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip 24build_url=https://download.rockbox.org/release/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip
25voice_url=https://download.rockbox.org/release/%RELVERSION%/%MODEL%-%RELVERSION%-english.zip 25voice_url=https://download.rockbox.org/release/%RELVERSION%/%MODEL%-%RELVERSION%-%LANGUAGE%.zip
26font_url=https://download.rockbox.org/release/%RELEASEVER%/rockbox-fonts-%RELEASEVER%.zip 26font_url=https://download.rockbox.org/release/%RELEASEVER%/rockbox-fonts-%RELEASEVER%.zip
27manual_url=https://download.rockbox.org/release/%RELEASEVER%/rockbox-%MODEL%%FORMAT% 27manual_url=https://download.rockbox.org/release/%RELEASEVER%/rockbox-%MODEL%%FORMAT%
28 28
@@ -34,14 +34,15 @@ manual_url=https://download.rockbox.org/release-candidate/%RELEASEVER%/rockbox-%
34 34
35[development] 35[development]
36build_url=http://build.rockbox.org/data/rockbox-%MODEL%.zip 36build_url=http://build.rockbox.org/data/rockbox-%MODEL%.zip
37voice_url=https://download.rockbox.org/release/%RELVERSION%/%MODEL%-%RELVERSION%-english.zip 37; we don't have voices for dev builds.
38voice_url=https://download.rockbox.org/daily/voices/%MODEL%-%LANGUAGE%.zip
38font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip 39font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip
39; manual is only built daily, use that one instead. 40; manual is only built daily, use that one instead.
40manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT% 41manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT%
41 42
42[daily] 43[daily]
43build_url=https://download.rockbox.org/daily/%MODEL%/rockbox-%MODEL%.zip 44build_url=https://download.rockbox.org/daily/%MODEL%/rockbox-%MODEL%.zip
44voice_url=https://download.rockbox.org/daily/voices/%MODEL%-%VERSION%-%LANGUAGE%.zip 45voice_url=https://download.rockbox.org/daily/voices/%MODEL%-%LANGUAGE%.zip
45font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip 46font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip
46manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT% 47manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT%
47 48
diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp
index 597509cc78..d996eddfe1 100644
--- a/rbutil/rbutilqt/rbutilqt.cpp
+++ b/rbutil/rbutilqt/rbutilqt.cpp
@@ -496,6 +496,7 @@ void RbUtilQt::installVoice()
496 // replace placeholder in voice url 496 // replace placeholder in voice url
497 voiceurl.replace("%MODEL%", model); 497 voiceurl.replace("%MODEL%", model);
498 voiceurl.replace("%RELVERSION%", relversion); 498 voiceurl.replace("%RELVERSION%", relversion);
499 voiceurl.replace("%LANGUAGE%", "english");
499 500
500 LOG_INFO() << "voicefile URL:" << voiceurl; 501 LOG_INFO() << "voicefile URL:" << voiceurl;
501 502