diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 2943de39..1fad44d1 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -605,6 +605,7 @@ 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.hotkey.macro.togglePause="Toggle pause of macro %1" AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?" AdvSceneSwitcher.askForMacro="Select macro {{macroSelection}}" diff --git a/src/headers/macro.hpp b/src/headers/macro.hpp index 883391d5..4b08cb25 100644 --- a/src/headers/macro.hpp +++ b/src/headers/macro.hpp @@ -112,6 +112,7 @@ private: int _count = 0; obs_hotkey_id _pauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; + obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID; }; Macro *GetMacroByName(const char *name); diff --git a/src/macro.cpp b/src/macro.cpp index ae2a9696..f83f00aa 100644 --- a/src/macro.cpp +++ b/src/macro.cpp @@ -167,6 +167,10 @@ bool Macro::Save(obs_data_t *obj) 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 *togglePauseHotkey = + obs_hotkey_save(_togglePauseHotkey); + obs_data_set_array(obj, "togglePauseHotkey", togglePauseHotkey); + obs_data_array_release(togglePauseHotkey); obs_data_array_t *conditions = obs_data_array_create(); for (auto &c : _conditions) { @@ -237,11 +241,14 @@ bool Macro::Load(obs_data_t *obj) 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); + obs_data_array_t *togglePauseHotkey = + obs_data_get_array(obj, "togglePauseHotkey"); + obs_hotkey_load(_togglePauseHotkey, togglePauseHotkey); + obs_data_array_release(togglePauseHotkey); SetHotkeysDesc(); @@ -331,75 +338,90 @@ bool Macro::SwitchesScene() return false; } -static void pauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, - bool pressed) +static void pauseCB(void *data, obs_hotkey_id, obs_hotkey_t *, bool pressed) { - UNUSED_PARAMETER(id); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(hotkey); if (pressed) { auto m = static_cast(data); m->SetPaused(true); } } -static void unpauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, - bool pressed) +static void unpauseCB(void *data, obs_hotkey_id, obs_hotkey_t *, bool pressed) { - UNUSED_PARAMETER(id); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(hotkey); if (pressed) { auto m = static_cast(data); m->SetPaused(false); } } +static void togglePauseCB(void *data, obs_hotkey_id, obs_hotkey_t *, + bool pressed) +{ + if (pressed) { + auto m = static_cast(data); + m->SetPaused(!m->Paused()); + } +} + static int macroHotkeyID = 0; +obs_hotkey_id registerHotkeyHelper(const std::string prefix, + const char *formatModuleText, Macro *macro, + obs_hotkey_func func) +{ + macroHotkeyID++; + + std::string hotkeyName = prefix + std::to_string(macroHotkeyID); + QString format{obs_module_text(formatModuleText)}; + QString hotkeyDesc = format.arg(QString::fromStdString(macro->Name())); + return obs_hotkey_register_frontend(hotkeyName.c_str(), + hotkeyDesc.toStdString().c_str(), + func, macro); +} + void Macro::SetupHotkeys() { if (_pauseHotkey != OBS_INVALID_HOTKEY_ID || - _unpauseHotkey != OBS_INVALID_HOTKEY_ID) { + _unpauseHotkey != OBS_INVALID_HOTKEY_ID || + _togglePauseHotkey != 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); + _pauseHotkey = registerHotkeyHelper( + "macro_pause_hotkey_", "AdvSceneSwitcher.hotkey.macro.pause", + this, pauseCB); + _unpauseHotkey = registerHotkeyHelper( + "macro_unpause_hotkey_", + "AdvSceneSwitcher.hotkey.macro.unpause", this, unpauseCB); + _togglePauseHotkey = registerHotkeyHelper( + "macro_toggle_pause_hotkey_", + "AdvSceneSwitcher.hotkey.macro.togglePause", this, + togglePauseCB); } void Macro::ClearHotkeys() { obs_hotkey_unregister(_pauseHotkey); obs_hotkey_unregister(_unpauseHotkey); + obs_hotkey_unregister(_togglePauseHotkey); +} + +void setHotkeyDescriptionHelper(const char *formatModuleText, + const std::string name, const obs_hotkey_id id) +{ + QString format{obs_module_text(formatModuleText)}; + QString hotkeyDesc = format.arg(QString::fromStdString(name)); + obs_hotkey_set_description(id, hotkeyDesc.toStdString().c_str()); } 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()); + setHotkeyDescriptionHelper("AdvSceneSwitcher.hotkey.macro.pause", _name, + _pauseHotkey); + setHotkeyDescriptionHelper("AdvSceneSwitcher.hotkey.macro.unpause", + _name, _unpauseHotkey); + setHotkeyDescriptionHelper("AdvSceneSwitcher.hotkey.macro.togglePause", + _name, _togglePauseHotkey); } bool MacroCondition::Save(obs_data_t *obj)