scene-tree.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "obs.hpp"
  2. #include "scene-tree.hpp"
  3. #include "obs-app.hpp"
  4. #include <QSizePolicy>
  5. #include <QScrollBar>
  6. #include <QDropEvent>
  7. #include <QPushButton>
  8. SceneTree::SceneTree(QWidget *parent_) : QListWidget(parent_)
  9. {
  10. installEventFilter(this);
  11. setDragDropMode(InternalMove);
  12. setMovement(QListView::Snap);
  13. }
  14. void SceneTree::SetGridMode(bool grid)
  15. {
  16. config_set_bool(App()->GlobalConfig(), "BasicWindow", "gridMode", grid);
  17. parent()->setProperty("gridMode", grid);
  18. gridMode = grid;
  19. if (gridMode) {
  20. setResizeMode(QListView::Adjust);
  21. setViewMode(QListView::IconMode);
  22. setUniformItemSizes(true);
  23. setStyleSheet("*{padding: 0; margin: 0;}");
  24. } else {
  25. setViewMode(QListView::ListMode);
  26. setResizeMode(QListView::Fixed);
  27. setStyleSheet("");
  28. }
  29. resizeEvent(new QResizeEvent(size(), size()));
  30. }
  31. bool SceneTree::GetGridMode()
  32. {
  33. return gridMode;
  34. }
  35. void SceneTree::SetGridItemWidth(int width)
  36. {
  37. maxWidth = width;
  38. }
  39. void SceneTree::SetGridItemHeight(int height)
  40. {
  41. itemHeight = height;
  42. }
  43. int SceneTree::GetGridItemWidth()
  44. {
  45. return maxWidth;
  46. }
  47. int SceneTree::GetGridItemHeight()
  48. {
  49. return itemHeight;
  50. }
  51. bool SceneTree::eventFilter(QObject *obj, QEvent *event)
  52. {
  53. return QObject::eventFilter(obj, event);
  54. }
  55. void SceneTree::resizeEvent(QResizeEvent *event)
  56. {
  57. QListWidget::resizeEvent(event);
  58. if (gridMode) {
  59. int scrollWid = verticalScrollBar()->sizeHint().width();
  60. int h = visualItemRect(item(count() - 1)).bottom();
  61. if (h < height()) {
  62. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  63. scrollWid = 0;
  64. } else {
  65. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
  66. }
  67. int wid = contentsRect().width() - scrollWid - 1;
  68. int items = (int)ceil((float)wid / maxWidth);
  69. int itemWidth = wid / items;
  70. setGridSize(QSize(itemWidth, itemHeight));
  71. for (int i = 0; i < count(); i++) {
  72. item(i)->setSizeHint(QSize(itemWidth, itemHeight));
  73. }
  74. } else {
  75. setGridSize(QSize());
  76. setSpacing(0);
  77. for (int i = 0; i < count(); i++) {
  78. item(i)->setData(Qt::SizeHintRole, QVariant());
  79. }
  80. }
  81. }
  82. void SceneTree::startDrag(Qt::DropActions supportedActions)
  83. {
  84. QListWidget::startDrag(supportedActions);
  85. }
  86. void SceneTree::dropEvent(QDropEvent *event)
  87. {
  88. QListWidget::dropEvent(event);
  89. if (event->source() == this && gridMode) {
  90. int scrollWid = verticalScrollBar()->sizeHint().width();
  91. int h = visualItemRect(item(count() - 1)).bottom();
  92. if (h < height()) {
  93. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  94. scrollWid = 0;
  95. } else {
  96. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
  97. }
  98. float wid = contentsRect().width() - scrollWid - 1;
  99. QPoint point = event->pos();
  100. int x = (float)point.x() / wid * ceil(wid / maxWidth);
  101. int y = point.y() / itemHeight;
  102. int r = x + y * ceil(wid / maxWidth);
  103. QListWidgetItem *item = takeItem(selectedIndexes()[0].row());
  104. insertItem(r, item);
  105. setCurrentItem(item);
  106. resize(size());
  107. }
  108. }
  109. void SceneTree::dragMoveEvent(QDragMoveEvent *event)
  110. {
  111. if (gridMode) {
  112. int scrollWid = verticalScrollBar()->sizeHint().width();
  113. int h = visualItemRect(item(count() - 1)).bottom();
  114. if (h < height()) {
  115. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  116. scrollWid = 0;
  117. } else {
  118. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
  119. }
  120. float wid = contentsRect().width() - scrollWid - 1;
  121. QPoint point = event->pos();
  122. int x = (float)point.x() / wid * ceil(wid / maxWidth);
  123. int y = point.y() / itemHeight;
  124. int r = x + y * ceil(wid / maxWidth);
  125. int orig = selectedIndexes()[0].row();
  126. for (int i = 0; i < count(); i++) {
  127. auto *wItem = item(i);
  128. if (wItem->isSelected())
  129. continue;
  130. QModelIndex index = indexFromItem(wItem);
  131. int off = (i >= r ? 1 : 0) -
  132. (i > orig && i > r ? 1 : 0) -
  133. (i > orig && i == r ? 2 : 0);
  134. int xPos = (i + off) % (int)ceil(wid / maxWidth);
  135. int yPos = (i + off) / (int)ceil(wid / maxWidth);
  136. QSize g = gridSize();
  137. QPoint position(xPos * g.width(), yPos * g.height());
  138. setPositionForIndex(position, index);
  139. }
  140. } else {
  141. QListWidget::dragMoveEvent(event);
  142. }
  143. }
  144. void SceneTree::rowsInserted(const QModelIndex &parent, int start, int end)
  145. {
  146. QListWidget::rowsInserted(parent, start, end);
  147. QResizeEvent *event = new QResizeEvent(size(), size());
  148. SceneTree::resizeEvent(event);
  149. }