diff --git a/CMakeLists.txt b/CMakeLists.txt index aedee8e7..63e686e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,7 @@ target_sources( lib/macro/macro-segment-list.hpp lib/macro/macro-segment-selection.cpp lib/macro/macro-segment-selection.hpp + lib/macro/macro-segment-unknown.hpp lib/macro/macro-segment.cpp lib/macro/macro-segment.hpp lib/macro/macro-selection.cpp diff --git a/lib/macro/macro-action-factory.cpp b/lib/macro/macro-action-factory.cpp index 39406f25..4e934645 100644 --- a/lib/macro/macro-action-factory.cpp +++ b/lib/macro/macro-action-factory.cpp @@ -1,25 +1,11 @@ #include "macro-action-factory.hpp" +#include "macro-segment-unknown.hpp" #include namespace advss { -namespace { - -class MacroActionUnknown : public MacroAction { -public: - MacroActionUnknown(Macro *m) : MacroAction(m) {} - std::shared_ptr Copy() const - { - return std::make_shared(GetMacro()); - } - bool PerformAction() { return true; }; - bool Save(obs_data_t *obj) const { return MacroAction::Save(obj); }; - bool Load(obs_data_t *obj) { return MacroAction::Load(obj); }; - std::string GetId() const { return "unknown"; } -}; - -} // namespace +using MacroActionUnknown = MacroSegmentUnknown; static std::recursive_mutex mutex; @@ -49,9 +35,10 @@ bool MacroActionFactory::Deregister(const std::string &id) return true; } -static std::shared_ptr createUnknownAction(Macro *m) +static std::shared_ptr createUnknownAction(Macro *m, + const std::string &id) { - return std::make_shared(m); + return std::make_shared(m, id); } std::shared_ptr MacroActionFactory::Create(const std::string &id, @@ -62,12 +49,7 @@ std::shared_ptr MacroActionFactory::Create(const std::string &id, return it->second._create(m); } - return createUnknownAction(m); -} - -static QWidget *createUnknownActionWidget() -{ - return new QLabel(obs_module_text("AdvSceneSwitcher.action.unknown")); + return createUnknownAction(m, id); } QWidget *MacroActionFactory::CreateWidget(const std::string &id, @@ -79,7 +61,7 @@ QWidget *MacroActionFactory::CreateWidget(const std::string &id, return it->second._createWidget(parent, action); } - return createUnknownActionWidget(); + return CreateUnknownSegmentWidget(true); } std::string MacroActionFactory::GetActionName(const std::string &id) diff --git a/lib/macro/macro-condition-factory.cpp b/lib/macro/macro-condition-factory.cpp index d09b4fd7..6743c781 100644 --- a/lib/macro/macro-condition-factory.cpp +++ b/lib/macro/macro-condition-factory.cpp @@ -1,21 +1,11 @@ #include "macro-condition-factory.hpp" +#include "macro-segment-unknown.hpp" #include namespace advss { -namespace { - -class MacroConditionUnknown : public MacroCondition { -public: - MacroConditionUnknown(Macro *m) : MacroCondition(m) {} - bool CheckCondition() { return false; } - bool Save(obs_data_t *obj) const { return MacroCondition::Save(obj); }; - bool Load(obs_data_t *obj) { return MacroCondition::Load(obj); }; - std::string GetId() const { return "unknown"; } -}; - -} // namespace +using MacroConditionUnknown = MacroSegmentUnknown; static std::recursive_mutex mutex; @@ -46,9 +36,10 @@ bool MacroConditionFactory::Deregister(const std::string &id) return true; } -static std::shared_ptr createUnknownCondition(Macro *m) +static std::shared_ptr +createUnknownCondition(Macro *m, const std::string &id) { - return std::make_shared(m); + return std::make_shared(m, id); } std::shared_ptr @@ -58,13 +49,7 @@ MacroConditionFactory::Create(const std::string &id, Macro *m) if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._create(m); } - return createUnknownCondition(m); -} - -static QWidget *createUnknownConditionWidget() -{ - return new QLabel( - obs_module_text("AdvSceneSwitcher.condition.unknown")); + return createUnknownCondition(m, id); } QWidget * @@ -75,7 +60,7 @@ MacroConditionFactory::CreateWidget(const std::string &id, QWidget *parent, if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._createWidget(parent, cond); } - return createUnknownConditionWidget(); + return CreateUnknownSegmentWidget(false); } std::string MacroConditionFactory::GetConditionName(const std::string &id) diff --git a/lib/macro/macro-segment-unknown.hpp b/lib/macro/macro-segment-unknown.hpp new file mode 100644 index 00000000..a45dded9 --- /dev/null +++ b/lib/macro/macro-segment-unknown.hpp @@ -0,0 +1,74 @@ +#pragma once +#include "macro-action.hpp" +#include "macro-condition.hpp" + +#include + +#include + +namespace advss { + +// Retains the settings and ID of the macro segment even if they can't be +// interpreted correctly right now. +// +// As soon as a version of the plugin supporting the original ID is running it +// will take over again +template class MacroSegmentUnknown : public T { +public: + MacroSegmentUnknown(Macro *macro, const std::string &originalId); + bool CheckCondition() { return false; } + std::shared_ptr Copy() const; + bool PerformAction() { return true; }; + bool Save(obs_data_t *data) const; + bool Load(obs_data_t *data); + std::string GetId() const { return "unknown"; } + +private: + std::string _id; + OBSData _settings; +}; + +template +inline MacroSegmentUnknown::MacroSegmentUnknown( + Macro *macro, const std::string &originalId) + : T(macro), + _id(originalId), + _settings(obs_data_create()) +{ + obs_data_release(_settings); +} + +template +inline std::shared_ptr MacroSegmentUnknown::Copy() const +{ + if constexpr (std::is_same_v) { + return std::make_shared>( + MacroAction::GetMacro(), _id); + } + return {}; +} + +template +inline bool MacroSegmentUnknown::Save(obs_data_t *data) const +{ + T::Save(data); + obs_data_apply(data, _settings); + obs_data_set_string(_settings, "id", _id.c_str()); + return true; +}; + +template inline bool MacroSegmentUnknown::Load(obs_data_t *data) +{ + T::Load(data); + obs_data_apply(_settings, data); + return true; +}; + +inline QWidget *CreateUnknownSegmentWidget(bool isAction) +{ + return new QLabel(obs_module_text( + isAction ? "AdvSceneSwitcher.action.unknown" + : "AdvSceneSwitcher.condition.unknown")); +} + +} // namespace advss