parent
58b2da73b3
commit
3046f3b578
|
@ -7,6 +7,7 @@
|
||||||
#include <QDropEvent>
|
#include <QDropEvent>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QDrag>
|
||||||
|
|
||||||
SceneTree::SceneTree(QWidget *parent_) : QListWidget(parent_)
|
SceneTree::SceneTree(QWidget *parent_) : QListWidget(parent_)
|
||||||
{
|
{
|
||||||
|
@ -101,6 +102,10 @@ void SceneTree::resizeEvent(QResizeEvent *event)
|
||||||
|
|
||||||
void SceneTree::startDrag(Qt::DropActions supportedActions)
|
void SceneTree::startDrag(Qt::DropActions supportedActions)
|
||||||
{
|
{
|
||||||
|
QModelIndexList indexes = selectedIndexes();
|
||||||
|
|
||||||
|
setPositionForIndex(QPoint(-99999, -99999), indexes[0]);
|
||||||
|
|
||||||
QListWidget::startDrag(supportedActions);
|
QListWidget::startDrag(supportedActions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,21 +147,21 @@ void SceneTree::dropEvent(QDropEvent *event)
|
||||||
QTimer::singleShot(100, [this]() { emit scenesReordered(); });
|
QTimer::singleShot(100, [this]() { emit scenesReordered(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneTree::dragMoveEvent(QDragMoveEvent *event)
|
void SceneTree::RepositionGrid(QDragMoveEvent *event)
|
||||||
{
|
{
|
||||||
if (gridMode) {
|
int scrollWid = verticalScrollBar()->sizeHint().width();
|
||||||
int scrollWid = verticalScrollBar()->sizeHint().width();
|
int h = visualItemRect(item(count() - 1)).bottom();
|
||||||
int h = visualItemRect(item(count() - 1)).bottom();
|
|
||||||
|
|
||||||
if (h < height()) {
|
if (h < height()) {
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
scrollWid = 0;
|
scrollWid = 0;
|
||||||
} else {
|
} else {
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
||||||
}
|
}
|
||||||
|
|
||||||
float wid = contentsRect().width() - scrollWid - 1;
|
float wid = contentsRect().width() - scrollWid - 1;
|
||||||
|
|
||||||
|
if (event) {
|
||||||
QPoint point = event->pos();
|
QPoint point = event->pos();
|
||||||
|
|
||||||
int x = (float)point.x() / wid * ceil(wid / maxWidth);
|
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());
|
QPoint position(xPos * g.width(), yPos * g.height());
|
||||||
setPositionForIndex(position, index);
|
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);
|
QListWidget::dragMoveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SceneTree::dragLeaveEvent(QDragLeaveEvent *event)
|
||||||
|
{
|
||||||
|
if (gridMode) {
|
||||||
|
RepositionGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
QListWidget::dragLeaveEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
void SceneTree::rowsInserted(const QModelIndex &parent, int start, int end)
|
void SceneTree::rowsInserted(const QModelIndex &parent, int start, int end)
|
||||||
{
|
{
|
||||||
QResizeEvent event(size(), size());
|
QResizeEvent event(size(), size());
|
||||||
|
|
|
@ -26,12 +26,16 @@ public:
|
||||||
|
|
||||||
explicit SceneTree(QWidget *parent = nullptr);
|
explicit SceneTree(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void RepositionGrid(QDragMoveEvent *event = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool eventFilter(QObject *obj, QEvent *event) override;
|
virtual bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
virtual void resizeEvent(QResizeEvent *event) override;
|
virtual void resizeEvent(QResizeEvent *event) override;
|
||||||
virtual void startDrag(Qt::DropActions supportedActions) override;
|
virtual void startDrag(Qt::DropActions supportedActions) override;
|
||||||
virtual void dropEvent(QDropEvent *event) override;
|
virtual void dropEvent(QDropEvent *event) override;
|
||||||
virtual void dragMoveEvent(QDragMoveEvent *event) override;
|
virtual void dragMoveEvent(QDragMoveEvent *event) override;
|
||||||
|
virtual void dragLeaveEvent(QDragLeaveEvent *event) override;
|
||||||
virtual void rowsInserted(const QModelIndex &parent, int start,
|
virtual void rowsInserted(const QModelIndex &parent, int start,
|
||||||
int end) override;
|
int end) override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue