diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui
index fe9bbdd46..567b6e92c 100644
--- a/UI/forms/OBSBasic.ui
+++ b/UI/forms/OBSBasic.ui
@@ -1158,21 +1158,107 @@
0
+ -
+
+
+
+ 120
+ 0
+
+
+
+ Transition
+
+
+
-
4
-
-
-
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Expanding
+
+
- 120
- 0
+ 40
+ 20
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 22
+ 22
+
+
+
+ Basic.AddTransition
+
- Transition
+ Basic.AddTransition
+
+
+
+
+
+
+ :/res/images/add.png:/res/images/add.png
+
+
+ true
+
+
+ addIconSmall
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 22
+ 22
+
+
+
+ Basic.RemoveTransition
+
+
+ Basic.RemoveTransition
+
+
+
+
+
+
+ :/res/images/list_remove.png:/res/images/list_remove.png
+
+
+ true
+
+
+ removeIconSmall
diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp
index 7dc9e7969..782009e49 100644
--- a/UI/window-basic-main-transitions.cpp
+++ b/UI/window-basic-main-transitions.cpp
@@ -51,7 +51,6 @@ static inline QString MakeQuickTransitionText(QuickTransition *qt)
void OBSBasic::InitDefaultTransitions()
{
- ui->transitions->blockSignals(true);
std::vector transitions;
size_t idx = 0;
const char *id;
@@ -59,9 +58,9 @@ void OBSBasic::InitDefaultTransitions()
/* automatically add transitions that have no configuration (things
* such as cut/fade/etc) */
while (obs_enum_transition_types(idx++, &id)) {
- const char *name = obs_source_get_display_name(id);
-
if (!obs_is_source_configurable(id)) {
+ const char *name = obs_source_get_display_name(id);
+
OBSSourceAutoRelease tr =
obs_source_create_private(id, name, NULL);
InitTransition(tr);
@@ -69,23 +68,13 @@ void OBSBasic::InitDefaultTransitions()
if (strcmp(id, "fade_transition") == 0)
fadeTransition = tr;
- else if (strcmp(id, "cut_transition") == 0)
- cutTransition = tr;
- } else {
- ui->transitions->addItem(
- QTStr("Add ") + QT_UTF8(name),
- QVariant::fromValue(QString(QT_UTF8(id))));
}
}
- if (ui->transitions->count())
- ui->transitions->insertSeparator(ui->transitions->count());
-
for (OBSSource &tr : transitions) {
ui->transitions->addItem(QT_UTF8(obs_source_get_name(tr)),
QVariant::fromValue(OBSSource(tr)));
}
- ui->transitions->blockSignals(false);
}
void OBSBasic::AddQuickTransitionHotkey(QuickTransition *qt)
@@ -252,7 +241,7 @@ obs_source_t *OBSBasic::FindTransition(const char *name)
continue;
const char *trName = obs_source_get_name(tr);
- if (trName && *trName && strcmp(trName, name) == 0)
+ if (strcmp(trName, name) == 0)
return tr;
}
@@ -414,9 +403,6 @@ void OBSBasic::SetTransition(OBSSource transition)
{
OBSSourceAutoRelease oldTransition = obs_get_output_source(0);
- if (transition == oldTransition)
- return;
-
if (oldTransition && transition) {
obs_transition_swap_begin(transition, oldTransition);
if (transition != GetCurrentTransition())
@@ -432,10 +418,9 @@ void OBSBasic::SetTransition(OBSSource transition)
ui->transitionDuration->setVisible(!fixed);
bool configurable = obs_source_configurable(transition);
+ ui->transitionRemove->setEnabled(configurable);
ui->transitionProps->setEnabled(configurable);
- SetComboTransition(ui->transitions, transition);
-
if (api)
api->on_event(OBS_FRONTEND_EVENT_TRANSITION_CHANGED);
}
@@ -448,21 +433,17 @@ OBSSource OBSBasic::GetCurrentTransition()
void OBSBasic::on_transitions_currentIndexChanged(int)
{
OBSSource transition = GetCurrentTransition();
-
- if (transition)
- SetTransition(transition);
- else
- AddTransition(ui->transitions->currentData().value());
+ SetTransition(transition);
}
-void OBSBasic::AddTransition(QString id)
+void OBSBasic::AddTransition()
{
- if (id.isEmpty())
- return;
+ QAction *action = reinterpret_cast(sender());
+ QString idStr = action->property("id").toString();
string name;
QString placeHolderText =
- QT_UTF8(obs_source_get_display_name(QT_TO_UTF8(id)));
+ QT_UTF8(obs_source_get_display_name(QT_TO_UTF8(idStr)));
QString format = placeHolderText + " (%1)";
obs_source_t *source = nullptr;
int i = 1;
@@ -481,7 +462,7 @@ void OBSBasic::AddTransition(QString id)
OBSMessageBox::warning(this,
QTStr("NoNameEntered.Title"),
QTStr("NoNameEntered.Text"));
- AddTransition(id);
+ AddTransition();
return;
}
@@ -490,12 +471,12 @@ void OBSBasic::AddTransition(QString id)
OBSMessageBox::warning(this, QTStr("NameExists.Title"),
QTStr("NameExists.Text"));
- AddTransition(id);
+ AddTransition();
return;
}
- source = obs_source_create_private(QT_TO_UTF8(id), name.c_str(),
- NULL);
+ source = obs_source_create_private(QT_TO_UTF8(idStr),
+ name.c_str(), NULL);
InitTransition(source);
ui->transitions->addItem(
QT_UTF8(name.c_str()),
@@ -510,12 +491,34 @@ void OBSBasic::AddTransition(QString id)
ClearQuickTransitionWidgets();
RefreshQuickTransitions();
- } else {
- OBSSourceAutoRelease transition = obs_get_output_source(0);
- SetComboTransition(ui->transitions, transition);
}
}
+void OBSBasic::on_transitionAdd_clicked()
+{
+ bool foundConfigurableTransitions = false;
+ QMenu menu(this);
+ size_t idx = 0;
+ const char *id;
+
+ while (obs_enum_transition_types(idx++, &id)) {
+ if (obs_is_source_configurable(id)) {
+ const char *name = obs_source_get_display_name(id);
+ QAction *action = new QAction(name, this);
+ action->setProperty("id", id);
+
+ connect(action, SIGNAL(triggered()), this,
+ SLOT(AddTransition()));
+
+ menu.addAction(action);
+ foundConfigurableTransitions = true;
+ }
+ }
+
+ if (foundConfigurableTransitions)
+ menu.exec(QCursor::pos());
+}
+
void OBSBasic::on_transitionRemove_clicked()
{
OBSSource tr = GetCurrentTransition();
@@ -610,11 +613,6 @@ void OBSBasic::on_transitionProps_clicked()
action->setProperty("transition", QVariant::fromValue(source));
menu.addAction(action);
- action = new QAction(QTStr("Remove"), &menu);
- connect(action, SIGNAL(triggered()), this,
- SLOT(on_transitionRemove_clicked()));
- menu.addAction(action);
-
action = new QAction(QTStr("Properties"), &menu);
connect(action, &QAction::triggered, properties);
menu.addAction(action);
@@ -1789,6 +1787,8 @@ void OBSBasic::LoadTransitions(obs_data_array_t *transitions,
ui->transitions->addItem(
QT_UTF8(name),
QVariant::fromValue(OBSSource(source)));
+ ui->transitions->setCurrentIndex(
+ ui->transitions->count() - 1);
}
}
}
diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp
index 584e235d3..416944099 100644
--- a/UI/window-basic-main.hpp
+++ b/UI/window-basic-main.hpp
@@ -701,7 +701,7 @@ private slots:
void ProcessHotkey(obs_hotkey_id id, bool pressed);
- void AddTransition(QString id);
+ void AddTransition();
void RenameTransition();
void TransitionClicked();
void TransitionStopped();
@@ -1063,6 +1063,7 @@ private slots:
void on_toggleSourceIcons_toggled(bool visible);
void on_transitions_currentIndexChanged(int index);
+ void on_transitionAdd_clicked();
void on_transitionRemove_clicked();
void on_transitionProps_clicked();
void on_transitionDuration_valueChanged(int value);