Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions frontend/OBSStudioAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,11 @@ void OBSStudioAPI::obs_frontend_set_current_scene(obs_source_t *scene)

void OBSStudioAPI::obs_frontend_get_transitions(struct obs_frontend_source_list *sources)
{
for (int i = 0; i < main->ui->transitions->count(); i++) {
OBSSource tr = main->ui->transitions->itemData(i).value<OBSSource>();
for (const auto &[uuid, transition] : main->transitions) {
obs_source_t *source = transition;

if (!tr)
continue;

if (obs_source_get_ref(tr) != nullptr)
da_push_back(sources->sources, &tr);
if (obs_source_get_ref(source) != nullptr)
da_push_back(sources->sources, &source);
}
}

Expand All @@ -98,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()
Expand Down
36 changes: 35 additions & 1 deletion frontend/widgets/OBSBasic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,40 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new

connect(controls, &OBSBasicControls::SettingsButtonClicked, this, &OBSBasic::on_action_Settings_triggered);

/* Set up transitions combobox connections */
connect(this, &OBSBasic::TransitionAdded, this, [this](const QString &name, const QString &uuid) {
QSignalBlocker sb(ui->transitions);
ui->transitions->addItem(name, uuid);
});
connect(this, &OBSBasic::TransitionRenamed, this, [this](const QString &uuid, const QString &newName) {
QSignalBlocker sb(ui->transitions);
ui->transitions->setItemText(ui->transitions->findData(uuid), newName);
});
connect(this, &OBSBasic::TransitionRemoved, this, [this](const QString &uuid) {
QSignalBlocker sb(ui->transitions);
ui->transitions->removeItem(ui->transitions->findData(uuid));
});
connect(this, &OBSBasic::TransitionsCleared, this, [this]() {
QSignalBlocker sb(ui->transitions);
ui->transitions->clear();
});

connect(this, &OBSBasic::CurrentTransitionChanged, this, [this](const QString &uuid) {
QSignalBlocker sb(ui->transitions);
ui->transitions->setCurrentIndex(ui->transitions->findData(uuid));
});

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();
Expand Down Expand Up @@ -967,7 +1001,7 @@ void OBSBasic::OBSInit()
}

/* Modules can access frontend information (i.e. profile and scene collection data) during their initialization, and some modules (e.g. obs-websockets) are known to use the filesystem location of the current profile in their own code.

Thus the profile and scene collection discovery needs to happen before any access to that information (but after intializing global settings) to ensure legacy code gets valid path information.
*/
RefreshSceneCollections(true);
Expand Down
26 changes: 24 additions & 2 deletions frontend/widgets/OBSBasic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1466,6 +1466,14 @@ private slots:
std::vector<OBSDataAutoRelease> safeModeTransitions;
QPointer<QPushButton> transitionButton;
QPointer<QMenu> perSceneTransitionMenu;

std::unordered_map<std::string, OBSSource> transitions;
// FIXME: Any code accessing this collection relies on order of insertion
std::vector<std::string> transitionUuids;
// FIXME: Replace usages of a name to identify a transition
std::unordered_map<std::string, std::string> transitionNameToUuids;
int transitionDuration;
std::string currentTransitionUuid;
obs_source_t *fadeTransition;
obs_source_t *cutTransition;
std::vector<QuickTransition> quickTransitions;
Expand Down Expand Up @@ -1519,6 +1527,8 @@ private slots:

void PasteShowHideTransition(obs_sceneitem_t *item, bool show, obs_source_t *tr, int duration);

void UpdateCurrentTransition(const std::string &uuid, bool setTransition);

public slots:
void SetCurrentScene(OBSSource scene, bool force = false);

Expand All @@ -1528,6 +1538,10 @@ public slots:
void TransitionToScene(OBSSource scene, bool force = false, bool quickTransition = false, int quickDuration = 0,
bool black = false, bool manual = false);

void SetCurrentTransition(const QString &uuid);

void SetTransitionDuration(int duration);

private slots:
void AddTransition(const char *id);
void RenameTransition(OBSSource transition);
Expand All @@ -1540,15 +1554,23 @@ private slots:
void TBarChanged(int value);
void TBarReleased();

void on_transitions_currentIndexChanged(int index);
void on_transitionAdd_clicked();
void on_transitionRemove_clicked();
void on_transitionProps_clicked();
void on_transitionDuration_valueChanged();

void ShowTransitionProperties();
void HideTransitionProperties();

signals:
void TransitionAdded(const QString &name, const QString &uuid);
void TransitionRenamed(const QString &uuid, const QString &newName);
void TransitionRemoved(const QString &uuid);
void TransitionsCleared();

void CurrentTransitionChanged(const QString &uuid);

void TransitionDurationChanged(const int &duration);

public:
int GetTransitionDuration();
int GetTbarPosition();
Expand Down
24 changes: 14 additions & 10 deletions frontend/widgets/OBSBasic_SceneCollections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -882,13 +882,12 @@ void OBSBasic::Save(SceneCollection &collection)
curProgramScene = obs_scene_get_source(scene);

OBSDataArrayAutoRelease sceneOrder = SaveSceneListOrder();
OBSDataArrayAutoRelease transitions = SaveTransitions();
OBSDataArrayAutoRelease transitionsData = SaveTransitions();
OBSDataArrayAutoRelease quickTrData = SaveQuickTransitions();
OBSDataArrayAutoRelease savedProjectorList = SaveProjectors();
OBSDataArrayAutoRelease savedCanvases = OBS::Canvas::SaveCanvases(canvases);
OBSDataAutoRelease saveData = GenerateSaveData(sceneOrder, quickTrData, ui->transitionDuration->value(),
transitions, 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());
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -1172,7 +1171,7 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)
OBSDataArrayAutoRelease sceneOrder = obs_data_get_array(data, "scene_order");
OBSDataArrayAutoRelease sources = obs_data_get_array(data, "sources");
OBSDataArrayAutoRelease groups = obs_data_get_array(data, "groups");
OBSDataArrayAutoRelease transitions = obs_data_get_array(data, "transitions");
OBSDataArrayAutoRelease transitionsData = obs_data_get_array(data, "transitions");
OBSDataArrayAutoRelease collection_canvases = obs_data_get_array(data, "canvases");
const char *sceneName = obs_data_get_string(data, "current_scene");
const char *programSceneName = obs_data_get_string(data, "current_program_scene");
Expand Down Expand Up @@ -1295,16 +1294,16 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)

if (resetVideo)
ResetVideo();
if (transitions)
LoadTransitions(transitions, AddMissingFiles, files);
if (transitionsData)
LoadTransitions(transitionsData, AddMissingFiles, files);
if (sceneOrder)
LoadSceneListOrder(sceneOrder);

curTransition = FindTransition(transitionName);
if (!curTransition)
curTransition = fadeTransition;

ui->transitionDuration->setValue(newDuration);
transitionDuration = newDuration;
SetTransition(curTransition);

retryScene:
Expand Down Expand Up @@ -1499,7 +1498,12 @@ void OBSBasic::ClearSceneData()
ClearListItems(ui->scenes);
ui->sources->Clear();
ClearQuickTransitions();
ui->transitions->clear();

currentTransitionUuid.clear();
transitions.clear();
transitionNameToUuids.clear();
transitionUuids.clear();
emit TransitionsCleared();

ClearProjectors();

Expand Down
10 changes: 5 additions & 5 deletions frontend/widgets/OBSBasic_StudioMode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,17 @@ void OBSBasic::CreateProgramOptions()
transitionButton = new QPushButton(QTStr("Transition"));
transitionButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

QHBoxLayout *quickTransitions = new QHBoxLayout();
quickTransitions->setSpacing(2);
QHBoxLayout *quickTransitionsLayout = new QHBoxLayout();
quickTransitionsLayout->setSpacing(2);

QPushButton *addQuickTransition = new QPushButton();
addQuickTransition->setProperty("class", "icon-plus");

QLabel *quickTransitionsLabel = new QLabel(QTStr("QuickTransitions"));
quickTransitionsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

quickTransitions->addWidget(quickTransitionsLabel);
quickTransitions->addWidget(addQuickTransition);
quickTransitionsLayout->addWidget(quickTransitionsLabel);
quickTransitionsLayout->addWidget(addQuickTransition);

mainButtonLayout->addWidget(transitionButton);
mainButtonLayout->addWidget(configTransitions);
Expand All @@ -102,7 +102,7 @@ void OBSBasic::CreateProgramOptions()

layout->addStretch(0);
layout->addLayout(mainButtonLayout);
layout->addLayout(quickTransitions);
layout->addLayout(quickTransitionsLayout);
layout->addWidget(tBar);
layout->addStretch(0);

Expand Down
Loading
Loading