浏览代码

UI: Fix filter props. getting recreated unnecessarily

Closes obsproject/obs-studio#5846
jp9000 3 年之前
父节点
当前提交
f0e631df17
共有 2 个文件被更改,包括 25 次插入1 次删除
  1. 16 0
      UI/properties-view.hpp
  2. 9 1
      UI/window-basic-filters.cpp

+ 16 - 0
UI/properties-view.hpp

@@ -170,4 +170,20 @@ public:
 	inline bool DeferUpdate() const { return deferUpdate; }
 
 	inline OBSObject GetObject() const { return OBSGetStrongRef(weakObj); }
+
+#define Def_IsObject(type)                                \
+	inline bool IsObject(obs_##type##_t *type) const  \
+	{                                                 \
+		OBSObject obj = OBSGetStrongRef(weakObj); \
+		return obj.Get() == (obs_object_t *)type; \
+	}
+
+	/* clang-format off */
+	Def_IsObject(source)
+	Def_IsObject(output)
+	Def_IsObject(encoder)
+	Def_IsObject(service)
+	/* clang-format off */
+
+#undef Def_IsObject
 };

+ 9 - 1
UI/window-basic-filters.cpp

@@ -263,6 +263,15 @@ void FilterChangeUndoRedo(void *vp, obs_data_t *nd_old_settings,
 
 void OBSBasicFilters::UpdatePropertiesView(int row, bool async)
 {
+	OBSSource filter = GetFilter(row, async);
+	if (filter && view && view->IsObject(filter)) {
+		/* do not recreate properties view if already using a view
+		 * with the same object */
+		return;
+	}
+
+	ui->propertiesFrame->setVisible(false);
+
 	if (view) {
 		updatePropertiesSignal.Disconnect();
 		ui->propertiesFrame->setVisible(false);
@@ -271,7 +280,6 @@ void OBSBasicFilters::UpdatePropertiesView(int row, bool async)
 		view = nullptr;
 	}
 
-	OBSSource filter = GetFilter(row, async);
 	if (!filter)
 		return;