1
0

source-list-widget.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <QMouseEvent>
  2. #include <vector>
  3. #include "qt-wrappers.hpp"
  4. #include "source-list-widget.hpp"
  5. Q_DECLARE_METATYPE(OBSSceneItem);
  6. void SourceListWidget::mouseDoubleClickEvent(QMouseEvent *event)
  7. {
  8. if (event->button() == Qt::LeftButton)
  9. QListWidget::mouseDoubleClickEvent(event);
  10. }
  11. void SourceListWidget::dropEvent(QDropEvent *event)
  12. {
  13. QListWidget::dropEvent(event);
  14. if (!event->isAccepted() || !count())
  15. return;
  16. auto GetSceneItem = [&](int i)
  17. {
  18. return item(i)->data(Qt::UserRole).value<OBSSceneItem>();
  19. };
  20. std::vector<obs_sceneitem_t*> newOrder;
  21. newOrder.reserve(count());
  22. for (int i = count() - 1; i >= 0; i--)
  23. newOrder.push_back(GetSceneItem(i));
  24. auto UpdateOrderAtomically = [&](obs_scene_t *scene)
  25. {
  26. ignoreReorder = true;
  27. obs_scene_reorder_items(scene, newOrder.data(),
  28. newOrder.size());
  29. ignoreReorder = false;
  30. };
  31. using UpdateOrderAtomically_t = decltype(UpdateOrderAtomically);
  32. auto scene = obs_sceneitem_get_scene(GetSceneItem(0));
  33. obs_scene_atomic_update(scene, [](void *data, obs_scene_t *scene)
  34. {
  35. (*static_cast<UpdateOrderAtomically_t*>(data))(scene);
  36. }, static_cast<void*>(&UpdateOrderAtomically));
  37. }