Explorar el Código

libobs: Refactor hide/show transition functions

Having two separate functions for each hide/show transition action is
silly and makes code awful.
jp9000 hace 3 años
padre
commit
e236a16715
Se han modificado 4 ficheros con 94 adiciones y 83 borrados
  1. 23 59
      UI/window-basic-main-transitions.cpp
  2. 2 2
      UI/window-basic-main.cpp
  3. 47 14
      libobs/obs-scene.c
  4. 22 8
      libobs/obs.h

+ 23 - 59
UI/window-basic-main-transitions.cpp

@@ -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());
-
-			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());
+	auto setDuration = [visible](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(""));

+ 2 - 2
UI/window-basic-main.cpp

@@ -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));

+ 47 - 14
libobs/obs-scene.c

@@ -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);
 	}

+ 22 - 8
libobs/obs.h

@@ -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);