From fd502ce94f3a8cae55de259ffe9afce8388375cd Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sat, 16 Aug 2025 12:51:16 +0200 Subject: [PATCH] Gui: Try to load Theme Parameters from file This creates logic that tries to load user parameters from file as the priority and pushes back older mechanism to lower layer. Older way of loading theme parameters should be preserved until we release first 1.1 RC. --- src/Gui/Application.cpp | 43 ++++++++++++++++---- src/Gui/StyleParameters/ParameterManager.cpp | 15 ++++++- src/Gui/StyleParameters/ParameterManager.h | 3 ++ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 7acd57933f..8f46494588 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -141,6 +141,7 @@ #include "QtWidgets.h" #include +#include #include #ifdef BUILD_TRACY_FRAME_PROFILER @@ -381,20 +382,48 @@ struct PyMethodDef FreeCADGui_methods[] = { void Application::initStyleParameterManager() { + static ParamHandlers handlers; + + const auto deduceParametersFilePath = []() -> std::string { + const auto hMainWindowGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/MainWindow"); + + if (const std::string& path = hMainWindowGrp->GetASCII("ThemeStyleParametersFile"); + !path.empty()) { + return path; + } + + return fmt::format("qss:parameters/{}.yaml", hMainWindowGrp->GetASCII("Theme", "Classic")); + }; + + auto themeParametersSource = new StyleParameters::YamlParameterSource( + deduceParametersFilePath(), + {.name = QT_TR_NOOP("Theme Parameters"), + .options = StyleParameters::ParameterSourceOption::UserEditable}); + + handlers.addDelayedHandler( + "BaseApp/Preferences/MainWindow", + {"ThemeStyleParametersFiles", "Theme"}, + [themeParametersSource, deduceParametersFilePath](ParameterGrp::handle) { + themeParametersSource->changeFilePath(deduceParametersFilePath()); + }); + Base::registerServiceImplementation( new StyleParameters::BuiltInParameterSource({.name = QT_TR_NOOP("Built-in Parameters")})); - Base::registerServiceImplementation( - new StyleParameters::UserParameterSource( - App::GetApplication().GetParameterGroupByPath( - "User parameter:BaseApp/Preferences/Themes/Tokens"), - {.name = QT_TR_NOOP("Theme Parameters"), - .options = StyleParameters::ParameterSourceOption::UserEditable})); - + // todo: left for compatibility with older theme versions, to be removed before release Base::registerServiceImplementation( new StyleParameters::UserParameterSource( App::GetApplication().GetParameterGroupByPath( "User parameter:BaseApp/Preferences/Themes/UserTokens"), + {.name = QT_TR_NOOP("Theme Parameters - Fallback"), + .options = StyleParameters::ParameterSourceOption::ReadOnly})); + + Base::registerServiceImplementation(themeParametersSource); + + Base::registerServiceImplementation( + new StyleParameters::UserParameterSource( + App::GetApplication().GetParameterGroupByPath( + "User parameter:BaseApp/Preferences/Themes/UserParameters"), {.name = QT_TR_NOOP("User Parameters"), .options = StyleParameters::ParameterSource::UserEditable})); diff --git a/src/Gui/StyleParameters/ParameterManager.cpp b/src/Gui/StyleParameters/ParameterManager.cpp index 8fa1727609..9aa9894eaf 100644 --- a/src/Gui/StyleParameters/ParameterManager.cpp +++ b/src/Gui/StyleParameters/ParameterManager.cpp @@ -223,7 +223,17 @@ void UserParameterSource::remove(const std::string& name) YamlParameterSource::YamlParameterSource(const std::string& filePath, const Metadata& metadata) : ParameterSource(metadata) - , filePath(filePath) +{ + changeFilePath(filePath); +} + +void YamlParameterSource::changeFilePath(const std::string& path) +{ + this->filePath = path; + reload(); +} + +void YamlParameterSource::reload() { QFile file(QString::fromStdString(filePath)); @@ -240,6 +250,7 @@ YamlParameterSource::YamlParameterSource(const std::string& filePath, const Meta std::string content = in.readAll().toStdString(); YAML::Node root = YAML::Load(content); + parameters.clear(); for (auto it = root.begin(); it != root.end(); ++it) { auto key = it->first.as(); auto value = it->second.as(); @@ -288,7 +299,7 @@ void YamlParameterSource::flush() QFile file(QString::fromStdString(filePath)); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { - FC_TRACE("StyleParameters: Unable to open file " << filePath); + FC_WARN("StyleParameters: Unable to open file " << filePath); return; } diff --git a/src/Gui/StyleParameters/ParameterManager.h b/src/Gui/StyleParameters/ParameterManager.h index a2832a9030..fb13994494 100644 --- a/src/Gui/StyleParameters/ParameterManager.h +++ b/src/Gui/StyleParameters/ParameterManager.h @@ -403,6 +403,9 @@ public: */ explicit YamlParameterSource(const std::string& filePath, const Metadata& metadata = {}); + void changeFilePath(const std::string& path); + void reload(); + std::list all() const override; std::optional get(const std::string& name) const override; void define(const Parameter& param) override;