Merge pull request #2955 from cg2121/group-signals

UI: Make select/deselect signals work w/ group items
master
Jim 2020-08-08 19:59:13 -07:00 committed by GitHub
commit a9c65aeabf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 49 deletions

View File

@ -151,6 +151,7 @@ void SourceTreeItem::DisconnectSignals()
{ {
sceneRemoveSignal.Disconnect(); sceneRemoveSignal.Disconnect();
itemRemoveSignal.Disconnect(); itemRemoveSignal.Disconnect();
selectSignal.Disconnect();
deselectSignal.Disconnect(); deselectSignal.Disconnect();
visibleSignal.Disconnect(); visibleSignal.Disconnect();
lockedSignal.Disconnect(); lockedSignal.Disconnect();
@ -212,6 +213,16 @@ void SourceTreeItem::ReconnectSignals()
Q_ARG(bool, locked)); Q_ARG(bool, locked));
}; };
auto itemSelect = [](void *data, calldata_t *cd) {
SourceTreeItem *this_ =
reinterpret_cast<SourceTreeItem *>(data);
obs_sceneitem_t *curItem =
(obs_sceneitem_t *)calldata_ptr(cd, "item");
if (curItem == this_->sceneitem)
QMetaObject::invokeMethod(this_, "Select");
};
auto itemDeselect = [](void *data, calldata_t *cd) { auto itemDeselect = [](void *data, calldata_t *cd) {
SourceTreeItem *this_ = SourceTreeItem *this_ =
reinterpret_cast<SourceTreeItem *>(data); reinterpret_cast<SourceTreeItem *>(data);
@ -236,6 +247,8 @@ void SourceTreeItem::ReconnectSignals()
itemRemoveSignal.Connect(signal, "item_remove", removeItem, this); itemRemoveSignal.Connect(signal, "item_remove", removeItem, this);
visibleSignal.Connect(signal, "item_visible", itemVisible, this); visibleSignal.Connect(signal, "item_visible", itemVisible, this);
lockedSignal.Connect(signal, "item_locked", itemLocked, this); lockedSignal.Connect(signal, "item_locked", itemLocked, this);
selectSignal.Connect(signal, "item_select", itemSelect, this);
deselectSignal.Connect(signal, "item_deselect", itemDeselect, this);
if (obs_sceneitem_is_group(sceneitem)) { if (obs_sceneitem_is_group(sceneitem)) {
obs_source_t *source = obs_sceneitem_get_source(sceneitem); obs_source_t *source = obs_sceneitem_get_source(sceneitem);
@ -245,10 +258,6 @@ void SourceTreeItem::ReconnectSignals()
this); this);
} }
if (scene != GetCurrentScene())
deselectSignal.Connect(signal, "item_deselect", itemDeselect,
this);
/* --------------------------------------------------------- */ /* --------------------------------------------------------- */
auto renamed = [](void *data, calldata_t *cd) { auto renamed = [](void *data, calldata_t *cd) {
@ -516,6 +525,11 @@ void SourceTreeItem::ExpandClicked(bool checked)
tree->GetStm()->CollapseGroup(sceneitem); tree->GetStm()->CollapseGroup(sceneitem);
} }
void SourceTreeItem::Select()
{
tree->SelectItem(sceneitem, true);
}
void SourceTreeItem::Deselect() void SourceTreeItem::Deselect()
{ {
tree->SelectItem(sceneitem, false); tree->SelectItem(sceneitem, false);

View File

@ -70,6 +70,7 @@ private:
OBSSignal sceneRemoveSignal; OBSSignal sceneRemoveSignal;
OBSSignal itemRemoveSignal; OBSSignal itemRemoveSignal;
OBSSignal groupReorderSignal; OBSSignal groupReorderSignal;
OBSSignal selectSignal;
OBSSignal deselectSignal; OBSSignal deselectSignal;
OBSSignal visibleSignal; OBSSignal visibleSignal;
OBSSignal lockedSignal; OBSSignal lockedSignal;
@ -90,6 +91,7 @@ private slots:
void ExpandClicked(bool checked); void ExpandClicked(bool checked);
void Select();
void Deselect(); void Deselect();
}; };

View File

@ -2677,11 +2677,6 @@ void OBSBasic::AddScene(OBSSource source)
container.handlers.assign({ container.handlers.assign({
std::make_shared<OBSSignal>(handler, "item_add", std::make_shared<OBSSignal>(handler, "item_add",
OBSBasic::SceneItemAdded, this), OBSBasic::SceneItemAdded, this),
std::make_shared<OBSSignal>(handler, "item_select",
OBSBasic::SceneItemSelected, this),
std::make_shared<OBSSignal>(handler, "item_deselect",
OBSBasic::SceneItemDeselected,
this),
std::make_shared<OBSSignal>(handler, "reorder", std::make_shared<OBSSignal>(handler, "reorder",
OBSBasic::SceneReordered, this), OBSBasic::SceneReordered, this),
std::make_shared<OBSSignal>(handler, "refresh", std::make_shared<OBSSignal>(handler, "refresh",
@ -2851,16 +2846,6 @@ void OBSBasic::RenameSources(OBSSource source, QString newName,
OBSProjector::UpdateMultiviewProjectors(); OBSProjector::UpdateMultiviewProjectors();
} }
void OBSBasic::SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select)
{
SignalBlocker sourcesSignalBlocker(ui->sources);
if (scene != GetCurrentScene() || ignoreSelectionUpdate)
return;
ui->sources->SelectItem(item, select);
}
static inline bool SourceMixerHidden(obs_source_t *source) static inline bool SourceMixerHidden(obs_source_t *source)
{ {
obs_data_t *priv_settings = obs_source_get_private_settings(source); obs_data_t *priv_settings = obs_source_get_private_settings(source);
@ -3463,31 +3448,6 @@ void OBSBasic::SceneItemAdded(void *data, calldata_t *params)
Q_ARG(OBSSceneItem, OBSSceneItem(item))); Q_ARG(OBSSceneItem, OBSSceneItem(item)));
} }
void OBSBasic::SceneItemSelected(void *data, calldata_t *params)
{
OBSBasic *window = static_cast<OBSBasic *>(data);
obs_scene_t *scene = (obs_scene_t *)calldata_ptr(params, "scene");
obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(params, "item");
QMetaObject::invokeMethod(window, "SelectSceneItem",
Q_ARG(OBSScene, scene),
Q_ARG(OBSSceneItem, item), Q_ARG(bool, true));
}
void OBSBasic::SceneItemDeselected(void *data, calldata_t *params)
{
OBSBasic *window = static_cast<OBSBasic *>(data);
obs_scene_t *scene = (obs_scene_t *)calldata_ptr(params, "scene");
obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(params, "item");
QMetaObject::invokeMethod(window, "SelectSceneItem",
Q_ARG(OBSScene, scene),
Q_ARG(OBSSceneItem, item),
Q_ARG(bool, false));
}
void OBSBasic::SourceCreated(void *data, calldata_t *params) void OBSBasic::SourceCreated(void *data, calldata_t *params)
{ {
obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source");

View File

@ -232,7 +232,6 @@ private:
gs_vertbuffer_t *circle = nullptr; gs_vertbuffer_t *circle = nullptr;
bool sceneChanging = false; bool sceneChanging = false;
bool ignoreSelectionUpdate = false;
int previewX = 0, previewY = 0; int previewX = 0, previewY = 0;
int previewCX = 0, previewCY = 0; int previewCX = 0, previewCY = 0;
@ -595,8 +594,6 @@ private slots:
void RemoveScene(OBSSource source); void RemoveScene(OBSSource source);
void RenameSources(OBSSource source, QString newName, QString prevName); void RenameSources(OBSSource source, QString newName, QString prevName);
void SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select);
void ActivateAudioSource(OBSSource source); void ActivateAudioSource(OBSSource source);
void DeactivateAudioSource(OBSSource source); void DeactivateAudioSource(OBSSource source);
@ -693,8 +690,6 @@ private:
static void SceneReordered(void *data, calldata_t *params); static void SceneReordered(void *data, calldata_t *params);
static void SceneRefreshed(void *data, calldata_t *params); static void SceneRefreshed(void *data, calldata_t *params);
static void SceneItemAdded(void *data, calldata_t *params); static void SceneItemAdded(void *data, calldata_t *params);
static void SceneItemSelected(void *data, calldata_t *params);
static void SceneItemDeselected(void *data, calldata_t *params);
static void SourceCreated(void *data, calldata_t *params); static void SourceCreated(void *data, calldata_t *params);
static void SourceRemoved(void *data, calldata_t *params); static void SourceRemoved(void *data, calldata_t *params);
static void SourceActivated(void *data, calldata_t *params); static void SourceActivated(void *data, calldata_t *params);