Browse Source

UI: Make select/deselect signals work w/ group items

Clayton Groeneveld 5 years ago
parent
commit
2fe749fc84
4 changed files with 20 additions and 49 deletions
  1. 18 4
      UI/source-tree.cpp
  2. 2 0
      UI/source-tree.hpp
  3. 0 40
      UI/window-basic-main.cpp
  4. 0 5
      UI/window-basic-main.hpp

+ 18 - 4
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<SourceTreeItem *>(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<SourceTreeItem *>(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);

+ 2 - 0
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();
 };
 

+ 0 - 40
UI/window-basic-main.cpp

@@ -2580,11 +2580,6 @@ void OBSBasic::AddScene(OBSSource source)
 	container.handlers.assign({
 		std::make_shared<OBSSignal>(handler, "item_add",
 					    OBSBasic::SceneItemAdded, this),
-		std::make_shared<OBSSignal>(handler, "item_select",
-					    OBSBasic::SceneItemSelected, this),
-		std::make_shared<OBSSignal>(handler, "item_deselect",
-					    OBSBasic::SceneItemDeselected,
-					    this),
 		std::make_shared<OBSSignal>(handler, "reorder",
 					    OBSBasic::SceneReordered, this),
 		std::make_shared<OBSSignal>(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<OBSBasic *>(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<OBSBasic *>(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");

+ 0 - 5
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);