From e147402250ef01f8020af47bca9981886e92ffa6 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 23 Dec 2022 23:28:00 +0100 Subject: [PATCH] Improve random action * Allow duplicates to enable weighting macro occurance * Add option to allow consecutive execution of the same macro --- data/locale/en-US.ini | 1 + src/macro-core/macro-action-random.cpp | 46 +++++++++++++++++++++++--- src/macro-core/macro-action-random.hpp | 9 +++-- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 66babe54..ad2426bd 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -522,6 +522,7 @@ AdvSceneSwitcher.action.timer.type.reset="Reset" AdvSceneSwitcher.action.timer.type.setTimeRemaining="Set time remaining of" AdvSceneSwitcher.action.timer.entry="{{timerAction}} timers on {{macros}} {{duration}}" AdvSceneSwitcher.action.random="Random" +AdvSceneSwitcher.action.random.allowRepeat="Allow consecutive execution of the same macro" AdvSceneSwitcher.action.random.entry="Randomly run any of the following macros (paused macros are ignored)" AdvSceneSwitcher.action.systray="System tray notification" AdvSceneSwitcher.action.systray.entry="Show notification: {{message}}" diff --git a/src/macro-core/macro-action-random.cpp b/src/macro-core/macro-action-random.cpp index d258b188..07bc569f 100644 --- a/src/macro-core/macro-action-random.cpp +++ b/src/macro-core/macro-action-random.cpp @@ -11,8 +11,8 @@ bool MacroActionRandom::_registered = MacroActionFactory::Register( {MacroActionRandom::Create, MacroActionRandomEdit::Create, "AdvSceneSwitcher.action.random"}); -std::vector getNextMacro(std::vector ¯os, - MacroRef &lastRandomMacro) +std::vector getNextMacros(std::vector ¯os, + MacroRef &lastRandomMacro, bool allowRepeat) { std::vector res; if (macros.size() == 1) { @@ -25,7 +25,7 @@ std::vector getNextMacro(std::vector ¯os, for (auto &m : macros) { if (m.get() && !m->Paused() && - !(lastRandomMacro.get() == m.get())) { + (allowRepeat || (lastRandomMacro.get() != m.get()))) { res.push_back(m); } } @@ -38,7 +38,7 @@ bool MacroActionRandom::PerformAction() return true; } - auto macros = getNextMacro(_macros, lastRandomMacro); + auto macros = getNextMacros(_macros, lastRandomMacro, _allowRepeat); if (macros.size() == 0) { return true; } @@ -61,6 +61,7 @@ bool MacroActionRandom::Save(obs_data_t *obj) const { MacroAction::Save(obj); SaveMacroList(obj, _macros); + obs_data_set_bool(obj, "allowRepeat", _allowRepeat); return true; } @@ -68,12 +69,16 @@ bool MacroActionRandom::Load(obs_data_t *obj) { MacroAction::Load(obj); LoadMacroList(obj, _macros); + _allowRepeat = obs_data_get_bool(obj, "allowRepeat"); return true; } MacroActionRandomEdit::MacroActionRandomEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent), _list(new MacroList(this, false, false)) + : QWidget(parent), + _list(new MacroList(this, true, false)), + _allowRepeat(new QCheckBox(obs_module_text( + "AdvSceneSwitcher.action.random.allowRepeat"))) { QWidget::connect(_list, SIGNAL(Added(const std::string &)), this, SLOT(Add(const std::string &))); @@ -82,6 +87,8 @@ MacroActionRandomEdit::MacroActionRandomEdit( this, SLOT(Replace(int, const std::string &))); QWidget::connect(window(), SIGNAL(MacroRemoved(const QString &)), this, SLOT(MacroRemove(const QString &))); + QWidget::connect(_allowRepeat, SIGNAL(stateChanged(int)), this, + SLOT(AllowRepeatChanged(int))); auto *entryLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = {}; @@ -91,6 +98,7 @@ MacroActionRandomEdit::MacroActionRandomEdit( auto *mainLayout = new QVBoxLayout; mainLayout->addLayout(entryLayout); mainLayout->addWidget(_list); + mainLayout->addWidget(_allowRepeat); setLayout(mainLayout); _entryData = entryData; @@ -105,6 +113,8 @@ void MacroActionRandomEdit::UpdateEntryData() } _list->SetContent(_entryData->_macros); + _allowRepeat->setChecked(_entryData->_allowRepeat); + _allowRepeat->setVisible(ShouldShowAllowRepeat()); adjustSize(); } @@ -135,6 +145,7 @@ void MacroActionRandomEdit::Add(const std::string &name) std::lock_guard lock(switcher->m); MacroRef macro(name); _entryData->_macros.push_back(macro); + _allowRepeat->setVisible(ShouldShowAllowRepeat()); adjustSize(); } @@ -146,6 +157,7 @@ void MacroActionRandomEdit::Remove(int idx) std::lock_guard lock(switcher->m); _entryData->_macros.erase(std::next(_entryData->_macros.begin(), idx)); + _allowRepeat->setVisible(ShouldShowAllowRepeat()); adjustSize(); } @@ -160,3 +172,27 @@ void MacroActionRandomEdit::Replace(int idx, const std::string &name) _entryData->_macros[idx] = macro; adjustSize(); } + +void MacroActionRandomEdit::AllowRepeatChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_allowRepeat = value; +} + +bool MacroActionRandomEdit::ShouldShowAllowRepeat() +{ + if (_entryData->_macros.size() <= 1) { + return false; + } + const auto macro = _entryData->_macros[0]; + for (const auto m : _entryData->_macros) { + if (macro.get() != m.get()) { + return true; + } + } + return false; +} diff --git a/src/macro-core/macro-action-random.hpp b/src/macro-core/macro-action-random.hpp index 12989e7e..397cf785 100644 --- a/src/macro-core/macro-action-random.hpp +++ b/src/macro-core/macro-action-random.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include class MacroActionRandom : public MultiMacroRefAction { public: @@ -19,8 +19,7 @@ public: return std::make_shared(m); } - // TODO: add weights to each macro ... - // std::unordered_map _weights; + bool _allowRepeat = false; private: MacroRef lastRandomMacro; @@ -49,11 +48,15 @@ private slots: void Add(const std::string &); void Remove(int); void Replace(int, const std::string &); + void AllowRepeatChanged(int); protected: std::shared_ptr _entryData; private: + bool ShouldShowAllowRepeat(); + MacroList *_list; + QCheckBox *_allowRepeat; bool _loading = true; };