UI: Undo/Redo Transformations

Implements undo/redo for transformations of sources, both through
preview and the transformations properties.
This commit is contained in:
Ford Smith
2021-03-22 01:14:37 -04:00
committed by Ford Smith
parent 60d95cb5bd
commit 3a620c485e
8 changed files with 426 additions and 2 deletions

View File

@@ -73,10 +73,42 @@ OBSBasicTransform::OBSBasicTransform(OBSBasic *parent)
SetScene(scene);
SetItem(item);
obs_data_t *wrapper = obs_scene_save_transform_states(scene, false);
undo_data = std::string(obs_data_get_json(wrapper));
obs_data_release(wrapper);
channelChangedSignal.Connect(obs_get_signal_handler(), "channel_change",
OBSChannelChanged, this);
}
OBSBasicTransform::~OBSBasicTransform()
{
obs_data_t *wrapper =
obs_scene_save_transform_states(main->GetCurrentScene(), false);
auto undo_redo = [](const std::string &data) {
obs_data_t *dat = obs_data_create_from_json(data.c_str());
obs_source_t *source = obs_get_source_by_name(
obs_data_get_string(dat, "scene_name"));
reinterpret_cast<OBSBasic *>(App()->GetMainWindow())
->SetCurrentScene(source);
obs_source_release(source);
obs_data_release(dat);
obs_scene_load_transform_states(data.c_str());
};
std::string redo_data(obs_data_get_json(wrapper));
if (undo_data.compare(redo_data) != 0)
main->undo_s.add_action(
QTStr("Undo.Transform")
.arg(obs_source_get_name(obs_scene_get_source(
main->GetCurrentScene()))),
undo_redo, undo_redo, undo_data, redo_data, NULL);
obs_data_release(wrapper);
}
void OBSBasicTransform::SetScene(OBSScene scene)
{
transformSignal.Disconnect();