From 2c5aa874684d8c9704881d9f708cf7c20c7af5ef Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 26 Jul 2016 01:32:43 -0700 Subject: [PATCH] UI: Add ability to lock preview Adds the ability to lock the preview so sources can't be edited. This feature is typically used in the case where the user wants to prevent accidentally clicking and dragging on sources. --- obs/data/locale/en-US.ini | 1 + obs/forms/OBSBasic.ui | 13 +++++++++++-- obs/window-basic-main.cpp | 18 ++++++++++++++++++ obs/window-basic-main.hpp | 2 ++ obs/window-basic-preview.cpp | 16 ++++++++++++++++ obs/window-basic-preview.hpp | 5 +++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/obs/data/locale/en-US.ini b/obs/data/locale/en-US.ini index 4c3eaed7e..f9b2b61ba 100644 --- a/obs/data/locale/en-US.ini +++ b/obs/data/locale/en-US.ini @@ -324,6 +324,7 @@ Basic.MainMenu.Edit.Undo="&Undo" Basic.MainMenu.Edit.Redo="&Redo" Basic.MainMenu.Edit.UndoAction="&Undo $1" Basic.MainMenu.Edit.RedoAction="&Redo $1" +Basic.MainMenu.Edit.LockPreview="&Lock Preview" Basic.MainMenu.Edit.Transform="&Transform" Basic.MainMenu.Edit.Transform.EditTransform="&Edit Transform..." Basic.MainMenu.Edit.Transform.ResetTransform="&Reset Transform" diff --git a/obs/forms/OBSBasic.ui b/obs/forms/OBSBasic.ui index ca0e35fd9..76d8e5517 100644 --- a/obs/forms/OBSBasic.ui +++ b/obs/forms/OBSBasic.ui @@ -7,7 +7,7 @@ 0 0 - 957 + 1110 724 @@ -804,7 +804,7 @@ 0 0 - 957 + 1110 21 @@ -875,6 +875,7 @@ + @@ -1310,6 +1311,14 @@ Basic.MainMenu.View.StatusBar + + + true + + + Basic.MainMenu.Edit.LockPreview + + diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 558994459..eb3f7cfc4 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -374,6 +374,8 @@ void OBSBasic::Save(const char *file) ui->transitionDuration->value(), transitions, scene, curProgramScene); + obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked()); + if (!obs_data_save_json_safe(saveData, file, "tmp", "bak")) blog(LOG_ERROR, "Could not save scene data to %s", file); @@ -607,6 +609,10 @@ retryScene: RefreshQuickTransitions(); + bool previewLocked = obs_data_get_bool(data, "preview_locked"); + ui->preview->SetLocked(previewLocked); + ui->actionLockPreview->setChecked(previewLocked); + obs_data_release(data); if (!opt_starting_scene.empty()) @@ -2958,6 +2964,12 @@ void OBSBasic::CreateSourcePopupMenu(QListWidgetItem *item, bool preview) if (IsPreviewProgramMode()) action->setEnabled(false); + action = popup.addAction( + QTStr("Basic.MainMenu.Edit.LockPreview"), + this, SLOT(on_actionLockPreview_triggered())); + action->setCheckable(true); + action->setChecked(ui->preview->Locked()); + previewProjector = new QMenu(QTStr("PreviewProjector")); AddProjectorMenuMonitors(previewProjector, this, SLOT(OpenPreviewProjector())); @@ -4306,3 +4318,9 @@ void OBSBasic::on_toggleStatusBar_toggled(bool visible) config_set_bool(App()->GlobalConfig(), "BasicWindow", "ShowStatusBar", visible); } + +void OBSBasic::on_actionLockPreview_triggered() +{ + ui->preview->ToggleLocked(); + ui->actionLockPreview->setChecked(ui->preview->Locked()); +} diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index b84d16432..0fe477e88 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -460,6 +460,8 @@ private slots: void on_actionMoveToTop_triggered(); void on_actionMoveToBottom_triggered(); + void on_actionLockPreview_triggered(); + void on_streamButton_clicked(); void on_recordButton_clicked(); void on_settingsButton_clicked(); diff --git a/obs/window-basic-preview.cpp b/obs/window-basic-preview.cpp index 8e7725c11..dc2c4f310 100644 --- a/obs/window-basic-preview.cpp +++ b/obs/window-basic-preview.cpp @@ -379,6 +379,11 @@ void OBSBasicPreview::GetStretchHandleData(const vec2 &pos) void OBSBasicPreview::mousePressEvent(QMouseEvent *event) { + if (locked) { + OBSQTDisplay::mousePressEvent(event); + return; + } + OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); float pixelRatio = main->devicePixelRatio(); float x = float(event->x()) - main->previewX / pixelRatio; @@ -451,6 +456,11 @@ void OBSBasicPreview::ProcessClick(const vec2 &pos) void OBSBasicPreview::mouseReleaseEvent(QMouseEvent *event) { + if (locked) { + OBSQTDisplay::mouseReleaseEvent(event); + return; + } + if (mouseDown) { vec2 pos = GetMouseEventPos(event); @@ -941,6 +951,9 @@ void OBSBasicPreview::StretchItem(const vec2 &pos) void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event) { + if (locked) + return; + if (mouseDown) { vec2 pos = GetMouseEventPos(event); @@ -1076,6 +1089,9 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene, void OBSBasicPreview::DrawSceneEditing() { + if (locked) + return; + OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); gs_effect_t *solid = obs_get_base_effect(OBS_EFFECT_SOLID); diff --git a/obs/window-basic-preview.hpp b/obs/window-basic-preview.hpp index 1a2524532..c11581b67 100644 --- a/obs/window-basic-preview.hpp +++ b/obs/window-basic-preview.hpp @@ -45,6 +45,7 @@ private: bool mouseMoved = false; bool mouseOverItems = false; bool cropping = false; + bool locked = false; static vec2 GetMouseEventPos(QMouseEvent *event); static bool DrawSelectedItem(obs_scene_t *scene, obs_sceneitem_t *item, @@ -80,6 +81,10 @@ public: void DrawSceneEditing(); + inline void SetLocked(bool newLockedVal) {locked = newLockedVal;} + inline void ToggleLocked() {locked = !locked;} + inline bool Locked() const {return locked;} + /* use libobs allocator for alignment because the matrices itemToScreen * and screenToItem may contain SSE data, which will cause SSE * instructions to crash if the data is not aligned to at least a 16