Răsfoiți Sursa

UI: Add Undo/Redo for source visibility transitions

Exeldro 4 ani în urmă
părinte
comite
8c49cc2831
2 a modificat fișierele cu 39 adăugiri și 1 ștergeri
  1. 2 0
      UI/data/locale/en-US.ini
  2. 37 1
      UI/window-basic-main-transitions.cpp

+ 2 - 0
UI/data/locale/en-US.ini

@@ -290,6 +290,8 @@ Undo.Volume.Change="Volume Change on '%1'"
 Undo.Audio="Audio Changes"
 Undo.Properties="Property Change on '%1'"
 Undo.Scene.Duplicate="Duplicate Scene '%1'"
+Undo.ShowTransition="Show Transition on '%1'"
+Undo.HideTransition="Hide Transition on '%1'"
 
 
 # transition name dialog

+ 37 - 1
UI/window-basic-main-transitions.cpp

@@ -1152,7 +1152,28 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
 
 		QString id = action->property("transition_id").toString();
 		OBSSceneItem sceneItem = main->GetCurrentSceneItem();
-
+		int64_t sceneItemId = obs_sceneitem_get_id(sceneItem);
+		std::string sceneName =
+			obs_source_get_name(obs_scene_get_source(
+				obs_sceneitem_get_scene(sceneItem)));
+
+		auto undo_redo = [sceneName, sceneItemId,
+				  visible](const std::string &data) {
+			obs_source_t *source =
+				obs_get_source_by_name(sceneName.c_str());
+			obs_scene_t *scene = obs_scene_from_source(source);
+			obs_sceneitem_t *i = obs_scene_find_sceneitem_by_id(
+				scene, sceneItemId);
+			if (i) {
+				obs_data_t *dat =
+					obs_data_create_from_json(data.c_str());
+				obs_sceneitem_transition_load(i, dat, visible);
+				obs_data_release(dat);
+			}
+			obs_source_release(source);
+		};
+		obs_data_t *oldTransitionData =
+			obs_sceneitem_transition_save(sceneItem, visible);
 		if (id.isNull() || id.isEmpty()) {
 			if (visible)
 				obs_sceneitem_set_show_transition(sceneItem,
@@ -1204,6 +1225,21 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible)
 			if (obs_source_configurable(tr))
 				CreatePropertiesWindow(tr);
 		}
+		obs_data_t *newTransitionData =
+			obs_sceneitem_transition_save(sceneItem, visible);
+		std::string undo_data(obs_data_get_json(oldTransitionData));
+		std::string redo_data(obs_data_get_json(newTransitionData));
+		if (undo_data.compare(redo_data) != 0)
+			main->undo_s.add_action(
+				QTStr(visible ? "Undo.ShowTransition"
+					      : "Undo.HideTransition")
+					.arg(obs_source_get_name(
+						obs_sceneitem_get_source(
+							sceneItem))),
+				undo_redo, undo_redo, undo_data, redo_data,
+				NULL);
+		obs_data_release(newTransitionData);
+		obs_data_release(oldTransitionData);
 	};
 	if (visible) {
 		auto setDuration = [this](int duration) {