UI: Add Undo/Redo for source visibility transitions

master
Exeldro 2021-04-05 15:35:58 +02:00 committed by Jim
parent b9a2fe7851
commit 8c49cc2831
2 changed files with 38 additions and 0 deletions

View File

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

View File

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