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.
master
Chris Angelico 2019-05-24 21:34:41 +10:00 committed by jp9000
parent dd607b422f
commit 2fe641b8a4
5 changed files with 46 additions and 0 deletions

View File

@ -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<SourceTreeItem*>(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<SourceTreeItem*>(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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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)

View File

@ -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;
}