From 2fe749fc84ac5c6fa3c9a60586dfdff3ff4dafd9 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Tue, 19 May 2020 06:25:06 -0500 Subject: [PATCH] UI: Make select/deselect signals work w/ group items --- UI/source-tree.cpp | 22 ++++++++++++++++++---- UI/source-tree.hpp | 2 ++ UI/window-basic-main.cpp | 40 ---------------------------------------- UI/window-basic-main.hpp | 5 ----- 4 files changed, 20 insertions(+), 49 deletions(-) diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp index fdd4c37c8..dc11827b3 100644 --- a/UI/source-tree.cpp +++ b/UI/source-tree.cpp @@ -151,6 +151,7 @@ void SourceTreeItem::DisconnectSignals() { sceneRemoveSignal.Disconnect(); itemRemoveSignal.Disconnect(); + selectSignal.Disconnect(); deselectSignal.Disconnect(); visibleSignal.Disconnect(); lockedSignal.Disconnect(); @@ -212,6 +213,16 @@ void SourceTreeItem::ReconnectSignals() Q_ARG(bool, locked)); }; + auto itemSelect = [](void *data, calldata_t *cd) { + SourceTreeItem *this_ = + reinterpret_cast(data); + obs_sceneitem_t *curItem = + (obs_sceneitem_t *)calldata_ptr(cd, "item"); + + if (curItem == this_->sceneitem) + QMetaObject::invokeMethod(this_, "Select"); + }; + auto itemDeselect = [](void *data, calldata_t *cd) { SourceTreeItem *this_ = reinterpret_cast(data); @@ -236,6 +247,8 @@ void SourceTreeItem::ReconnectSignals() itemRemoveSignal.Connect(signal, "item_remove", removeItem, this); visibleSignal.Connect(signal, "item_visible", itemVisible, this); lockedSignal.Connect(signal, "item_locked", itemLocked, this); + selectSignal.Connect(signal, "item_select", itemSelect, this); + deselectSignal.Connect(signal, "item_deselect", itemDeselect, this); if (obs_sceneitem_is_group(sceneitem)) { obs_source_t *source = obs_sceneitem_get_source(sceneitem); @@ -245,10 +258,6 @@ void SourceTreeItem::ReconnectSignals() this); } - if (scene != GetCurrentScene()) - deselectSignal.Connect(signal, "item_deselect", itemDeselect, - this); - /* --------------------------------------------------------- */ auto renamed = [](void *data, calldata_t *cd) { @@ -516,6 +525,11 @@ void SourceTreeItem::ExpandClicked(bool checked) tree->GetStm()->CollapseGroup(sceneitem); } +void SourceTreeItem::Select() +{ + tree->SelectItem(sceneitem, true); +} + void SourceTreeItem::Deselect() { tree->SelectItem(sceneitem, false); diff --git a/UI/source-tree.hpp b/UI/source-tree.hpp index 32a4c5929..329108f94 100644 --- a/UI/source-tree.hpp +++ b/UI/source-tree.hpp @@ -70,6 +70,7 @@ private: OBSSignal sceneRemoveSignal; OBSSignal itemRemoveSignal; OBSSignal groupReorderSignal; + OBSSignal selectSignal; OBSSignal deselectSignal; OBSSignal visibleSignal; OBSSignal lockedSignal; @@ -90,6 +91,7 @@ private slots: void ExpandClicked(bool checked); + void Select(); void Deselect(); }; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 09304eb15..90a27ea88 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2580,11 +2580,6 @@ void OBSBasic::AddScene(OBSSource source) container.handlers.assign({ std::make_shared(handler, "item_add", OBSBasic::SceneItemAdded, this), - std::make_shared(handler, "item_select", - OBSBasic::SceneItemSelected, this), - std::make_shared(handler, "item_deselect", - OBSBasic::SceneItemDeselected, - this), std::make_shared(handler, "reorder", OBSBasic::SceneReordered, this), std::make_shared(handler, "refresh", @@ -2754,16 +2749,6 @@ void OBSBasic::RenameSources(OBSSource source, QString newName, OBSProjector::UpdateMultiviewProjectors(); } -void OBSBasic::SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select) -{ - SignalBlocker sourcesSignalBlocker(ui->sources); - - if (scene != GetCurrentScene() || ignoreSelectionUpdate) - return; - - ui->sources->SelectItem(item, select); -} - static inline bool SourceMixerHidden(obs_source_t *source) { obs_data_t *priv_settings = obs_source_get_private_settings(source); @@ -3363,31 +3348,6 @@ void OBSBasic::SceneItemAdded(void *data, calldata_t *params) Q_ARG(OBSSceneItem, OBSSceneItem(item))); } -void OBSBasic::SceneItemSelected(void *data, calldata_t *params) -{ - OBSBasic *window = static_cast(data); - - obs_scene_t *scene = (obs_scene_t *)calldata_ptr(params, "scene"); - obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(params, "item"); - - QMetaObject::invokeMethod(window, "SelectSceneItem", - Q_ARG(OBSScene, scene), - Q_ARG(OBSSceneItem, item), Q_ARG(bool, true)); -} - -void OBSBasic::SceneItemDeselected(void *data, calldata_t *params) -{ - OBSBasic *window = static_cast(data); - - obs_scene_t *scene = (obs_scene_t *)calldata_ptr(params, "scene"); - obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(params, "item"); - - QMetaObject::invokeMethod(window, "SelectSceneItem", - Q_ARG(OBSScene, scene), - Q_ARG(OBSSceneItem, item), - Q_ARG(bool, false)); -} - void OBSBasic::SourceCreated(void *data, calldata_t *params) { obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 7d47ce286..85cd6e288 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -226,7 +226,6 @@ private: gs_vertbuffer_t *circle = nullptr; bool sceneChanging = false; - bool ignoreSelectionUpdate = false; int previewX = 0, previewY = 0; int previewCX = 0, previewCY = 0; @@ -573,8 +572,6 @@ private slots: void RemoveScene(OBSSource source); void RenameSources(OBSSource source, QString newName, QString prevName); - void SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select); - void ActivateAudioSource(OBSSource source); void DeactivateAudioSource(OBSSource source); @@ -671,8 +668,6 @@ private: static void SceneReordered(void *data, calldata_t *params); static void SceneRefreshed(void *data, calldata_t *params); static void SceneItemAdded(void *data, calldata_t *params); - static void SceneItemSelected(void *data, calldata_t *params); - static void SceneItemDeselected(void *data, calldata_t *params); static void SourceCreated(void *data, calldata_t *params); static void SourceRemoved(void *data, calldata_t *params); static void SourceActivated(void *data, calldata_t *params);