From 2fe641b8a4916efd13c4008a1c7d4af68f64837d Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Fri, 24 May 2019 21:34:41 +1000 Subject: [PATCH] libobs, UI: Implement item_locked event Similar to item_visible, this event fires whenever a scene item is locked or unlocked. This allows the UI and libobs to remain in sync regarding scene elements' statuses. --- UI/source-tree.cpp | 19 +++++++++++++++++++ UI/source-tree.hpp | 2 ++ UI/visibility-item-widget.cpp | 4 ++++ docs/sphinx/reference-scenes.rst | 11 +++++++++++ libobs/obs-scene.c | 10 ++++++++++ 5 files changed, 46 insertions(+) diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp index e46ad5415..15996ceed 100644 --- a/UI/source-tree.cpp +++ b/UI/source-tree.cpp @@ -130,6 +130,7 @@ void SourceTreeItem::DisconnectSignals() itemRemoveSignal.Disconnect(); deselectSignal.Disconnect(); visibleSignal.Disconnect(); + lockedSignal.Disconnect(); renameSignal.Disconnect(); removeSignal.Disconnect(); } @@ -177,6 +178,18 @@ void SourceTreeItem::ReconnectSignals() Q_ARG(bool, visible)); }; + auto itemLocked = [] (void *data, calldata_t *cd) + { + SourceTreeItem *this_ = reinterpret_cast(data); + obs_sceneitem_t *curItem = + (obs_sceneitem_t*)calldata_ptr(cd, "item"); + bool locked = calldata_bool(cd, "locked"); + + if (curItem == this_->sceneitem) + QMetaObject::invokeMethod(this_, "LockedChanged", + Q_ARG(bool, locked)); + }; + auto itemDeselect = [] (void *data, calldata_t *cd) { SourceTreeItem *this_ = reinterpret_cast(data); @@ -200,6 +213,7 @@ void SourceTreeItem::ReconnectSignals() sceneRemoveSignal.Connect(signal, "remove", removeItem, this); itemRemoveSignal.Connect(signal, "item_remove", removeItem, this); visibleSignal.Connect(signal, "item_visible", itemVisible, this); + lockedSignal.Connect(signal, "item_locked", itemLocked, this); if (obs_sceneitem_is_group(sceneitem)) { obs_source_t *source = obs_sceneitem_get_source(sceneitem); @@ -368,6 +382,11 @@ void SourceTreeItem::VisibilityChanged(bool visible) vis->setChecked(visible); } +void SourceTreeItem::LockedChanged(bool locked) +{ + lock->setChecked(locked); +} + void SourceTreeItem::Renamed(const QString &name) { label->setText(name); diff --git a/UI/source-tree.hpp b/UI/source-tree.hpp index 46577d20d..c739940c4 100644 --- a/UI/source-tree.hpp +++ b/UI/source-tree.hpp @@ -68,6 +68,7 @@ private: OBSSignal groupReorderSignal; OBSSignal deselectSignal; OBSSignal visibleSignal; + OBSSignal lockedSignal; OBSSignal renameSignal; OBSSignal removeSignal; @@ -80,6 +81,7 @@ private slots: void ExitEditMode(bool save); void VisibilityChanged(bool visible); + void LockedChanged(bool locked); void Renamed(const QString &name); void ExpandClicked(bool checked); diff --git a/UI/visibility-item-widget.cpp b/UI/visibility-item-widget.cpp index ba1ecbf05..f5b20d5d3 100644 --- a/UI/visibility-item-widget.cpp +++ b/UI/visibility-item-widget.cpp @@ -94,6 +94,8 @@ VisibilityItemWidget::VisibilityItemWidget(obs_sceneitem_t *item_) this); signal_handler_connect(signal, "item_visible", OBSSceneItemVisible, this); + signal_handler_connect(signal, "item_locked", OBSSceneItemLocked, + this); connect(vis, SIGNAL(clicked(bool)), this, SLOT(VisibilityClicked(bool))); @@ -121,6 +123,8 @@ void VisibilityItemWidget::DisconnectItemSignals() this); signal_handler_disconnect(signal, "item_visible", OBSSceneItemVisible, this); + signal_handler_disconnect(signal, "item_locked", OBSSceneItemLocked, + this); sceneRemoved = true; } diff --git a/docs/sphinx/reference-scenes.rst b/docs/sphinx/reference-scenes.rst index 883b67ef6..250a9c7ba 100644 --- a/docs/sphinx/reference-scenes.rst +++ b/docs/sphinx/reference-scenes.rst @@ -139,6 +139,10 @@ Scene Signals Called when a scene item's visibility state changes. +**item_locked** (ptr scene, ptr item, bool locked) + + Called when a scene item has been locked or unlocked. + **item_select** (ptr scene, ptr item) **item_deselect** (ptr scene, ptr item) @@ -406,6 +410,13 @@ Scene Item Functions --------------------- +.. function:: bool obs_sceneitem_set_locked(obs_sceneitem_t *item, bool locked) + bool obs_sceneitem_locked(const obs_sceneitem_t *item) + + Sets/gets the locked/unlocked state of the scene item. + +--------------------- + .. function:: void obs_sceneitem_set_crop(obs_sceneitem_t *item, const struct obs_sceneitem_crop *crop) void obs_sceneitem_get_crop(const obs_sceneitem_t *item, struct obs_sceneitem_crop *crop) diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index f23fd49f2..e746a3423 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -54,6 +54,7 @@ static const char *obs_scene_signals[] = { "void item_select(ptr scene, ptr item)", "void item_deselect(ptr scene, ptr item)", "void item_transform(ptr scene, ptr item)", + "void item_locked(ptr scene, ptr item, bool locked)", NULL }; @@ -2118,6 +2119,9 @@ bool obs_sceneitem_locked(const obs_sceneitem_t *item) bool obs_sceneitem_set_locked(obs_sceneitem_t *item, bool lock) { + struct calldata cd; + uint8_t stack[256]; + if (!item) return false; @@ -2129,6 +2133,12 @@ bool obs_sceneitem_set_locked(obs_sceneitem_t *item, bool lock) item->locked = lock; + calldata_init_fixed(&cd, stack, sizeof(stack)); + calldata_set_ptr(&cd, "item", item); + calldata_set_bool(&cd, "locked", lock); + + signal_parent(item->parent, "item_locked", &cd); + return true; }