From 81757006208888aeec2e9f06f1a6e07cc46daaae Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 16 Apr 2021 20:29:18 -0700 Subject: [PATCH] UI: Add Undo/Redo for source visibility (Author note: This is why I hate supporting undo/redo.) Fixes obsproject/obs-studio#4447 --- UI/data/locale/en-US.ini | 3 ++- UI/source-tree.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 80f21c7ce..a61a84bb2 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -292,7 +292,8 @@ Undo.Properties="Property Change on '%1'" Undo.Scene.Duplicate="Duplicate Scene '%1'" Undo.ShowTransition="Show Transition on '%1'" Undo.HideTransition="Hide Transition on '%1'" - +Undo.ShowSceneItem="Show '%1' in '%2'" +Undo.HideSceneItem="Hide '%1' in '%2'" # transition name dialog TransitionNameDlg.Text="Please enter the name of the transition" diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp index 1a14855dd..d7b3f3ddc 100644 --- a/UI/source-tree.cpp +++ b/UI/source-tree.cpp @@ -131,6 +131,31 @@ SourceTreeItem::SourceTreeItem(SourceTree *tree_, OBSSceneItem sceneitem_) /* --------------------------------------------------------- */ auto setItemVisible = [this](bool checked) { + obs_scene_t *scene = obs_sceneitem_get_scene(sceneitem); + obs_source_t *scenesource = obs_scene_get_source(scene); + int64_t id = obs_sceneitem_get_id(sceneitem); + std::string name = obs_source_get_name(scenesource); + obs_source_t *source = obs_sceneitem_get_source(sceneitem); + + auto undo_redo = [id, name](const std::string &val) { + bool vis = val[0] == '1'; + obs_scene_t *s = obs_get_scene_by_name(name.c_str()); + obs_sceneitem_t *si = + obs_scene_find_sceneitem_by_id(s, id); + if (si) + obs_sceneitem_set_visible(si, vis); + obs_scene_release(s); + }; + + QString str = QTStr(checked ? "Undo.ShowSceneItem" + : "Undo.HideSceneItem"); + str = str.arg(obs_source_get_name(source), name.c_str()); + + OBSBasic *main = OBSBasic::Get(); + main->undo_s.add_action(str, undo_redo, undo_redo, + checked ? "0" : "1", + checked ? "1" : "0", nullptr); + SignalBlocker sourcesSignalBlocker(this); obs_sceneitem_set_visible(sceneitem, checked); };