From 1c005fcb51c1bb7d561af91f838aac703a7c2549 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Wed, 23 Oct 2019 16:11:14 -0500 Subject: [PATCH] UI: Add fade to black in studio mode --- UI/data/locale/en-US.ini | 1 + UI/window-basic-main-transitions.cpp | 57 ++++++++++++++++++++++++---- UI/window-basic-main.hpp | 10 ++++- 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 3ab69de19..acec511f6 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -57,6 +57,7 @@ ResetOSXVSyncOnExit="Reset OSX V-Sync on Exit" HighResourceUsage="Encoding overloaded! Consider turning down video settings or using a faster encoding preset." Transition="Transition" QuickTransitions="Quick Transitions" +FadeToBlack="Fade to Black" Left="Left" Right="Right" Top="Top" diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index c97121cf2..76890c28d 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -36,7 +36,13 @@ Q_DECLARE_METATYPE(QuickTransition); static inline QString MakeQuickTransitionText(QuickTransition *qt) { - QString name = QT_UTF8(obs_source_get_name(qt->source)); + QString name; + + if (!qt->fadeToBlack) + name = QT_UTF8(obs_source_get_name(qt->source)); + else + name = QTStr("FadeToBlack"); + if (!obs_transition_fixed(qt->source)) name += QString(" (%1ms)").arg(QString::number(qt->duration)); return name; @@ -124,7 +130,7 @@ void OBSBasic::TriggerQuickTransition(int id) if (GetCurrentTransition() != qt->source) SetTransition(qt->source); - TransitionToScene(source, false, false, true); + TransitionToScene(source, false, false, true, qt->fadeToBlack); } } @@ -169,6 +175,9 @@ void OBSBasic::CreateDefaultQuickTransitions() quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions, 1), 300, quickTransitionIdCounter++); + quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions, + 1), + 300, quickTransitionIdCounter++, true); } void OBSBasic::LoadQuickTransitions(obs_data_array_t *array) @@ -183,12 +192,13 @@ void OBSBasic::LoadQuickTransitions(obs_data_array_t *array) const char *name = obs_data_get_string(data, "name"); int duration = obs_data_get_int(data, "duration"); int id = obs_data_get_int(data, "id"); + bool toBlack = obs_data_get_bool(data, "fade_to_black"); if (id) { obs_source_t *source = FindTransition(name); if (source) { quickTransitions.emplace_back(source, duration, - id); + id, toBlack); if (quickTransitionIdCounter <= id) quickTransitionIdCounter = id + 1; @@ -219,6 +229,7 @@ obs_data_array_t *OBSBasic::SaveQuickTransitions() obs_data_set_int(data, "duration", qt.duration); obs_data_set_array(data, "hotkeys", hotkeys); obs_data_set_int(data, "id", qt.id); + obs_data_set_bool(data, "fade_to_black", qt.fadeToBlack); obs_data_array_push_back(array, data); @@ -292,7 +303,7 @@ void OBSBasic::TransitionFullyStopped() } void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, - bool quickTransition) + bool quickTransition, bool black) { obs_scene_t *scene = obs_scene_from_source(source); bool usingPreviewProgram = IsPreviewProgramMode(); @@ -305,7 +316,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, lastProgramScene = programScene; programScene = OBSGetWeakRef(source); - if (swapScenesMode && !force && !direct) { + if (swapScenesMode && !force && !direct && !black) { OBSSource newScene = OBSGetStrongRef(lastProgramScene); if (!sceneDuplicationMode && newScene == source) @@ -361,6 +372,18 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, } } + if (black && !prevFTBSource) { + source = nullptr; + prevFTBSource = + obs_transition_get_active_source(transition); + obs_source_release(prevFTBSource); + } else if (black && prevFTBSource) { + source = prevFTBSource; + prevFTBSource = nullptr; + } else if (!black) { + prevFTBSource = nullptr; + } + bool success = obs_transition_start( transition, OBS_TRANSITION_MODE_AUTO, duration, source); if (!success) @@ -940,6 +963,7 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt) { QMenu *menu = new QMenu(parent); QAction *action; + OBSSource tr; if (qt) { action = menu->addAction(QTStr("Remove")); @@ -965,8 +989,25 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt) this, &OBSBasic::QuickTransitionChangeDuration); } + tr = GetTransitionComboItem(ui->transitions, 1); + + action = menu->addAction(QTStr("FadeToBlack")); + action->setProperty("transition_index", 1); + action->setProperty("fadeToBlack", true); + + if (qt) { + action->setProperty("id", qt->id); + connect(action, &QAction::triggered, this, + &OBSBasic::QuickTransitionChange); + } else { + action->setProperty("duration", + QVariant::fromValue(duration)); + connect(action, &QAction::triggered, this, + &OBSBasic::AddQuickTransition); + } + for (int i = 0; i < ui->transitions->count(); i++) { - OBSSource tr = GetTransitionComboItem(ui->transitions, i); + tr = GetTransitionComboItem(ui->transitions, i); action = menu->addAction(obs_source_get_name(tr)); action->setProperty("transition_index", i); @@ -1037,10 +1078,12 @@ void OBSBasic::AddQuickTransition() { int trIdx = sender()->property("transition_index").toInt(); QSpinBox *duration = sender()->property("duration").value(); + bool toBlack = sender()->property("fadeToBlack").value(); OBSSource transition = GetTransitionComboItem(ui->transitions, trIdx); int id = quickTransitionIdCounter++; - quickTransitions.emplace_back(transition, duration->value(), id); + quickTransitions.emplace_back(transition, duration->value(), id, + toBlack); AddQuickTransitionId(id); int idx = (int)quickTransitions.size() - 1; diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index bb67cc47b..5be582d27 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -86,12 +86,15 @@ struct QuickTransition { obs_hotkey_id hotkey = OBS_INVALID_HOTKEY_ID; int duration = 0; int id = 0; + bool fadeToBlack = false; inline QuickTransition() {} - inline QuickTransition(OBSSource source_, int duration_, int id_) + inline QuickTransition(OBSSource source_, int duration_, int id_, + bool fadeToBlack_ = false) : source(source_), duration(duration_), id(id_), + fadeToBlack(fadeToBlack_), renamedSignal(std::make_shared( obs_source_get_signal_handler(source), "rename", SourceRenamed, this)) @@ -477,7 +480,8 @@ public slots: bool direct = false); void TransitionToScene(OBSSource scene, bool force = false, bool direct = false, - bool quickTransition = false); + bool quickTransition = false, + bool black = false); void SetCurrentScene(OBSSource scene, bool force = false, bool direct = false); @@ -596,6 +600,8 @@ private: bool LowDiskSpace(); void DiskSpaceMessage(); + OBSSource prevFTBSource = nullptr; + public: OBSSource GetProgramSource(); OBSScene GetCurrentScene();