Add option to check action enable state to "Macro" condition

This commit is contained in:
WarmUpTill
2023-07-22 15:09:31 +02:00
committed by WarmUpTill
parent df7fc7ec01
commit 08e430396a
3 changed files with 136 additions and 67 deletions

View File

@@ -307,10 +307,12 @@ AdvSceneSwitcher.condition.timer.entry.line2="Time remaining: {{remaining}} seco
AdvSceneSwitcher.condition.timer.entry.line3="{{pauseContinue}} {{reset}} {{saveRemaining}} Save time remaining {{autoReset}} Automatically reset timer after duration was reached"
AdvSceneSwitcher.condition.timer.reset="Reset"
AdvSceneSwitcher.condition.macro="Macro"
AdvSceneSwitcher.condition.macro.type.count="Count"
AdvSceneSwitcher.condition.macro.type.state="State"
AdvSceneSwitcher.condition.macro.type.multiState="Multiple states"
AdvSceneSwitcher.condition.macro.type.selection="Condition type: {{types}}"
AdvSceneSwitcher.condition.macro.type.count="Macro run count"
AdvSceneSwitcher.condition.macro.type.state="Macro condition state"
AdvSceneSwitcher.condition.macro.type.multiState="Multiple macro condition state"
AdvSceneSwitcher.condition.macro.type.actionDisabled="Macro action disabled"
AdvSceneSwitcher.condition.macro.type.actionEnabled="Macro action enabled"
AdvSceneSwitcher.condition.macro.type.selection="{{types}}"
AdvSceneSwitcher.condition.macro.count.type.below="Less than"
AdvSceneSwitcher.condition.macro.count.type.above="More than"
AdvSceneSwitcher.condition.macro.count.type.equal="Exactly"
@@ -323,6 +325,8 @@ AdvSceneSwitcher.condition.macro.state.entry="Conditions of {{macros}} are true"
AdvSceneSwitcher.condition.macro.multistate.entry="Conditions of {{multiStateConditions}}{{multiStateCount}} of the following macros are true:"
AdvSceneSwitcher.condition.macro.count.entry.line1="{{macros}} was executed {{conditions}} {{count}} times"
AdvSceneSwitcher.condition.macro.count.entry.line2="Current count: {{currentCount}} {{resetCount}}"
AdvSceneSwitcher.condition.macro.actionState.disabled.entry="Action{{actionIndex}}of{{macros}}is disabled"
AdvSceneSwitcher.condition.macro.actionState.enabled.entry="Action{{actionIndex}}of{{macros}}is enabled"
AdvSceneSwitcher.condition.source="Source"
AdvSceneSwitcher.condition.source.type.active="Is active"
AdvSceneSwitcher.condition.source.type.showing="Is showing"

View File

@@ -1,5 +1,6 @@
#include "macro-condition-macro.hpp"
#include "macro.hpp"
#include "macro-action-edit.hpp"
#include "utility.hpp"
namespace advss {
@@ -19,6 +20,10 @@ const static std::map<MacroConditionMacro::Type, std::string>
"AdvSceneSwitcher.condition.macro.type.state"},
{MacroConditionMacro::Type::MULTI_STATE,
"AdvSceneSwitcher.condition.macro.type.multiState"},
{MacroConditionMacro::Type::ACTION_DISABLED,
"AdvSceneSwitcher.condition.macro.type.actionDisabled"},
{MacroConditionMacro::Type::ACTION_ENABLED,
"AdvSceneSwitcher.condition.macro.type.actionEnabled"},
};
const static std::map<MacroConditionMacro::CounterCondition, std::string>
@@ -84,6 +89,24 @@ bool MacroConditionMacro::CheckMultiStateCondition()
return false;
}
bool MacroConditionMacro::CheckActionStateCondition()
{
auto macro = _macro.GetMacro();
if (!macro) {
return false;
}
if (!IsValidMacroSegmentIndex(macro.get(), _actionIndex - 1, false)) {
return false;
}
if (_type == Type::ACTION_DISABLED) {
return !macro->Actions().at(_actionIndex - 1)->Enabled();
} else if (_type == Type::ACTION_ENABLED) {
return macro->Actions().at(_actionIndex - 1)->Enabled();
}
return false;
}
bool MacroConditionMacro::CheckCountCondition()
{
auto macro = _macro.GetMacro();
@@ -114,6 +137,9 @@ bool MacroConditionMacro::CheckCondition()
return CheckMultiStateCondition();
case Type::COUNT:
return CheckCountCondition();
case Type::ACTION_DISABLED:
case Type::ACTION_ENABLED:
return CheckActionStateCondition();
default:
break;
}
@@ -132,6 +158,7 @@ bool MacroConditionMacro::Save(obs_data_t *obj) const
_multiSateCount.Save(obj, "multiStateCount");
obs_data_set_int(obj, "multiStateCondition",
static_cast<int>(_multiSateCondition));
_actionIndex.Save(obj, "actionIndex");
obs_data_set_int(obj, "version", 1);
return true;
}
@@ -144,6 +171,7 @@ bool MacroConditionMacro::Load(obs_data_t *obj)
_type = static_cast<Type>(obs_data_get_int(obj, "type"));
_counterCondition = static_cast<CounterCondition>(
obs_data_get_int(obj, "condition"));
_actionIndex.Load(obj, "actionIndex");
// TODO: Remove this fallback in future version
if (!obs_data_has_user_value(obj, "multiStateCondition")) {
_multiSateCondition = MultiStateCondition::ABOVE;
@@ -211,7 +239,9 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
_settingsLine2(new QHBoxLayout()),
_macroList(new MacroList(this, false, false)),
_multiStateConditions(new QComboBox()),
_multiStateCount(new VariableSpinBox())
_multiStateCount(new VariableSpinBox()),
_actionIndex(new MacroSegmentSelection(
this, MacroSegmentSelection::Type::ACTION))
{
_count->setMaximum(10000000);
populateTypeSelection(_types);
@@ -246,6 +276,9 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this,
SLOT(MultiStateCountChanged(const NumberVariable<int> &)));
QWidget::connect(_actionIndex,
SIGNAL(SelectionChanged(const IntVariable &)), this,
SLOT(ActionIndexChanged(const IntVariable &)));
auto typesLayout = new QHBoxLayout();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -295,10 +328,34 @@ void MacroConditionMacroEdit::ClearLayouts()
_settingsLine2->removeWidget(_resetCount);
_settingsLine1->removeWidget(_multiStateConditions);
_settingsLine1->removeWidget(_multiStateCount);
_settingsLine1->removeWidget(_actionIndex);
ClearLayout(_settingsLine1);
ClearLayout(_settingsLine2);
}
void MacroConditionMacroEdit::SetupWidgets()
{
switch (_entryData->_type) {
case MacroConditionMacro::Type::COUNT:
SetupCountWidgets();
break;
case MacroConditionMacro::Type::STATE:
SetupStateWidgets();
break;
case MacroConditionMacro::Type::MULTI_STATE:
SetupMultiStateWidgets();
break;
case MacroConditionMacro::Type::ACTION_DISABLED:
SetupActionStateWidgets(false);
break;
case MacroConditionMacro::Type::ACTION_ENABLED:
SetupActionStateWidgets(true);
break;
default:
break;
}
}
void MacroConditionMacroEdit::SetupStateWidgets()
{
SetWidgetVisibility();
@@ -349,43 +406,51 @@ void MacroConditionMacroEdit::SetupCountWidgets()
_settingsLine2, widgetPlaceholders);
}
void MacroConditionMacroEdit::SetupActionStateWidgets(bool enable)
{
SetWidgetVisibility();
ClearLayouts();
PlaceWidgets(
obs_module_text(
enable ? "AdvSceneSwitcher.condition.macro.actionState.enabled.entry"
: "AdvSceneSwitcher.condition.macro.actionState.disabled.entry"),
_settingsLine1,
{{"{{macros}}", _macros}, {"{{actionIndex}}", _actionIndex}});
}
void MacroConditionMacroEdit::SetWidgetVisibility()
{
switch (_entryData->_type) {
case MacroConditionMacro::Type::COUNT:
_macros->show();
_counterConditions->show();
_count->show();
_currentCount->show();
_resetCount->show();
_macroList->hide();
_multiStateConditions->hide();
_multiStateCount->hide();
break;
case MacroConditionMacro::Type::STATE:
_macros->show();
_counterConditions->hide();
_count->hide();
_currentCount->hide();
_resetCount->hide();
_macroList->hide();
_multiStateConditions->hide();
_multiStateCount->hide();
break;
case MacroConditionMacro::Type::MULTI_STATE:
_macros->hide();
_counterConditions->hide();
_count->hide();
_currentCount->hide();
_macros->setVisible(
_entryData->_type == MacroConditionMacro::Type::COUNT ||
_entryData->_type == MacroConditionMacro::Type::STATE ||
_entryData->_type ==
MacroConditionMacro::Type::ACTION_DISABLED ||
_entryData->_type == MacroConditionMacro::Type::ACTION_ENABLED);
_counterConditions->setVisible(_entryData->_type ==
MacroConditionMacro::Type::COUNT);
_count->setVisible(_entryData->_type ==
MacroConditionMacro::Type::COUNT);
_currentCount->setVisible(_entryData->_type ==
MacroConditionMacro::Type::COUNT);
_resetCount->setVisible(_entryData->_type ==
MacroConditionMacro::Type::COUNT);
_macroList->setVisible(_entryData->_type ==
MacroConditionMacro::Type::MULTI_STATE);
_multiStateConditions->setVisible(
_entryData->_type == MacroConditionMacro::Type::MULTI_STATE);
_multiStateCount->setVisible(_entryData->_type ==
MacroConditionMacro::Type::MULTI_STATE);
_actionIndex->setVisible(
_entryData->_type ==
MacroConditionMacro::Type::ACTION_DISABLED ||
_entryData->_type == MacroConditionMacro::Type::ACTION_ENABLED);
if (_entryData->_type == MacroConditionMacro::Type::MULTI_STATE ||
_entryData->_type == MacroConditionMacro::Type::ACTION_DISABLED ||
_entryData->_type == MacroConditionMacro::Type::ACTION_ENABLED) {
_pausedWarning->hide();
_resetCount->hide();
_macroList->show();
_multiStateConditions->show();
_multiStateCount->show();
break;
default:
break;
}
adjustSize();
updateGeometry();
}
@@ -396,20 +461,7 @@ void MacroConditionMacroEdit::UpdateEntryData()
return;
}
switch (_entryData->_type) {
case MacroConditionMacro::Type::COUNT:
SetupCountWidgets();
break;
case MacroConditionMacro::Type::STATE:
SetupStateWidgets();
break;
case MacroConditionMacro::Type::MULTI_STATE:
SetupMultiStateWidgets();
break;
default:
break;
}
SetupWidgets();
_macros->SetCurrentMacro(_entryData->_macro);
_types->setCurrentIndex(static_cast<int>(_entryData->_type));
_counterConditions->setCurrentIndex(
@@ -419,6 +471,9 @@ void MacroConditionMacroEdit::UpdateEntryData()
_multiStateConditions->setCurrentIndex(
static_cast<int>(_entryData->_multiSateCondition));
_multiStateCount->SetValue(_entryData->_multiSateCount);
_actionIndex->SetValue(_entryData->_actionIndex);
_actionIndex->SetMacro(_entryData->_macro.GetMacro());
SetWidgetVisibility();
}
void MacroConditionMacroEdit::MacroChanged(const QString &text)
@@ -429,6 +484,7 @@ void MacroConditionMacroEdit::MacroChanged(const QString &text)
auto lock = LockContext();
_entryData->_macro = text;
_actionIndex->SetMacro(_entryData->_macro.GetMacro());
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}
@@ -469,6 +525,7 @@ void MacroConditionMacroEdit::MacroRemove(const QString &)
}
}
adjustSize();
updateGeometry();
}
void MacroConditionMacroEdit::TypeChanged(int type)
@@ -479,20 +536,7 @@ void MacroConditionMacroEdit::TypeChanged(int type)
auto lock = LockContext();
_entryData->_type = static_cast<MacroConditionMacro::Type>(type);
switch (_entryData->_type) {
case MacroConditionMacro::Type::COUNT:
SetupCountWidgets();
break;
case MacroConditionMacro::Type::STATE:
SetupStateWidgets();
break;
case MacroConditionMacro::Type::MULTI_STATE:
SetupMultiStateWidgets();
break;
default:
break;
}
SetupWidgets();
}
void MacroConditionMacroEdit::ResetClicked()
@@ -565,6 +609,7 @@ void MacroConditionMacroEdit::Add(const std::string &name)
MacroRef macro(name);
_entryData->_macros.push_back(macro);
adjustSize();
updateGeometry();
}
void MacroConditionMacroEdit::Remove(int idx)
@@ -576,6 +621,7 @@ void MacroConditionMacroEdit::Remove(int idx)
auto lock = LockContext();
_entryData->_macros.erase(std::next(_entryData->_macros.begin(), idx));
adjustSize();
updateGeometry();
}
void MacroConditionMacroEdit::Replace(int idx, const std::string &name)
@@ -588,6 +634,17 @@ void MacroConditionMacroEdit::Replace(int idx, const std::string &name)
auto lock = LockContext();
_entryData->_macros[idx] = macro;
adjustSize();
updateGeometry();
}
void MacroConditionMacroEdit::ActionIndexChanged(const IntVariable &value)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_actionIndex = value;
}
} // namespace advss

View File

@@ -2,7 +2,7 @@
#include "macro-condition-edit.hpp"
#include "macro-selection.hpp"
#include "macro-list.hpp"
#include "variable-spinbox.hpp"
#include "macro-segment-selection.hpp"
#include <QComboBox>
#include <QSpinBox>
@@ -37,6 +37,8 @@ public:
COUNT,
STATE,
MULTI_STATE,
ACTION_DISABLED,
ACTION_ENABLED,
};
Type _type = Type::STATE;
@@ -55,11 +57,13 @@ public:
};
MultiStateCondition _multiSateCondition = MultiStateCondition::ABOVE;
NumberVariable<int> _multiSateCount = 0;
IntVariable _actionIndex = 1;
private:
bool CheckCountCondition();
bool CheckStateCondition();
bool CheckMultiStateCondition();
bool CheckActionStateCondition();
static bool _registered;
static const std::string id;
@@ -95,6 +99,7 @@ private slots:
void Add(const std::string &);
void Remove(int);
void Replace(int, const std::string &);
void ActionIndexChanged(const IntVariable &value);
signals:
void HeaderInfoChanged(const QString &);
@@ -111,15 +116,18 @@ protected:
MacroList *_macroList;
QComboBox *_multiStateConditions;
VariableSpinBox *_multiStateCount;
MacroSegmentSelection *_actionIndex;
QTimer _countTimer;
QTimer _pausedTimer;
std::shared_ptr<MacroConditionMacro> _entryData;
private:
void ClearLayouts();
void SetupWidgets();
void SetupStateWidgets();
void SetupMultiStateWidgets();
void SetupCountWidgets();
void SetupActionStateWidgets(bool enable);
void SetWidgetVisibility();
bool _loading = true;
};