libobs: Refactor hide/show transition functions

Having two separate functions for each hide/show transition action is
silly and makes code awful.
This commit is contained in:
jp9000 2022-03-24 22:32:41 -07:00
parent 5e2c757cd1
commit e236a16715
4 changed files with 94 additions and 83 deletions

View file

@ -1095,7 +1095,7 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu()
void OBSBasic::on_actionShowTransitionProperties_triggered()
{
OBSSceneItem item = GetCurrentSceneItem();
OBSSource source = obs_sceneitem_get_show_transition(item);
OBSSource source = obs_sceneitem_get_transition(item, true);
if (source)
CreatePropertiesWindow(source);
@ -1104,7 +1104,7 @@ void OBSBasic::on_actionShowTransitionProperties_triggered()
void OBSBasic::on_actionHideTransitionProperties_triggered()
{
OBSSceneItem item = GetCurrentSceneItem();
OBSSource source = obs_sceneitem_get_hide_transition(item);
OBSSource source = obs_sceneitem_get_transition(item, false);
if (source)
CreatePropertiesWindow(source);
@ -1118,14 +1118,11 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
new QMenu(QTStr(visible ? "ShowTransition" : "HideTransition"));
QAction *action;
OBSSource curTransition =
visible ? obs_sceneitem_get_show_transition(si)
: obs_sceneitem_get_hide_transition(si);
OBSSource curTransition = obs_sceneitem_get_transition(si, visible);
const char *curId = curTransition ? obs_source_get_id(curTransition)
: nullptr;
int curDuration =
(int)(visible ? obs_sceneitem_get_show_transition_duration(si)
: obs_sceneitem_get_hide_transition_duration(si));
(int)obs_sceneitem_get_transition_duration(si, visible);
if (curDuration <= 0)
curDuration = obs_frontend_get_transition_duration();
@ -1164,18 +1161,11 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
OBSDataAutoRelease oldTransitionData =
obs_sceneitem_transition_save(sceneItem, visible);
if (id.isNull() || id.isEmpty()) {
if (visible)
obs_sceneitem_set_show_transition(sceneItem,
nullptr);
else
obs_sceneitem_set_hide_transition(sceneItem,
nullptr);
obs_sceneitem_set_transition(sceneItem, visible,
nullptr);
} else {
OBSSource tr =
visible ? obs_sceneitem_get_show_transition(
sceneItem)
: obs_sceneitem_get_hide_transition(
sceneItem);
OBSSource tr = obs_sceneitem_get_transition(sceneItem,
visible);
if (!tr || strcmp(QT_TO_UTF8(id),
obs_source_get_id(tr)) != 0) {
@ -1187,28 +1177,18 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
tr = obs_source_create_private(QT_TO_UTF8(id),
QT_TO_UTF8(name),
nullptr);
if (visible)
obs_sceneitem_set_show_transition(
sceneItem, tr);
else
obs_sceneitem_set_hide_transition(
sceneItem, tr);
obs_sceneitem_set_transition(sceneItem, visible,
tr);
obs_source_release(tr);
int duration =
(int)(visible ? obs_sceneitem_get_show_transition_duration(
sceneItem)
: obs_sceneitem_get_hide_transition_duration(
sceneItem));
int duration = (int)
obs_sceneitem_get_transition_duration(
sceneItem, visible);
if (duration <= 0) {
duration =
obs_frontend_get_transition_duration();
if (visible)
obs_sceneitem_set_show_transition_duration(
sceneItem, duration);
else
obs_sceneitem_set_hide_transition_duration(
sceneItem, duration);
obs_sceneitem_set_transition_duration(
sceneItem, visible, duration);
}
}
if (obs_source_configurable(tr))
@ -1227,31 +1207,15 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
sceneItem))),
undo_redo, undo_redo, undo_data, redo_data);
};
if (visible) {
auto setDuration = [](int duration) {
OBSBasic *main = reinterpret_cast<OBSBasic *>(
App()->GetMainWindow());
auto setDuration = [visible](int duration) {
OBSBasic *main =
reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
OBSSceneItem item = main->GetCurrentSceneItem();
obs_sceneitem_set_show_transition_duration(item,
duration);
};
connect(duration,
(void (QSpinBox::*)(int)) & QSpinBox::valueChanged,
setDuration);
} else {
auto setDuration = [](int duration) {
OBSBasic *main = reinterpret_cast<OBSBasic *>(
App()->GetMainWindow());
OBSSceneItem item = main->GetCurrentSceneItem();
obs_sceneitem_set_hide_transition_duration(item,
duration);
};
connect(duration,
(void (QSpinBox::*)(int)) & QSpinBox::valueChanged,
setDuration);
}
OBSSceneItem item = main->GetCurrentSceneItem();
obs_sceneitem_set_transition_duration(item, visible, duration);
};
connect(duration, (void (QSpinBox::*)(int)) & QSpinBox::valueChanged,
setDuration);
action = menu->addAction(QT_UTF8(Str("None")));
action->setProperty("transition_id", QT_UTF8(""));

View file

@ -912,8 +912,8 @@ static bool LogSceneItem(obs_scene_t *, obs_sceneitem_t *item, void *v_val)
obs_source_enum_filters(source, LogFilter,
(void *)(intptr_t)child_indent);
obs_source_t *show_tn = obs_sceneitem_get_show_transition(item);
obs_source_t *hide_tn = obs_sceneitem_get_hide_transition(item);
obs_source_t *show_tn = obs_sceneitem_get_transition(item, true);
obs_source_t *hide_tn = obs_sceneitem_get_transition(item, false);
if (show_tn)
blog(LOG_INFO, " %s- show: '%s' (%s)", indent.c_str(),
obs_source_get_name(show_tn), obs_source_get_id(show_tn));

View file

@ -1523,14 +1523,14 @@ static inline void duplicate_item_data(struct obs_scene_item *dst,
obs_source_t *transition = obs_source_duplicate(
src->show_transition,
obs_source_get_name(src->show_transition), true);
obs_sceneitem_set_show_transition(dst, transition);
obs_sceneitem_set_transition(dst, true, transition);
obs_source_release(transition);
}
if (src->hide_transition) {
obs_source_t *transition = obs_source_duplicate(
src->hide_transition,
obs_source_get_name(src->hide_transition), true);
obs_sceneitem_set_hide_transition(dst, transition);
obs_sceneitem_set_transition(dst, false, transition);
obs_source_release(transition);
}
dst->show_transition_duration = src->show_transition_duration;
@ -2129,8 +2129,8 @@ void obs_sceneitem_remove(obs_sceneitem_t *item)
full_unlock(scene);
obs_sceneitem_set_show_transition(item, NULL);
obs_sceneitem_set_hide_transition(item, NULL);
obs_sceneitem_set_transition(item, true, NULL);
obs_sceneitem_set_transition(item, false, NULL);
obs_sceneitem_release(item);
}
@ -3655,6 +3655,46 @@ uint32_t obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item)
return item->hide_transition_duration;
}
void obs_sceneitem_set_transition(obs_sceneitem_t *item, bool show,
obs_source_t *transition)
{
if (!item)
return;
obs_source_t **target = show ? &item->show_transition
: &item->hide_transition;
if (*target)
obs_source_release(*target);
*target = obs_source_get_ref(transition);
}
obs_source_t *obs_sceneitem_get_transition(obs_sceneitem_t *item, bool show)
{
if (!item)
return NULL;
return show ? item->show_transition : item->hide_transition;
}
void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item, bool show,
uint32_t duration_ms)
{
if (!item)
return;
if (show)
item->show_transition_duration = duration_ms;
else
item->hide_transition_duration = duration_ms;
}
uint32_t obs_sceneitem_get_transition_duration(obs_sceneitem_t *item, bool show)
{
if (!item)
return 0;
return show ? item->show_transition_duration
: item->hide_transition_duration;
}
void obs_sceneitem_transition_stop(void *data, calldata_t *calldata)
{
obs_source_t *parent = data;
@ -3679,16 +3719,12 @@ void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible)
if (transition_active(item->hide_transition))
obs_transition_force_stop(item->hide_transition);
obs_source_t *transition =
visible ? obs_sceneitem_get_show_transition(item)
: obs_sceneitem_get_hide_transition(item);
obs_source_t *transition = obs_sceneitem_get_transition(item, visible);
if (!transition)
return;
int duration =
(int)(visible ? obs_sceneitem_get_show_transition_duration(item)
: obs_sceneitem_get_hide_transition_duration(
item));
(int)obs_sceneitem_get_transition_duration(item, visible);
const int cx = obs_source_get_width(item->source);
const int cy = obs_source_get_height(item->source);
@ -3729,10 +3765,7 @@ void obs_sceneitem_transition_load(struct obs_scene_item *item,
const char *tn = obs_data_get_string(data, "name");
obs_data_t *s = obs_data_get_obj(data, "transition");
obs_source_t *t = obs_source_create_private(id, tn, s);
if (show)
obs_sceneitem_set_show_transition(item, t);
else
obs_sceneitem_set_hide_transition(item, t);
obs_sceneitem_set_transition(item, show, t);
obs_source_release(t);
obs_data_release(s);
}

View file

@ -1859,16 +1859,30 @@ EXPORT void obs_sceneitem_set_show_transition(obs_sceneitem_t *item,
obs_source_t *transition);
EXPORT void obs_sceneitem_set_show_transition_duration(obs_sceneitem_t *item,
uint32_t duration_ms);
EXPORT obs_source_t *obs_sceneitem_get_show_transition(obs_sceneitem_t *item);
EXPORT uint32_t
OBS_DEPRECATED EXPORT obs_source_t *
obs_sceneitem_get_show_transition(obs_sceneitem_t *item);
OBS_DEPRECATED EXPORT uint32_t
obs_sceneitem_get_show_transition_duration(obs_sceneitem_t *item);
EXPORT void obs_sceneitem_set_hide_transition(obs_sceneitem_t *item,
obs_source_t *transition);
EXPORT void obs_sceneitem_set_hide_transition_duration(obs_sceneitem_t *item,
uint32_t duration_ms);
EXPORT obs_source_t *obs_sceneitem_get_hide_transition(obs_sceneitem_t *item);
EXPORT uint32_t
OBS_DEPRECATED EXPORT void
obs_sceneitem_set_hide_transition(obs_sceneitem_t *item,
obs_source_t *transition);
OBS_DEPRECATED EXPORT void
obs_sceneitem_set_hide_transition_duration(obs_sceneitem_t *item,
uint32_t duration_ms);
OBS_DEPRECATED EXPORT obs_source_t *
obs_sceneitem_get_hide_transition(obs_sceneitem_t *item);
OBS_DEPRECATED EXPORT uint32_t
obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item);
EXPORT void obs_sceneitem_set_transition(obs_sceneitem_t *item, bool show,
obs_source_t *transition);
EXPORT obs_source_t *obs_sceneitem_get_transition(obs_sceneitem_t *item,
bool show);
EXPORT void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item,
bool show,
uint32_t duration_ms);
EXPORT uint32_t obs_sceneitem_get_transition_duration(obs_sceneitem_t *item,
bool show);
EXPORT void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible);
EXPORT void obs_sceneitem_transition_load(struct obs_scene_item *item,
obs_data_t *data, bool show);