From d22ddfd3957cde26a09144ce5c9e7ec79a291791 Mon Sep 17 00:00:00 2001 From: tytan652 Date: Tue, 18 Feb 2025 16:07:03 +0100 Subject: [PATCH] frontend: Reduce reliance on transition indexes --- frontend/widgets/OBSBasic.hpp | 2 +- frontend/widgets/OBSBasic_Transitions.cpp | 66 ++++++++++------------- 2 files changed, 29 insertions(+), 39 deletions(-) diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index e2d116f17..7165e36c5 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -1478,7 +1478,7 @@ private: QPointer perSceneTransitionMenu; std::unordered_map transitions; - // TODO: Reduce usages of an index to identify a transition + // FIXME: Any code accessing this collection relies on order of insertion std::vector transitionUuids; // FIXME: Replace usages of a name to identify a transition std::unordered_map transitionNameToUuids; diff --git a/frontend/widgets/OBSBasic_Transitions.cpp b/frontend/widgets/OBSBasic_Transitions.cpp index 882e8a7e7..e19fc9d17 100644 --- a/frontend/widgets/OBSBasic_Transitions.cpp +++ b/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 (!uuid.empty()) { + auto transition = transitions.find(uuid); + if (transition == transitions.end()) + return; - if (transitionIter == transitions.end()) - continue; - - 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()) + for (const auto &[uuid, transition] : transitions) { + if (!transition) continue; - tr = transitionIter->second; - - if (!tr) - 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(); bool fadeToBlack = sender()->property("fadeToBlack").value(); - 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(); QuickTransition *qt = GetQuickTransition(id); if (qt) { - auto transitionIter = transitions.find(transitionUuids[trIdx]); + auto transitionIter = transitions.find(transitionUuid); OBSSource tr; if (!fadeToBlack && (transitionIter == transitions.end()))