diff --git a/frontend/OBSStudioAPI.cpp b/frontend/OBSStudioAPI.cpp index 283cd2f48..e9cbf7a83 100644 --- a/frontend/OBSStudioAPI.cpp +++ b/frontend/OBSStudioAPI.cpp @@ -95,12 +95,12 @@ void OBSStudioAPI::obs_frontend_set_current_transition(obs_source_t *transition) int OBSStudioAPI::obs_frontend_get_transition_duration() { - return main->ui->transitionDuration->value(); + return main->GetTransitionDuration(); } void OBSStudioAPI::obs_frontend_set_transition_duration(int duration) { - QMetaObject::invokeMethod(main->ui->transitionDuration, "setValue", Q_ARG(int, duration)); + QMetaObject::invokeMethod(main, "SetTransitionDuration", Q_ARG(int, duration)); } void OBSStudioAPI::obs_frontend_release_tbar() diff --git a/frontend/widgets/OBSBasic.cpp b/frontend/widgets/OBSBasic.cpp index 39686d88c..662d8eb08 100644 --- a/frontend/widgets/OBSBasic.cpp +++ b/frontend/widgets/OBSBasic.cpp @@ -313,6 +313,14 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new connect(ui->transitions, &QComboBox::currentIndexChanged, this, [this]() { SetCurrentTransition(ui->transitions->currentData().toString()); }); + connect(this, &OBSBasic::TransitionDurationChanged, this, [this](int duration) { + QSignalBlocker sb(ui->transitionDuration); + ui->transitionDuration->setValue(duration); + }); + + connect(ui->transitionDuration, &QSpinBox::valueChanged, this, + [this](int value) { SetTransitionDuration(value); }); + startingDockLayout = saveState(); statsDock = new OBSDock(); diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index 7165e36c5..44c0be56e 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -1482,6 +1482,7 @@ private: std::vector transitionUuids; // FIXME: Replace usages of a name to identify a transition std::unordered_map transitionNameToUuids; + int transitionDuration; std::string currentTransitionUuid; obs_source_t *fadeTransition; obs_source_t *cutTransition; @@ -1549,6 +1550,8 @@ public slots: void SetCurrentTransition(const QString &uuid); + void SetTransitionDuration(int duration); + private slots: void AddTransition(const char *id); void RenameTransition(OBSSource transition); @@ -1564,7 +1567,6 @@ private slots: void on_transitionAdd_clicked(); void on_transitionRemove_clicked(); void on_transitionProps_clicked(); - void on_transitionDuration_valueChanged(); void ShowTransitionProperties(); void HideTransitionProperties(); @@ -1577,6 +1579,8 @@ signals: void CurrentTransitionChanged(const QString &uuid); + void TransitionDurationChanged(const int &duration); + public: int GetTransitionDuration(); int GetTbarPosition(); diff --git a/frontend/widgets/OBSBasic_SceneCollections.cpp b/frontend/widgets/OBSBasic_SceneCollections.cpp index 60a9eb015..ee9e4e608 100644 --- a/frontend/widgets/OBSBasic_SceneCollections.cpp +++ b/frontend/widgets/OBSBasic_SceneCollections.cpp @@ -886,9 +886,8 @@ void OBSBasic::Save(SceneCollection &collection) OBSDataArrayAutoRelease quickTrData = SaveQuickTransitions(); OBSDataArrayAutoRelease savedProjectorList = SaveProjectors(); OBSDataArrayAutoRelease savedCanvases = OBS::Canvas::SaveCanvases(canvases); - OBSDataAutoRelease saveData = GenerateSaveData(sceneOrder, quickTrData, ui->transitionDuration->value(), - transitionsData, scene, curProgramScene, savedProjectorList, - savedCanvases); + OBSDataAutoRelease saveData = GenerateSaveData(sceneOrder, quickTrData, transitionDuration, transitionsData, + scene, curProgramScene, savedProjectorList, savedCanvases); obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked()); obs_data_set_bool(saveData, "scaling_enabled", ui->preview->IsFixedScaling()); @@ -1004,7 +1003,7 @@ void OBSBasic::CreateDefaultScene(bool firstStart) ClearSceneData(); InitDefaultTransitions(); CreateDefaultQuickTransitions(); - ui->transitionDuration->setValue(300); + transitionDuration = 300; SetTransition(fadeTransition); updateRemigrationMenuItem(SceneCoordinateMode::Relative, ui->actionRemigrateSceneCollection); @@ -1304,7 +1303,7 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection) if (!curTransition) curTransition = fadeTransition; - ui->transitionDuration->setValue(newDuration); + transitionDuration = newDuration; SetTransition(curTransition); retryScene: diff --git a/frontend/widgets/OBSBasic_Transitions.cpp b/frontend/widgets/OBSBasic_Transitions.cpp index e19fc9d17..b76f43376 100644 --- a/frontend/widgets/OBSBasic_Transitions.cpp +++ b/frontend/widgets/OBSBasic_Transitions.cpp @@ -333,7 +333,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool quickTransit obs_transition_set(transition, source); OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED); } else { - int duration = ui->transitionDuration->value(); + int duration = GetTransitionDuration(); /* check for scene override */ OBSSource trOverride = GetOverrideTransition(source); @@ -603,11 +603,6 @@ void OBSBasic::on_transitionProps_clicked() menu.exec(QCursor::pos()); } -void OBSBasic::on_transitionDuration_valueChanged() -{ - OnEvent(OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED); -} - QuickTransition *OBSBasic::GetQuickTransition(int id) { for (QuickTransition &qt : quickTransitions) { @@ -1420,7 +1415,7 @@ int OBSBasic::GetOverrideTransitionDuration(OBSSource source) int OBSBasic::GetTransitionDuration() { - return ui->transitionDuration->value(); + return transitionDuration; } void OBSBasic::UpdateCurrentTransition(const std::string &uuid, bool setTransition) @@ -1450,3 +1445,18 @@ void OBSBasic::SetCurrentTransition(const QString &uuid) emit CurrentTransitionChanged(uuid); } + +void OBSBasic::SetTransitionDuration(int duration) +{ + duration = std::max(duration, 50); + duration = std::min(duration, 20000); + + if (duration == transitionDuration) + return; + + transitionDuration = duration; + + emit TransitionDurationChanged(transitionDuration); + + OnEvent(OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED); +}