Implement right click to delete objects in room
This commit is contained in:
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user