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);