diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 494798c6..9eee7b43 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -82,6 +82,7 @@ AdvSceneSwitcher.macroTab.defaultname="Macro %1" AdvSceneSwitcher.macroTab.defaultGroupName="Group %1" AdvSceneSwitcher.macroTab.exists="Macro name exists already" AdvSceneSwitcher.macroTab.groupDeleteConfirm="Are you sure you want to delete \"%1\" and all its elements?" +AdvSceneSwitcher.macroTab.deleteMultipleMacrosConfirmation="Are you sure you want to delete %1 macros?" AdvSceneSwitcher.macroTab.copy="Create copy of current macro" AdvSceneSwitcher.macroTab.group="Group selected items" AdvSceneSwitcher.macroTab.ungroup="Ungroup selected groups" diff --git a/src/advanced-scene-switcher.hpp b/src/advanced-scene-switcher.hpp index 1b4ce912..a169d336 100644 --- a/src/advanced-scene-switcher.hpp +++ b/src/advanced-scene-switcher.hpp @@ -46,7 +46,9 @@ public: bool addNewMacro(std::shared_ptr &res, std::string &name, std::string format = ""); + void RemoveMacro(std::shared_ptr &); std::shared_ptr getSelectedMacro(); + std::vector> getSelectedMacros(); void SetEditMacro(Macro &m); void SetMacroEditAreaDisabled(bool); void HighlightAction(int idx, QColor color = QColor(Qt::green)); diff --git a/src/macro-core/macro-tab.cpp b/src/macro-core/macro-tab.cpp index 8eaa96ad..fdd19f79 100644 --- a/src/macro-core/macro-tab.cpp +++ b/src/macro-core/macro-tab.cpp @@ -83,12 +83,12 @@ void AdvSceneSwitcher::on_macroAdd_clicked() emit MacroAdded(QString::fromStdString(name)); } -void AdvSceneSwitcher::on_macroRemove_clicked() +void AdvSceneSwitcher::RemoveMacro(std::shared_ptr ¯o) { - auto macro = getSelectedMacro(); if (!macro) { return; } + auto name = QString::fromStdString(macro->Name()); if (macro->IsGroup()) { QString deleteWarning = obs_module_text( @@ -106,6 +106,29 @@ void AdvSceneSwitcher::on_macroRemove_clicked() emit MacroRemoved(name); } +void AdvSceneSwitcher::on_macroRemove_clicked() +{ + auto macros = getSelectedMacros(); + if (macros.empty()) { + return; + } + + if (macros.size() == 1) { + RemoveMacro(macros.at(0)); + return; + } + + QString deleteWarning = obs_module_text( + "AdvSceneSwitcher.macroTab.deleteMultipleMacrosConfirmation"); + if (!DisplayMessage(deleteWarning.arg(macros.size()), true)) { + return; + } + + for (auto ¯o : macros) { + RemoveMacro(macro); + } +} + void AdvSceneSwitcher::on_macroUp_clicked() { std::lock_guard lock(switcher->m); @@ -314,6 +337,11 @@ std::shared_ptr AdvSceneSwitcher::getSelectedMacro() return ui->macros->GetCurrentMacro(); } +std::vector> AdvSceneSwitcher::getSelectedMacros() +{ + return ui->macros->GetCurrentMacros(); +} + void AdvSceneSwitcher::MacroSelectionChanged(const QItemSelection &, const QItemSelection &) { diff --git a/src/macro-core/macro-tree.cpp b/src/macro-core/macro-tree.cpp index 7bef780a..a5652cd9 100644 --- a/src/macro-core/macro-tree.cpp +++ b/src/macro-core/macro-tree.cpp @@ -390,6 +390,8 @@ void MacroTreeModel::Remove(std::shared_ptr item) if (!item->IsCollapsed()) { uiEndIdx += item->GroupSize(); } + } else if (item->IsSubitem()) { + Macro::PrepareMoveToGroup(nullptr, item); } beginRemoveRows(QModelIndex(), uiStartIdx, uiEndIdx); @@ -472,6 +474,21 @@ std::shared_ptr MacroTreeModel::GetCurrentMacro() const return _macros[ModelIndexToMacroIndex(idx, _macros)]; } +std::vector> +MacroTreeModel::GetCurrentMacros(const QModelIndexList &selection) const +{ + std::vector> result; + result.reserve(selection.size()); + for (const auto &sel : selection) { + try { + result.emplace_back(_macros.at( + ModelIndexToMacroIndex(sel.row(), _macros))); + } catch (const std::out_of_range &) { + } + } + return result; +} + MacroTreeModel::MacroTreeModel(MacroTree *st_, std::deque> ¯os) : QAbstractListModel(st_), _mt(st_), _macros(macros) @@ -708,6 +725,12 @@ std::shared_ptr MacroTree::GetCurrentMacro() const return GetModel()->GetCurrentMacro(); } +std::vector> MacroTree::GetCurrentMacros() const +{ + QModelIndexList indices = selectedIndexes(); + return GetModel()->GetCurrentMacros(indices); +} + MacroTree::MacroTree(QWidget *parent_) : QListView(parent_) { setStyleSheet(QString( diff --git a/src/macro-core/macro-tree.hpp b/src/macro-core/macro-tree.hpp index 1eaa9967..fd63255d 100644 --- a/src/macro-core/macro-tree.hpp +++ b/src/macro-core/macro-tree.hpp @@ -92,6 +92,8 @@ private: std::shared_ptr FindEndOfGroup(const std::shared_ptr &m, bool above) const; std::shared_ptr GetCurrentMacro() const; + std::vector> + GetCurrentMacros(const QModelIndexList &) const; QString GetNewGroupName(); void GroupSelectedItems(QModelIndexList &indices); void UngroupSelectedGroups(QModelIndexList &indices); @@ -121,6 +123,7 @@ public: void Up(std::shared_ptr item) const; void Down(std::shared_ptr item) const; std::shared_ptr GetCurrentMacro() const; + std::vector> GetCurrentMacros() const; bool GroupsSelected() const; bool GroupedItemsSelected() const; bool SelectionEmpty() const;