diff --git a/QtGameMaker.pro b/QtGameMaker.pro index 56eae40..018f224 100644 --- a/QtGameMaker.pro +++ b/QtGameMaker.pro @@ -26,9 +26,11 @@ INCLUDEPATH += \ HEADERS += \ src/closeeventfilter.h \ + src/editor/dialogs/actions/speedhorizontaldialog.h \ src/editor/dialogs/actions/movefreedialog.h \ src/editor/dialogs/actions/movetowardsdialog.h \ src/editor/dialogs/actions/executecodedialog.h \ + src/editor/dialogs/actions/speedverticaldialog.h \ src/editor/dialogs/genericcodeeditordialog.h \ src/editor/dialogs/includedfilepropertiesdialog.h \ src/editor/dialogs/transparentbackgroundsettingsdialog.h \ @@ -92,8 +94,10 @@ HEADERS += \ SOURCES += \ src/closeeventfilter.cpp \ src/editor/dialogs/actions/executecodedialog.cpp \ + src/editor/dialogs/actions/speedhorizontaldialog.cpp \ src/editor/dialogs/actions/movefreedialog.cpp \ src/editor/dialogs/actions/movetowardsdialog.cpp \ + src/editor/dialogs/actions/speedverticaldialog.cpp \ src/editor/dialogs/genericcodeeditordialog.cpp \ src/editor/dialogs/includedfilepropertiesdialog.cpp \ src/editor/dialogs/transparentbackgroundsettingsdialog.cpp \ @@ -154,8 +158,10 @@ SOURCES += \ src/projectserialization.cpp FORMS += \ + src/editor/dialogs/actions/speedhorizontaldialog.ui \ src/editor/dialogs/actions/movefreedialog.ui \ src/editor/dialogs/actions/movetowardsdialog.ui \ + src/editor/dialogs/actions/speedverticaldialog.ui \ src/editor/dialogs/includedfilepropertiesdialog.ui \ src/editor/dialogs/transparentbackgroundsettingsdialog.ui \ src/editor/mainwindow.ui \ diff --git a/src/editor/dialogs/actions/movefixeddialog.ui b/src/editor/dialogs/actions/movefixeddialog.ui index 17bee17..d3de655 100644 --- a/src/editor/dialogs/actions/movefixeddialog.ui +++ b/src/editor/dialogs/actions/movefixeddialog.ui @@ -253,6 +253,9 @@ Speed: + + spinBox + diff --git a/src/editor/dialogs/actions/movefreedialog.ui b/src/editor/dialogs/actions/movefreedialog.ui index a796c4c..e8c9148 100644 --- a/src/editor/dialogs/actions/movefreedialog.ui +++ b/src/editor/dialogs/actions/movefreedialog.ui @@ -143,6 +143,9 @@ direction: + + spinBoxDirection + @@ -153,6 +156,9 @@ speed: + + spinBoxSpeed + diff --git a/src/editor/dialogs/actions/movetowardsdialog.cpp b/src/editor/dialogs/actions/movetowardsdialog.cpp index 79ec4bf..af28db8 100644 --- a/src/editor/dialogs/actions/movetowardsdialog.cpp +++ b/src/editor/dialogs/actions/movetowardsdialog.cpp @@ -1,12 +1,19 @@ #include "movetowardsdialog.h" #include "ui_movetowardsdialog.h" +#include + MoveTowardsDialog::MoveTowardsDialog(MoveTowardsAction &action, QWidget *parent) : QDialog{parent}, m_ui{std::make_unique()}, m_action{action} { m_ui->setupUi(this); + + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok)) + button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) + button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); } MoveTowardsDialog::~MoveTowardsDialog() = default; diff --git a/src/editor/dialogs/actions/movetowardsdialog.ui b/src/editor/dialogs/actions/movetowardsdialog.ui index 801fb50..8104348 100644 --- a/src/editor/dialogs/actions/movetowardsdialog.ui +++ b/src/editor/dialogs/actions/movetowardsdialog.ui @@ -6,31 +6,204 @@ 0 0 - 400 - 300 + 435 + 429 - Dialog + Move Towards - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + + + + + + + + + :/qtgameengine/icons/action-move-towards.png + + + + + + + Applies to + + + + + + Self + + + true + + + + + + + Other + + + + + + + + + Object: + + + + + + + + + + ... + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + x: + + + spinBoxX + + + + + + + + + + y: + + + spinBoxY + + + + + + + + + + Relative + + + + + + + + + + speed: + + + spinBoxSpeed + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + - + + + buttonBox @@ -39,8 +212,8 @@ accept() - 248 - 254 + 257 + 419 157 @@ -55,8 +228,8 @@ reject() - 316 - 260 + 325 + 419 286 diff --git a/src/editor/dialogs/actions/speedhorizontaldialog.cpp b/src/editor/dialogs/actions/speedhorizontaldialog.cpp new file mode 100644 index 0000000..b325b49 --- /dev/null +++ b/src/editor/dialogs/actions/speedhorizontaldialog.cpp @@ -0,0 +1,19 @@ +#include "speedhorizontaldialog.h" +#include "ui_speedhorizontaldialog.h" + +#include + +SpeedHorizontalDialog::SpeedHorizontalDialog(SpeedHorizontalAction &action, QWidget *parent) : + QDialog{parent}, + m_ui{std::make_unique()}, + m_action{action} +{ + m_ui->setupUi(this); + + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok)) + button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) + button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); +} + +SpeedHorizontalDialog::~SpeedHorizontalDialog() = default; diff --git a/src/editor/dialogs/actions/speedhorizontaldialog.h b/src/editor/dialogs/actions/speedhorizontaldialog.h new file mode 100644 index 0000000..51c96e9 --- /dev/null +++ b/src/editor/dialogs/actions/speedhorizontaldialog.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace Ui { class SpeedHorizontalDialog; } +struct SpeedHorizontalAction; + +class SpeedHorizontalDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SpeedHorizontalDialog(SpeedHorizontalAction &action, QWidget *parent = nullptr); + ~SpeedHorizontalDialog() override; + +private: + const std::unique_ptr m_ui; + + SpeedHorizontalAction &m_action; +}; diff --git a/src/editor/dialogs/actions/speedhorizontaldialog.ui b/src/editor/dialogs/actions/speedhorizontaldialog.ui new file mode 100644 index 0000000..3a1e2cb --- /dev/null +++ b/src/editor/dialogs/actions/speedhorizontaldialog.ui @@ -0,0 +1,68 @@ + + + SpeedHorizontalDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + accepted() + SpeedHorizontalDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SpeedHorizontalDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/editor/dialogs/actions/speedverticaldialog.cpp b/src/editor/dialogs/actions/speedverticaldialog.cpp new file mode 100644 index 0000000..1af4a83 --- /dev/null +++ b/src/editor/dialogs/actions/speedverticaldialog.cpp @@ -0,0 +1,19 @@ +#include "speedverticaldialog.h" +#include "ui_speedverticaldialog.h" + +#include + +SpeedVerticalDialog::SpeedVerticalDialog(SpeedVerticalAction &action, QWidget *parent) : + QDialog{parent}, + m_ui{std::make_unique()}, + m_action{action} +{ + m_ui->setupUi(this); + + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok)) + button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) + button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); +} + +SpeedVerticalDialog::~SpeedVerticalDialog() = default; diff --git a/src/editor/dialogs/actions/speedverticaldialog.h b/src/editor/dialogs/actions/speedverticaldialog.h new file mode 100644 index 0000000..70749f9 --- /dev/null +++ b/src/editor/dialogs/actions/speedverticaldialog.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace Ui { class SpeedVerticalDialog; } +struct SpeedVerticalAction; + +class SpeedVerticalDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SpeedVerticalDialog(SpeedVerticalAction &action, QWidget *parent = nullptr); + ~SpeedVerticalDialog() override; + +private: + const std::unique_ptr m_ui; + + SpeedVerticalAction &m_action; +}; diff --git a/src/editor/dialogs/actions/speedverticaldialog.ui b/src/editor/dialogs/actions/speedverticaldialog.ui new file mode 100644 index 0000000..3981708 --- /dev/null +++ b/src/editor/dialogs/actions/speedverticaldialog.ui @@ -0,0 +1,68 @@ + + + SpeedVerticalDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + accepted() + SpeedVerticalDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SpeedVerticalDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/editor/icons/action-code.png b/src/editor/icons/action-execute-code.png similarity index 100% rename from src/editor/icons/action-code.png rename to src/editor/icons/action-execute-code.png diff --git a/src/editor/icons/action-speed-horizontal.png b/src/editor/icons/action-speed-horizontal.png new file mode 100644 index 0000000..cee92ca Binary files /dev/null and b/src/editor/icons/action-speed-horizontal.png differ diff --git a/src/editor/icons/action-speed-vertical.png b/src/editor/icons/action-speed-vertical.png new file mode 100644 index 0000000..6231674 Binary files /dev/null and b/src/editor/icons/action-speed-vertical.png differ diff --git a/src/editor/models/actionscontainermodel.cpp b/src/editor/models/actionscontainermodel.cpp index cd17aff..385c2d4 100644 --- a/src/editor/models/actionscontainermodel.cpp +++ b/src/editor/models/actionscontainermodel.cpp @@ -50,6 +50,10 @@ QVariant ActionsContainerModel::data(const QModelIndex &index, int role) const return tr("Set direction and speed of motion"); else if (std::holds_alternative(action)) return tr("Move towards point (99, 99)"); + else if (std::holds_alternative(action)) + return tr("Set the horizontal speed"); + else if (std::holds_alternative(action)) + return tr("Set the vertical speed"); else if (std::holds_alternative(action)) return tr("Execute a piece of code"); else @@ -64,8 +68,12 @@ QVariant ActionsContainerModel::data(const QModelIndex &index, int role) const return QIcon{":/qtgameengine/icons/action-move-free.png"}; else if (std::holds_alternative(action)) return QIcon{":/qtgameengine/icons/action-move-towards.png"}; + else if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-speed-horizontal.png"}; + else if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-speed-vertical.png"}; else if (std::holds_alternative(action)) - return QIcon{":/qtgameengine/icons/action-code.png"}; + return QIcon{":/qtgameengine/icons/action-execute-code.png"}; else { qWarning() << "unknown action type"; @@ -132,11 +140,6 @@ QMimeData *ActionsContainerModel::mimeData(const QModelIndexList &indexes) const bool ActionsContainerModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const { - if (!m_actionsContainer) - { - qWarning() << "no container"; - return false; - } // if the drop is on an item, reject drop if (parent.isValid() && row == -1 && column == -1) { @@ -149,11 +152,6 @@ bool ActionsContainerModel::canDropMimeData(const QMimeData *data, Qt::DropActio bool ActionsContainerModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { - if (!m_actionsContainer) - { - qWarning() << "no container"; - return false; - } // check if the action is supported if (!data || !(action == Qt::CopyAction || action == Qt::MoveAction)) { @@ -200,6 +198,12 @@ bool ActionsContainerModel::dropMimeData(const QMimeData *data, Qt::DropAction a qWarning() << "empty actions"; return false; } + if (!m_actionsContainer) + { + qWarning() << "no container"; + emit actionsContainerMissing(); + return false; + } beginInsertRows({}, row, row + actions.size() - 1); auto iter = std::next(std::begin(*m_actionsContainer), row); diff --git a/src/editor/models/actionscontainermodel.h b/src/editor/models/actionscontainermodel.h index c6748d1..19a555b 100644 --- a/src/editor/models/actionscontainermodel.h +++ b/src/editor/models/actionscontainermodel.h @@ -41,6 +41,7 @@ public: signals: void changed(); + void actionsContainerMissing(); private: ActionsContainer *m_actionsContainer{}; diff --git a/src/editor/resources_editor.qrc b/src/editor/resources_editor.qrc index 3b2672c..bbf428e 100644 --- a/src/editor/resources_editor.qrc +++ b/src/editor/resources_editor.qrc @@ -1,10 +1,12 @@ icons/action.png - icons/action-code.png + icons/action-execute-code.png icons/action-move-fixed.png icons/action-move-free.png icons/action-move-towards.png + icons/action-speed-horizontal.png + icons/action-speed-vertical.png icons/add.png icons/arrow-down.png icons/arrow-left.png diff --git a/src/editor/widgets/actionscontainerwidget.cpp b/src/editor/widgets/actionscontainerwidget.cpp index 309fec1..8bc77d4 100644 --- a/src/editor/widgets/actionscontainerwidget.cpp +++ b/src/editor/widgets/actionscontainerwidget.cpp @@ -10,6 +10,8 @@ #include "dialogs/actions/movefixeddialog.h" #include "dialogs/actions/movefreedialog.h" #include "dialogs/actions/movetowardsdialog.h" +#include "dialogs/actions/speedhorizontaldialog.h" +#include "dialogs/actions/speedverticaldialog.h" #include "dialogs/actions/executecodedialog.h" namespace { @@ -17,6 +19,8 @@ template struct ActionDialogForImpl; template<> struct ActionDialogForImpl { using Dialog = MoveFixedDialog; }; template<> struct ActionDialogForImpl { using Dialog = MoveFreeDialog; }; template<> struct ActionDialogForImpl { using Dialog = MoveTowardsDialog; }; +template<> struct ActionDialogForImpl { using Dialog = SpeedHorizontalDialog; }; +template<> struct ActionDialogForImpl { using Dialog = SpeedVerticalDialog; }; template<> struct ActionDialogForImpl { using Dialog = ExecuteCodeDialog; }; template using ActionDialogFor = ActionDialogForImpl::Dialog; } @@ -33,6 +37,9 @@ ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : connect(m_actionsModel.get(), &ActionsContainerModel::changed, this, &ActionsContainerWidget::changed); + connect(m_actionsModel.get(), &ActionsContainerModel::actionsContainerMissing, + this, &ActionsContainerWidget::actionsContainerMissing); + connect(m_ui->listViewActions, &QListView::customContextMenuRequested, this, &ActionsContainerWidget::actionsContextMenuRequested); @@ -50,12 +57,18 @@ ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : this, &ActionsContainerWidget::createNewAction); connect(m_ui->toolButtonMoveTowards, &QAbstractButton::clicked, this, &ActionsContainerWidget::createNewAction); + connect(m_ui->toolButtonSpeedHorizontal, &QAbstractButton::clicked, + this, &ActionsContainerWidget::createNewAction); + connect(m_ui->toolButtonSpeedVertical, &QAbstractButton::clicked, + this, &ActionsContainerWidget::createNewAction); connect(m_ui->toolButtonExecuteCode, &QAbstractButton::clicked, this, &ActionsContainerWidget::createNewAction); m_ui->toolButtonMoveFixed->setAction(MoveFixedAction{}); m_ui->toolButtonMoveFree->setAction(MoveFreeAction{}); m_ui->toolButtonMoveTowards->setAction(MoveTowardsAction{}); + m_ui->toolButtonSpeedHorizontal->setAction(SpeedHorizontalAction{}); + m_ui->toolButtonSpeedVertical->setAction(SpeedVerticalAction{}); m_ui->toolButtonExecuteCode->setAction(ExecuteCodeAction{}); } @@ -98,6 +111,18 @@ void ActionsContainerWidget::actionDoubleClicked(const QModelIndex &index) if (dialog.exec() == QDialog::Accepted) emit changed(); } + else if (auto ptr = std::get_if(action)) + { + SpeedHorizontalDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } + else if (auto ptr = std::get_if(action)) + { + SpeedVerticalDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } else if (auto ptr = std::get_if(action)) { ExecuteCodeDialog dialog{*ptr, this}; @@ -167,6 +192,12 @@ void ActionsContainerWidget::actionsContextMenuRequested(const QPoint &pos) menu.exec(m_ui->listViewActions->viewport()->mapToGlobal(pos)); } +void ActionsContainerWidget::actionsContainerMissing() +{ + QMessageBox::warning(this, tr("You need to select or add an event before you can add actions"), + tr("You need to select or add an event before you can add actions")); +} + template void ActionsContainerWidget::createNewAction() { diff --git a/src/editor/widgets/actionscontainerwidget.h b/src/editor/widgets/actionscontainerwidget.h index a22f86b..44cbeb1 100644 --- a/src/editor/widgets/actionscontainerwidget.h +++ b/src/editor/widgets/actionscontainerwidget.h @@ -26,6 +26,7 @@ signals: private slots: void actionDoubleClicked(const QModelIndex &index); void actionsContextMenuRequested(const QPoint &pos); + void actionsContainerMissing(); private: template diff --git a/src/editor/widgets/actionscontainerwidget.ui b/src/editor/widgets/actionscontainerwidget.ui index 2944c8a..6842209 100644 --- a/src/editor/widgets/actionscontainerwidget.ui +++ b/src/editor/widgets/actionscontainerwidget.ui @@ -240,13 +240,13 @@ - + Speed Vertical - :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + :/qtgameengine/icons/action-speed-vertical.png:/qtgameengine/icons/action-speed-vertical.png @@ -336,13 +336,13 @@ - + Speed Horizontal - :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + :/qtgameengine/icons/action-speed-horizontal.png:/qtgameengine/icons/action-speed-horizontal.png @@ -1450,7 +1450,7 @@ - :/qtgameengine/icons/action-code.png:/qtgameengine/icons/action-code.png + :/qtgameengine/icons/action-execute-code.png:/qtgameengine/icons/action-execute-code.png diff --git a/src/projectcontainer.h b/src/projectcontainer.h index 954ef25..ba98d6a 100644 --- a/src/projectcontainer.h +++ b/src/projectcontainer.h @@ -169,6 +169,14 @@ struct MoveTowardsAction { }; +struct SpeedHorizontalAction { + +}; + +struct SpeedVerticalAction { + +}; + struct ExecuteCodeAction { enum class AppliesTo { Self, @@ -184,6 +192,8 @@ using Action = std::variant< MoveFixedAction, MoveFreeAction, MoveTowardsAction, + SpeedHorizontalAction, + SpeedVerticalAction, ExecuteCodeAction >; diff --git a/src/projectserialization.cpp b/src/projectserialization.cpp index 2243398..d241617 100644 --- a/src/projectserialization.cpp +++ b/src/projectserialization.cpp @@ -304,6 +304,34 @@ QDataStream &operator>>(QDataStream &ds, MoveTowardsAction &action) return ds; } +QDataStream &operator<<(QDataStream &ds, const SpeedHorizontalAction &action) +{ + Q_UNUSED(action); +// ds << action.; + return ds; +} + +QDataStream &operator>>(QDataStream &ds, SpeedHorizontalAction &action) +{ + Q_UNUSED(action); +// ds >> action.; + return ds; +} + +QDataStream &operator<<(QDataStream &ds, const SpeedVerticalAction &action) +{ + Q_UNUSED(action); +// ds << action.; + return ds; +} + +QDataStream &operator>>(QDataStream &ds, SpeedVerticalAction &action) +{ + Q_UNUSED(action); +// ds >> action.; + return ds; +} + QDataStream &operator<<(QDataStream &ds, const ExecuteCodeAction &action) { ds << action.script; diff --git a/src/projectserialization.h b/src/projectserialization.h index 382fdbc..acd1a57 100644 --- a/src/projectserialization.h +++ b/src/projectserialization.h @@ -34,6 +34,10 @@ QDataStream &operator<<(QDataStream &ds, const MoveFreeAction &action); QDataStream &operator>>(QDataStream &ds, MoveFreeAction &action); QDataStream &operator<<(QDataStream &ds, const MoveTowardsAction &action); QDataStream &operator>>(QDataStream &ds, MoveTowardsAction &action); +QDataStream &operator<<(QDataStream &ds, const SpeedHorizontalAction &action); +QDataStream &operator>>(QDataStream &ds, SpeedHorizontalAction &action); +QDataStream &operator<<(QDataStream &ds, const SpeedVerticalAction &action); +QDataStream &operator>>(QDataStream &ds, SpeedVerticalAction &action); QDataStream &operator<<(QDataStream &ds, const ExecuteCodeAction &action); QDataStream &operator>>(QDataStream &ds, ExecuteCodeAction &action); QDataStream &operator<<(QDataStream &ds, const TimeLine &timeLine);