Add option to un-/pause macros using hotkeys

This commit is contained in:
WarmUpTill 2021-05-28 22:21:00 +02:00 committed by WarmUpTill
parent c18d799f4a
commit d9997d374d
3 changed files with 115 additions and 6 deletions

View File

@ -446,6 +446,8 @@ AdvSceneSwitcher.sceneTriggerTab.help="This tab allows you to trigger actions on
AdvSceneSwitcher.hotkey.startSwitcherHotkey="Start the Advanced Scene Switcher"
AdvSceneSwitcher.hotkey.stopSwitcherHotkey="Stop the Advanced Scene Switcher"
AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Toggle Start/Stop for the Advanced Scene Switcher"
AdvSceneSwitcher.hotkey.macro.pause="Pause macro %1"
AdvSceneSwitcher.hotkey.macro.unpause="Unpause macro %1"
AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?"

View File

@ -60,14 +60,14 @@ public:
class Macro {
public:
Macro(std::string name = "");
Macro(const std::string &name = "");
virtual ~Macro();
bool CeckMatch();
bool PerformAction();
bool Matched() { return _matched; }
std::string Name() { return _name; }
void SetName(const std::string &name) { _name = name; }
void SetName(const std::string &name);
void SetPaused(bool pause = true) { _paused = pause; }
bool Paused() { return _paused; }
int GetCount() { return _count; };
@ -88,12 +88,18 @@ public:
bool SwitchesScene();
private:
void SetupHotkeys();
void ClearHotkeys();
void SetHotkeysDesc();
std::string _name = "";
std::deque<std::shared_ptr<MacroCondition>> _conditions;
std::deque<std::shared_ptr<MacroAction>> _actions;
bool _matched = false;
bool _paused = false;
int _count = 0;
obs_hotkey_id _pauseHotkey = OBS_INVALID_HOTKEY_ID;
obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID;
};
Macro *GetMacroByName(const char *name);

View File

@ -17,9 +17,16 @@ const std::map<LogicType, LogicTypeInfo> MacroCondition::logicTypes = {
{LogicType::ROOT_NOT, {"AdvSceneSwitcher.logic.not"}},
};
Macro::Macro(std::string name) : _name(name) {}
Macro::Macro(const std::string &name)
{
SetupHotkeys();
SetName(name);
}
Macro::~Macro() {}
Macro::~Macro()
{
ClearHotkeys();
}
bool Macro::CeckMatch()
{
@ -94,11 +101,24 @@ bool Macro::PerformAction()
return ret;
}
void Macro::SetName(const std::string &name)
{
_name = name;
SetHotkeysDesc();
}
bool Macro::Save(obs_data_t *obj)
{
obs_data_set_string(obj, "name", _name.c_str());
obs_data_set_bool(obj, "pause", _paused);
obs_data_array_t *pauseHotkey = obs_hotkey_save(_pauseHotkey);
obs_data_set_array(obj, "pauseHotkey", pauseHotkey);
obs_data_array_release(pauseHotkey);
obs_data_array_t *unpauseHotkey = obs_hotkey_save(_unpauseHotkey);
obs_data_set_array(obj, "unpauseHotkey", unpauseHotkey);
obs_data_array_release(unpauseHotkey);
obs_data_array_t *conditions = obs_data_array_create();
for (auto &c : _conditions) {
obs_data_t *array_obj = obs_data_create();
@ -164,8 +184,19 @@ bool Macro::Load(obs_data_t *obj)
{
_name = obs_data_get_string(obj, "name");
_paused = obs_data_get_bool(obj, "pause");
bool root = true;
obs_data_array_t *pauseHotkey = obs_data_get_array(obj, "pauseHotkey");
obs_hotkey_load(_pauseHotkey, pauseHotkey);
obs_data_array_release(pauseHotkey);
obs_data_array_t *unpauseHotkey =
obs_data_get_array(obj, "unpauseHotkey");
obs_hotkey_load(_unpauseHotkey, unpauseHotkey);
obs_data_array_release(unpauseHotkey);
SetHotkeysDesc();
bool root = true;
obs_data_array_t *conditions = obs_data_get_array(obj, "conditions");
size_t count = obs_data_array_count(conditions);
@ -212,7 +243,6 @@ bool Macro::Load(obs_data_t *obj)
obs_data_release(array_obj);
}
obs_data_array_release(actions);
return true;
}
@ -245,6 +275,77 @@ bool Macro::SwitchesScene()
return false;
}
static void pauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
bool pressed)
{
UNUSED_PARAMETER(id);
UNUSED_PARAMETER(data);
UNUSED_PARAMETER(hotkey);
if (pressed) {
auto m = static_cast<Macro *>(data);
m->SetPaused(true);
}
}
static void unpauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
bool pressed)
{
UNUSED_PARAMETER(id);
UNUSED_PARAMETER(data);
UNUSED_PARAMETER(hotkey);
if (pressed) {
auto m = static_cast<Macro *>(data);
m->SetPaused(false);
}
}
static int macroHotkeyID = 0;
void Macro::SetupHotkeys()
{
if (_pauseHotkey != OBS_INVALID_HOTKEY_ID ||
_unpauseHotkey != OBS_INVALID_HOTKEY_ID) {
ClearHotkeys();
}
macroHotkeyID++;
std::string hotkeyName =
"macro_pause_hotkey_" + std::to_string(macroHotkeyID);
QString format{obs_module_text("AdvSceneSwitcher.hotkey.macro.pause")};
QString hotkeyDesc = format.arg(QString::fromStdString(_name));
_pauseHotkey = obs_hotkey_register_frontend(
hotkeyName.c_str(), hotkeyDesc.toStdString().c_str(), pauseCB,
this);
macroHotkeyID++;
hotkeyName = "macro_pause_hotkey_" + _name;
format = {obs_module_text("AdvSceneSwitcher.hotkey.macro.unpause")};
hotkeyDesc = format.arg(QString::fromStdString(_name));
_unpauseHotkey = obs_hotkey_register_frontend(
hotkeyName.c_str(), hotkeyDesc.toStdString().c_str(), unpauseCB,
this);
}
void Macro::ClearHotkeys()
{
obs_hotkey_unregister(_pauseHotkey);
obs_hotkey_unregister(_unpauseHotkey);
}
void Macro::SetHotkeysDesc()
{
QString format{obs_module_text("AdvSceneSwitcher.hotkey.macro.pause")};
QString hotkeyDesc = format.arg(QString::fromStdString(_name));
obs_hotkey_set_description(_pauseHotkey,
hotkeyDesc.toStdString().c_str());
format = {obs_module_text("AdvSceneSwitcher.hotkey.macro.unpause")};
hotkeyDesc = format.arg(QString::fromStdString(_name));
obs_hotkey_set_description(_unpauseHotkey,
hotkeyDesc.toStdString().c_str());
}
bool MacroCondition::Save(obs_data_t *obj)
{
obs_data_set_string(obj, "id", GetId().c_str());