diff --git a/src/editor/dialogs/addeventdialog.cpp b/src/editor/dialogs/addeventdialog.cpp
index e994f9f..3d7cd58 100644
--- a/src/editor/dialogs/addeventdialog.cpp
+++ b/src/editor/dialogs/addeventdialog.cpp
@@ -32,28 +32,48 @@ AddEventDialog::AddEventDialog(ProjectTreeModel &projectModel, QWidget *parent)
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())
+ {
+ auto menu = new QMenu;
+ menu->addAction(tr("Alarm 0"), this, [this](){ m_eventType = Object::EventType::Alarm0; accept(); });
+ menu->addAction(tr("Alarm 1"), this, [this](){ m_eventType = Object::EventType::Alarm1; accept(); });
+ menu->addAction(tr("Alarm 2"), this, [this](){ m_eventType = Object::EventType::Alarm2; accept(); });
+ menu->addAction(tr("Alarm 3"), this, [this](){ m_eventType = Object::EventType::Alarm3; accept(); });
+ menu->addAction(tr("Alarm 4"), this, [this](){ m_eventType = Object::EventType::Alarm4; accept(); });
+ menu->addAction(tr("Alarm 5"), this, [this](){ m_eventType = Object::EventType::Alarm5; accept(); });
+ menu->addAction(tr("Alarm 6"), this, [this](){ m_eventType = Object::EventType::Alarm6; accept(); });
+ menu->addAction(tr("Alarm 7"), this, [this](){ m_eventType = Object::EventType::Alarm7; accept(); });
+ menu->addAction(tr("Alarm 8"), this, [this](){ m_eventType = Object::EventType::Alarm8; accept(); });
+ menu->addAction(tr("Alarm 9"), this, [this](){ m_eventType = Object::EventType::Alarm9; accept(); });
+ menu->addAction(tr("Alarm 10"), this, [this](){ m_eventType = Object::EventType::Alarm10; accept(); });
+ menu->addAction(tr("Alarm 11"), this, [this](){ m_eventType = Object::EventType::Alarm11; accept(); });
+ m_ui->pushButtonAlarm->setMenu(menu);
+ }
+
+ {
+ auto menu = new QMenu;
+ connect(menu, &QMenu::aboutToShow, menu, [this,menu](){
+ menu->clear();
+ for (const Object &object : m_projectModel.project()->objects)
{
- 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))
+ QIcon icon;
+ if (!object.spriteName.isEmpty())
{
- if (!iter->pixmaps.empty())
- icon = iter->pixmaps.front();
+ 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();
+ });
}
- menu->addAction(icon, object.name, this, [this,&object](){
- m_eventType = object.name; accept();
- });
- }
- }, Qt::SingleShotConnection);
- m_ui->pushButtonCollision->setMenu(menu);
+ });
+ m_ui->pushButtonCollision->setMenu(menu);
+ }
}
AddEventDialog::~AddEventDialog() = default;
diff --git a/src/editor/dialogs/addeventdialog.ui b/src/editor/dialogs/addeventdialog.ui
index 3d4e022..2dbf04c 100644
--- a/src/editor/dialogs/addeventdialog.ui
+++ b/src/editor/dialogs/addeventdialog.ui
@@ -46,6 +46,10 @@
&Alarm
+
+
+ :/qtgameengine/icons/event-alarm.png:/qtgameengine/icons/event-alarm.png
+
-
diff --git a/src/editor/icons/event-alarm.png b/src/editor/icons/event-alarm.png
new file mode 100644
index 0000000..ecd0a92
Binary files /dev/null and b/src/editor/icons/event-alarm.png differ
diff --git a/src/editor/models/objecteventsmodel.cpp b/src/editor/models/objecteventsmodel.cpp
index afc1acf..ad559f6 100644
--- a/src/editor/models/objecteventsmodel.cpp
+++ b/src/editor/models/objecteventsmodel.cpp
@@ -40,23 +40,47 @@ QVariant ObjectEventsModel::data(const QModelIndex &index, int role) const
{
case Object::EventType::Create: return tr("Create");
case Object::EventType::Destroy: return tr("Destroy");
+ case Object::EventType::Alarm0: return tr("Alarm 0");
+ case Object::EventType::Alarm1: return tr("Alarm 1");
+ case Object::EventType::Alarm2: return tr("Alarm 2");
+ case Object::EventType::Alarm3: return tr("Alarm 3");
+ case Object::EventType::Alarm4: return tr("Alarm 4");
+ case Object::EventType::Alarm5: return tr("Alarm 5");
+ case Object::EventType::Alarm6: return tr("Alarm 6");
+ case Object::EventType::Alarm7: return tr("Alarm 7");
+ case Object::EventType::Alarm8: return tr("Alarm 8");
+ case Object::EventType::Alarm9: return tr("Alarm 9");
+ case Object::EventType::Alarm10: return tr("Alarm 10");
+ case Object::EventType::Alarm11: return tr("Alarm 11");
case Object::EventType::Step: return tr("Step");
case Object::EventType::Draw: return tr("Draw");
- default:
- qWarning() << "unknown event type" << std::to_underlying(pair.first);
- return QString::number(std::to_underlying(pair.first));
}
+
+ qWarning() << "unknown event type" << std::to_underlying(pair.first);
+ return QString::number(std::to_underlying(pair.first));
case Qt::DecorationRole:
switch (pair.first)
{
case Object::EventType::Create: return QIcon{":/qtgameengine/icons/event-create.png"};
case Object::EventType::Destroy: return QIcon{":/qtgameengine/icons/event-destroy.png"};
+ case Object::EventType::Alarm0:
+ case Object::EventType::Alarm1:
+ case Object::EventType::Alarm2:
+ case Object::EventType::Alarm3:
+ case Object::EventType::Alarm4:
+ case Object::EventType::Alarm5:
+ case Object::EventType::Alarm6:
+ case Object::EventType::Alarm7:
+ case Object::EventType::Alarm8:
+ case Object::EventType::Alarm9:
+ case Object::EventType::Alarm10:
+ case Object::EventType::Alarm11: return QIcon{":/qtgameengine/icons/event-alarm.png"};
case Object::EventType::Step: return QIcon{":/qtgameengine/icons/event-step.png"};
case Object::EventType::Draw: return QIcon{":/qtgameengine/icons/event-draw.png"};
- default:
- qWarning() << "unknown event type" << std::to_underlying(pair.first);
- return {};
}
+
+ qWarning() << "unknown event type" << std::to_underlying(pair.first);
+ return {};
}
}
else if (std::size_t(index.row()) < m_collisionEvents.size() + m_events.size())
diff --git a/src/editor/resources_editor.qrc b/src/editor/resources_editor.qrc
index c2f0725..e46a314 100644
--- a/src/editor/resources_editor.qrc
+++ b/src/editor/resources_editor.qrc
@@ -76,6 +76,7 @@
icons/info.png
icons/merge.png
icons/sort.png
+ icons/event-alarm.png
icons/event-collision.png
icons/event-create.png
icons/event-destroy.png
diff --git a/src/projectcontainer.cpp b/src/projectcontainer.cpp
index 19fcdc3..4fcff5a 100644
--- a/src/projectcontainer.cpp
+++ b/src/projectcontainer.cpp
@@ -136,6 +136,16 @@ QDataStream &operator<<(QDataStream &ds, const std::variant &variant)
return ds;
}
+// for idiotic GCC we cannot use the usual lambda syntax but instead
+// have to provide a template method, GCC sucks
+template
+std::variant variantUnpacker(QDataStream& ds)
+{
+ T value;
+ ds >> value;
+ return value;
+}
+
template
QDataStream &operator>>(QDataStream &ds, std::variant &variant)
{
@@ -144,11 +154,7 @@ QDataStream &operator>>(QDataStream &ds, std::variant &variant)
using func_t = std::variant (QDataStream&);
static constexpr func_t *funcs[] = {
- [](QDataStream& ds) -> std::variant {
- T value;
- ds >> value;
- return value;
- }...
+ variantUnpacker...
};
variant = funcs[index](ds);
diff --git a/src/projectcontainer.h b/src/projectcontainer.h
index 990afee..7f2bf43 100644
--- a/src/projectcontainer.h
+++ b/src/projectcontainer.h
@@ -113,6 +113,18 @@ struct Object
enum class EventType {
Create,
Destroy,
+ Alarm0,
+ Alarm1,
+ Alarm2,
+ Alarm3,
+ Alarm4,
+ Alarm5,
+ Alarm6,
+ Alarm7,
+ Alarm8,
+ Alarm9,
+ Alarm10,
+ Alarm11,
Step,
Draw,
};