From 3486c0b3633a8ff2b36170d56f37705fe7061349 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 6 Oct 2020 08:49:58 -0700 Subject: [PATCH] UI: Fix selecting correct transition when deleting When deleting a transition, it would sometimes select the one that replaces it, which could be the separator. This would cause undefined behavior. This fixes it so that it selects either the one that replaces it (if a valid one replaces it), or the transition at the bottom of the known list and not the separator. --- UI/window-basic-main-transitions.cpp | 28 ++++++++++++++++++++++------ UI/window-basic-main.hpp | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index c6b79309c..98b43cdd7 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -102,11 +102,9 @@ void OBSBasic::InitDefaultTransitions() ui->transitions->blockSignals(false); } -int OBSBasic::AddTransitionBeforeSeparator(const QString &name, - obs_source_t *source) +int OBSBasic::TransitionCount() { - int idx = -1; - + int idx = 0; for (int i = 0; i < ui->transitions->count(); i++) { QVariant v = ui->transitions->itemData(i); if (!v.toString().isEmpty()) { @@ -115,11 +113,21 @@ int OBSBasic::AddTransitionBeforeSeparator(const QString &name, } } + /* should always have at least fade and cut due to them being + * defaults */ + assert(idx != 0); + return idx - 1; /* remove separator from equation */ +} + +int OBSBasic::AddTransitionBeforeSeparator(const QString &name, + obs_source_t *source) +{ + int idx = TransitionCount(); ui->transitions->blockSignals(true); - ui->transitions->insertItem(idx - 1, name, + ui->transitions->insertItem(idx, name, QVariant::fromValue(OBSSource(source))); ui->transitions->blockSignals(false); - return idx - 1; + return idx; } void OBSBasic::AddQuickTransitionHotkey(QuickTransition *qt) @@ -577,7 +585,15 @@ void OBSBasic::on_transitionRemove_clicked() } } + ui->transitions->blockSignals(true); ui->transitions->removeItem(idx); + ui->transitions->setCurrentIndex(-1); + ui->transitions->blockSignals(false); + + int bottomIdx = TransitionCount() - 1; + if (idx > bottomIdx) + idx = bottomIdx; + ui->transitions->setCurrentIndex(idx); if (api) api->on_event(OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 77c987de9..0d8cdc49b 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -401,6 +401,7 @@ private: void CreateProgramDisplay(); void CreateProgramOptions(); + int TransitionCount(); int AddTransitionBeforeSeparator(const QString &name, obs_source_t *source); void AddQuickTransitionId(int id);