From 23430a9221e61413c41bbf3aefd14bcf4abda3e9 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 2 Jul 2016 15:44:24 -0700 Subject: [PATCH] UI: Allow removing multiple selected scene items --- obs/data/locale/en-US.ini | 1 + obs/window-basic-main.cpp | 48 +++++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/obs/data/locale/en-US.ini b/obs/data/locale/en-US.ini index e8f045ae5..4c3eaed7e 100644 --- a/obs/data/locale/en-US.ini +++ b/obs/data/locale/en-US.ini @@ -101,6 +101,7 @@ ConfirmExit.Text="OBS is currently active. All streams/recordings will be shut # confirm delete dialog box ConfirmRemove.Title="Confirm Remove" ConfirmRemove.Text="Are you sure you wish to remove '$1'?" +ConfirmRemove.TextMultiple="Are you sure you wish to remove %1 items?" # output connect messages Output.ConnectFail.Title="Failed to connect" diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index cfc3983b0..b6e09f90d 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -3107,11 +3107,51 @@ void OBSBasic::on_actionAddSource_triggered() void OBSBasic::on_actionRemoveSource_triggered() { - OBSSceneItem item = GetCurrentSceneItem(); - obs_source_t *source = obs_sceneitem_get_source(item); + vector items; - if (source && QueryRemoveSource(source)) - obs_sceneitem_remove(item); + auto func = [] (obs_scene_t *, obs_sceneitem_t *item, void *param) + { + vector &items = + *reinterpret_cast*>(param); + if (obs_sceneitem_selected(item)) + items.emplace_back(item); + return true; + }; + + obs_scene_enum_items(GetCurrentScene(), func, &items); + + if (!items.size()) + return; + + auto removeMultiple = [this] (size_t count) + { + QString text = QTStr("ConfirmRemove.TextMultiple") + .arg(QString::number(count)); + + QMessageBox remove_items(this); + remove_items.setText(text); + QAbstractButton *Yes = remove_items.addButton(QTStr("Yes"), + QMessageBox::YesRole); + remove_items.addButton(QTStr("No"), QMessageBox::NoRole); + remove_items.setIcon(QMessageBox::Question); + remove_items.setWindowTitle(QTStr("ConfirmRemove.Title")); + remove_items.exec(); + + return Yes == remove_items.clickedButton(); + }; + + if (items.size() == 1) { + OBSSceneItem &item = items[0]; + obs_source_t *source = obs_sceneitem_get_source(item); + + if (source && QueryRemoveSource(source)) + obs_sceneitem_remove(item); + } else { + if (removeMultiple(items.size())) { + for (auto &item : items) + obs_sceneitem_remove(item); + } + } } void OBSBasic::on_actionInteract_triggered()