diff --git a/hecl-gui/CMakeLists.txt b/hecl-gui/CMakeLists.txt index a375ebb1b..9bce2c97a 100644 --- a/hecl-gui/CMakeLists.txt +++ b/hecl-gui/CMakeLists.txt @@ -27,7 +27,7 @@ list(APPEND PLAT_SRCS mainicon_qt.c) add_executable(hecl-gui WIN32 MACOSX_BUNDLE MainWindow.ui MainWindow.hpp MainWindow.cpp - FileDirDialog.hpp FileDirDialog.cpp + FileDirDialog.hpp SysReqTableView.hpp SysReqTableView.cpp VectorISATableView.hpp VectorISATableView.cpp VectorISATableModel.hpp VectorISATableModelIntel.hpp diff --git a/hecl-gui/Common.cpp b/hecl-gui/Common.cpp index ece4caf35..e25b0b897 100644 --- a/hecl-gui/Common.cpp +++ b/hecl-gui/Common.cpp @@ -1,4 +1,9 @@ #include "Common.hpp" +#include + +#ifndef _WIN32 +#include +#endif #if __APPLE__ const QString CurPlatformString = QStringLiteral("macos"); @@ -25,22 +30,13 @@ QString PlatformToString(Platform plat) } } -#if ZEUS_ARCH_X86_64 -const QString CurArchitectureString = QStringLiteral("x86_64"); -#elif ZEUS_ARCH_X86 -const QString CurArchitectureString = QStringLiteral("x86"); -#elif ZEUS_ARCH_ARM -const QString CurArchitectureString = QStringLiteral("arm"); -#elif ZEUS_ARCH_AARCH64 -const QString CurArchitectureString = QStringLiteral("aarch64"); -#else -#error HECL does not know which architecture to fetch for -#endif +Architecture CurArchitecture = Architecture::Invalid; +QString CurArchitectureString; Platform StringToPlatform(const QString& str) { for (int i = 1; i < int(Platform::MAXPlatform); ++i) - if (str.contains(PlatformToString(Platform(i)), Qt::CaseInsensitive)) + if (!str.compare(PlatformToString(Platform(i)), Qt::CaseInsensitive)) return Platform(i); return Platform::Invalid; } @@ -65,7 +61,7 @@ QString ArchitectureToString(Architecture arch) Architecture StringToArchitecture(const QString& str) { for (int i = 1; i < int(Architecture::MAXArchitecture); ++i) - if (str.contains(ArchitectureToString(Architecture(i)), Qt::CaseInsensitive)) + if (!str.compare(ArchitectureToString(Architecture(i)), Qt::CaseInsensitive)) return Architecture(i); return Architecture::Invalid; } @@ -96,7 +92,62 @@ QString VectorISAToString(VectorISA visa) VectorISA StringToVectorISA(const QString& str) { for (int i = 1; i < int(VectorISA::MAXVectorISA); ++i) - if (str.contains(VectorISAToString(VectorISA(i)), Qt::CaseInsensitive)) + if (!str.compare(VectorISAToString(VectorISA(i)), Qt::CaseInsensitive)) return VectorISA(i); return VectorISA::Invalid; } + +URDEVersion::URDEVersion(const QString& filename) +{ + int idx; + QString useFilename = filename; + if ((idx = filename.indexOf('.')) >= 0) + { + m_extension = QString(filename).remove(0, idx); + useFilename.truncate(idx); + } + QStringList list = useFilename.split('-'); + if (list.size() >= 2) + m_version = list[1].toInt(); + if (list.size() >= 3) + m_platform = StringToPlatform(list[2]); + if (list.size() >= 4) + m_architecture = StringToArchitecture(list[3]); + if (list.size() >= 5) + m_vectorISA = StringToVectorISA(list[4]); +} + +QString URDEVersion::fileString(bool withExtension) const +{ + if (m_version < 0) + return {}; + if (withExtension && !m_extension.isEmpty()) + return QString("urde-%1-%2-%3-%4%5").arg(QString::number(m_version), + PlatformToString(m_platform), + ArchitectureToString(m_architecture), + VectorISAToString(m_vectorISA), + m_extension); + else + return QString("urde-%1-%2-%3-%4").arg(QString::number(m_version), + PlatformToString(m_platform), + ArchitectureToString(m_architecture), + VectorISAToString(m_vectorISA)); +} + +void InitializePlatform() +{ +#if ZEUS_ARCH_X86_64 + const_cast(CurArchitecture) = Architecture::X86_64; +#elif ZEUS_ARCH_X86 +#if !defined(__APPLE__) && !defined(_WIN32) + const_cast(CurArchitecture) = + (sysconf(_SC_WORD_BIT) == 64 ? Architecture::X86_64 : Architecture::X86); +#elif _WIN32 + bool isWOW = false; + IsWow64Process(GetCurrentProcess(), &isWOW); + const_cast(CurArchitecture) = + (isWOW ? Architecture::X86_64 : Architecture::X86); +#endif +#endif + const_cast(CurArchitectureString) = ArchitectureToString(CurArchitecture); +} diff --git a/hecl-gui/Common.hpp b/hecl-gui/Common.hpp index 3f70e6b03..f2265ab10 100644 --- a/hecl-gui/Common.hpp +++ b/hecl-gui/Common.hpp @@ -2,6 +2,7 @@ #define GUI_COMMON_HPP #include +#include #include "zeus/Math.hpp" enum class Platform @@ -37,17 +38,8 @@ enum class Architecture QString ArchitectureToString(Architecture arch); Architecture StringToArchitecture(const QString& str); -#if ZEUS_ARCH_X86_64 -constexpr Architecture CurArchitecture = Architecture::X86_64; -#elif ZEUS_ARCH_X86 -constexpr Architecture CurArchitecture = Architecture::X86; -#elif ZEUS_ARCH_ARM -constexpr Architecture CurArchitecture = Architecture::ARM; -#elif ZEUS_ARCH_AARCH64 -constexpr Architecture CurArchitecture = Architecture::AARCH64; -#endif - -extern const QString CurArchitectureString; +extern Architecture CurArchitecture; +extern QString CurArchitectureString; enum class VectorISA { @@ -67,11 +59,22 @@ VectorISA StringToVectorISA(const QString& str); class URDEVersion { int m_version = -1; - VectorISA m_vectorISA; + Platform m_platform = CurPlatform; + Architecture m_architecture = CurArchitecture; + VectorISA m_vectorISA = VectorISA::Invalid; + QString m_extension; public: + URDEVersion() = default; explicit URDEVersion(const QString& filename); bool isValid() const { return m_version >= 0; } - + QString fileString(bool withExtension) const; + int getVersion() const { return m_version; } + Platform getPlatform() const { return m_platform; } + Architecture getArchitecture() const { return m_architecture; } + VectorISA getVectorISA() const { return m_vectorISA; } }; +Q_DECLARE_METATYPE(URDEVersion); + +void InitializePlatform(); #endif // GUI_COMMON_HPP diff --git a/hecl-gui/DownloadManager.cpp b/hecl-gui/DownloadManager.cpp index 32b9e736b..bb8c756f5 100644 --- a/hecl-gui/DownloadManager.cpp +++ b/hecl-gui/DownloadManager.cpp @@ -84,14 +84,12 @@ void DownloadManager::indexFinished() QStringList files; - while (true) + while (!m_indexInProgress->atEnd()) { - if (m_indexInProgress->atEnd()) - break; - QByteArray line = m_indexInProgress->readLine(); + QString line = QString::fromUtf8(m_indexInProgress->readLine()).trimmed(); if (line.isEmpty()) continue; - files.push_back(QString::fromUtf8(line).trimmed()); + files.push_back(line); } if (m_indexCompletionHandler) diff --git a/hecl-gui/FileDirDialog.cpp b/hecl-gui/FileDirDialog.cpp deleted file mode 100644 index 92d34ff3e..000000000 --- a/hecl-gui/FileDirDialog.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "FileDirDialog.hpp" -#include -#include -#include -#include -#include -#include - -FileDirDialog::FileDirDialog(QWidget *parent) - : QFileDialog(parent) -{ - m_selectedFiles.clear(); - - this->setOption(QFileDialog::DontUseNativeDialog, true); - this->setFileMode(QFileDialog::Directory); - QList btns = this->findChildren(); - for (int i = 0; i < btns.size(); ++i) - { - QString text = btns[i]->text(); - if (text.toLower().contains("open") || text.toLower().contains("choose")) - { - m_btnOpen = btns[i]; - break; - } - } - - if (!m_btnOpen) - return; - - m_btnOpen->installEventFilter(this); - m_btnOpen->disconnect(SIGNAL(clicked())); - connect(m_btnOpen, SIGNAL(clicked()), this, SLOT(chooseClicked())); - - - m_listView = findChild("listView"); - if (m_listView) { - m_listView->setSelectionMode(QAbstractItemView::ExtendedSelection); - } - - m_treeView = findChild(); - if (m_treeView) - m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); -} - -bool FileDirDialog::eventFilter( QObject* watched, QEvent* event ) -{ - QPushButton *btn = qobject_cast(watched); - if (btn && !btn->isEnabled() && event->type()==QEvent::EnabledChange) - btn->setEnabled(true); - - return QWidget::eventFilter(watched, event); -} - - -void FileDirDialog::chooseClicked() -{ - QModelIndexList indexList = m_listView->selectionModel()->selectedIndexes(); - foreach (QModelIndex index, indexList) - if (index.column( )== 0) - m_selectedFiles.append(this->directory().absolutePath() + "/" + index.data().toString()); - - QDialog::accept(); -} - -QStringList FileDirDialog::selectedFiles() -{ - return m_selectedFiles; -} diff --git a/hecl-gui/FileDirDialog.hpp b/hecl-gui/FileDirDialog.hpp index 962078521..bedcaf8e6 100644 --- a/hecl-gui/FileDirDialog.hpp +++ b/hecl-gui/FileDirDialog.hpp @@ -2,29 +2,12 @@ #define FILEDIRDIALOG_HPP #include -#include -#include -#include - -class QPushButton; -class QTreeView; -class QListView; class FileDirDialog : public QFileDialog { Q_OBJECT -private: - QListView* m_listView = nullptr; - QTreeView* m_treeView = nullptr; - QPushButton* m_btnOpen = nullptr; - QStringList m_selectedFiles; - -public slots: - void chooseClicked(); public: - FileDirDialog(QWidget* parent = nullptr); - QStringList selectedFiles(); - bool eventFilter(QObject* watched, QEvent* event); + FileDirDialog(QWidget* parent = nullptr) : QFileDialog(parent) { setFileMode(QFileDialog::Directory); } }; #endif // FILEDIRDIALOG_HPP diff --git a/hecl-gui/MainWindow.cpp b/hecl-gui/MainWindow.cpp index 33d95d5c2..70f2677e9 100644 --- a/hecl-gui/MainWindow.cpp +++ b/hecl-gui/MainWindow.cpp @@ -12,6 +12,7 @@ MainWindow::MainWindow(QWidget *parent) : m_ui(new Ui::MainWindow) , m_heclProc(this) , m_dlManager(this) + , m_settings("AxioDL", "HECL", this) { m_ui->setupUi(this); m_ui->heclTabs->setCurrentIndex(0); @@ -24,6 +25,16 @@ MainWindow::MainWindow(QWidget *parent) : m_ui->currentBinaryLabel->setFont(mFont); m_ui->recommendedBinaryLabel->setFont(mFont); + m_updateURDEButton = new QPushButton(QStringLiteral("Update URDE"), m_ui->centralwidget); + m_ui->gridLayout->addWidget(m_updateURDEButton, 2, 3, 1, 1); + m_updateURDEButton->hide(); + QPalette pal = m_updateURDEButton->palette(); + pal.setColor(QPalette::Button, QColor(53,53,72)); + m_updateURDEButton->setPalette(pal); + connect(m_updateURDEButton, SIGNAL(clicked()), this, SLOT(onUpdateURDEPressed())); + + setPath(m_settings.value(QStringLiteral("working_dir")).toString()); + m_dlManager.connectWidgets(m_ui->downloadProgressBar, m_ui->downloadErrorLabel, std::bind(&MainWindow::onIndexDownloaded, this, std::placeholders::_1), std::bind(&MainWindow::onBinaryDownloaded, this, std::placeholders::_1)); @@ -557,20 +568,131 @@ void MainWindow::onExtract() void MainWindow::onReturnPressed() { if (sender() == m_ui->pathEdit && !m_ui->pathEdit->text().isEmpty()) - m_path = m_ui->pathEdit->text(); + setPath(m_ui->pathEdit->text()); } void MainWindow::onIndexDownloaded(const QStringList& index) { + int bestVersion = 0; m_ui->binaryComboBox->clear(); for (const QString& str : index) - m_ui->binaryComboBox->addItem(str); + { + URDEVersion version(str); + if (m_ui->sysReqTable->willRun(version)) + bestVersion = m_ui->binaryComboBox->count(); + m_ui->binaryComboBox->addItem(version.fileString(false), QVariant::fromValue(version)); + } + m_ui->binaryComboBox->setCurrentIndex(bestVersion); + m_recommendedVersion = m_ui->binaryComboBox->itemData(bestVersion).value(); + m_ui->recommendedBinaryLabel->setText(m_recommendedVersion.fileString(false)); m_ui->binaryComboBox->setEnabled(true); + + if (!m_path.isEmpty()) + { + checkDownloadedBinary(); + m_ui->downloadButton->setEnabled(true); + } +} + +void MainWindow::onDownloadPressed() +{ + m_updateURDEButton->hide(); + QString filename = m_ui->binaryComboBox->currentData().value().fileString(true); + printf("Downloading %s\n", filename.toUtf8().data()); + m_ui->launchBtn->setEnabled(false); + m_dlManager.fetchBinary(filename, m_path + '/' + filename); +} + +void MainWindow::onUpdateURDEPressed() +{ + m_ui->heclTabs->setCurrentIndex(1); + onDownloadPressed(); } void MainWindow::onBinaryDownloaded(const QString& file) { + QFileInfo path(file); +#ifndef _WIN32 + QProcess untar; + untar.setWorkingDirectory(path.dir().absolutePath()); + untar.start("tar", {"-xvf", path.fileName()}); + untar.waitForFinished(); +#if __APPLE__ + QFile::rename(path.dir().absoluteFilePath(path.baseName()) + ".app", "urde.app"); +#else + QFile::rename(path.dir().absoluteFilePath(path.baseName()), "urde"); +#endif + QFile::remove(file); +#else + QFile::rename(file, "urde.exe"); +#endif + checkDownloadedBinary(); +} +void MainWindow::checkDownloadedBinary() +{ + m_updateURDEButton->hide(); + +#if __APPLE__ + QString urdePath = m_path + "/urde.app/Contents/MacOS/urde"; +#elif _WIN32 + QString urdePath = m_path + "urde.exe"; +#else + QString urdePath = m_path + "urde"; +#endif + QProcess proc; + proc.start(urdePath, {"--dlpackage"}, QIODevice::ReadOnly); + if (proc.waitForStarted()) + { + proc.waitForFinished(); + QString dlPackage = QString::fromUtf8(proc.readLine()).trimmed(); + if (proc.exitCode() == 100) + { + if (dlPackage.isEmpty()) + { + m_ui->currentBinaryLabel->setText(QStringLiteral("unknown")); + } + else + { + URDEVersion v(dlPackage); + m_ui->currentBinaryLabel->setText(v.fileString(false)); + if (m_recommendedVersion.isValid() && v.isValid() && + m_recommendedVersion.getVersion() > v.getVersion()) + { + m_updateURDEButton->show(); + } + } + } + else + { + m_ui->currentBinaryLabel->setText(QStringLiteral("unknown")); + } + } + else + { + m_ui->currentBinaryLabel->setText(QStringLiteral("none")); + } +} + +void MainWindow::setPath(const QString& path) +{ + if (!path.isEmpty()) + { + m_path = path; + m_settings.setValue(QStringLiteral("working_dir"), m_path); + m_ui->pathEdit->setText(m_path); + m_ui->extractBtn->setEnabled(true); + m_ui->packageBtn->setEnabled(true); + m_ui->downloadButton->setToolTip(QString()); + m_ui->downloadButton->setEnabled(m_ui->binaryComboBox->isEnabled()); + checkDownloadedBinary(); + } + else + { + m_ui->downloadButton->setToolTip(QStringLiteral("Working directory must be set")); + m_ui->downloadButton->setEnabled(false); + m_ui->currentBinaryLabel->setText(QStringLiteral("none")); + } } void MainWindow::initSlots() @@ -607,15 +729,8 @@ void MainWindow::initSlots() if (dialog.selectedFiles().size() <= 0) return; - QString path = dialog.selectedFiles().at(0); /* TODO: Add beacon detection */ - if (!path.isEmpty()) - { - m_path = path; - m_ui->pathEdit->setText(m_path); - m_ui->extractBtn->setEnabled(true); - m_ui->packageBtn->setEnabled(true); - } + setPath(dialog.selectedFiles().at(0)); }); connect(m_ui->packageBtn, &QPushButton::clicked, [=](){ @@ -632,6 +747,8 @@ void MainWindow::initSlots() m_heclProc.setProcessChannelMode(QProcess::ProcessChannelMode::MergedChannels); m_heclProc.start("../hecl/driver/hecl.exe", {"package", "-y"}); }); + + connect(m_ui->downloadButton, SIGNAL(clicked()), this, SLOT(onDownloadPressed())); } void MainWindow::setTextTermFormatting(QTextEdit* textEdit, const QString& text) diff --git a/hecl-gui/MainWindow.hpp b/hecl-gui/MainWindow.hpp index 8db11631c..76ee88bd9 100644 --- a/hecl-gui/MainWindow.hpp +++ b/hecl-gui/MainWindow.hpp @@ -5,8 +5,10 @@ #include #include #include "DownloadManager.hpp" +#include "Common.hpp" class QTextEdit; class QTextCharFormat; +class QPushButton; namespace Ui { class MainWindow; @@ -20,6 +22,9 @@ class MainWindow : public QMainWindow QString m_path; QProcess m_heclProc; DownloadManager m_dlManager; + QSettings m_settings; + URDEVersion m_recommendedVersion; + QPushButton* m_updateURDEButton; public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); @@ -28,7 +33,11 @@ public: private slots: void onExtract(); void onReturnPressed(); + void onDownloadPressed(); + void onUpdateURDEPressed(); private: + void checkDownloadedBinary(); + void setPath(const QString& path); void initSlots(); void onIndexDownloaded(const QStringList& index); void onBinaryDownloaded(const QString& file); diff --git a/hecl-gui/MainWindow.ui b/hecl-gui/MainWindow.ui index 0e4a87948..a42e89ee8 100644 --- a/hecl-gui/MainWindow.ui +++ b/hecl-gui/MainWindow.ui @@ -289,7 +289,7 @@ p, li { white-space: pre-wrap; } - fetching... + none @@ -310,6 +310,12 @@ p, li { white-space: pre-wrap; } Qt::Vertical + + + 0 + 0 + + @@ -481,6 +487,9 @@ p, li { white-space: pre-wrap; } + + true + diff --git a/hecl-gui/SysReqTableView.cpp b/hecl-gui/SysReqTableView.cpp index b8425e653..18f4a2520 100644 --- a/hecl-gui/SysReqTableView.cpp +++ b/hecl-gui/SysReqTableView.cpp @@ -34,9 +34,6 @@ SysReqTableModel::SysReqTableModel(QObject* parent) m_osVersion.sprintf("macOS %d.%d", m_macosMajor, m_macosMinor); else m_osVersion.sprintf("macOS %d.%d.%d", m_macosMajor, m_macosMinor, m_macosPatch); -#elif _WIN32 -#else - m_is64Bit = sysconf(_SC_WORD_BIT) == 64; #endif } @@ -84,7 +81,7 @@ QVariant SysReqTableModel::data(const QModelIndex& index, int role) const { case 0: #if ZEUS_ARCH_X86 || ZEUS_ARCH_X86_64 - return QStringLiteral("x86, x86_64"); + return QStringLiteral("x86_64"); #else return {}; #endif @@ -107,7 +104,7 @@ QVariant SysReqTableModel::data(const QModelIndex& index, int role) const { case 0: #if ZEUS_ARCH_X86 || ZEUS_ARCH_X86_64 - return m_is64Bit ? QStringLiteral("x86_64") : QStringLiteral("x86"); + return CurArchitectureString; #else return {}; #endif diff --git a/hecl-gui/SysReqTableView.hpp b/hecl-gui/SysReqTableView.hpp index b2e8f050a..133170417 100644 --- a/hecl-gui/SysReqTableView.hpp +++ b/hecl-gui/SysReqTableView.hpp @@ -19,7 +19,6 @@ class SysReqTableModel : public QAbstractTableModel int m_macosPatch = 0; #endif QString m_osVersion; - bool m_is64Bit = true; public: SysReqTableModel(QObject* parent = Q_NULLPTR); int rowCount(const QModelIndex& parent = QModelIndex()) const; @@ -37,6 +36,13 @@ class SysReqTableView : public QTableView public: SysReqTableView(QWidget* parent = Q_NULLPTR); void paintEvent(QPaintEvent* e) Q_DECL_OVERRIDE; + const SysReqTableModel& getModel() const { return m_model; } + const VectorISATableView& getVectorISATable() const { return m_vectorISATable; } + bool willRun(const URDEVersion& v) const + { + return v.getArchitecture() == CurArchitecture && v.getPlatform() == CurPlatform && + m_vectorISATable.willRun(v.getVectorISA()); + } }; #endif // GUI_SYSREQTABLEVIEW_HPP diff --git a/hecl-gui/VectorISATableModelIntel.hpp b/hecl-gui/VectorISATableModelIntel.hpp index 08cffe998..c8dbdcdfa 100644 --- a/hecl-gui/VectorISATableModelIntel.hpp +++ b/hecl-gui/VectorISATableModelIntel.hpp @@ -82,6 +82,29 @@ public: return VectorISA::AVX2; } } + + bool willRun(VectorISA visa) const + { + switch (visa) + { + default: + return false; + case VectorISA::X87: + return true; + case VectorISA::SSE: + return m_features.SSE1; + case VectorISA::SSE2: + return m_features.SSE2; + case VectorISA::SSE3: + return m_features.SSE3; + case VectorISA::SSE41: + return m_features.SSE41; + case VectorISA::AVX: + return m_features.AVX; + case VectorISA::AVX2: + return m_features.AVX2; + } + } }; #endif // GUI_VECTORISATABLEMODELINTEL_HPP diff --git a/hecl-gui/VectorISATableView.hpp b/hecl-gui/VectorISATableView.hpp index 745f0c696..d697d0079 100644 --- a/hecl-gui/VectorISATableView.hpp +++ b/hecl-gui/VectorISATableView.hpp @@ -22,6 +22,7 @@ public: VectorISATableView(QWidget* parent = Q_NULLPTR); void paintEvent(QPaintEvent* e) Q_DECL_OVERRIDE; VectorISA getISA() const { return m_model.getISA(m_maxISA); } + bool willRun(VectorISA visa) const { return m_model.willRun(visa); } }; #endif // GUI_VECTORISATABLEVIEW_HPP diff --git a/hecl-gui/main.cpp b/hecl-gui/main.cpp index 7fdf8e8bc..e4ad6b4c1 100644 --- a/hecl-gui/main.cpp +++ b/hecl-gui/main.cpp @@ -1,6 +1,7 @@ #include #include #include "MainWindow.hpp" +#include "Common.hpp" extern const size_t MAINICON_QT_SZ; extern const uint8_t MAINICON_QT[]; @@ -26,6 +27,8 @@ static QIcon MakeAppIcon() int main(int argc, char* argv[]) { + InitializePlatform(); + QApplication a(argc, argv); a.setStyle(QStyleFactory::create("Fusion")); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) @@ -37,10 +40,10 @@ int main(int argc, char* argv[]) QPalette darkPalette; darkPalette.setColor(QPalette::Window, QColor(53,53,53)); darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, QColor(25,25,25)); + darkPalette.setColor(QPalette::Base, QColor(42,42,42)); darkPalette.setColor(QPalette::Disabled, QPalette::Base, QColor(25,25,25,53)); darkPalette.setColor(QPalette::AlternateBase, QColor(53,53,53)); - darkPalette.setColor(QPalette::ToolTipBase, Qt::white); + darkPalette.setColor(QPalette::ToolTipBase, QColor(42,42,42)); darkPalette.setColor(QPalette::ToolTipText, Qt::white); darkPalette.setColor(QPalette::Text, Qt::white); darkPalette.setColor(QPalette::Disabled, QPalette::Text, QColor(255,255,255,120)); @@ -49,10 +52,11 @@ int main(int argc, char* argv[]) darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(255,255,255,120)); darkPalette.setColor(QPalette::BrightText, Qt::red); - darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); - darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); - darkPalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(42, 130, 218, 53)); - darkPalette.setColor(QPalette::HighlightedText, Qt::black); + darkPalette.setColor(QPalette::Link, QColor(42,130,218)); + darkPalette.setColor(QPalette::Highlight, QColor(42,130,218)); + darkPalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(42,130,218,53)); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + darkPalette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(255,255,255,120)); a.setPalette(darkPalette); MainWindow w;