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;