RoomEditorWidget improvements
This commit is contained in:
1 parent
77e7e18c26
commit
e5406ed0ce
16 files changed
+335
-79
No files matched your search
@@ -0,0 +1,51 @@
|
||||
#include "draggabletreeview.h"
|
||||
|
||||
DraggableTreeView::DraggableTreeView(QWidget *parent) :
|
||||
QTreeView{parent}
|
||||
{
|
||||
}
|
||||
|
||||
void DraggableTreeView::dragMoveEvent(QDragMoveEvent *event)
|
||||
{
|
||||
setDropIndicatorShown(true);
|
||||
//qDebug() << QStringList{"OnItem","AboveItem","BelowItem","OnViewport"}[dropIndicatorPosition()];
|
||||
QTreeView::dragMoveEvent(event);
|
||||
}
|
||||
|
||||
void DraggableTreeView::dropEvent(QDropEvent *event)
|
||||
{
|
||||
bool dropOK = false;
|
||||
DropIndicatorPosition dropIndicator = dropIndicatorPosition();
|
||||
|
||||
switch (dropIndicator)
|
||||
{
|
||||
case QAbstractItemView::AboveItem:
|
||||
dropOK = true;
|
||||
break;
|
||||
case QAbstractItemView::BelowItem:
|
||||
dropOK = true;
|
||||
break;
|
||||
case QAbstractItemView::OnItem:
|
||||
dropOK = false;
|
||||
break;
|
||||
case QAbstractItemView::OnViewport:
|
||||
dropOK = false;
|
||||
break;
|
||||
}
|
||||
if(dropOK)
|
||||
{
|
||||
// Here, you need to manage yourself the case of dropping an item
|
||||
}
|
||||
setDropIndicatorShown(false); // hide the drop indicator once the drop is done
|
||||
QTreeView::dropEvent(event);
|
||||
}
|
||||
|
||||
void DraggableTreeView::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
DropIndicatorPosition position = dropIndicatorPosition();
|
||||
setDropIndicatorShown( position == QAbstractItemView::BelowItem || position == QAbstractItemView::AboveItem );
|
||||
|
||||
QTreeView::paintEvent(event);
|
||||
|
||||
setDropIndicatorShown( true );
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include <QTreeView>
|
||||
|
||||
class DraggableTreeView : public QTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DraggableTreeView(QWidget *parent = nullptr);
|
||||
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
};
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "editorguiutils.h"
|
||||
|
||||
PathPointsWidget::PathPointsWidget(QWidget *parent) :
|
||||
QWidget{parent}
|
||||
{
|
||||
@@ -81,21 +83,10 @@ void PathPointsWidget::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
if (!m_gridBrush || m_gridBrush->snapX != m_snapX || m_gridBrush->snapY != m_snapY)
|
||||
{
|
||||
QPixmap pixmap{m_snapX, m_snapY};
|
||||
|
||||
{
|
||||
QPainter painter{&pixmap};
|
||||
painter.setPen(palette().color(m_gridRole));
|
||||
painter.drawLine(0, 0, m_snapX, 0);
|
||||
painter.drawLine(0, 0, 0, m_snapY);
|
||||
|
||||
painter.fillRect(1, 1, m_snapX - 1, m_snapY - 1, palette().color(backgroundRole()));
|
||||
}
|
||||
|
||||
m_gridBrush = GridBrush {
|
||||
.snapX = m_snapX,
|
||||
.snapY = m_snapY,
|
||||
.brush = QBrush{std:: move(pixmap)}
|
||||
.brush = makeGridBrush(m_snapX, m_snapY, palette().color(m_gridRole), palette().color(backgroundRole()))
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
#include <QPaintEvent>
|
||||
#include <QMouseEvent>
|
||||
|
||||
#include "editorguiutils.h"
|
||||
#include "models/projecttreemodel.h"
|
||||
#include "projectcontainer.h"
|
||||
|
||||
RoomEditWidget::RoomEditWidget(QWidget *parent) :
|
||||
QWidget{parent}
|
||||
{
|
||||
@@ -18,7 +22,8 @@ void RoomEditWidget::setSnapX(int snapX)
|
||||
if (m_snapX == snapX)
|
||||
return;
|
||||
emit snapXChanged(m_snapX = snapX);
|
||||
update();
|
||||
if (m_gridEnabled)
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomEditWidget::setSnapY(int snapY)
|
||||
@@ -26,7 +31,8 @@ void RoomEditWidget::setSnapY(int snapY)
|
||||
if (m_snapY == snapY)
|
||||
return;
|
||||
emit snapYChanged(m_snapY = snapY);
|
||||
update();
|
||||
if (m_gridEnabled)
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomEditWidget::setGridEnabled(bool gridEnabled)
|
||||
@@ -50,6 +56,17 @@ void RoomEditWidget::setGridRole(QPalette::ColorRole gridRole)
|
||||
if (gridRole == m_gridRole)
|
||||
return;
|
||||
m_gridRole = gridRole;
|
||||
if (m_gridEnabled)
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomEditWidget::setSelectedObject(const Object *selectedObject)
|
||||
{
|
||||
if (m_selectedObject == selectedObject)
|
||||
return;
|
||||
if (m_draggedObject && &m_draggedObject->object.get() == m_selectedObject)
|
||||
m_draggedObject = std::nullopt;
|
||||
m_selectedObject = selectedObject;
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -57,25 +74,16 @@ void RoomEditWidget::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
Q_UNUSED(event)
|
||||
|
||||
QWidget::paintEvent(event);
|
||||
|
||||
if (m_gridEnabled)
|
||||
{
|
||||
if (!m_gridBrush || m_gridBrush->snapX != m_snapX || m_gridBrush->snapY != m_snapY)
|
||||
{
|
||||
QPixmap pixmap{m_snapX, m_snapY};
|
||||
|
||||
{
|
||||
QPainter painter{&pixmap};
|
||||
painter.setPen(palette().color(m_gridRole));
|
||||
painter.drawLine(0, 0, m_snapX, 0);
|
||||
painter.drawLine(0, 0, 0, m_snapY);
|
||||
|
||||
painter.fillRect(1, 1, m_snapX - 1, m_snapY - 1, palette().color(backgroundRole()));
|
||||
}
|
||||
|
||||
m_gridBrush = GridBrush {
|
||||
.snapX = m_snapX,
|
||||
.snapY = m_snapY,
|
||||
.brush = QBrush{std:: move(pixmap)}
|
||||
.brush = makeGridBrush(m_snapX, m_snapY, palette().color(m_gridRole), Qt::transparent)
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -83,17 +91,62 @@ void RoomEditWidget::paintEvent(QPaintEvent *event)
|
||||
m_gridBrush = std::nullopt;
|
||||
|
||||
QPainter painter{this};
|
||||
painter.fillRect(rect(), m_gridBrush ? m_gridBrush->brush : palette().color(backgroundRole()));
|
||||
|
||||
if (m_draggedObject)
|
||||
{
|
||||
if (m_projectTreeModel)
|
||||
{
|
||||
QPixmap pixmap;
|
||||
const auto &object = m_draggedObject->object.get();
|
||||
if (!object.spriteName.isEmpty())
|
||||
{
|
||||
const auto iter = std::find_if(std::cbegin(m_projectTreeModel->project()->sprites), std::cend(m_projectTreeModel->project()->sprites),
|
||||
[&object](const auto &sprite){ return object.spriteName == sprite.name; });
|
||||
if (iter == std::cend(m_projectTreeModel->project()->sprites))
|
||||
qWarning() << "invalid sprite" << object.spriteName;
|
||||
else if (!iter->pixmaps.empty() && !iter->pixmaps.front().isNull())
|
||||
pixmap = iter->pixmaps.front();
|
||||
}
|
||||
|
||||
if (pixmap.isNull())
|
||||
goto noPixmap;
|
||||
|
||||
painter.drawPixmap(m_draggedObject->pos, std::move(pixmap));
|
||||
}
|
||||
else
|
||||
{
|
||||
noPixmap:
|
||||
painter.drawRect(QRect{m_draggedObject->pos, QSize{64, 64}});
|
||||
}
|
||||
}
|
||||
|
||||
if (m_gridBrush)
|
||||
painter.fillRect(rect(), m_gridBrush->brush);
|
||||
}
|
||||
|
||||
void RoomEditWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mousePressEvent(event);
|
||||
|
||||
if (m_selectedObject)
|
||||
{
|
||||
m_draggedObject = DraggedObject {
|
||||
.object = *m_selectedObject,
|
||||
.pos = event->pos()
|
||||
};
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void RoomEditWidget::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mouseReleaseEvent(event);
|
||||
|
||||
if (m_draggedObject)
|
||||
{
|
||||
m_draggedObject = std::nullopt;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void RoomEditWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
@@ -101,6 +154,16 @@ void RoomEditWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
QWidget::mouseMoveEvent(event);
|
||||
|
||||
emit cursorMoved(snapPoint(event->pos()));
|
||||
|
||||
if (m_draggedObject)
|
||||
{
|
||||
const auto newPos = snapPoint(event->pos());
|
||||
if (newPos != m_draggedObject->pos)
|
||||
{
|
||||
m_draggedObject->pos = newPos;
|
||||
update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QPoint RoomEditWidget::snapPoint(const QPoint &point) const
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <optional>
|
||||
|
||||
struct Object;
|
||||
class ProjectTreeModel;
|
||||
|
||||
class RoomEditWidget : public QWidget
|
||||
{
|
||||
@@ -33,8 +34,12 @@ public:
|
||||
QPalette::ColorRole gridRole() const { return m_gridRole; }
|
||||
void setGridRole(QPalette::ColorRole gridRole);
|
||||
|
||||
ProjectTreeModel *projectTreeModel() { return m_projectTreeModel; }
|
||||
const ProjectTreeModel *projectTreeModel() const { return m_projectTreeModel; }
|
||||
void setProjectTreeModel(ProjectTreeModel *projectTreeModel) { m_projectTreeModel = projectTreeModel; update(); }
|
||||
|
||||
const Object *selectedObject() const { return m_selectedObject; }
|
||||
void setSelectedObject(const Object *object) { m_selectedObject = object; update(); }
|
||||
void setSelectedObject(const Object *selectedObject);
|
||||
|
||||
signals:
|
||||
void snapXChanged(int snapX);
|
||||
@@ -69,4 +74,12 @@ private:
|
||||
std::optional<GridBrush> m_gridBrush;
|
||||
|
||||
QPalette::ColorRole m_gridRole{QPalette::Dark};
|
||||
|
||||
ProjectTreeModel *m_projectTreeModel{};
|
||||
|
||||
struct DraggedObject {
|
||||
std::reference_wrapper<const Object> object;
|
||||
QPoint pos;
|
||||
};
|
||||
std::optional<DraggedObject> m_draggedObject;
|
||||
};
|
||||
Reference in new issue
Block a user