RoomEditorWidget improvements

This commit is contained in:
feedc0de committed 2022-01-17 22:22:27 +01:00
1 parent 77e7e18c26
commit e5406ed0ce
16 files changed
+335 -79

No files matched your search

+51
View File
@@ -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 );
}
+15
View File
@@ -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;
};
+3 -12
View File
@@ -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()))
};
}
}
+78 -15
View File
@@ -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
+14 -1
View File
@@ -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;
};