浏览代码

UI: Add UUID to file-based list widgets

List widgets are currently used as playlists in source properties,
but only contain the file paths and no other identifying information.

This can lead to files being added multiple times, so when changes to
list order occurs, plugins cannot uniquely identify which duplicate
item was actually changed (because they're only identified by the path).

By adding a UUID to the user data role of a list item, an additional
unique information is added that allows plugins to de-duplicate list
items.
PatTheMav 2 年之前
父节点
当前提交
3d2654f71b
共有 1 个文件被更改,包括 29 次插入3 次删除
  1. 29 3
      shared/properties-view/properties-view.cpp

+ 29 - 3
shared/properties-view/properties-view.cpp

@@ -24,6 +24,7 @@
 #include <QGroupBox>
 #include <QGroupBox>
 #include <QObject>
 #include <QObject>
 #include <QDesktopServices>
 #include <QDesktopServices>
+#include <QUuid>
 #include "double-slider.hpp"
 #include "double-slider.hpp"
 #include "spinbox-ignorewheel.hpp"
 #include "spinbox-ignorewheel.hpp"
 #include "properties-view.hpp"
 #include "properties-view.hpp"
@@ -740,6 +741,14 @@ void OBSPropertiesView::AddEditableList(obs_property_t *prop,
 		QListWidgetItem *const list_item = list->item((int)i);
 		QListWidgetItem *const list_item = list->item((int)i);
 		list_item->setSelected(obs_data_get_bool(item, "selected"));
 		list_item->setSelected(obs_data_get_bool(item, "selected"));
 		list_item->setHidden(obs_data_get_bool(item, "hidden"));
 		list_item->setHidden(obs_data_get_bool(item, "hidden"));
+		QString uuid = QT_UTF8(obs_data_get_string(item, "uuid"));
+		/* for backwards compatibility */
+		if (uuid.isEmpty()) {
+			uuid = QUuid::createUuid().toString(
+				QUuid::WithoutBraces);
+			obs_data_set_string(item, "uuid", uuid.toUtf8());
+		}
+		list_item->setData(Qt::UserRole, uuid);
 	}
 	}
 
 
 	WidgetInfo *info = new WidgetInfo(this, prop, list);
 	WidgetInfo *info = new WidgetInfo(this, prop, list);
@@ -2024,6 +2033,9 @@ void WidgetInfo::EditableListChanged()
 		OBSDataAutoRelease arrayItem = obs_data_create();
 		OBSDataAutoRelease arrayItem = obs_data_create();
 		obs_data_set_string(arrayItem, "value",
 		obs_data_set_string(arrayItem, "value",
 				    QT_TO_UTF8(item->text()));
 				    QT_TO_UTF8(item->text()));
+		obs_data_set_string(
+			arrayItem, "uuid",
+			QT_TO_UTF8(item->data(Qt::UserRole).toString()));
 		obs_data_set_bool(arrayItem, "selected", item->isSelected());
 		obs_data_set_bool(arrayItem, "selected", item->isSelected());
 		obs_data_set_bool(arrayItem, "hidden", item->isHidden());
 		obs_data_set_bool(arrayItem, "hidden", item->isHidden());
 		obs_data_array_push_back(array, arrayItem);
 		obs_data_array_push_back(array, arrayItem);
@@ -2293,7 +2305,11 @@ void WidgetInfo::EditListAddText()
 	if (text.isEmpty())
 	if (text.isEmpty())
 		return;
 		return;
 
 
-	list->addItem(text);
+	QListWidgetItem *item = new QListWidgetItem(text);
+	item->setData(Qt::UserRole,
+		      QUuid::createUuid().toString(QUuid::WithoutBraces));
+	list->addItem(item);
+
 	EditableListChanged();
 	EditableListChanged();
 }
 }
 
 
@@ -2318,7 +2334,13 @@ void WidgetInfo::EditListAddFiles()
 	if (files.count() == 0)
 	if (files.count() == 0)
 		return;
 		return;
 
 
-	list->addItems(files);
+	for (QString file : files) {
+		QListWidgetItem *item = new QListWidgetItem(file);
+		item->setData(Qt::UserRole, QUuid::createUuid().toString(
+						    QUuid::WithoutBraces));
+		list->addItem(item);
+	}
+
 	EditableListChanged();
 	EditableListChanged();
 }
 }
 
 
@@ -2341,7 +2363,11 @@ void WidgetInfo::EditListAddDir()
 	if (dir.isEmpty())
 	if (dir.isEmpty())
 		return;
 		return;
 
 
-	list->addItem(dir);
+	QListWidgetItem *item = new QListWidgetItem(dir);
+	item->setData(Qt::UserRole,
+		      QUuid::createUuid().toString(QUuid::WithoutBraces));
+	list->addItem(item);
+
 	EditableListChanged();
 	EditableListChanged();
 }
 }