From f8dadd38b4af93be86bc48d853d7c85e839b301e Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 1 Mar 2024 23:32:50 +0100 Subject: [PATCH] Add ResolveVariables() Settings will be set to fixed values based on the values of the variables used. --- lib/utils/duration.cpp | 5 ++++ lib/utils/duration.hpp | 4 ++- lib/utils/scene-selection.cpp | 6 +++++ lib/utils/scene-selection.hpp | 1 + lib/utils/source-selection.cpp | 5 ++++ lib/utils/source-selection.hpp | 1 + lib/variables/variable-number.hpp | 1 + lib/variables/variable-number.tpp | 6 +++++ lib/variables/variable-string.cpp | 6 +++++ lib/variables/variable-string.hpp | 2 ++ plugins/base/utils/filter-selection.cpp | 14 +++++++++++ plugins/base/utils/filter-selection.hpp | 1 + plugins/base/utils/osc-helpers.cpp | 28 +++++++++++++++++++++ plugins/base/utils/osc-helpers.hpp | 5 ++++ plugins/base/utils/process-config.cpp | 7 ++++++ plugins/base/utils/process-config.hpp | 2 ++ plugins/base/utils/scene-item-selection.cpp | 19 ++++++++++++++ plugins/base/utils/scene-item-selection.hpp | 2 ++ plugins/base/utils/string-list.cpp | 7 ++++++ plugins/base/utils/string-list.hpp | 1 + 20 files changed, 122 insertions(+), 1 deletion(-) diff --git a/lib/utils/duration.cpp b/lib/utils/duration.cpp index eb1851dc..11fde9d0 100644 --- a/lib/utils/duration.cpp +++ b/lib/utils/duration.cpp @@ -165,4 +165,9 @@ void Duration::SetUnit(Unit u) _value = _value * (prevMultiplier / newMultiplier); } +void Duration::ResolveVariables() +{ + _value.ResolveVariables(); +} + } // namespace advss diff --git a/lib/utils/duration.hpp b/lib/utils/duration.hpp index 3a8ab090..b4263f64 100644 --- a/lib/utils/duration.hpp +++ b/lib/utils/duration.hpp @@ -34,8 +34,10 @@ public: // Only use this function if you intend to convert old settings formats EXPORT void SetUnit(Unit u); + EXPORT void ResolveVariables(); + private: - NumberVariable _value = 0.; + DoubleVariable _value = 0.; Unit _unit = Unit::SECONDS; std::chrono::high_resolution_clock::time_point _startTime; diff --git a/lib/utils/scene-selection.cpp b/lib/utils/scene-selection.cpp index eb4ddb58..16b7b051 100644 --- a/lib/utils/scene-selection.cpp +++ b/lib/utils/scene-selection.cpp @@ -181,6 +181,12 @@ std::string SceneSelection::ToString(bool resolve) const return ""; } +void SceneSelection::ResolveVariables() +{ + _scene = GetScene(); + _type = Type::SCENE; +} + SceneSelection SceneSelectionWidget::CurrentSelection() { SceneSelection s; diff --git a/lib/utils/scene-selection.hpp b/lib/utils/scene-selection.hpp index 6fa6201a..fe581265 100644 --- a/lib/utils/scene-selection.hpp +++ b/lib/utils/scene-selection.hpp @@ -26,6 +26,7 @@ public: EXPORT Type GetType() const { return _type; } EXPORT OBSWeakSource GetScene(bool advance = true) const; EXPORT std::string ToString(bool resolve = false) const; + EXPORT void ResolveVariables(); private: OBSWeakSource _scene; diff --git a/lib/utils/source-selection.cpp b/lib/utils/source-selection.cpp index 4ea4a193..15feeafc 100644 --- a/lib/utils/source-selection.cpp +++ b/lib/utils/source-selection.cpp @@ -88,6 +88,11 @@ void SourceSelection::SetSource(OBSWeakSource source) _source = source; } +void SourceSelection::ResolveVariables() +{ + SetSource(GetSource()); +} + std::string SourceSelection::ToString(bool resolve) const { switch (_type) { diff --git a/lib/utils/source-selection.hpp b/lib/utils/source-selection.hpp index f5a7579a..9fc50b1f 100644 --- a/lib/utils/source-selection.hpp +++ b/lib/utils/source-selection.hpp @@ -19,6 +19,7 @@ public: EXPORT Type GetType() const { return _type; } EXPORT OBSWeakSource GetSource() const; EXPORT void SetSource(OBSWeakSource); + EXPORT void ResolveVariables(); EXPORT std::string ToString(bool resolve = false) const; EXPORT bool operator==(const SourceSelection &) const; diff --git a/lib/variables/variable-number.hpp b/lib/variables/variable-number.hpp index 5945286b..3edd81db 100644 --- a/lib/variables/variable-number.hpp +++ b/lib/variables/variable-number.hpp @@ -22,6 +22,7 @@ public: Type GetType() const { return _type; } bool IsFixedType() const { return _type == Type::FIXED_VALUE; } std::weak_ptr GetVariable() const { return _variable; } + void ResolveVariables(); private: Type _type = Type::FIXED_VALUE; diff --git a/lib/variables/variable-number.tpp b/lib/variables/variable-number.tpp index 9608546d..db67d144 100644 --- a/lib/variables/variable-number.tpp +++ b/lib/variables/variable-number.tpp @@ -93,3 +93,9 @@ template NumberVariable::operator T() const { return GetValue(); } + +template void NumberVariable::ResolveVariables() +{ + _value = GetValue(); + _type = Type::FIXED_VALUE; +} diff --git a/lib/variables/variable-string.cpp b/lib/variables/variable-string.cpp index 3d6c1186..386088d6 100644 --- a/lib/variables/variable-string.cpp +++ b/lib/variables/variable-string.cpp @@ -50,6 +50,12 @@ void StringVariable::Save(obs_data_t *obj, const char *name) const obs_data_set_string(obj, name, _value.c_str()); } +void StringVariable::ResolveVariables() +{ + Resolve(); + _value = _resolvedValue; +} + const char *StringVariable::c_str() { Resolve(); diff --git a/lib/variables/variable-string.hpp b/lib/variables/variable-string.hpp index 32c56060..53acf2ce 100644 --- a/lib/variables/variable-string.hpp +++ b/lib/variables/variable-string.hpp @@ -27,6 +27,8 @@ public: EXPORT void Load(obs_data_t *obj, const char *name); EXPORT void Save(obs_data_t *obj, const char *name) const; + EXPORT void ResolveVariables(); + private: void Resolve() const; diff --git a/plugins/base/utils/filter-selection.cpp b/plugins/base/utils/filter-selection.cpp index 568b19d0..01e6e065 100644 --- a/plugins/base/utils/filter-selection.cpp +++ b/plugins/base/utils/filter-selection.cpp @@ -114,6 +114,20 @@ FilterSelection::GetFilters(const SourceSelection &source) const return {}; } +void FilterSelection::ResolveVariables() +{ + if (_type != Type::VARIABLE) { + return; + } + _type = Type::SOURCE; + auto var = _variable.lock(); + if (!var) { + _filterName = ""; + return; + } + _filterName = var->Value(); +} + std::string FilterSelection::ToString(bool resolve) const { switch (_type) { diff --git a/plugins/base/utils/filter-selection.hpp b/plugins/base/utils/filter-selection.hpp index eae93420..bd809173 100644 --- a/plugins/base/utils/filter-selection.hpp +++ b/plugins/base/utils/filter-selection.hpp @@ -19,6 +19,7 @@ public: Type GetType() const { return _type; } std::vector GetFilters(const SourceSelection &source) const; + void ResolveVariables(); std::string ToString(bool resolve = false) const; private: diff --git a/plugins/base/utils/osc-helpers.cpp b/plugins/base/utils/osc-helpers.cpp index cec61bb5..0bc49368 100644 --- a/plugins/base/utils/osc-helpers.cpp +++ b/plugins/base/utils/osc-helpers.cpp @@ -140,6 +140,11 @@ void OSCBlob::Load(obs_data_t *obj, const char *name) _stringRep.Load(obj, name); } +void OSCBlob::ResolveVariables() +{ + _stringRep.ResolveVariables(); +} + void OSCTrue::Save(obs_data_t *obj, const char *name) const { obs_data_set_bool(obj, name, true); @@ -201,6 +206,14 @@ std::optional> OSCMessage::GetBuffer() const return buffer; } +void OSCMessage::ResolveVariables() +{ + _address.ResolveVariables(); + for (auto &element : _elements) { + element.ResolveVariables(); + } +} + const char *OSCMessageElement::GetTypeTag() const { return GetTypeTag(*this); @@ -216,6 +229,21 @@ const char *OSCMessageElement::GetTypeTag(const OSCMessageElement &element) return _typeNames.at(element._value.index()).tag; } +void OSCMessageElement::ResolveVariables() +{ + std::visit( + [](auto &&arg) { + using T = std::decay_t; + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) { + arg.ResolveVariables(); + } + }, + _value); +} + const char *OSCMessageElement::GetTypeName(const OSCMessageElement &element) { return obs_module_text( diff --git a/plugins/base/utils/osc-helpers.hpp b/plugins/base/utils/osc-helpers.hpp index 31898b6a..f2391196 100644 --- a/plugins/base/utils/osc-helpers.hpp +++ b/plugins/base/utils/osc-helpers.hpp @@ -19,6 +19,7 @@ public: std::optional> GetBinary() const; void Save(obs_data_t *obj, const char *name) const; void Load(obs_data_t *obj, const char *name); + void ResolveVariables(); private: StringVariable _stringRep; @@ -69,6 +70,8 @@ public: static const char *GetTypeName(const OSCMessageElement &); static const char *GetTypeTag(const OSCMessageElement &); + void ResolveVariables(); + private: struct TypeInfo { const char *localizedName, *tag; @@ -91,6 +94,8 @@ public: std::string ToString() const; std::optional> GetBuffer() const; + void ResolveVariables(); + private: StringVariable _address = "/address"; std::vector _elements = { diff --git a/plugins/base/utils/process-config.cpp b/plugins/base/utils/process-config.cpp index 4ccce5fc..8351a719 100644 --- a/plugins/base/utils/process-config.cpp +++ b/plugins/base/utils/process-config.cpp @@ -53,6 +53,13 @@ bool ProcessConfig::StartProcessDetached() const QString::fromStdString(WorkingDir())); } +void ProcessConfig::ResolveVariables() +{ + _path.ResolveVariables(); + _workingDirectory.ResolveVariables(); + _args.ResolveVariables(); +} + std::variant ProcessConfig::StartProcessAndWait(int timeout) const { diff --git a/plugins/base/utils/process-config.hpp b/plugins/base/utils/process-config.hpp index f353459e..e70856cc 100644 --- a/plugins/base/utils/process-config.hpp +++ b/plugins/base/utils/process-config.hpp @@ -34,6 +34,8 @@ public: StartProcessAndWait(int timeoutInMs) const; bool StartProcessDetached() const; + void ResolveVariables(); + private: StringVariable _path = obs_module_text("AdvSceneSwitcher.enterPath"); StringVariable _workingDirectory = ""; diff --git a/plugins/base/utils/scene-item-selection.cpp b/plugins/base/utils/scene-item-selection.cpp index 4dd9d088..5826ee51 100644 --- a/plugins/base/utils/scene-item-selection.cpp +++ b/plugins/base/utils/scene-item-selection.cpp @@ -304,6 +304,25 @@ void SceneItemSelection::SetSourceTypeSelection(const char *type) _sourceGroup = type; } +void SceneItemSelection::ResolveVariables() +{ + _index.ResolveVariables(); + _indexEnd.ResolveVariables(); + _pattern = std::string(_pattern); + + if (_type != Type::VARIABLE_NAME) { + return; + } + _type = Type::SOURCE_NAME; + + auto variable = _variable.lock(); + if (variable) { + _source = GetWeakSourceByName(variable->Value().c_str()); + } else { + _source = nullptr; + } +} + void SceneItemSelection::ReduceBadedOnIndexSelection( std::vector &items) const { diff --git a/plugins/base/utils/scene-item-selection.hpp b/plugins/base/utils/scene-item-selection.hpp index 9204bde5..d91832ef 100644 --- a/plugins/base/utils/scene-item-selection.hpp +++ b/plugins/base/utils/scene-item-selection.hpp @@ -53,6 +53,8 @@ public: // scene item visibility action void SetSourceTypeSelection(const char *); + void ResolveVariables(); + private: std::vector GetSceneItemsByName(const SceneSelection &) const; diff --git a/plugins/base/utils/string-list.cpp b/plugins/base/utils/string-list.cpp index 6bdcbb97..fdc29ba0 100644 --- a/plugins/base/utils/string-list.cpp +++ b/plugins/base/utils/string-list.cpp @@ -39,6 +39,13 @@ bool StringList::Load(obs_data_t *obj, const char *name, return true; } +void StringList::ResolveVariables() +{ + for (auto &value : *this) { + value.ResolveVariables(); + } +} + StringListEdit::StringListEdit(QWidget *parent, const QString &addString, const QString &addStringDescription, int maxStringSize, bool allowEmtpy) diff --git a/plugins/base/utils/string-list.hpp b/plugins/base/utils/string-list.hpp index 97a41f74..5d06c55c 100644 --- a/plugins/base/utils/string-list.hpp +++ b/plugins/base/utils/string-list.hpp @@ -16,6 +16,7 @@ public: const char *elementName = "string") const; bool Load(obs_data_t *obj, const char *name, const char *elementName = "string"); + void ResolveVariables(); friend class StringListEdit; };