From 3046f3b5782cbc51b797757811901dd91b52ca3e Mon Sep 17 00:00:00 2001 From: VodBox Date: Mon, 8 Mar 2021 23:33:54 +1300 Subject: [PATCH] UI: Fix grid mode scenes overlapping fixes #2676 --- UI/scene-tree.cpp | 59 ++++++++++++++++++++++++++++++++++++++--------- UI/scene-tree.hpp | 4 ++++ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/UI/scene-tree.cpp b/UI/scene-tree.cpp index 2111d9ec6..b60f60616 100644 --- a/UI/scene-tree.cpp +++ b/UI/scene-tree.cpp @@ -7,6 +7,7 @@ #include #include #include +#include SceneTree::SceneTree(QWidget *parent_) : QListWidget(parent_) { @@ -101,6 +102,10 @@ void SceneTree::resizeEvent(QResizeEvent *event) void SceneTree::startDrag(Qt::DropActions supportedActions) { + QModelIndexList indexes = selectedIndexes(); + + setPositionForIndex(QPoint(-99999, -99999), indexes[0]); + QListWidget::startDrag(supportedActions); } @@ -142,21 +147,21 @@ void SceneTree::dropEvent(QDropEvent *event) QTimer::singleShot(100, [this]() { emit scenesReordered(); }); } -void SceneTree::dragMoveEvent(QDragMoveEvent *event) +void SceneTree::RepositionGrid(QDragMoveEvent *event) { - if (gridMode) { - int scrollWid = verticalScrollBar()->sizeHint().width(); - int h = visualItemRect(item(count() - 1)).bottom(); + int scrollWid = verticalScrollBar()->sizeHint().width(); + int h = visualItemRect(item(count() - 1)).bottom(); - if (h < height()) { - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - scrollWid = 0; - } else { - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - } + if (h < height()) { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollWid = 0; + } else { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + } - float wid = contentsRect().width() - scrollWid - 1; + float wid = contentsRect().width() - scrollWid - 1; + if (event) { QPoint point = event->pos(); int x = (float)point.x() / wid * ceil(wid / maxWidth); @@ -184,11 +189,43 @@ void SceneTree::dragMoveEvent(QDragMoveEvent *event) QPoint position(xPos * g.width(), yPos * g.height()); setPositionForIndex(position, index); } + } else { + for (int i = 0; i < count(); i++) { + auto *wItem = item(i); + + if (wItem->isSelected()) + continue; + + QModelIndex index = indexFromItem(wItem); + + int xPos = i % (int)ceil(wid / maxWidth); + int yPos = i / (int)ceil(wid / maxWidth); + QSize g = gridSize(); + + QPoint position(xPos * g.width(), yPos * g.height()); + setPositionForIndex(position, index); + } + } +} + +void SceneTree::dragMoveEvent(QDragMoveEvent *event) +{ + if (gridMode) { + RepositionGrid(event); } QListWidget::dragMoveEvent(event); } +void SceneTree::dragLeaveEvent(QDragLeaveEvent *event) +{ + if (gridMode) { + RepositionGrid(); + } + + QListWidget::dragLeaveEvent(event); +} + void SceneTree::rowsInserted(const QModelIndex &parent, int start, int end) { QResizeEvent event(size(), size()); diff --git a/UI/scene-tree.hpp b/UI/scene-tree.hpp index 99090ebc7..58cbb08fe 100644 --- a/UI/scene-tree.hpp +++ b/UI/scene-tree.hpp @@ -26,12 +26,16 @@ public: explicit SceneTree(QWidget *parent = nullptr); +private: + void RepositionGrid(QDragMoveEvent *event = nullptr); + protected: virtual bool eventFilter(QObject *obj, QEvent *event) override; virtual void resizeEvent(QResizeEvent *event) override; virtual void startDrag(Qt::DropActions supportedActions) override; virtual void dropEvent(QDropEvent *event) override; virtual void dragMoveEvent(QDragMoveEvent *event) override; + virtual void dragLeaveEvent(QDragLeaveEvent *event) override; virtual void rowsInserted(const QModelIndex &parent, int start, int end) override;