2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-06-30 14:13:27 +00:00

Add Continuous track, disable zip downloading

Opens update links in browser until new auto-update is implemented
This commit is contained in:
Luke Street 2021-03-19 00:31:34 -04:00
parent 7cc9abfac8
commit 32ba74db08
6 changed files with 361 additions and 336 deletions

View File

@ -128,21 +128,21 @@ URDEVersion::URDEVersion(const QString& filename) {
} }
} }
if (state == architecture) { if (state == architecture) {
state = vectorISA; state = extra;
Architecture archValue = StringToArchitecture(list[i]); Architecture archValue = StringToArchitecture(list[i]);
if (archValue != Architecture::Invalid) { if (archValue != Architecture::Invalid) {
m_architecture = archValue; m_architecture = archValue;
continue; continue;
} }
} }
if (state == vectorISA) { // if (state == vectorISA) {
state = extra; // state = extra;
VectorISA isa = StringToVectorISA(list[i]); // VectorISA isa = StringToVectorISA(list[i]);
if (isa != VectorISA::Invalid) { // if (isa != VectorISA::Invalid) {
m_vectorISA = isa; // m_vectorISA = isa;
continue; // continue;
} // }
} // }
m_extra += QLatin1Char('-') + list[i]; m_extra += QLatin1Char('-') + list[i];
} }
} }
@ -153,13 +153,11 @@ QString URDEVersion::fileString(bool withExtension) const {
} }
if (withExtension && !m_extension.isEmpty()) { if (withExtension && !m_extension.isEmpty()) {
return QStringLiteral("urde-%1-%2-%3-%4%5%6") return QStringLiteral("urde-%1-%2-%3%4%5")
.arg(m_version, PlatformToString(m_platform), ArchitectureToString(m_architecture), .arg(m_version, PlatformToString(m_platform), ArchitectureToString(m_architecture), m_extra, m_extension);
VectorISAToString(m_vectorISA), m_extra, m_extension);
} else { } else {
return QStringLiteral("urde-%1-%2-%3-%4%5") return QStringLiteral("urde-%1-%2-%3%4")
.arg(m_version, PlatformToString(m_platform), ArchitectureToString(m_architecture), .arg(m_version, PlatformToString(m_platform), ArchitectureToString(m_architecture), m_extra);
VectorISAToString(m_vectorISA), m_extra);
} }
} }

View File

@ -2,6 +2,8 @@
#include "Common.hpp" #include "Common.hpp"
#include <quazip.h> #include <quazip.h>
#include <QDesktopServices>
#define KEY_PINNING 0 #define KEY_PINNING 0
#if KEY_PINNING #if KEY_PINNING
@ -77,6 +79,7 @@ void DownloadManager::fetchBinary(const QString& str, const QString& outPath) {
const QString track = QSettings().value(QStringLiteral("update_track")).toString(); const QString track = QSettings().value(QStringLiteral("update_track")).toString();
const auto url = QUrl(QStringLiteral("%1%2/%3/%4").arg(Domain, track, CurPlatformString, str)); const auto url = QUrl(QStringLiteral("%1%2/%3/%4").arg(Domain, track, CurPlatformString, str));
#if PLATFORM_ZIP_DOWNLOAD
m_binaryInProgress = m_netManager.get(QNetworkRequest(url)); m_binaryInProgress = m_netManager.get(QNetworkRequest(url));
connect(m_binaryInProgress, &QNetworkReply::finished, this, &DownloadManager::binaryFinished); connect(m_binaryInProgress, &QNetworkReply::finished, this, &DownloadManager::binaryFinished);
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
@ -92,6 +95,9 @@ void DownloadManager::fetchBinary(const QString& str, const QString& outPath) {
m_progBar->setEnabled(true); m_progBar->setEnabled(true);
m_progBar->setValue(0); m_progBar->setValue(0);
} }
#else
QDesktopServices::openUrl(url);
#endif
} }
void DownloadManager::indexFinished() { void DownloadManager::indexFinished() {

View File

@ -6,6 +6,12 @@
#include <QProgressBar> #include <QProgressBar>
#include <QLabel> #include <QLabel>
//#if _WIN32
//#define PLATFORM_ZIP_DOWNLOAD 1
//#else
#define PLATFORM_ZIP_DOWNLOAD 0
//#endif
class QuaZip; class QuaZip;
class DownloadManager : public QObject { class DownloadManager : public QObject {

View File

@ -59,7 +59,7 @@ static void KillProcessTree(QProcess& proc) {
} }
#endif #endif
const QStringList MainWindow::skUpdateTracks = {QStringLiteral("stable"), QStringLiteral("dev")}; const QStringList MainWindow::skUpdateTracks = {QStringLiteral("stable"), QStringLiteral("dev"), QStringLiteral("continuous")};
MainWindow::MainWindow(QWidget* parent) MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent) : QMainWindow(parent)
@ -73,7 +73,7 @@ MainWindow::MainWindow(QWidget* parent)
m_settings.setValue(QStringLiteral("urde_arguments"), QStringList{QStringLiteral("--no-shader-warmup")}); m_settings.setValue(QStringLiteral("urde_arguments"), QStringList{QStringLiteral("--no-shader-warmup")});
} }
if (m_settings.value(QStringLiteral("update_track")).isNull()) { if (m_settings.value(QStringLiteral("update_track")).isNull()) {
m_settings.setValue(QStringLiteral("update_track"), QStringLiteral("stable")); m_settings.setValue(QStringLiteral("update_track"), QStringLiteral("dev"));
} }
m_ui->setupUi(this); m_ui->setupUi(this);
@ -108,16 +108,17 @@ MainWindow::MainWindow(QWidget* parent)
} }
}); });
m_updateURDEButton = new QPushButton(tr("Update URDE"), m_ui->centralwidget); // m_updateURDEButton = new QPushButton(tr("Update URDE"), m_ui->centralwidget);
m_ui->gridLayout->addWidget(m_updateURDEButton, 2, 3, 1, 1); // m_ui->gridLayout->addWidget(m_updateURDEButton, 2, 3, 1, 1);
m_updateURDEButton->hide(); // m_updateURDEButton->hide();
QPalette pal = m_updateURDEButton->palette(); // QPalette pal = m_updateURDEButton->palette();
pal.setColor(QPalette::Button, QColor(53, 53, 72)); // pal.setColor(QPalette::Button, QColor(53, 53, 72));
m_updateURDEButton->setPalette(pal); // m_updateURDEButton->setPalette(pal);
connect(m_updateURDEButton, &QPushButton::clicked, this, &MainWindow::onUpdateURDEPressed); // connect(m_updateURDEButton, &QPushButton::clicked, this, &MainWindow::onUpdateURDEPressed);
qDebug() << "Stored track " << m_settings.value(QStringLiteral("update_track")); qDebug() << "Stored track " << m_settings.value(QStringLiteral("update_track"));
const int index = skUpdateTracks.indexOf(m_settings.value(QStringLiteral("update_track")).toString()); const int index = skUpdateTracks.indexOf(m_settings.value(QStringLiteral("update_track")).toString());
m_ui->devTrackWarning->setVisible(index == 1); m_ui->devTrackWarning->setVisible(index == 1);
m_ui->continuousTrackWarning->setVisible(index == 2);
m_ui->updateTrackComboBox->setCurrentIndex(index); m_ui->updateTrackComboBox->setCurrentIndex(index);
connect(m_ui->updateTrackComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, connect(m_ui->updateTrackComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this,
&MainWindow::onUpdateTrackChanged); &MainWindow::onUpdateTrackChanged);
@ -126,6 +127,9 @@ MainWindow::MainWindow(QWidget* parent)
std::bind(&MainWindow::onIndexDownloaded, this, std::placeholders::_1), std::bind(&MainWindow::onIndexDownloaded, this, std::placeholders::_1),
std::bind(&MainWindow::onBinaryDownloaded, this, std::placeholders::_1), std::bind(&MainWindow::onBinaryDownloaded, this, std::placeholders::_1),
std::bind(&MainWindow::onBinaryFailed, this)); std::bind(&MainWindow::onBinaryFailed, this));
#if !PLATFORM_ZIP_DOWNLOAD
m_ui->downloadProgressBar->hide();
#endif
initOptions(); initOptions();
initSlots(); initSlots();
@ -282,17 +286,19 @@ void MainWindow::onIndexDownloaded(const QStringList& index) {
} }
void MainWindow::onDownloadPressed() { void MainWindow::onDownloadPressed() {
m_updateURDEButton->hide(); // m_updateURDEButton->hide();
QString filename = m_ui->binaryComboBox->currentData().value<URDEVersion>().fileString(true); QString filename = m_ui->binaryComboBox->currentData().value<URDEVersion>().fileString(true);
#if PLATFORM_ZIP_DOWNLOAD
disableOperations(); disableOperations();
m_ui->downloadButton->setEnabled(false); m_ui->downloadButton->setEnabled(false);
#endif
m_dlManager.fetchBinary(filename, m_path + QLatin1Char{'/'} + filename); m_dlManager.fetchBinary(filename, m_path + QLatin1Char{'/'} + filename);
} }
void MainWindow::onUpdateURDEPressed() { //void MainWindow::onUpdateURDEPressed() {
m_ui->heclTabs->setCurrentIndex(2); // m_ui->heclTabs->setCurrentIndex(2);
onDownloadPressed(); // onDownloadPressed();
} //}
void MainWindow::onBinaryDownloaded(QuaZip& file) { void MainWindow::onBinaryDownloaded(QuaZip& file) {
const bool err = !ExtractZip::extractDir(file, m_path); const bool err = !ExtractZip::extractDir(file, m_path);
@ -410,7 +416,7 @@ static bool GetDLPackage(const QString& path, QString& dlPackage) {
} }
bool MainWindow::checkDownloadedBinary() { bool MainWindow::checkDownloadedBinary() {
m_updateURDEButton->hide(); // m_updateURDEButton->hide();
m_urdePath = QString(); m_urdePath = QString();
m_heclPath = QString(); m_heclPath = QString();
@ -422,24 +428,20 @@ bool MainWindow::checkDownloadedBinary() {
return false; return false;
} }
#if __APPLE__ const QString dir = QApplication::instance()->applicationDirPath();
QString urdePath = m_path + QStringLiteral("/URDE.app/Contents/MacOS/urde"); #if _WIN32
QString heclPath = m_path + QStringLiteral("/URDE.app/Contents/MacOS/hecl"); QString urdePath = dir + QStringLiteral("/urde.exe");
QString visigenPath = m_path + QStringLiteral("/URDE.app/Contents/MacOS/visigen"); QString heclPath = dir + QStringLiteral("/hecl.exe");
#elif _WIN32 QString visigenPath = dir + QStringLiteral("/visigen.exe");
QString urdePath = m_path + QStringLiteral("/urde.exe");
QString heclPath = m_path + QStringLiteral("/hecl.exe");
QString visigenPath = m_path + QStringLiteral("/visigen.exe");
#else
QString urdePath = m_path + QStringLiteral("/urde");
QString heclPath = m_path + QStringLiteral("/hecl");
QString visigenPath = m_path + QStringLiteral("/visigen");
if (!QFileInfo::exists(urdePath) || !QFileInfo::exists(heclPath) || !QFileInfo::exists(visigenPath)) { if (!QFileInfo::exists(urdePath) || !QFileInfo::exists(heclPath) || !QFileInfo::exists(visigenPath)) {
const QString dir = QApplication::instance()->applicationDirPath(); urdePath = m_path + QStringLiteral("/urde.exe");
urdePath = dir + QStringLiteral("/urde"); heclPath = m_path + QStringLiteral("/hecl.exe");
heclPath = dir + QStringLiteral("/hecl"); visigenPath = m_path + QStringLiteral("/visigen.exe");
visigenPath = dir + QStringLiteral("/visigen");
} }
#else
QString urdePath = dir + QStringLiteral("/urde");
QString heclPath = dir + QStringLiteral("/hecl");
QString visigenPath = dir + QStringLiteral("/visigen");
#endif #endif
urdePath = QFileInfo(urdePath).absoluteFilePath(); urdePath = QFileInfo(urdePath).absoluteFilePath();
heclPath = QFileInfo(heclPath).absoluteFilePath(); heclPath = QFileInfo(heclPath).absoluteFilePath();
@ -451,9 +453,9 @@ bool MainWindow::checkDownloadedBinary() {
if (!urdeDlPackage.isEmpty() && urdeDlPackage == heclDlPackage && urdeDlPackage == visigenDlPackage) { if (!urdeDlPackage.isEmpty() && urdeDlPackage == heclDlPackage && urdeDlPackage == visigenDlPackage) {
URDEVersion v(urdeDlPackage); URDEVersion v(urdeDlPackage);
m_ui->currentBinaryLabel->setText(v.fileString(false)); m_ui->currentBinaryLabel->setText(v.fileString(false));
if (m_recommendedVersion.isValid() && v.isValid() && m_recommendedVersion.getVersion() > v.getVersion()) { // if (m_recommendedVersion.isValid() && v.isValid() && m_recommendedVersion.getVersion() > v.getVersion()) {
m_updateURDEButton->show(); // m_updateURDEButton->show();
} // }
} else { } else {
m_ui->currentBinaryLabel->setText(tr("unknown -- re-download recommended")); m_ui->currentBinaryLabel->setText(tr("unknown -- re-download recommended"));
} }
@ -605,6 +607,7 @@ void MainWindow::onUpdateTrackChanged(int index) {
m_settings.setValue(QStringLiteral("update_track"), skUpdateTracks[index]); m_settings.setValue(QStringLiteral("update_track"), skUpdateTracks[index]);
m_dlManager.fetchIndex(); m_dlManager.fetchIndex();
m_ui->devTrackWarning->setVisible(index == 1); m_ui->devTrackWarning->setVisible(index == 1);
m_ui->continuousTrackWarning->setVisible(index == 2);
} }
void MainWindow::initOptions() { void MainWindow::initOptions() {

View File

@ -40,7 +40,7 @@ class MainWindow : public QMainWindow {
QStringList m_warpSettings; QStringList m_warpSettings;
QSettings m_settings; QSettings m_settings;
URDEVersion m_recommendedVersion; URDEVersion m_recommendedVersion;
QPushButton* m_updateURDEButton; // QPushButton* m_updateURDEButton;
bool m_inContinueNote = false; bool m_inContinueNote = false;
QStringListModel m_launchOptionsModel; QStringListModel m_launchOptionsModel;
@ -61,7 +61,7 @@ private slots:
void doHECLTerminate(); void doHECLTerminate();
void onReturnPressed(); void onReturnPressed();
void onDownloadPressed(); void onDownloadPressed();
void onUpdateURDEPressed(); // void onUpdateURDEPressed();
void onUpdateTrackChanged(int index); void onUpdateTrackChanged(int index);
private: private:

View File

@ -21,61 +21,6 @@
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Extract Directory:</string>
</property>
<property name="buddy">
<cstring>pathEdit</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="pathEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeIncrement">
<size>
<width>1</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="browseBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QTabWidget" name="heclTabs"> <widget class="QTabWidget" name="heclTabs">
<property name="currentIndex"> <property name="currentIndex">
@ -299,15 +244,15 @@
<item row="0" column="0" rowspan="4"> <item row="0" column="0" rowspan="4">
<widget class="QToolBox" name="toolBox"> <widget class="QToolBox" name="toolBox">
<property name="currentIndex"> <property name="currentIndex">
<number>3</number> <number>2</number>
</property> </property>
<widget class="QWidget" name="graphicsGroup"> <widget class="QWidget" name="graphicsGroup">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>225</width> <width>236</width>
<height>186</height> <height>198</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -450,8 +395,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>166</width> <width>174</width>
<height>105</height> <height>111</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -499,8 +444,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>164</width> <width>450</width>
<height>47</height> <height>633</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -510,7 +455,7 @@
<item> <item>
<widget class="QCheckBox" name="variableDtBox"> <widget class="QCheckBox" name="variableDtBox">
<property name="text"> <property name="text">
<string>Variable Delta Time</string> <string>Variable Delta Time (broken)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -535,7 +480,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>450</width> <width>450</width>
<height>649</height> <height>633</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -677,223 +622,6 @@
<string>&amp;System Check</string> <string>&amp;System Check</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="8" column="1">
<widget class="QLabel" name="devTrackWarning">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;Development Track selected!&lt;br/&gt;Development builds are considered unstable and may cause crashes. &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="ErrorLabel" name="downloadErrorLabel">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>47</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>47</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="96">
<red>164</red>
<green>166</green>
<blue>168</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="SysReqTableView" name="sysReqTable">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>300</height>
</size>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>68</red>
<green>68</green>
<blue>68</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QProgressBar" name="downloadProgressBar">
<property name="enabled">
<bool>false</bool>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<layout class="QFormLayout" name="formLayout">
<property name="horizontalSpacing">
<number>12</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Downloaded URDE Binary:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="currentBinaryLabel">
<property name="text">
<string>none</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Recommended URDE Binary:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="recommendedBinaryLabel">
<property name="text">
<string>fetching...</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Update Track:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="updateTrackComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Stable</string>
</property>
</item>
<item>
<property name="text">
<string>Development</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="3" column="1"> <item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
@ -976,7 +704,236 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="7" column="1"> <item row="0" column="1">
<widget class="SysReqTableView" name="sysReqTable">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>300</height>
</size>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>68</red>
<green>68</green>
<blue>68</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<layout class="QFormLayout" name="formLayout">
<property name="horizontalSpacing">
<number>12</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Downloaded URDE version:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="currentBinaryLabel">
<property name="text">
<string>none</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Recommended URDE version:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="recommendedBinaryLabel">
<property name="text">
<string>fetching...</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Update track:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="updateTrackComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Stable</string>
</property>
</item>
<item>
<property name="text">
<string>Development</string>
</property>
</item>
<item>
<property name="text">
<string>Continuous</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="5" column="1">
<widget class="ErrorLabel" name="downloadErrorLabel">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>47</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>47</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="96">
<red>164</red>
<green>166</green>
<blue>168</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLabel" name="continuousTrackWarning">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;Continuous track selected!&lt;br/&gt;Continuous builds are built after every commit &lt;br/&gt;and have &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;no&lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt; guarantee of working at all.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="1">
<widget class="QProgressBar" name="downloadProgressBar">
<property name="enabled">
<bool>false</bool>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="devTrackWarning">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; color:#1a5fb4;&quot;&gt;Development track selected!&lt;br/&gt;Development builds are considered unstable and may cause crashes.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="1">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -1247,7 +1204,7 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:10.5pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:600;&quot;&gt;About HECL Frontend&lt;/span&gt;&lt;/p&gt; &lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:600;&quot;&gt;About HECL Frontend&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt;&lt;br /&gt;The HECL frontend UI is designed and built by &lt;/span&gt;&lt;a href=&quot;https://axiodl.com&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; text-decoration: underline; color:#007af4;&quot;&gt;Axiomatic Data Laboratories&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt; Copyright 2020&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:600;&quot;&gt;Authors:&lt;/span&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt;&lt;br /&gt;Phillip &amp;quot;Antidote&amp;quot; Stephens&lt;br /&gt;Jack &amp;quot;jackoalan&amp;quot; Andersen&lt;br /&gt;Luke &amp;quot;encounter&amp;quot; Street&lt;/span&gt;&lt;/p&gt; &lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt;&lt;br /&gt;The HECL frontend UI is designed and built by &lt;/span&gt;&lt;a href=&quot;https://axiodl.com&quot;&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; text-decoration: underline; color:#007af4;&quot;&gt;Axiomatic Data Laboratories&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt; Copyright 2020&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:600;&quot;&gt;Authors:&lt;/span&gt;&lt;span style=&quot; font-family:'Noto Sans'; font-size:10pt;&quot;&gt;&lt;br /&gt;Phillip &amp;quot;Antidote&amp;quot; Stephens&lt;br /&gt;Jack &amp;quot;jackoalan&amp;quot; Andersen&lt;br /&gt;Luke &amp;quot;encounter&amp;quot; Street&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New'; font-size:10pt;&quot;&gt;The MIT License&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New'; font-size:10pt;&quot;&gt;The MIT License&lt;/span&gt;&lt;/p&gt;
@ -1270,7 +1227,62 @@ p, li { white-space: pre-wrap; }
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="5" column="0" rowspan="3"> <item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Extract Directory:</string>
</property>
<property name="buddy">
<cstring>pathEdit</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="pathEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeIncrement">
<size>
<width>1</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="browseBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0" rowspan="3">
<layout class="QHBoxLayout" name="bottomButtonBox"> <layout class="QHBoxLayout" name="bottomButtonBox">
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
@ -1359,7 +1371,7 @@ p, li { white-space: pre-wrap; }
</layout> </layout>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="alphaVersionLabel">
<property name="text"> <property name="text">
<string>&lt;center&gt;&lt;h1 style=&quot;color:red&quot;&gt;ALPHA VERSION&lt;/h1&gt;&lt;/center&gt;</string> <string>&lt;center&gt;&lt;h1 style=&quot;color:red&quot;&gt;ALPHA VERSION&lt;/h1&gt;&lt;/center&gt;</string>
</property> </property>