Retain settings of currently unknown macro segments

This commit is contained in:
WarmUpTill 2025-10-18 00:02:28 +02:00 committed by WarmUpTill
parent 10d45c67d6
commit badce063eb
4 changed files with 89 additions and 47 deletions

View File

@ -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

View File

@ -1,25 +1,11 @@
#include "macro-action-factory.hpp"
#include "macro-segment-unknown.hpp"
#include <mutex>
namespace advss {
namespace {
class MacroActionUnknown : public MacroAction {
public:
MacroActionUnknown(Macro *m) : MacroAction(m) {}
std::shared_ptr<MacroAction> Copy() const
{
return std::make_shared<MacroActionUnknown>(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<MacroAction>;
static std::recursive_mutex mutex;
@ -49,9 +35,10 @@ bool MacroActionFactory::Deregister(const std::string &id)
return true;
}
static std::shared_ptr<MacroAction> createUnknownAction(Macro *m)
static std::shared_ptr<MacroAction> createUnknownAction(Macro *m,
const std::string &id)
{
return std::make_shared<MacroActionUnknown>(m);
return std::make_shared<MacroActionUnknown>(m, id);
}
std::shared_ptr<MacroAction> MacroActionFactory::Create(const std::string &id,
@ -62,12 +49,7 @@ std::shared_ptr<MacroAction> 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)

View File

@ -1,21 +1,11 @@
#include "macro-condition-factory.hpp"
#include "macro-segment-unknown.hpp"
#include <mutex>
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<MacroCondition>;
static std::recursive_mutex mutex;
@ -46,9 +36,10 @@ bool MacroConditionFactory::Deregister(const std::string &id)
return true;
}
static std::shared_ptr<MacroCondition> createUnknownCondition(Macro *m)
static std::shared_ptr<MacroCondition>
createUnknownCondition(Macro *m, const std::string &id)
{
return std::make_shared<MacroConditionUnknown>(m);
return std::make_shared<MacroConditionUnknown>(m, id);
}
std::shared_ptr<MacroCondition>
@ -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)

View File

@ -0,0 +1,74 @@
#pragma once
#include "macro-action.hpp"
#include "macro-condition.hpp"
#include <obs.hpp>
#include <QLabel>
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<typename T> class MacroSegmentUnknown : public T {
public:
MacroSegmentUnknown(Macro *macro, const std::string &originalId);
bool CheckCondition() { return false; }
std::shared_ptr<MacroAction> 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<typename T>
inline MacroSegmentUnknown<T>::MacroSegmentUnknown(
Macro *macro, const std::string &originalId)
: T(macro),
_id(originalId),
_settings(obs_data_create())
{
obs_data_release(_settings);
}
template<typename T>
inline std::shared_ptr<MacroAction> MacroSegmentUnknown<T>::Copy() const
{
if constexpr (std::is_same_v<T, MacroAction>) {
return std::make_shared<MacroSegmentUnknown<T>>(
MacroAction::GetMacro(), _id);
}
return {};
}
template<typename T>
inline bool MacroSegmentUnknown<T>::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<typename T> inline bool MacroSegmentUnknown<T>::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