From a3f5ea359827abb7949070cdcd8d56be50ab3360 Mon Sep 17 00:00:00 2001 From: Tayou Date: Tue, 1 Nov 2022 15:41:08 +0100 Subject: [PATCH] added suggested changes Signed-off-by: Tayou --- launcher/Application.cpp | 18 +++------ launcher/Application.h | 9 ++--- launcher/ui/themes/CustomTheme.cpp | 24 ++++++------ launcher/ui/themes/CustomTheme.h | 3 +- launcher/ui/themes/SystemTheme.cpp | 10 ++--- launcher/ui/themes/ThemeManager.cpp | 60 +++++++++++++++-------------- launcher/ui/themes/ThemeManager.h | 15 ++++++-- 7 files changed, 68 insertions(+), 71 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 7b33361c..fa202312 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -2,10 +2,8 @@ /* * Prism Launcher * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Tayou - * - * PolyMC - Minecraft Launcher * Copyright (C) 2022 Lenny McLennington + * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -71,6 +69,8 @@ #include "ui/pagedialog/PageDialog.h" +#include "ui/themes/ThemeManager.h" + #include "ApplicationMessage.h" #include @@ -747,11 +747,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) } // Themes - { - m_themeManager = new ThemeManager(m_mainWindow); - - m_themeManager->InitializeThemes(); - } + m_themeManager = std::make_unique(m_mainWindow); // initialize and load all instances { @@ -860,10 +856,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) performMainStartupAction(); } -ThemeManager* Application::getThemeManager() { - return Application::m_themeManager; -} - bool Application::createSetupWizard() { bool javaRequired = [&]() @@ -1109,7 +1101,7 @@ std::shared_ptr Application::javalist() return m_javalist; } -std::vector Application::getValidApplicationThemes() +QList Application::getValidApplicationThemes() { return m_themeManager->getValidApplicationThemes(); } diff --git a/launcher/Application.h b/launcher/Application.h index 33d8db29..ec434c6c 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -45,8 +45,6 @@ #include #include -#include "ui/themes/ThemeManager.h" - #include #include "minecraft/launch/MinecraftServerTarget.h" @@ -71,6 +69,7 @@ class BaseDetachedToolFactory; class TranslationsModel; class ITheme; class MCEditTool; +class ThemeManager; namespace Meta { class Index; @@ -121,7 +120,7 @@ public: void setIconTheme(const QString& name); - std::vector getValidApplicationThemes(); + QList getValidApplicationThemes(); void setApplicationTheme(const QString& name, bool initial); @@ -201,8 +200,6 @@ public: void ShowGlobalSettings(class QWidget * parent, QString open_page = QString()); - ThemeManager* getThemeManager(); - signals: void updateAllowedChanged(bool status); void globalSettingsAboutToOpen(); @@ -262,7 +259,7 @@ private: std::shared_ptr m_globalSettingsProvider; std::unique_ptr m_mcedit; QSet m_features; - ThemeManager* m_themeManager; + std::unique_ptr m_themeManager; QMap> m_profilers; diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index 3c35bf37..c346d42f 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -66,7 +66,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm QColor color(colorValue); if(!color.isValid()) { - themeWarningLog << "Color value" << colorValue << "for" << colorName << "was not recognized."; + themeWarningLog() << "Color value" << colorValue << "for" << colorName << "was not recognized."; return QColor(); } return color; @@ -82,7 +82,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } else { - themeDebugLog << "Color value for" << colorName << "was not present."; + themeDebugLog() << "Color value for" << colorName << "was not present."; } }; @@ -108,13 +108,13 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } catch (const Exception &e) { - themeWarningLog << "Couldn't load theme json: " << e.cause(); + themeWarningLog() << "Couldn't load theme json: " << e.cause(); return false; } } else { - themeDebugLog << "No theme json present."; + themeDebugLog() << "No theme json present."; return false; } return true; @@ -160,7 +160,7 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double } catch (const Exception &e) { - themeWarningLog << "Failed to write theme json to" << path; + themeWarningLog() << "Failed to write theme json to" << path; return false; } } @@ -179,7 +179,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest if(!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) { - themeWarningLog << "X couldn't create folder for theme!"; + themeWarningLog() << "couldn't create folder for theme!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); return; @@ -192,7 +192,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_palette = baseTheme->colorScheme(); if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) { - themeDebugLog << "Did not read theme json file correctly, writing new one to: " << themeFilePath; + themeDebugLog() << "Did not read theme json file correctly, writing new one to: " << themeFilePath; m_name = "Custom"; m_palette = baseTheme->colorScheme(); m_fadeColor = baseTheme->fadeColor(); @@ -223,13 +223,13 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "X Couldn't load css:" << e.cause() << "from" << cssFilePath; + themeWarningLog() << "Couldn't load css:" << e.cause() << "from" << cssFilePath; m_styleSheet = baseTheme->appStyleSheet(); } } else { - themeDebugLog << "X No theme css present."; + themeDebugLog() << "No theme css present."; m_styleSheet = baseTheme->appStyleSheet(); try { @@ -237,7 +237,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "X Couldn't write css:" << e.cause() << "to" << cssFilePath; + themeWarningLog() << "Couldn't write css:" << e.cause() << "to" << cssFilePath; } } } else { @@ -250,7 +250,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest if(!FS::ensureFilePathExists(path)) { - themeWarningLog << m_name << " Theme file path doesn't exist!"; + themeWarningLog() << m_name << " Theme file path doesn't exist!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); return; @@ -264,7 +264,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "Couldn't load qss:" << e.cause() << "from" << path; + themeWarningLog() << "Couldn't load qss:" << e.cause() << "from" << path; m_styleSheet = baseTheme->appStyleSheet(); } } diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index f4a7b737..6d1f46b4 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -39,8 +39,7 @@ #pragma once #include "ITheme.h" -#include -#include +#include class CustomTheme: public ITheme { diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index b8eb2a3c..ec24c6d7 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -45,25 +45,25 @@ SystemTheme::SystemTheme() { - themeDebugLog << "Determining System Theme..."; + themeDebugLog() << "Determining System Theme..."; const auto & style = QApplication::style(); systemPalette = style->standardPalette(); QString lowerThemeName = style->objectName(); - themeDebugLog << "System theme seems to be:" << lowerThemeName; + themeDebugLog() << "System theme seems to be:" << lowerThemeName; QStringList styles = QStyleFactory::keys(); for(auto &st: styles) { - themeDebugLog << "Considering theme from theme factory:" << st.toLower(); + themeDebugLog() << "Considering theme from theme factory:" << st.toLower(); if(st.toLower() == lowerThemeName) { systemTheme = st; - themeDebugLog << "System theme has been determined to be:" << systemTheme; + themeDebugLog() << "System theme has been determined to be:" << systemTheme; return; } } // fall back to fusion if we can't find the current theme. systemTheme = "Fusion"; - themeDebugLog << "System theme not found, defaulted to Fusion"; + themeDebugLog() << "System theme not found, defaulted to Fusion"; } void SystemTheme::apply(bool initial) diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 6e1566d2..3c338fd6 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -29,20 +29,25 @@ #include "Application.h" #ifdef Q_OS_WIN -#include +#include +// this is needed for versionhelpers.h, it is also included in WinDarkmode, but we can't rely on that. +// Ultimately this should be included in versionhelpers, but that is outside of the project. #include "ui/WinDarkmode.h" +#include #endif ThemeManager::ThemeManager(MainWindow* mainWindow) { m_mainWindow = mainWindow; + InitializeThemes(); } /// @brief Adds the Theme to the list of themes /// @param theme The Theme to add /// @return Theme ID -QString ThemeManager::AddTheme(ITheme * theme) { - m_themes.insert(std::make_pair(theme->id(), std::unique_ptr(theme))); - return theme->id(); +QString ThemeManager::AddTheme(std::unique_ptr theme) { + QString id = theme->id(); + m_themes.emplace(id, std::move(theme)); + return id; } /// @brief Gets the Theme from the List via ID @@ -62,20 +67,20 @@ void ThemeManager::InitializeThemes() { auto searchPaths = QIcon::themeSearchPaths(); searchPaths.append("iconthemes"); QIcon::setThemeSearchPaths(searchPaths); - themeDebugLog << "<> Icon themes initialized."; + themeDebugLog() << "<> Icon themes initialized."; } // Initialize widget themes { - themeDebugLog << "<> Initializing Widget Themes"; - themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new SystemTheme()); - auto darkThemeId = AddTheme(new DarkTheme()); - themeDebugLog "✓ Loading Built-in Theme:" << darkThemeId; - themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new BrightTheme()); + themeDebugLog() << "<> Initializing Widget Themes"; + themeDebugLog() << "Loading Built-in Theme:" << AddTheme(std::make_unique()); + auto darkThemeId = AddTheme(std::make_unique()); + themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; + themeDebugLog() << "Loading Built-in Theme:" << AddTheme(std::make_unique()); - // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown? Dunno how to do that though) - QString themeFolder = (new QDir("./themes/"))->absoluteFilePath(""); - themeDebugLog << "Theme Folder Path: " << themeFolder; + // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown?) + QString themeFolder = QDir("./themes/").absoluteFilePath(""); + themeDebugLog() << "Theme Folder Path: " << themeFolder; QDirIterator directoryIterator(themeFolder, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (directoryIterator.hasNext()) { @@ -83,34 +88,30 @@ void ThemeManager::InitializeThemes() { QFileInfo themeJson(dir.absoluteFilePath("theme.json")); if (themeJson.exists()) { // Load "theme.json" based themes - themeDebugLog "✓ Loading JSON Theme from:" << themeJson.absoluteFilePath(); - CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), themeJson, true); - AddTheme(theme); + themeDebugLog() << "Loading JSON Theme from:" << themeJson.absoluteFilePath(); + AddTheme(std::make_unique(GetTheme(darkThemeId), themeJson, true)); } else { // Load pure QSS Themes QDirIterator stylesheetFileIterator(dir.absoluteFilePath(""), {"*.qss", "*.css"}, QDir::Files); while (stylesheetFileIterator.hasNext()) { QFile customThemeFile(stylesheetFileIterator.next()); QFileInfo customThemeFileInfo(customThemeFile); - themeDebugLog "✓ Loading QSS Theme from:" << customThemeFileInfo.absoluteFilePath(); - CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), customThemeFileInfo, false); - AddTheme(theme); + themeDebugLog() << "Loading QSS Theme from:" << customThemeFileInfo.absoluteFilePath(); + AddTheme(std::make_unique(GetTheme(darkThemeId), customThemeFileInfo, false)); } } } - themeDebugLog << "<> Widget themes initialized."; + themeDebugLog() << "<> Widget themes initialized."; } } -std::vector ThemeManager::getValidApplicationThemes() +QList ThemeManager::getValidApplicationThemes() { - std::vector ret; - auto iter = m_themes.cbegin(); - while (iter != m_themes.cend()) - { - ret.push_back((*iter).second.get()); - iter++; + QList ret; + ret.reserve(m_themes.size()); + for (auto&& [id, theme] : m_themes) { + ret.append(theme.get()); } return ret; } @@ -133,7 +134,8 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) auto themeIter = m_themes.find(name); if(themeIter != m_themes.end()) { - auto & theme = (*themeIter).second; + auto & theme = themeIter->second; + themeDebugLog() << "applying theme" << theme->name(); theme->apply(initial); #ifdef Q_OS_WIN if (m_mainWindow && IsWindows10OrGreater()) { @@ -147,6 +149,6 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) } else { - qWarning() << "Tried to set invalid theme:" << name; + themeWarningLog() << "Tried to set invalid theme:" << name; } } diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index fa6ea236..871e6fe2 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -15,21 +15,28 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once #include #include "ui/themes/ITheme.h" #include "ui/MainWindow.h" -#define themeDebugLog qDebug() << "[Themes]" -#define themeWarningLog qWarning() << "[Themes]" +inline auto themeDebugLog() { + return qDebug() << "[Theme]"; +} +inline auto themeWarningLog() { + return qWarning() << "[Theme]"; +} class ThemeManager { public: ThemeManager(MainWindow* mainWindow); + + // maybe make private? Or put in ctor? void InitializeThemes(); - std::vector getValidApplicationThemes(); + QList getValidApplicationThemes(); void setIconTheme(const QString& name); void applyCurrentlySelectedTheme(); void setApplicationTheme(const QString& name, bool initial); @@ -38,7 +45,7 @@ private: std::map> m_themes; MainWindow* m_mainWindow; - QString AddTheme(ITheme * theme); + QString AddTheme(std::unique_ptr theme); ITheme* GetTheme(QString themeId); };