0
0
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:
jp9000 2015-11-15 08:39:50 -08:00
parent c1b9901b6a
commit 6ba723a997
2 changed files with 18 additions and 34 deletions

View File

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

View File

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