1
0
Эх сурвалжийг харах

frontend: Reduce reliance on transition indexes

tytan652 8 сар өмнө
parent
commit
d22ddfd395

+ 1 - 1
frontend/widgets/OBSBasic.hpp

@@ -1478,7 +1478,7 @@ private:
 	QPointer<QMenu> perSceneTransitionMenu;
 
 	std::unordered_map<std::string, OBSSource> transitions;
-	// TODO: Reduce usages of an index to identify a transition
+	// FIXME: Any code accessing this collection relies on order of insertion
 	std::vector<std::string> transitionUuids;
 	// FIXME: Replace usages of a name to identify a transition
 	std::unordered_map<std::string, std::string> transitionNameToUuids;

+ 28 - 38
frontend/widgets/OBSBasic_Transitions.cpp

@@ -781,7 +781,6 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
 {
 	OBSSource scene = GetCurrentSceneSource();
 	QMenu *menu = new QMenu(QTStr("TransitionOverride"));
-	QAction *action;
 
 	OBSDataAutoRelease data = obs_source_get_private_settings(scene);
 
@@ -798,12 +797,13 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
 	duration->setValue(curDuration);
 
 	auto setTransition = [this](QAction *action) {
-		int idx = action->property("transition_index").toInt();
+		std::string uuid = action->property("transition_uuid").toString().toStdString();
 		OBSSource scene = GetCurrentSceneSource();
 		OBSDataAutoRelease data = obs_source_get_private_settings(scene);
-		auto transitionIter = transitions.find(transitionUuids[idx]);
+		auto transitionIter = transitions.find(uuid);
+		OBSSource transition;
 
-		if (idx == -1) {
+		if (uuid.empty()) {
 			obs_data_set_string(data, "transition", "");
 			return;
 		}
@@ -811,10 +811,10 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
 		if (transitionIter == transitions.end())
 			return;
 
-		OBSSource tr = transitionIter->second;
+		transition = transitionIter->second;
 
-		if (tr) {
-			const char *name = obs_source_get_name(tr);
+		if (transition) {
+			const char *name = obs_source_get_name(transition);
 			obs_data_set_string(data, "transition", name);
 		}
 	};
@@ -828,20 +828,16 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
 
 	connect(duration, (void(QSpinBox::*)(int)) & QSpinBox::valueChanged, setDuration);
 
-	for (int i = -1; i < (int)transitionUuids.size(); i++) {
+	auto addAction = [&](const std::string &uuid = "") {
 		const char *name = "";
+		QAction *action;
 
-		if (i >= 0) {
-			auto transitionIter = transitions.find(transitionUuids[i]);
-			OBSSource tr;
-
-			if (transitionIter == transitions.end())
-				continue;
+		if (!uuid.empty()) {
+			auto transition = transitions.find(uuid);
+			if (transition == transitions.end())
+				return;
 
-			tr = transitionIter->second;
-			if (!tr)
-				continue;
-			name = obs_source_get_name(tr);
+			name = obs_source_get_name(transition->second);
 		}
 
 		bool match = (name && strcmp(name, curTransition) == 0);
@@ -850,12 +846,16 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
 			name = Str("None");
 
 		action = menu->addAction(QT_UTF8(name));
-		action->setProperty("transition_index", i);
+		action->setProperty("transition_uuid", QString::fromStdString(uuid));
 		action->setCheckable(true);
 		action->setChecked(match);
 
 		connect(action, &QAction::triggered, std::bind(setTransition, action));
-	}
+	};
+
+	addAction();
+	for (const auto &[uuid, transition] : transitions)
+		addAction(uuid);
 
 	QWidgetAction *durationAction = new QWidgetAction(menu);
 	durationAction->setDefaultWidget(duration);
@@ -1061,7 +1061,6 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
 {
 	QMenu *menu = new QMenu(parent);
 	QAction *action;
-	OBSSource tr;
 
 	if (qt) {
 		action = menu->addAction(QTStr("Remove"));
@@ -1085,8 +1084,6 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
 			&OBSBasic::QuickTransitionChangeDuration);
 	}
 
-	tr = fadeTransition;
-
 	action = menu->addAction(QTStr("FadeToBlack"));
 	action->setProperty("fadeToBlack", true);
 
@@ -1098,19 +1095,12 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
 		connect(action, &QAction::triggered, this, &OBSBasic::AddQuickTransition);
 	}
 
-	for (int i = 0; i < (int)transitionUuids.size(); i++) {
-		auto transitionIter = transitions.find(transitionUuids[i]);
-
-		if (transitionIter == transitions.end())
-			continue;
-
-		tr = transitionIter->second;
-
-		if (!tr)
+	for (const auto &[uuid, transition] : transitions) {
+		if (!transition)
 			continue;
 
-		action = menu->addAction(obs_source_get_name(tr));
-		action->setProperty("transition_index", i);
+		action = menu->addAction(obs_source_get_name(transition));
+		action->setProperty("transition_uuid", QString::fromStdString(uuid));
 
 		if (qt) {
 			action->setProperty("id", qt->id);
@@ -1170,10 +1160,10 @@ void OBSBasic::AddQuickTransitionId(int id)
 
 void OBSBasic::AddQuickTransition()
 {
-	int trIdx = sender()->property("transition_index").toInt();
+	std::string transitionUuid = sender()->property("transition_uuid").toString().toStdString();
 	QSpinBox *duration = sender()->property("duration").value<QSpinBox *>();
 	bool fadeToBlack = sender()->property("fadeToBlack").value<bool>();
-	auto transitionIter = transitions.find(transitionUuids[trIdx]);
+	auto transitionIter = transitions.find(transitionUuid);
 	OBSSource transition;
 
 	if (!fadeToBlack && (transitionIter == transitions.end()))
@@ -1230,12 +1220,12 @@ void OBSBasic::QuickTransitionClicked()
 void OBSBasic::QuickTransitionChange()
 {
 	int id = sender()->property("id").toInt();
-	int trIdx = sender()->property("transition_index").toInt();
+	std::string transitionUuid = sender()->property("transition_uuid").toString().toStdString();
 	bool fadeToBlack = sender()->property("fadeToBlack").value<bool>();
 	QuickTransition *qt = GetQuickTransition(id);
 
 	if (qt) {
-		auto transitionIter = transitions.find(transitionUuids[trIdx]);
+		auto transitionIter = transitions.find(transitionUuid);
 		OBSSource tr;
 
 		if (!fadeToBlack && (transitionIter == transitions.end()))