Add variable support to filter condition

This commit is contained in:
WarmUpTill 2022-12-27 20:14:51 +01:00 committed by WarmUpTill
parent eb478d2948
commit 30294842f2
2 changed files with 71 additions and 48 deletions

View File

@ -12,18 +12,33 @@ bool MacroConditionFilter::_registered = MacroConditionFactory::Register(
{MacroConditionFilter::Create, MacroConditionFilterEdit::Create,
"AdvSceneSwitcher.condition.filter"});
static std::map<FilterCondition, std::string> filterConditionTypes = {
{FilterCondition::ENABLED,
"AdvSceneSwitcher.condition.filter.type.active"},
{FilterCondition::DISABLED,
"AdvSceneSwitcher.condition.filter.type.showing"},
{FilterCondition::SETTINGS,
"AdvSceneSwitcher.condition.filter.type.settings"},
static std::map<MacroConditionFilter::Condition, std::string>
filterConditionTypes = {
{MacroConditionFilter::Condition::ENABLED,
"AdvSceneSwitcher.condition.filter.type.active"},
{MacroConditionFilter::Condition::DISABLED,
"AdvSceneSwitcher.condition.filter.type.showing"},
{MacroConditionFilter::Condition::SETTINGS,
"AdvSceneSwitcher.condition.filter.type.settings"},
};
void MacroConditionFilter::ResolveVariables()
{
if (_source.GetType() == SourceSelection::Type::SOURCE) {
return;
}
std::string name = GetWeakSourceName(_filter);
if (!name.empty()) {
_filterName = name;
}
_filter = GetWeakFilterByName(_source.GetSource(), _filterName.c_str());
}
bool MacroConditionFilter::CheckCondition()
{
if (!_source) {
ResolveVariables();
if (!_source.GetSource()) {
return false;
}
@ -31,13 +46,13 @@ bool MacroConditionFilter::CheckCondition()
auto s = obs_weak_source_get_source(_filter);
switch (_condition) {
case FilterCondition::ENABLED:
case Condition::ENABLED:
ret = obs_source_enabled(s);
break;
case FilterCondition::DISABLED:
case Condition::DISABLED:
ret = !obs_source_enabled(s);
break;
case FilterCondition::SETTINGS:
case Condition::SETTINGS:
ret = compareSourceSettings(_filter, _settings, _regex);
break;
default:
@ -45,15 +60,14 @@ bool MacroConditionFilter::CheckCondition()
}
obs_source_release(s);
return ret;
}
bool MacroConditionFilter::Save(obs_data_t *obj) const
{
MacroCondition::Save(obj);
obs_data_set_string(obj, "source", GetWeakSourceName(_source).c_str());
obs_data_set_string(obj, "filter", GetWeakSourceName(_filter).c_str());
_source.Save(obj);
obs_data_set_string(obj, "filter", _filterName.c_str());
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
_settings.Save(obj, "settings");
_regex.Save(obj);
@ -63,12 +77,11 @@ bool MacroConditionFilter::Save(obs_data_t *obj) const
bool MacroConditionFilter::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
const char *sourceName = obs_data_get_string(obj, "source");
_source = GetWeakSourceByName(sourceName);
const char *filterName = obs_data_get_string(obj, "filter");
_filter = GetWeakFilterByQString(_source, filterName);
_condition = static_cast<FilterCondition>(
obs_data_get_int(obj, "condition"));
_source.Load(obj);
_filterName = obs_data_get_string(obj, "filter");
_filter = GetWeakFilterByQString(_source.GetSource(),
_filterName.c_str());
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
_settings.Load(obj, "settings");
_regex.Load(obj);
// TOOD: remove in future version
@ -81,9 +94,8 @@ bool MacroConditionFilter::Load(obs_data_t *obj)
std::string MacroConditionFilter::GetShortDesc() const
{
if (_filter && _source) {
return GetWeakSourceName(_source) + " - " +
GetWeakSourceName(_filter);
if (_filter && !_source.ToString().empty()) {
return _source.ToString() + " - " + GetWeakSourceName(_filter);
}
return "";
}
@ -98,7 +110,7 @@ static inline void populateConditionSelection(QComboBox *list)
MacroConditionFilterEdit::MacroConditionFilterEdit(
QWidget *parent, std::shared_ptr<MacroConditionFilter> entryData)
: QWidget(parent),
_sources(new QComboBox()),
_sources(new SourceSelectionWidget(this, QStringList(), true)),
_filters(new QComboBox()),
_conditions(new QComboBox()),
_getSettings(new QPushButton(obs_module_text(
@ -108,10 +120,13 @@ MacroConditionFilterEdit::MacroConditionFilterEdit(
{
_filters->setSizeAdjustPolicy(QComboBox::AdjustToContents);
populateConditionSelection(_conditions);
populateSourcesWithFilterSelection(_sources);
auto sources = GetSourcesWithFilterNames();
sources.sort();
_sources->SetSourceNameList(sources);
QWidget::connect(_sources, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(SourceChanged(const QString &)));
QWidget::connect(_sources,
SIGNAL(SourceChanged(const SourceSelection &)), this,
SLOT(SourceChanged(const SourceSelection &)));
QWidget::connect(_filters, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(FilterChanged(const QString &)));
QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this,
@ -152,17 +167,17 @@ MacroConditionFilterEdit::MacroConditionFilterEdit(
_loading = false;
}
void MacroConditionFilterEdit::SourceChanged(const QString &text)
void MacroConditionFilterEdit::SourceChanged(const SourceSelection &source)
{
if (_loading || !_entryData) {
return;
}
{
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_source = GetWeakSourceByQString(text);
_entryData->_source = source;
}
_filters->clear();
populateFilterSelection(_filters, _entryData->_source);
populateFilterSelection(_filters, _entryData->_source.GetSource());
_filters->adjustSize();
}
@ -173,7 +188,9 @@ void MacroConditionFilterEdit::FilterChanged(const QString &text)
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_filter = GetWeakFilterByQString(_entryData->_source, text);
_entryData->_filterName = text.toStdString();
_entryData->_filter =
GetWeakFilterByQString(_entryData->_source.GetSource(), text);
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}
@ -185,14 +202,15 @@ void MacroConditionFilterEdit::ConditionChanged(int index)
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_condition = static_cast<FilterCondition>(index);
_entryData->_condition =
static_cast<MacroConditionFilter::Condition>(index);
SetSettingsSelectionVisible(_entryData->_condition ==
FilterCondition::SETTINGS);
MacroConditionFilter::Condition::SETTINGS);
}
void MacroConditionFilterEdit::GetSettingsClicked()
{
if (_loading || !_entryData || !_entryData->_source) {
if (_loading || !_entryData || !_entryData->_source.GetSource()) {
return;
}
@ -243,16 +261,15 @@ void MacroConditionFilterEdit::UpdateEntryData()
return;
}
_sources->setCurrentText(
GetWeakSourceName(_entryData->_source).c_str());
populateFilterSelection(_filters, _entryData->_source);
_sources->SetSource(_entryData->_source);
populateFilterSelection(_filters, _entryData->_source.GetSource());
_filters->setCurrentText(
GetWeakSourceName(_entryData->_filter).c_str());
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_settings->setPlainText(_entryData->_settings);
_regex->SetRegexConfig(_entryData->_regex);
SetSettingsSelectionVisible(_entryData->_condition ==
FilterCondition::SETTINGS);
MacroConditionFilter::Condition::SETTINGS);
adjustSize();
updateGeometry();

View File

@ -2,17 +2,12 @@
#include "macro.hpp"
#include "variable-text-edit.hpp"
#include "regex-config.hpp"
#include "source-selection.hpp"
#include <QComboBox>
#include <QPushButton>
#include <QCheckBox>
enum class FilterCondition {
ENABLED,
DISABLED,
SETTINGS,
};
class MacroConditionFilter : public MacroCondition {
public:
MacroConditionFilter(Macro *m) : MacroCondition(m) {}
@ -26,15 +21,26 @@ public:
return std::make_shared<MacroConditionFilter>(m);
}
OBSWeakSource _source;
enum class Condition {
ENABLED,
DISABLED,
SETTINGS,
};
SourceSelection _source;
OBSWeakSource _filter;
FilterCondition _condition = FilterCondition::ENABLED;
Condition _condition = Condition::ENABLED;
VariableResolvingString _settings = "";
RegexConfig _regex;
private:
void ResolveVariables();
std::string _filterName = "";
static bool _registered;
static const std::string id;
friend class MacroConditionFilterEdit;
};
class MacroConditionFilterEdit : public QWidget {
@ -54,7 +60,7 @@ public:
}
private slots:
void SourceChanged(const QString &text);
void SourceChanged(const SourceSelection &);
void FilterChanged(const QString &text);
void ConditionChanged(int cond);
void GetSettingsClicked();
@ -64,7 +70,7 @@ signals:
void HeaderInfoChanged(const QString &);
protected:
QComboBox *_sources;
SourceSelectionWidget *_sources;
QComboBox *_filters;
QComboBox *_conditions;
QPushButton *_getSettings;