diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 0d898995b..80f21c7ce 100644 --- a/UI/data/locale/en-US.ini +++ b/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 diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index 64eae7e10..bebcbac0c 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/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) {