diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index aad5dbaf..461e4816 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -177,6 +177,8 @@ AdvSceneSwitcher.macroTab.contextMenuAdd="Add" AdvSceneSwitcher.macroTab.copy="Duplicate Macro" AdvSceneSwitcher.macroTab.group="Group Selected Macros" AdvSceneSwitcher.macroTab.ungroup="Ungroup Selected Groups" +AdvSceneSwitcher.macroTab.expandAllGroups="Expand all Groups" +AdvSceneSwitcher.macroTab.collapseAllGroups="Collapse all Groups" AdvSceneSwitcher.macroTab.rename="Rename" AdvSceneSwitcher.macroTab.remove="Remove" AdvSceneSwitcher.macroTab.export="Export" diff --git a/lib/macro/macro-tab.cpp b/lib/macro/macro-tab.cpp index 6cc4c96a..38ddde84 100644 --- a/lib/macro/macro-tab.cpp +++ b/lib/macro/macro-tab.cpp @@ -1148,6 +1148,17 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos) !ui->macros->GroupsSelected()); menu.addSeparator(); + auto rename = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.rename"), this, + &AdvSceneSwitcher::RenameSelectedMacro); + rename->setEnabled(ui->macros->SingleItemSelected()); + + auto remove = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.remove"), this, + &AdvSceneSwitcher::on_macroRemove_clicked); + remove->setDisabled(ui->macros->SelectionEmpty()); + menu.addSeparator(); + auto group = menu.addAction( obs_module_text("AdvSceneSwitcher.macroTab.group"), ui->macros, &MacroTree::GroupSelectedItems); @@ -1159,17 +1170,16 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos) obs_module_text("AdvSceneSwitcher.macroTab.ungroup"), ui->macros, &MacroTree::UngroupSelectedGroups); ungroup->setEnabled(ui->macros->GroupsSelected()); - menu.addSeparator(); - auto rename = menu.addAction( - obs_module_text("AdvSceneSwitcher.macroTab.rename"), this, - &AdvSceneSwitcher::RenameSelectedMacro); - rename->setEnabled(ui->macros->SingleItemSelected()); + auto expandAll = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.expandAllGroups"), + ui->macros, &MacroTree::ExpandAll); + expandAll->setEnabled(ui->macros->GroupsExist()); - auto remove = menu.addAction( - obs_module_text("AdvSceneSwitcher.macroTab.remove"), this, - &AdvSceneSwitcher::on_macroRemove_clicked); - remove->setDisabled(ui->macros->SelectionEmpty()); + auto collapseAll = menu.addAction( + obs_module_text("AdvSceneSwitcher.macroTab.collapseAllGroups"), + ui->macros, &MacroTree::CollapseAll); + collapseAll->setEnabled(ui->macros->GroupsExist()); menu.addSeparator(); auto exportAction = menu.addAction( diff --git a/lib/macro/macro-tree.cpp b/lib/macro/macro-tree.cpp index 6c7f18cc..eee68916 100644 --- a/lib/macro/macro-tree.cpp +++ b/lib/macro/macro-tree.cpp @@ -1181,6 +1181,16 @@ bool MacroTree::SelectionEmpty() const return selectedIndexes().empty(); } +bool MacroTree::GroupsExist() const +{ + for (const auto ¯o : GetMacros()) { + if (macro->IsGroup()) { + return true; + } + } + return false; +} + void MacroTree::ExpandGroup(std::shared_ptr item) const { auto *mtm = GetModel(); @@ -1293,6 +1303,26 @@ void MacroTree::UngroupSelectedGroups() assert(GetModel()->IsInValidState()); } +void MacroTree::ExpandAll() +{ + for (const auto ¯o : GetMacros()) { + if (!macro->IsGroup()) { + continue; + } + ExpandGroup(macro); + } +} + +void MacroTree::CollapseAll() +{ + for (const auto ¯o : GetMacros()) { + if (!macro->IsGroup()) { + continue; + } + CollapseGroup(macro); + } +} + void MacroTree::SelectionChangedHelper(const QItemSelection &, const QItemSelection &) { diff --git a/lib/macro/macro-tree.hpp b/lib/macro/macro-tree.hpp index 09015f18..223f85b5 100644 --- a/lib/macro/macro-tree.hpp +++ b/lib/macro/macro-tree.hpp @@ -139,12 +139,15 @@ public: bool GroupedItemsSelected() const; bool SingleItemSelected() const; bool SelectionEmpty() const; + bool GroupsExist() const; void ExpandGroup(std::shared_ptr item) const; void CollapseGroup(std::shared_ptr item) const; public slots: void GroupSelectedItems(); void UngroupSelectedGroups(); + void ExpandAll(); + void CollapseAll(); void SelectionChangedHelper(const QItemSelection &, const QItemSelection &);