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, };