Added room objects to store placed objects in rooms
This commit is contained in:
1 parent
e5406ed0ce
commit
0cbde44138
6 files changed
+148
-36
No files matched your search
@@ -17,6 +17,11 @@ RoomEditWidget::RoomEditWidget(QWidget *parent) :
|
||||
setFixedSize(640, 480);
|
||||
}
|
||||
|
||||
void RoomEditWidget::setObjects(std::vector<Room::Object> *objects)
|
||||
{
|
||||
m_objects = objects;
|
||||
}
|
||||
|
||||
void RoomEditWidget::setSnapX(int snapX)
|
||||
{
|
||||
if (m_snapX == snapX)
|
||||
@@ -92,33 +97,8 @@ void RoomEditWidget::paintEvent(QPaintEvent *event)
|
||||
|
||||
QPainter painter{this};
|
||||
|
||||
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}});
|
||||
}
|
||||
}
|
||||
paintObjects(painter);
|
||||
paintDraggedObject(painter);
|
||||
|
||||
if (m_gridBrush)
|
||||
painter.fillRect(rect(), m_gridBrush->brush);
|
||||
@@ -132,7 +112,7 @@ void RoomEditWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_draggedObject = DraggedObject {
|
||||
.object = *m_selectedObject,
|
||||
.pos = event->pos()
|
||||
.pos = snapPoint(event->pos())
|
||||
};
|
||||
update();
|
||||
}
|
||||
@@ -144,6 +124,16 @@ void RoomEditWidget::mouseReleaseEvent(QMouseEvent *event)
|
||||
|
||||
if (m_draggedObject)
|
||||
{
|
||||
if (m_objects)
|
||||
{
|
||||
m_objects->emplace_back(Room::Object{
|
||||
.objectName = m_draggedObject->object.get().name,
|
||||
.pos = snapPoint(event->pos())
|
||||
});
|
||||
|
||||
emit changed();
|
||||
}
|
||||
|
||||
m_draggedObject = std::nullopt;
|
||||
update();
|
||||
}
|
||||
@@ -153,17 +143,16 @@ void RoomEditWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mouseMoveEvent(event);
|
||||
|
||||
emit cursorMoved(snapPoint(event->pos()));
|
||||
const auto snappedPos = snapPoint(event->pos());
|
||||
|
||||
emit cursorMoved(snappedPos);
|
||||
|
||||
if (m_draggedObject)
|
||||
{
|
||||
const auto newPos = snapPoint(event->pos());
|
||||
if (newPos != m_draggedObject->pos)
|
||||
if (snappedPos != m_draggedObject->pos)
|
||||
{
|
||||
m_draggedObject->pos = newPos;
|
||||
m_draggedObject->pos = snappedPos;
|
||||
update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QPoint RoomEditWidget::snapPoint(const QPoint &point) const
|
||||
@@ -173,3 +162,81 @@ QPoint RoomEditWidget::snapPoint(const QPoint &point) const
|
||||
m_snapY > 1 ? ((point.y() + (m_snapY / 2)) / m_snapY * m_snapY) : point.y(),
|
||||
};
|
||||
}
|
||||
|
||||
void RoomEditWidget::paintObjects(QPainter &painter)
|
||||
{
|
||||
if (!m_objects)
|
||||
return;
|
||||
|
||||
for (const Room::Object &object : *m_objects)
|
||||
{
|
||||
if (m_projectTreeModel)
|
||||
{
|
||||
const auto iter = std::find_if(std::cbegin(m_projectTreeModel->project()->objects), std::cend(m_projectTreeModel->project()->objects),
|
||||
[&object](const auto &obj){ return object.objectName == obj.name; });
|
||||
if (iter == std::cend(m_projectTreeModel->project()->objects))
|
||||
{
|
||||
qWarning() << "invalid object" << object.objectName;
|
||||
goto noPixmap;
|
||||
}
|
||||
|
||||
if (iter->spriteName.isEmpty())
|
||||
goto noPixmap;
|
||||
|
||||
{
|
||||
const auto iter2 = std::find_if(std::cbegin(m_projectTreeModel->project()->sprites), std::cend(m_projectTreeModel->project()->sprites),
|
||||
[&object=*iter](const auto &sprite){ return object.spriteName == sprite.name; });
|
||||
|
||||
if (iter2 == std::cend(m_projectTreeModel->project()->sprites))
|
||||
{
|
||||
qWarning() << "invalid sprite" << iter->spriteName;
|
||||
goto noPixmap;
|
||||
}
|
||||
|
||||
if (iter2->pixmaps.empty() || iter2->pixmaps.front().isNull())
|
||||
goto noPixmap;
|
||||
|
||||
painter.drawPixmap(object.pos, iter2->pixmaps.front());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
noPixmap:
|
||||
painter.drawRect(QRect{object.pos, QSize{64, 64}});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RoomEditWidget::paintDraggedObject(QPainter &painter)
|
||||
{
|
||||
if (!m_draggedObject)
|
||||
return;
|
||||
|
||||
if (m_projectTreeModel)
|
||||
{
|
||||
const auto &object = m_draggedObject->object.get();
|
||||
|
||||
if (object.spriteName.isEmpty())
|
||||
goto noPixmap;
|
||||
|
||||
{
|
||||
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;
|
||||
goto noPixmap;
|
||||
}
|
||||
|
||||
if (iter->pixmaps.empty() || iter->pixmaps.front().isNull())
|
||||
goto noPixmap;
|
||||
|
||||
painter.drawPixmap(m_draggedObject->pos, iter->pixmaps.front());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
noPixmap:
|
||||
painter.drawRect(QRect{m_draggedObject->pos, QSize{64, 64}});
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
struct Object;
|
||||
class ProjectTreeModel;
|
||||
|
||||
@@ -19,6 +21,10 @@ class RoomEditWidget : public QWidget
|
||||
public:
|
||||
explicit RoomEditWidget(QWidget *parent = nullptr);
|
||||
|
||||
std::vector<Room::Object> *objects() { return m_objects; }
|
||||
const std::vector<Room::Object> *objects() const { return m_objects; }
|
||||
void setObjects(std::vector<Room::Object> *objects);
|
||||
|
||||
int snapX() const { return m_snapX; }
|
||||
void setSnapX(int snapX);
|
||||
|
||||
@@ -49,6 +55,8 @@ signals:
|
||||
|
||||
void cursorMoved(const QPoint &point);
|
||||
|
||||
void changed();
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
@@ -57,6 +65,10 @@ protected:
|
||||
|
||||
private:
|
||||
QPoint snapPoint(const QPoint &point) const;
|
||||
void paintObjects(QPainter &painter);
|
||||
void paintDraggedObject(QPainter &painter);
|
||||
|
||||
std::vector<Room::Object> *m_objects{};
|
||||
|
||||
int m_snapX{16};
|
||||
int m_snapY{16};
|
||||
|
||||
Reference in new issue
Block a user