diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index a19c0e9f1..3447dcd77 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -8581,8 +8581,11 @@ void OBSBasic::UpdateEditMenu() } const bool canTransformSingle = videoCount == 1 && totalCount == 1; + OBSSceneItem curItem = GetCurrentSceneItem(); + bool locked = obs_sceneitem_locked(curItem); + ui->actionCopySource->setEnabled(totalCount > 0); - ui->actionEditTransform->setEnabled(canTransformSingle); + ui->actionEditTransform->setEnabled(canTransformSingle && !locked); ui->actionCopyTransform->setEnabled(canTransformSingle); ui->actionPasteTransform->setEnabled( canTransformMultiple && hasCopiedTransform && videoCount > 0); diff --git a/UI/window-basic-transform.cpp b/UI/window-basic-transform.cpp index b11a6b749..f13aaeb0e 100644 --- a/UI/window-basic-transform.cpp +++ b/UI/window-basic-transform.cpp @@ -125,6 +125,7 @@ void OBSBasicTransform::SetScene(OBSScene scene) selectSignal.Disconnect(); deselectSignal.Disconnect(); removeSignal.Disconnect(); + lockSignal.Disconnect(); if (scene) { OBSSource source = obs_scene_get_source(scene); @@ -139,6 +140,8 @@ void OBSBasicTransform::SetScene(OBSScene scene) this); deselectSignal.Connect(signal, "item_deselect", OBSSceneItemDeselect, this); + lockSignal.Connect(signal, "item_locked", OBSSceneItemLocked, + this); } } @@ -148,15 +151,20 @@ void OBSBasicTransform::SetItem(OBSSceneItem newItem) Q_ARG(OBSSceneItem, OBSSceneItem(newItem))); } +void OBSBasicTransform::SetEnabled(bool enable) +{ + ui->container->setEnabled(enable); + ui->buttonBox->button(QDialogButtonBox::Reset)->setEnabled(enable); +} + void OBSBasicTransform::SetItemQt(OBSSceneItem newItem) { item = newItem; if (item) RefreshControls(); - bool enable = !!item; - ui->container->setEnabled(enable); - ui->buttonBox->button(QDialogButtonBox::Reset)->setEnabled(enable); + bool enable = !!item && !obs_sceneitem_locked(item); + SetEnabled(enable); } void OBSBasicTransform::OBSChannelChanged(void *param, calldata_t *data) @@ -222,6 +230,15 @@ void OBSBasicTransform::OBSSceneItemDeselect(void *param, calldata_t *data) } } +void OBSBasicTransform::OBSSceneItemLocked(void *param, calldata_t *data) +{ + OBSBasicTransform *window = + reinterpret_cast(param); + bool locked = calldata_bool(data, "locked"); + + QMetaObject::invokeMethod(window, "SetEnabled", Q_ARG(bool, !locked)); +} + static const uint32_t listToAlign[] = {OBS_ALIGN_TOP | OBS_ALIGN_LEFT, OBS_ALIGN_TOP, OBS_ALIGN_TOP | OBS_ALIGN_RIGHT, diff --git a/UI/window-basic-transform.hpp b/UI/window-basic-transform.hpp index d1936279a..6b6e8ff9f 100644 --- a/UI/window-basic-transform.hpp +++ b/UI/window-basic-transform.hpp @@ -21,6 +21,7 @@ private: OBSSignal removeSignal; OBSSignal selectSignal; OBSSignal deselectSignal; + OBSSignal lockSignal; std::string undo_data; @@ -45,6 +46,7 @@ private: static void OBSSceneItemRemoved(void *param, calldata_t *data); static void OBSSceneItemSelect(void *param, calldata_t *data); static void OBSSceneItemDeselect(void *param, calldata_t *data); + static void OBSSceneItemLocked(void *param, calldata_t *data); private slots: void RefreshControls(); @@ -52,6 +54,7 @@ private slots: void OnBoundsType(int index); void OnControlChanged(); void OnCropChanged(); + void SetEnabled(bool enable); public: OBSBasicTransform(OBSSceneItem item, OBSBasic *parent);