Implement source item transform changed condition (#885)

This commit is contained in:
Michael Kirsch
2023-10-03 19:55:45 +02:00
committed by GitHub
parent 6558792e73
commit de8da553f1
8 changed files with 139 additions and 16 deletions

View File

@@ -12,19 +12,79 @@ bool MacroConditionSceneTransform::_registered =
MacroConditionSceneTransformEdit::Create,
"AdvSceneSwitcher.condition.sceneTransform"});
bool MacroConditionSceneTransform::CheckCondition()
const static std::map<MacroConditionSceneTransform::CondType, std::string>
conditionTypes = {
{MacroConditionSceneTransform::CondType::MATCHES,
"AdvSceneSwitcher.condition.sceneTransform.entry.type.matches"},
{MacroConditionSceneTransform::CondType::CHANGED,
"AdvSceneSwitcher.condition.sceneTransform.entry.type.changed"},
};
static bool doesTransformOfAnySceneItemMatch(
const std::vector<OBSSceneItem> &items, const std::string &jsonCompare,
const RegexConfig &regex, std::string &newVariable)
{
bool ret = false;
auto items = _source.GetSceneItems(_scene);
std::string json;
for (const auto &item : items) {
json = GetSceneItemTransform(item);
if (MatchJson(json, _settings, _regex)) {
if (MatchJson(json, jsonCompare, regex)) {
ret = true;
}
}
SetVariableValue(json);
newVariable = json;
return ret;
}
static bool
didTransformOfAnySceneItemChange(const std::vector<OBSSceneItem> &items,
std::vector<std::string> &previousTransform,
std::string &newVariable)
{
bool ret = false;
std::string json;
RegexConfig regex;
int n_items = items.size();
if (previousTransform.size() < n_items) {
ret = true;
previousTransform.resize(n_items);
}
for (int idx = 0; idx < n_items; ++idx) {
auto const &item = items[idx];
json = GetSceneItemTransform(item);
if (!MatchJson(json, previousTransform[idx], regex)) {
ret = true;
previousTransform[idx] = json;
}
}
newVariable = json;
return ret;
}
bool MacroConditionSceneTransform::CheckCondition()
{
auto items = _source.GetSceneItems(_scene);
if (items.empty()) {
return false;
}
std::string newVariable = "";
bool ret = false;
switch (_type) {
case CondType::MATCHES:
ret = doesTransformOfAnySceneItemMatch(items, _settings, _regex,
newVariable);
break;
case CondType::CHANGED:
ret = didTransformOfAnySceneItemChange(
items, _previousTransform, newVariable);
break;
default:
return false;
}
SetVariableValue(newVariable);
return ret;
}
@@ -35,6 +95,7 @@ bool MacroConditionSceneTransform::Save(obs_data_t *obj) const
_source.Save(obj);
_settings.Save(obj, "settings");
_regex.Save(obj);
obs_data_set_int(obj, "type", static_cast<int>(_type));
return true;
}
@@ -52,6 +113,7 @@ bool MacroConditionSceneTransform::Load(obs_data_t *obj)
_source.Load(obj);
_settings.Load(obj, "settings");
_regex.Load(obj);
_type = static_cast<CondType>(obs_data_get_int(obj, "type"));
// TOOD: remove in future version
if (obs_data_has_user_value(obj, "regex")) {
_regex.CreateBackwardsCompatibleRegex(
@@ -69,6 +131,13 @@ std::string MacroConditionSceneTransform::GetShortDesc() const
return _scene.ToString() + " - " + _source.ToString();
}
static inline void populateTypesSelection(QComboBox *list)
{
for (const auto &entry : conditionTypes) {
list->addItem(obs_module_text(entry.second.c_str()));
}
}
MacroConditionSceneTransformEdit::MacroConditionSceneTransformEdit(
QWidget *parent,
std::shared_ptr<MacroConditionSceneTransform> entryData)
@@ -76,11 +145,14 @@ MacroConditionSceneTransformEdit::MacroConditionSceneTransformEdit(
_scenes(new SceneSelectionWidget(window(), true, false, false, true)),
_sources(new SceneItemSelectionWidget(
parent, true, SceneItemSelectionWidget::Placeholder::ANY)),
_types(new QComboBox()),
_getSettings(new QPushButton(obs_module_text(
"AdvSceneSwitcher.condition.sceneTransform.getTransform"))),
_settings(new VariableTextEdit(this)),
_regex(new RegexConfigWidget(parent))
{
populateTypesSelection(_types);
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
this, SLOT(SceneChanged(const SceneSelection &)));
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
@@ -88,6 +160,8 @@ MacroConditionSceneTransformEdit::MacroConditionSceneTransformEdit(
QWidget::connect(_sources,
SIGNAL(SceneItemChanged(const SceneItemSelection &)),
this, SLOT(SourceChanged(const SceneItemSelection &)));
QWidget::connect(_types, SIGNAL(currentIndexChanged(int)), this,
SLOT(TypeChanged(int)));
QWidget::connect(_getSettings, SIGNAL(clicked()), this,
SLOT(GetSettingsClicked()));
QWidget::connect(_settings, SIGNAL(textChanged()), this,
@@ -96,8 +170,11 @@ MacroConditionSceneTransformEdit::MacroConditionSceneTransformEdit(
SLOT(RegexChanged(RegexConfig)));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", _scenes}, {"{{sources}}", _sources},
{"{{settings}}", _settings}, {"{{getSettings}}", _getSettings},
{"{{scenes}}", _scenes},
{"{{sources}}", _sources},
{"{{types}}", _types},
{"{{settings}}", _settings},
{"{{getSettings}}", _getSettings},
{"{{regex}}", _regex},
};
@@ -136,11 +213,10 @@ void MacroConditionSceneTransformEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene);
_sources->SetSceneItem(_entryData->_source);
_types->setCurrentIndex(static_cast<int>(_entryData->_type));
_regex->SetRegexConfig(_entryData->_regex);
_settings->setPlainText(_entryData->_settings);
adjustSize();
updateGeometry();
SetWidgetVisibility();
}
void MacroConditionSceneTransformEdit::SceneChanged(const SceneSelection &s)
@@ -168,6 +244,18 @@ void MacroConditionSceneTransformEdit::SourceChanged(
updateGeometry();
}
void MacroConditionSceneTransformEdit::TypeChanged(int index)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_type =
static_cast<MacroConditionSceneTransform::CondType>(index);
SetWidgetVisibility();
}
void MacroConditionSceneTransformEdit::GetSettingsClicked()
{
@@ -213,4 +301,16 @@ void MacroConditionSceneTransformEdit::RegexChanged(RegexConfig conf)
updateGeometry();
}
void MacroConditionSceneTransformEdit::SetWidgetVisibility()
{
const bool showSettingsAndRegex =
_entryData->_type ==
MacroConditionSceneTransform::CondType::MATCHES;
_settings->setVisible(showSettingsAndRegex);
_getSettings->setVisible(showSettingsAndRegex);
_regex->setVisible(showSettingsAndRegex);
adjustSize();
updateGeometry();
}
} // namespace advss

View File

@@ -23,12 +23,20 @@ public:
return std::make_shared<MacroConditionSceneTransform>(m);
}
enum class CondType {
MATCHES,
CHANGED,
};
SceneSelection _scene;
SceneItemSelection _source;
CondType _type = CondType::MATCHES;
RegexConfig _regex;
StringVariable _settings = "";
private:
std::vector<std::string> _previousTransform;
static bool _registered;
static const std::string id;
};
@@ -54,6 +62,7 @@ public:
private slots:
void SceneChanged(const SceneSelection &);
void SourceChanged(const SceneItemSelection &);
void TypeChanged(int type);
void GetSettingsClicked();
void SettingsChanged();
void RegexChanged(RegexConfig);
@@ -63,6 +72,7 @@ signals:
protected:
SceneSelectionWidget *_scenes;
SceneItemSelectionWidget *_sources;
QComboBox *_types;
QPushButton *_getSettings;
VariableTextEdit *_settings;
RegexConfigWidget *_regex;
@@ -70,6 +80,7 @@ protected:
std::shared_ptr<MacroConditionSceneTransform> _entryData;
private:
void SetWidgetVisibility();
bool _loading = true;
};