Implement right click to delete objects in room

This commit is contained in:
2023-12-28 19:48:21 +01:00
parent 0cbde44138
commit a51ab2a889

View File

@ -1,5 +1,7 @@
#include "roomeditwidget.h" #include "roomeditwidget.h"
#include <iterator>
#include <QDebug> #include <QDebug>
#include <QPainter> #include <QPainter>
#include <QPaintEvent> #include <QPaintEvent>
@ -108,13 +110,71 @@ void RoomEditWidget::mousePressEvent(QMouseEvent *event)
{ {
QWidget::mousePressEvent(event); QWidget::mousePressEvent(event);
if (m_selectedObject) switch (event->button())
{ {
m_draggedObject = DraggedObject { case Qt::MouseButton::LeftButton:
.object = *m_selectedObject, if (m_selectedObject)
.pos = snapPoint(event->pos()) {
}; m_draggedObject = DraggedObject {
update(); .object = *m_selectedObject,
.pos = snapPoint(event->pos())
};
update();
}
break;
case Qt::MouseButton::RightButton:
{
if (m_projectTreeModel && m_objects)
{
auto iter = std::find_if(std::rbegin(*m_objects), std::rend(*m_objects),
[&](const Room::Object &obj){
const auto &objectName = obj.objectName;
const auto &objects = m_projectTreeModel->project()->objects;
const auto iter = std::find_if(std::cbegin(objects), std::cend(objects),
[&](const Object &obj){ return obj.name == objectName; });
if (iter == std::cend(objects))
{
qWarning() << "object" << obj.objectName << "not found";
return false;
}
else
{
const Object &object = *iter;
const auto &spriteName = object.spriteName;
const auto &sprites = m_projectTreeModel->project()->sprites;
const auto iter = std::find_if(std::cbegin(sprites), std::cend(sprites),
[&](const Sprite &sprite){ return sprite.name == spriteName; });
if (iter == std::cend(sprites))
{
qWarning() << "sprite" << spriteName << "not found";
return false;
}
else
{
const Sprite &sprite = *iter;
if (sprite.pixmaps.empty())
return false;
return QRect(obj.pos, sprite.pixmaps.front().size()).contains(event->pos());
}
}
});
if (iter != std::rend(*m_objects))
{
m_objects->erase(std::next(iter).base());
emit changed();
update();
}
}
break;
}
default:;
} }
} }
@ -122,20 +182,25 @@ void RoomEditWidget::mouseReleaseEvent(QMouseEvent *event)
{ {
QWidget::mouseReleaseEvent(event); QWidget::mouseReleaseEvent(event);
if (m_draggedObject) switch (event->button())
{ {
if (m_objects) case Qt::MouseButton::LeftButton:
if (m_draggedObject)
{ {
m_objects->emplace_back(Room::Object{ if (m_objects)
.objectName = m_draggedObject->object.get().name, {
.pos = snapPoint(event->pos()) m_objects->emplace_back(Room::Object{
}); .objectName = m_draggedObject->object.get().name,
.pos = snapPoint(event->pos())
});
emit changed(); emit changed();
}
m_draggedObject = std::nullopt;
update();
} }
default:;
m_draggedObject = std::nullopt;
update();
} }
} }