浏览代码

UI: Fix signals for sub-items of groups

Because sub-items of groups can no longer reroute their signals to the
parent scenes of groups, delegates removal handling to SourceTreeItem
instead of OBSBasic.
jp9000 7 年之前
父节点
当前提交
573d5719d8
共有 4 个文件被更改,包括 41 次插入34 次删除
  1. 38 1
      UI/source-tree.cpp
  2. 3 2
      UI/source-tree.hpp
  3. 0 29
      UI/window-basic-main.cpp
  4. 0 2
      UI/window-basic-main.hpp

+ 38 - 1
UI/source-tree.cpp

@@ -112,7 +112,13 @@ void SourceTreeItem::ReconnectSignals()
 		obs_sceneitem_t *curItem =
 		obs_sceneitem_t *curItem =
 			(obs_sceneitem_t*)calldata_ptr(cd, "item");
 			(obs_sceneitem_t*)calldata_ptr(cd, "item");
 
 
-		if (!curItem || curItem == this_->sceneitem) {
+		if (curItem == this_->sceneitem) {
+			QMetaObject::invokeMethod(this_->tree,
+					"Remove",
+					Q_ARG(OBSSceneItem, curItem));
+			curItem = nullptr;
+		}
+		if (!curItem) {
 			this_->DisconnectSignals();
 			this_->DisconnectSignals();
 			this_->sceneitem = nullptr;
 			this_->sceneitem = nullptr;
 		}
 		}
@@ -130,6 +136,12 @@ void SourceTreeItem::ReconnectSignals()
 					Q_ARG(bool, visible));
 					Q_ARG(bool, visible));
 	};
 	};
 
 
+	auto reorderGroup = [] (void *data, calldata_t*)
+	{
+		SourceTreeItem *this_ = reinterpret_cast<SourceTreeItem*>(data);
+		QMetaObject::invokeMethod(this_->tree, "ReorderItems");
+	};
+
 	obs_scene_t *scene = obs_sceneitem_get_scene(sceneitem);
 	obs_scene_t *scene = obs_sceneitem_get_scene(sceneitem);
 	obs_source_t *sceneSource = obs_scene_get_source(scene);
 	obs_source_t *sceneSource = obs_scene_get_source(scene);
 	signal_handler_t *signal = obs_source_get_signal_handler(sceneSource);
 	signal_handler_t *signal = obs_source_get_signal_handler(sceneSource);
@@ -138,6 +150,14 @@ void SourceTreeItem::ReconnectSignals()
 	itemRemoveSignal.Connect(signal, "item_remove", removeItem, this);
 	itemRemoveSignal.Connect(signal, "item_remove", removeItem, this);
 	visibleSignal.Connect(signal, "item_visible", itemVisible, this);
 	visibleSignal.Connect(signal, "item_visible", itemVisible, this);
 
 
+	if (obs_sceneitem_is_group(sceneitem)) {
+		obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+		signal = obs_source_get_signal_handler(source);
+
+		groupReorderSignal.Connect(signal, "reorder", reorderGroup,
+				this);
+	}
+
 	/* --------------------------------------------------------- */
 	/* --------------------------------------------------------- */
 
 
 	auto renamed = [] (void *data, calldata_t *cd)
 	auto renamed = [] (void *data, calldata_t *cd)
@@ -1274,6 +1294,23 @@ bool SourceTree::GroupedItemsSelected() const
 	return false;
 	return false;
 }
 }
 
 
+void SourceTree::Remove(OBSSceneItem item)
+{
+	OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
+	GetStm()->Remove(item);
+	main->SaveProject();
+
+	if (!main->SavingDisabled()) {
+		obs_scene_t *scene = obs_sceneitem_get_scene(item);
+		obs_source_t *sceneSource = obs_scene_get_source(scene);
+		obs_source_t *itemSource = obs_sceneitem_get_source(item);
+		blog(LOG_INFO, "User Removed source '%s' (%s) from scene '%s'",
+				obs_source_get_name(itemSource),
+				obs_source_get_id(itemSource),
+				obs_source_get_name(sceneSource));
+	}
+}
+
 void SourceTree::GroupSelectedItems()
 void SourceTree::GroupSelectedItems()
 {
 {
 	QModelIndexList indices = selectedIndexes();
 	QModelIndexList indices = selectedIndexes();

+ 3 - 2
UI/source-tree.hpp

@@ -62,6 +62,7 @@ private:
 	OBSSceneItem sceneitem;
 	OBSSceneItem sceneitem;
 	OBSSignal sceneRemoveSignal;
 	OBSSignal sceneRemoveSignal;
 	OBSSignal itemRemoveSignal;
 	OBSSignal itemRemoveSignal;
+	OBSSignal groupReorderSignal;
 	OBSSignal visibleSignal;
 	OBSSignal visibleSignal;
 	OBSSignal renameSignal;
 	OBSSignal renameSignal;
 	OBSSignal removeSignal;
 	OBSSignal removeSignal;
@@ -143,11 +144,9 @@ public:
 	explicit SourceTree(QWidget *parent = nullptr);
 	explicit SourceTree(QWidget *parent = nullptr);
 
 
 	inline bool IgnoreReorder() const {return ignoreReorder;}
 	inline bool IgnoreReorder() const {return ignoreReorder;}
-	inline void ReorderItems() {GetStm()->ReorderItems();}
 	inline void Clear() {GetStm()->Clear();}
 	inline void Clear() {GetStm()->Clear();}
 
 
 	inline void Add(obs_sceneitem_t *item) {GetStm()->Add(item);}
 	inline void Add(obs_sceneitem_t *item) {GetStm()->Add(item);}
-	inline void Remove(obs_sceneitem_t *item) {GetStm()->Remove(item);}
 	inline OBSSceneItem Get(int idx) {return GetStm()->Get(idx);}
 	inline OBSSceneItem Get(int idx) {return GetStm()->Get(idx);}
 	inline QString GetNewGroupName() {return GetStm()->GetNewGroupName();}
 	inline QString GetNewGroupName() {return GetStm()->GetNewGroupName();}
 
 
@@ -158,6 +157,8 @@ public:
 	bool GroupedItemsSelected() const;
 	bool GroupedItemsSelected() const;
 
 
 public slots:
 public slots:
+	inline void ReorderItems() {GetStm()->ReorderItems();}
+	void Remove(OBSSceneItem item);
 	void GroupSelectedItems();
 	void GroupSelectedItems();
 	void UngroupSelectedGroups();
 	void UngroupSelectedGroups();
 	void AddGroup();
 	void AddGroup();

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

@@ -2137,8 +2137,6 @@ void OBSBasic::AddScene(OBSSource source)
 	container.handlers.assign({
 	container.handlers.assign({
 		std::make_shared<OBSSignal>(handler, "item_add",
 		std::make_shared<OBSSignal>(handler, "item_add",
 					OBSBasic::SceneItemAdded, this),
 					OBSBasic::SceneItemAdded, this),
-		std::make_shared<OBSSignal>(handler, "item_remove",
-					OBSBasic::SceneItemRemoved, this),
 		std::make_shared<OBSSignal>(handler, "item_select",
 		std::make_shared<OBSSignal>(handler, "item_select",
 					OBSBasic::SceneItemSelected, this),
 					OBSBasic::SceneItemSelected, this),
 		std::make_shared<OBSSignal>(handler, "item_deselect",
 		std::make_shared<OBSSignal>(handler, "item_deselect",
@@ -2236,23 +2234,6 @@ void OBSBasic::AddSceneItem(OBSSceneItem item)
 	}
 	}
 }
 }
 
 
-void OBSBasic::RemoveSceneItem(OBSSceneItem item)
-{
-	ui->sources->Remove(item);
-
-	SaveProject();
-
-	if (!disableSaving) {
-		obs_scene_t *scene = obs_sceneitem_get_scene(item);
-		obs_source_t *sceneSource = obs_scene_get_source(scene);
-		obs_source_t *itemSource = obs_sceneitem_get_source(item);
-		blog(LOG_INFO, "User Removed source '%s' (%s) from scene '%s'",
-				obs_source_get_name(itemSource),
-				obs_source_get_id(itemSource),
-				obs_source_get_name(sceneSource));
-	}
-}
-
 void OBSBasic::UpdateSceneSelection(OBSSource source)
 void OBSBasic::UpdateSceneSelection(OBSSource source)
 {
 {
 	if (source) {
 	if (source) {
@@ -2853,16 +2834,6 @@ void OBSBasic::SceneItemAdded(void *data, calldata_t *params)
 			Q_ARG(OBSSceneItem, OBSSceneItem(item)));
 			Q_ARG(OBSSceneItem, OBSSceneItem(item)));
 }
 }
 
 
-void OBSBasic::SceneItemRemoved(void *data, calldata_t *params)
-{
-	OBSBasic *window = static_cast<OBSBasic*>(data);
-
-	obs_sceneitem_t *item = (obs_sceneitem_t*)calldata_ptr(params, "item");
-
-	QMetaObject::invokeMethod(window, "RemoveSceneItem",
-			Q_ARG(OBSSceneItem, OBSSceneItem(item)));
-}
-
 void OBSBasic::SceneItemSelected(void *data, calldata_t *params)
 void OBSBasic::SceneItemSelected(void *data, calldata_t *params)
 {
 {
 	OBSBasic *window = static_cast<OBSBasic*>(data);
 	OBSBasic *window = static_cast<OBSBasic*>(data);

+ 0 - 2
UI/window-basic-main.hpp

@@ -416,7 +416,6 @@ public slots:
 
 
 private slots:
 private slots:
 	void AddSceneItem(OBSSceneItem item);
 	void AddSceneItem(OBSSceneItem item);
-	void RemoveSceneItem(OBSSceneItem item);
 	void AddScene(OBSSource source);
 	void AddScene(OBSSource source);
 	void RemoveScene(OBSSource source);
 	void RemoveScene(OBSSource source);
 	void RenameSources(OBSSource source, QString newName, QString prevName);
 	void RenameSources(OBSSource source, QString newName, QString prevName);
@@ -473,7 +472,6 @@ private:
 	/* OBS Callbacks */
 	/* OBS Callbacks */
 	static void SceneReordered(void *data, calldata_t *params);
 	static void SceneReordered(void *data, calldata_t *params);
 	static void SceneItemAdded(void *data, calldata_t *params);
 	static void SceneItemAdded(void *data, calldata_t *params);
-	static void SceneItemRemoved(void *data, calldata_t *params);
 	static void SceneItemSelected(void *data, calldata_t *params);
 	static void SceneItemSelected(void *data, calldata_t *params);
 	static void SceneItemDeselected(void *data, calldata_t *params);
 	static void SceneItemDeselected(void *data, calldata_t *params);
 	static void SourceCreated(void *data, calldata_t *params);
 	static void SourceCreated(void *data, calldata_t *params);