Add collision events and fix a few bugs when objects are renamed/deleted
This commit is contained in:
1 parent
95d1936a5f
commit
42575e5d5a
14 files changed
+416
-97
No files matched your search
@@ -2,9 +2,13 @@
|
||||
#include "ui_addeventdialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QMenu>
|
||||
|
||||
AddEventDialog::AddEventDialog(QWidget *parent) :
|
||||
#include "models/projecttreemodel.h"
|
||||
|
||||
AddEventDialog::AddEventDialog(ProjectTreeModel &projectModel, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_projectModel{projectModel},
|
||||
m_ui{std::make_unique<Ui::AddEventDialog>()}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
@@ -27,6 +31,29 @@ AddEventDialog::AddEventDialog(QWidget *parent) :
|
||||
this, [this](){ m_eventType = Object::EventType::Draw; accept(); });
|
||||
connect(m_ui->pushButtonStep, &QAbstractButton::clicked,
|
||||
this, [this](){ m_eventType = Object::EventType::Step; accept(); });
|
||||
|
||||
auto menu = new QMenu;
|
||||
connect(menu, &QMenu::aboutToShow, menu, [this,menu](){
|
||||
for (const Object &object : m_projectModel.project()->objects)
|
||||
{
|
||||
QIcon icon;
|
||||
if (!object.spriteName.isEmpty())
|
||||
{
|
||||
const auto &sprites = m_projectModel.project()->sprites;
|
||||
const auto iter = std::find_if(std::cbegin(sprites), std::cend(sprites),
|
||||
[&](const Sprite &sprite){ return sprite.name == object.spriteName; });
|
||||
if (iter != std::cend(sprites))
|
||||
{
|
||||
if (!iter->pixmaps.empty())
|
||||
icon = iter->pixmaps.front();
|
||||
}
|
||||
}
|
||||
menu->addAction(icon, object.name, this, [this,&object](){
|
||||
m_eventType = object.name; accept();
|
||||
});
|
||||
}
|
||||
}, Qt::SingleShotConnection);
|
||||
m_ui->pushButtonCollision->setMenu(menu);
|
||||
}
|
||||
|
||||
AddEventDialog::~AddEventDialog() = default;
|
||||
|
||||
@@ -3,26 +3,31 @@
|
||||
#include <QDialog>
|
||||
|
||||
#include <optional>
|
||||
#include <variant>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
namespace Ui { class AddEventDialog; }
|
||||
|
||||
class ProjectTreeModel;
|
||||
|
||||
class AddEventDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AddEventDialog(QWidget *parent = nullptr);
|
||||
explicit AddEventDialog(ProjectTreeModel &projectModel, QWidget *parent = nullptr);
|
||||
~AddEventDialog();
|
||||
|
||||
Object::EventType eventType() const { return *m_eventType; }
|
||||
const std::optional<std::variant<Object::EventType, QString>> &eventType() const { return m_eventType; }
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private:
|
||||
ProjectTreeModel &m_projectModel;
|
||||
|
||||
const std::unique_ptr<Ui::AddEventDialog> m_ui;
|
||||
|
||||
std::optional<Object::EventType> m_eventType;
|
||||
std::optional<std::variant<Object::EventType, QString>> m_eventType;
|
||||
};
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>265</width>
|
||||
<height>221</height>
|
||||
<height>238</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -82,6 +82,10 @@
|
||||
<property name="text">
|
||||
<string>C&ollision</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources_editor.qrc">
|
||||
<normaloff>:/qtgameengine/icons/event-collision.png</normaloff>:/qtgameengine/icons/event-collision.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
|
||||
@@ -19,7 +19,8 @@ ObjectPropertiesDialog::ObjectPropertiesDialog(Object &object, ProjectTreeModel
|
||||
m_projectModel{projectModel},
|
||||
m_mainWindow{mainWindow},
|
||||
m_events{m_object.events},
|
||||
m_eventsModel{std::make_unique<ObjectEventsModel>(m_events)},
|
||||
m_collisionEvents{m_object.collisionEvents},
|
||||
m_eventsModel{std::make_unique<ObjectEventsModel>(m_events, m_collisionEvents)},
|
||||
m_menuSprites{new QMenu{this}},
|
||||
m_spriteName{object.spriteName}
|
||||
{
|
||||
@@ -132,6 +133,7 @@ void ObjectPropertiesDialog::accept()
|
||||
m_object.depth = m_ui->spinBoxDepth->value();
|
||||
m_object.persistent = m_ui->checkBoxPersistent->isChecked();
|
||||
m_object.events = std::move(m_events);
|
||||
m_object.collisionEvents = std::move(m_collisionEvents);
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
@@ -204,12 +206,11 @@ void ObjectPropertiesDialog::showInformation()
|
||||
|
||||
void ObjectPropertiesDialog::addEvent()
|
||||
{
|
||||
AddEventDialog dialog{this};
|
||||
AddEventDialog dialog{m_projectModel, this};
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
if (!m_eventsModel->addEvent(dialog.eventType()))
|
||||
QMessageBox::warning(this, tr("Could not add Event!"), tr("Could not add Event!"));
|
||||
}
|
||||
if (const auto &eventType = dialog.eventType())
|
||||
if (!m_eventsModel->addEvent(*eventType))
|
||||
QMessageBox::warning(this, tr("Could not add Event!"), tr("Could not add Event!"));
|
||||
}
|
||||
|
||||
void ObjectPropertiesDialog::deleteEvent()
|
||||
@@ -235,12 +236,13 @@ void ObjectPropertiesDialog::replaceEvent()
|
||||
if (!event)
|
||||
return;
|
||||
|
||||
AddEventDialog dialog{this};
|
||||
std::variant<Object::EventType, QString> x = event->first;
|
||||
|
||||
AddEventDialog dialog{m_projectModel, this};
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
if (!m_eventsModel->changeEvent(event->first, dialog.eventType()))
|
||||
if (const auto &eventType = dialog.eventType())
|
||||
if (!m_eventsModel->changeEvent(event->first, *eventType))
|
||||
QMessageBox::warning(this, tr("Could not change Event!"), tr("Could not change Event!"));
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectPropertiesDialog::duplicateEvent()
|
||||
@@ -329,7 +331,7 @@ void ObjectPropertiesDialog::currentEventChanged(const QModelIndex &index)
|
||||
if (index.isValid())
|
||||
{
|
||||
if (auto event = m_eventsModel->getEvent(index))
|
||||
m_ui->actionsWidget->setActionsContainer(&event->second);
|
||||
m_ui->actionsWidget->setActionsContainer(&event->second.get());
|
||||
else
|
||||
goto none;
|
||||
}
|
||||
@@ -343,13 +345,13 @@ none:
|
||||
void ObjectPropertiesDialog::eventsContextMenuRequested(const QPoint &pos)
|
||||
{
|
||||
const auto index = m_ui->listViewEvents->indexAt(pos);
|
||||
auto event = index.isValid() ? m_eventsModel->getEvent(index) : nullptr;
|
||||
auto event = index.isValid() ? m_eventsModel->getEvent(index) : std::nullopt;
|
||||
|
||||
QMenu menu{this};
|
||||
menu.addAction(tr("&Add Event"), this, &ObjectPropertiesDialog::addEvent);
|
||||
menu.addAction(tr("&Change Event"), this, &ObjectPropertiesDialog::replaceEvent)->setEnabled(event);
|
||||
menu.addAction(tr("&Duplicate Event"), this, &ObjectPropertiesDialog::duplicateEvent)->setEnabled(event);
|
||||
menu.addAction(tr("D&elete Event"), this, &ObjectPropertiesDialog::deleteEvent)->setEnabled(event);
|
||||
menu.addAction(tr("&Change Event"), this, &ObjectPropertiesDialog::replaceEvent)->setEnabled(event.has_value());
|
||||
menu.addAction(tr("&Duplicate Event"), this, &ObjectPropertiesDialog::duplicateEvent)->setEnabled(event.has_value());
|
||||
menu.addAction(tr("D&elete Event"), this, &ObjectPropertiesDialog::deleteEvent)->setEnabled(event.has_value());
|
||||
menu.exec(m_ui->listViewEvents->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ private:
|
||||
MainWindow * const m_mainWindow;
|
||||
|
||||
Object::events_container_t m_events;
|
||||
Object::collision_events_container_t m_collisionEvents;
|
||||
|
||||
const std::unique_ptr<ObjectEventsModel> m_eventsModel;
|
||||
|
||||
|
||||
@@ -343,29 +343,35 @@ void RoomPropertiesDialog::spritePixmapsChanged(const Sprite &sprite)
|
||||
m_ui->labelObjectPreview->setPixmap(std::move(pixmap));
|
||||
}
|
||||
|
||||
void RoomPropertiesDialog::objectNameChanged(const Object &object)
|
||||
void RoomPropertiesDialog::objectNameChanged(const Object &object, const QString &oldName)
|
||||
{
|
||||
if (!m_selectedObject)
|
||||
return;
|
||||
if (m_selectedObject && &object == m_selectedObject)
|
||||
m_ui->lineEditObject->setText(object.name);
|
||||
|
||||
if (&object != m_selectedObject)
|
||||
return;
|
||||
for (auto &obj : m_objects)
|
||||
{
|
||||
if (obj.objectName != oldName)
|
||||
continue;
|
||||
|
||||
m_ui->lineEditObject->setText(object.name);
|
||||
obj.objectName = object.name;
|
||||
}
|
||||
}
|
||||
|
||||
void RoomPropertiesDialog::objectAboutToBeRemoved(const Object &object)
|
||||
{
|
||||
if (!m_selectedObject)
|
||||
return;
|
||||
if (m_selectedObject && &object == m_selectedObject)
|
||||
{
|
||||
m_selectedObject = nullptr;
|
||||
m_ui->lineEditObject->clear();
|
||||
m_ui->labelObjectPreview->setPixmap({});
|
||||
m_ui->roomEditWidget->setSelectedObject(nullptr);
|
||||
}
|
||||
|
||||
if (&object != m_selectedObject)
|
||||
return;
|
||||
|
||||
m_selectedObject = nullptr;
|
||||
m_ui->lineEditObject->clear();
|
||||
m_ui->labelObjectPreview->setPixmap({});
|
||||
m_ui->roomEditWidget->setSelectedObject(nullptr);
|
||||
for (auto iter = std::begin(m_objects); iter != std::end(m_objects);)
|
||||
if (iter->objectName == object.name)
|
||||
iter = m_objects.erase(iter);
|
||||
else
|
||||
iter++;
|
||||
}
|
||||
|
||||
void RoomPropertiesDialog::objectSpriteNameChanged(const Object &object)
|
||||
|
||||
@@ -41,7 +41,7 @@ private slots:
|
||||
|
||||
void roomNameChanged(const Room &room);
|
||||
void spritePixmapsChanged(const Sprite &sprite);
|
||||
void objectNameChanged(const Object &object);
|
||||
void objectNameChanged(const Object &object, const QString &oldName);
|
||||
void objectAboutToBeRemoved(const Object &object);
|
||||
void objectSpriteNameChanged(const Object &object);
|
||||
|
||||
|
||||
Reference in new issue
Block a user