mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 13:08:50 +02:00
UI: Fix multi-item selection
Allows changing item selection via list box or via preview window, and keeps their selection status in sync with each other.
This commit is contained in:
parent
c1b9901b6a
commit
6ba723a997
@ -1496,6 +1496,8 @@ void OBSBasic::RenameSources(QString newName, QString prevName)
|
|||||||
|
|
||||||
void OBSBasic::SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select)
|
void OBSBasic::SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select)
|
||||||
{
|
{
|
||||||
|
SignalBlocker sourcesSignalBlocker(ui->sources);
|
||||||
|
|
||||||
if (scene != GetCurrentScene() || ignoreSelectionUpdate)
|
if (scene != GetCurrentScene() || ignoreSelectionUpdate)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1509,10 +1511,7 @@ void OBSBasic::SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select)
|
|||||||
if (item != data.value<OBSSceneItem>())
|
if (item != data.value<OBSSceneItem>())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (select)
|
witem->setSelected(select);
|
||||||
ui->sources->setCurrentItem(witem,
|
|
||||||
QItemSelectionModel::ClearAndSelect);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2583,43 +2582,29 @@ void OBSBasic::MoveSceneToBottom()
|
|||||||
ui->scenes->count() - 1);
|
ui->scenes->count() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBSBasic::on_sources_currentItemChanged(QListWidgetItem *current,
|
void OBSBasic::on_sources_itemSelectionChanged()
|
||||||
QListWidgetItem *prev)
|
|
||||||
{
|
{
|
||||||
auto select_one = [] (obs_scene_t *scene, obs_sceneitem_t *item,
|
SignalBlocker sourcesSignalBlocker(ui->sources);
|
||||||
void *param)
|
|
||||||
{
|
|
||||||
obs_sceneitem_t *selectedItem =
|
|
||||||
*reinterpret_cast<OBSSceneItem*>(param);
|
|
||||||
obs_sceneitem_select(item, (selectedItem == item));
|
|
||||||
|
|
||||||
UNUSED_PARAMETER(scene);
|
auto updateItemSelection = [&]()
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!current)
|
|
||||||
return;
|
|
||||||
|
|
||||||
OBSSceneItem item = GetOBSRef<OBSSceneItem>(current);
|
|
||||||
obs_source_t *source = obs_sceneitem_get_source(item);
|
|
||||||
if ((obs_source_get_output_flags(source) & OBS_SOURCE_VIDEO) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto IgnoreSelfUpdate = [&](obs_scene_t *scene)
|
|
||||||
{
|
{
|
||||||
ignoreSelectionUpdate = true;
|
ignoreSelectionUpdate = true;
|
||||||
obs_scene_enum_items(scene, select_one, &item);
|
for (int i = 0; i < ui->sources->count(); i++)
|
||||||
|
{
|
||||||
|
QListWidgetItem *wItem = ui->sources->item(i);
|
||||||
|
OBSSceneItem item = GetOBSRef<OBSSceneItem>(wItem);
|
||||||
|
|
||||||
|
obs_sceneitem_select(item, wItem->isSelected());
|
||||||
|
}
|
||||||
ignoreSelectionUpdate = false;
|
ignoreSelectionUpdate = false;
|
||||||
};
|
};
|
||||||
using IgnoreSelfUpdate_t = decltype(IgnoreSelfUpdate);
|
using updateItemSelection_t = decltype(updateItemSelection);
|
||||||
|
|
||||||
obs_scene_atomic_update(GetCurrentScene(),
|
obs_scene_atomic_update(GetCurrentScene(),
|
||||||
[](void *data, obs_scene_t *scene)
|
[](void *data, obs_scene_t *)
|
||||||
{
|
{
|
||||||
(*static_cast<IgnoreSelfUpdate_t*>(data))(scene);
|
(*static_cast<updateItemSelection_t*>(data))();
|
||||||
}, static_cast<void*>(&IgnoreSelfUpdate));
|
}, static_cast<void*>(&updateItemSelection));
|
||||||
|
|
||||||
UNUSED_PARAMETER(prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBSBasic::EditSceneItemName()
|
void OBSBasic::EditSceneItemName()
|
||||||
|
@ -339,8 +339,7 @@ private slots:
|
|||||||
void on_actionRemoveScene_triggered();
|
void on_actionRemoveScene_triggered();
|
||||||
void on_actionSceneUp_triggered();
|
void on_actionSceneUp_triggered();
|
||||||
void on_actionSceneDown_triggered();
|
void on_actionSceneDown_triggered();
|
||||||
void on_sources_currentItemChanged(QListWidgetItem *current,
|
void on_sources_itemSelectionChanged();
|
||||||
QListWidgetItem *prev);
|
|
||||||
void on_sources_customContextMenuRequested(const QPoint &pos);
|
void on_sources_customContextMenuRequested(const QPoint &pos);
|
||||||
void on_sources_itemDoubleClicked(QListWidgetItem *item);
|
void on_sources_itemDoubleClicked(QListWidgetItem *item);
|
||||||
void on_actionAddSource_triggered();
|
void on_actionAddSource_triggered();
|
||||||
|
Loading…
Reference in New Issue
Block a user