UI: Add fade to black in studio mode
This commit is contained in:
parent
c56de17bdb
commit
1c005fcb51
@ -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."
|
HighResourceUsage="Encoding overloaded! Consider turning down video settings or using a faster encoding preset."
|
||||||
Transition="Transition"
|
Transition="Transition"
|
||||||
QuickTransitions="Quick Transitions"
|
QuickTransitions="Quick Transitions"
|
||||||
|
FadeToBlack="Fade to Black"
|
||||||
Left="Left"
|
Left="Left"
|
||||||
Right="Right"
|
Right="Right"
|
||||||
Top="Top"
|
Top="Top"
|
||||||
|
@ -36,7 +36,13 @@ Q_DECLARE_METATYPE(QuickTransition);
|
|||||||
|
|
||||||
static inline QString MakeQuickTransitionText(QuickTransition *qt)
|
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))
|
if (!obs_transition_fixed(qt->source))
|
||||||
name += QString(" (%1ms)").arg(QString::number(qt->duration));
|
name += QString(" (%1ms)").arg(QString::number(qt->duration));
|
||||||
return name;
|
return name;
|
||||||
@ -124,7 +130,7 @@ void OBSBasic::TriggerQuickTransition(int id)
|
|||||||
if (GetCurrentTransition() != qt->source)
|
if (GetCurrentTransition() != qt->source)
|
||||||
SetTransition(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,
|
quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions,
|
||||||
1),
|
1),
|
||||||
300, quickTransitionIdCounter++);
|
300, quickTransitionIdCounter++);
|
||||||
|
quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions,
|
||||||
|
1),
|
||||||
|
300, quickTransitionIdCounter++, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBSBasic::LoadQuickTransitions(obs_data_array_t *array)
|
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");
|
const char *name = obs_data_get_string(data, "name");
|
||||||
int duration = obs_data_get_int(data, "duration");
|
int duration = obs_data_get_int(data, "duration");
|
||||||
int id = obs_data_get_int(data, "id");
|
int id = obs_data_get_int(data, "id");
|
||||||
|
bool toBlack = obs_data_get_bool(data, "fade_to_black");
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
obs_source_t *source = FindTransition(name);
|
obs_source_t *source = FindTransition(name);
|
||||||
if (source) {
|
if (source) {
|
||||||
quickTransitions.emplace_back(source, duration,
|
quickTransitions.emplace_back(source, duration,
|
||||||
id);
|
id, toBlack);
|
||||||
|
|
||||||
if (quickTransitionIdCounter <= id)
|
if (quickTransitionIdCounter <= id)
|
||||||
quickTransitionIdCounter = id + 1;
|
quickTransitionIdCounter = id + 1;
|
||||||
@ -219,6 +229,7 @@ obs_data_array_t *OBSBasic::SaveQuickTransitions()
|
|||||||
obs_data_set_int(data, "duration", qt.duration);
|
obs_data_set_int(data, "duration", qt.duration);
|
||||||
obs_data_set_array(data, "hotkeys", hotkeys);
|
obs_data_set_array(data, "hotkeys", hotkeys);
|
||||||
obs_data_set_int(data, "id", qt.id);
|
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);
|
obs_data_array_push_back(array, data);
|
||||||
|
|
||||||
@ -292,7 +303,7 @@ void OBSBasic::TransitionFullyStopped()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct,
|
void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct,
|
||||||
bool quickTransition)
|
bool quickTransition, bool black)
|
||||||
{
|
{
|
||||||
obs_scene_t *scene = obs_scene_from_source(source);
|
obs_scene_t *scene = obs_scene_from_source(source);
|
||||||
bool usingPreviewProgram = IsPreviewProgramMode();
|
bool usingPreviewProgram = IsPreviewProgramMode();
|
||||||
@ -305,7 +316,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct,
|
|||||||
lastProgramScene = programScene;
|
lastProgramScene = programScene;
|
||||||
programScene = OBSGetWeakRef(source);
|
programScene = OBSGetWeakRef(source);
|
||||||
|
|
||||||
if (swapScenesMode && !force && !direct) {
|
if (swapScenesMode && !force && !direct && !black) {
|
||||||
OBSSource newScene = OBSGetStrongRef(lastProgramScene);
|
OBSSource newScene = OBSGetStrongRef(lastProgramScene);
|
||||||
|
|
||||||
if (!sceneDuplicationMode && newScene == source)
|
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(
|
bool success = obs_transition_start(
|
||||||
transition, OBS_TRANSITION_MODE_AUTO, duration, source);
|
transition, OBS_TRANSITION_MODE_AUTO, duration, source);
|
||||||
if (!success)
|
if (!success)
|
||||||
@ -940,6 +963,7 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
|
|||||||
{
|
{
|
||||||
QMenu *menu = new QMenu(parent);
|
QMenu *menu = new QMenu(parent);
|
||||||
QAction *action;
|
QAction *action;
|
||||||
|
OBSSource tr;
|
||||||
|
|
||||||
if (qt) {
|
if (qt) {
|
||||||
action = menu->addAction(QTStr("Remove"));
|
action = menu->addAction(QTStr("Remove"));
|
||||||
@ -965,8 +989,25 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
|
|||||||
this, &OBSBasic::QuickTransitionChangeDuration);
|
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<QWidget *>(duration));
|
||||||
|
connect(action, &QAction::triggered, this,
|
||||||
|
&OBSBasic::AddQuickTransition);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < ui->transitions->count(); i++) {
|
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 = menu->addAction(obs_source_get_name(tr));
|
||||||
action->setProperty("transition_index", i);
|
action->setProperty("transition_index", i);
|
||||||
@ -1037,10 +1078,12 @@ void OBSBasic::AddQuickTransition()
|
|||||||
{
|
{
|
||||||
int trIdx = sender()->property("transition_index").toInt();
|
int trIdx = sender()->property("transition_index").toInt();
|
||||||
QSpinBox *duration = sender()->property("duration").value<QSpinBox *>();
|
QSpinBox *duration = sender()->property("duration").value<QSpinBox *>();
|
||||||
|
bool toBlack = sender()->property("fadeToBlack").value<bool>();
|
||||||
OBSSource transition = GetTransitionComboItem(ui->transitions, trIdx);
|
OBSSource transition = GetTransitionComboItem(ui->transitions, trIdx);
|
||||||
int id = quickTransitionIdCounter++;
|
int id = quickTransitionIdCounter++;
|
||||||
|
|
||||||
quickTransitions.emplace_back(transition, duration->value(), id);
|
quickTransitions.emplace_back(transition, duration->value(), id,
|
||||||
|
toBlack);
|
||||||
AddQuickTransitionId(id);
|
AddQuickTransitionId(id);
|
||||||
|
|
||||||
int idx = (int)quickTransitions.size() - 1;
|
int idx = (int)quickTransitions.size() - 1;
|
||||||
|
@ -86,12 +86,15 @@ struct QuickTransition {
|
|||||||
obs_hotkey_id hotkey = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id hotkey = OBS_INVALID_HOTKEY_ID;
|
||||||
int duration = 0;
|
int duration = 0;
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
bool fadeToBlack = false;
|
||||||
|
|
||||||
inline QuickTransition() {}
|
inline QuickTransition() {}
|
||||||
inline QuickTransition(OBSSource source_, int duration_, int id_)
|
inline QuickTransition(OBSSource source_, int duration_, int id_,
|
||||||
|
bool fadeToBlack_ = false)
|
||||||
: source(source_),
|
: source(source_),
|
||||||
duration(duration_),
|
duration(duration_),
|
||||||
id(id_),
|
id(id_),
|
||||||
|
fadeToBlack(fadeToBlack_),
|
||||||
renamedSignal(std::make_shared<OBSSignal>(
|
renamedSignal(std::make_shared<OBSSignal>(
|
||||||
obs_source_get_signal_handler(source), "rename",
|
obs_source_get_signal_handler(source), "rename",
|
||||||
SourceRenamed, this))
|
SourceRenamed, this))
|
||||||
@ -477,7 +480,8 @@ public slots:
|
|||||||
bool direct = false);
|
bool direct = false);
|
||||||
void TransitionToScene(OBSSource scene, bool force = false,
|
void TransitionToScene(OBSSource scene, bool force = false,
|
||||||
bool direct = false,
|
bool direct = false,
|
||||||
bool quickTransition = false);
|
bool quickTransition = false,
|
||||||
|
bool black = false);
|
||||||
void SetCurrentScene(OBSSource scene, bool force = false,
|
void SetCurrentScene(OBSSource scene, bool force = false,
|
||||||
bool direct = false);
|
bool direct = false);
|
||||||
|
|
||||||
@ -596,6 +600,8 @@ private:
|
|||||||
bool LowDiskSpace();
|
bool LowDiskSpace();
|
||||||
void DiskSpaceMessage();
|
void DiskSpaceMessage();
|
||||||
|
|
||||||
|
OBSSource prevFTBSource = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OBSSource GetProgramSource();
|
OBSSource GetProgramSource();
|
||||||
OBSScene GetCurrentScene();
|
OBSScene GetCurrentScene();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user