diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 364867599..e97fd76a6 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -206,6 +206,8 @@ AdvSceneSwitcher.macroTab.expandAllGroups="Expand all Groups" AdvSceneSwitcher.macroTab.collapseAllGroups="Collapse all Groups" AdvSceneSwitcher.macroTab.rename="Rename" AdvSceneSwitcher.macroTab.remove="Remove" +AdvSceneSwitcher.macroTab.pause="Pause" +AdvSceneSwitcher.macroTab.unpause="Unpause" AdvSceneSwitcher.macroTab.export="Export" AdvSceneSwitcher.macroTab.export.info="Paste the string below into the import dialog to import the selected macros:" AdvSceneSwitcher.macroTab.export.usePlainText="Use plain text" diff --git a/lib/advanced-scene-switcher.hpp b/lib/advanced-scene-switcher.hpp index 6b8561bf9..14172a549 100644 --- a/lib/advanced-scene-switcher.hpp +++ b/lib/advanced-scene-switcher.hpp @@ -114,6 +114,8 @@ public slots: void RenameSelectedMacro(); void ExportMacros() const; void ImportMacros(); + void PauseSelectedMacros(); + void UnpauseSelectedMacros(); void HighlightOnChange() const; void on_macroSettings_clicked(); diff --git a/lib/macro/macro-tab.cpp b/lib/macro/macro-tab.cpp index 0287a176b..98ed78c12 100644 --- a/lib/macro/macro-tab.cpp +++ b/lib/macro/macro-tab.cpp @@ -745,6 +745,17 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos) remove->setDisabled(ui->macros->SelectionEmpty()); menu.addSeparator(); + auto pause = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.pause"), this, + &AdvSceneSwitcher::PauseSelectedMacros); + pause->setDisabled(ui->macros->SelectionEmpty()); + + auto unpause = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.unpause"), this, + &AdvSceneSwitcher::UnpauseSelectedMacros); + unpause->setDisabled(ui->macros->SelectionEmpty()); + menu.addSeparator(); + auto group = menu.addAction( obs_module_text("AdvSceneSwitcher.macroTab.group"), ui->macros, &MacroTree::GroupSelectedItems); @@ -805,6 +816,48 @@ void AdvSceneSwitcher::CopyMacro() MacroSignalManager::Instance()->Add(QString::fromStdString(name)); } +void AdvSceneSwitcher::PauseSelectedMacros() +{ + auto selectedMacros = GetSelectedMacros(); + if (selectedMacros.empty()) { + return; + } + + auto lock = LockContext(); + for (const auto ¯o : selectedMacros) { + if (macro->IsGroup()) { + for (const auto &subitem : + GetGroupMacroEntries(macro.get())) { + subitem->SetPaused(true); + } + } else { + macro->SetPaused(true); + } + } + ui->macros->UpdateRunningStates(); +} + +void AdvSceneSwitcher::UnpauseSelectedMacros() +{ + auto selectedMacros = GetSelectedMacros(); + if (selectedMacros.empty()) { + return; + } + + auto lock = LockContext(); + for (const auto ¯o : selectedMacros) { + if (macro->IsGroup()) { + for (const auto &subitem : + GetGroupMacroEntries(macro.get())) { + subitem->SetPaused(false); + } + } else { + macro->SetPaused(false); + } + } + ui->macros->UpdateRunningStates(); +} + bool MacroTabIsInFocus() { return AdvSceneSwitcher::window && diff --git a/lib/macro/macro-tree.cpp b/lib/macro/macro-tree.cpp index 211f2500c..0b5c2e441 100644 --- a/lib/macro/macro-tree.cpp +++ b/lib/macro/macro-tree.cpp @@ -981,6 +981,17 @@ void MacroTree::UpdateWidgets(bool force) } } +void MacroTree::UpdateRunningStates() +{ + MacroTreeModel *mtm = GetModel(); + for (int i = 0; i < (int)mtm->_macros.size(); i++) { + auto widget = GetItemWidget(i); + if (widget) { + widget->UpdateRunning(); + } + } +} + static inline void MoveItem(std::deque> &items, std::shared_ptr &item, int to) { diff --git a/lib/macro/macro-tree.hpp b/lib/macro/macro-tree.hpp index ca7645288..65bef68d4 100644 --- a/lib/macro/macro-tree.hpp +++ b/lib/macro/macro-tree.hpp @@ -145,6 +145,7 @@ class MacroTree : public QListView { void ExpandGroup(std::shared_ptr item) const; void CollapseGroup(std::shared_ptr item) const; void RefreshFilter(); + void UpdateRunningStates(); public slots: void GroupSelectedItems();