UI: Fix grid mode scenes overlapping

fixes #2676
master
VodBox 2021-03-08 23:33:54 +13:00
parent 58b2da73b3
commit 3046f3b578
2 changed files with 52 additions and 11 deletions

View File

@ -7,6 +7,7 @@
#include <QDropEvent>
#include <QPushButton>
#include <QTimer>
#include <QDrag>
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());

View File

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