diff --git a/QtGameMaker.pro b/QtGameMaker.pro index 65c75a2..56eae40 100644 --- a/QtGameMaker.pro +++ b/QtGameMaker.pro @@ -26,6 +26,9 @@ INCLUDEPATH += \ HEADERS += \ src/closeeventfilter.h \ + src/editor/dialogs/actions/movefreedialog.h \ + src/editor/dialogs/actions/movetowardsdialog.h \ + src/editor/dialogs/actions/executecodedialog.h \ src/editor/dialogs/genericcodeeditordialog.h \ src/editor/dialogs/includedfilepropertiesdialog.h \ src/editor/dialogs/transparentbackgroundsettingsdialog.h \ @@ -46,7 +49,6 @@ HEADERS += \ src/editor/mainwindow.h \ src/editor/dialogs/addeventdialog.h \ src/editor/dialogs/backgroundpropertiesdialog.h \ - src/editor/dialogs/codeactiondialog.h \ src/editor/dialogs/codeeditordialog.h \ src/editor/dialogs/createspritedialog.h \ src/editor/dialogs/deletemomentsdialog.h \ @@ -89,6 +91,9 @@ HEADERS += \ SOURCES += \ src/closeeventfilter.cpp \ + src/editor/dialogs/actions/executecodedialog.cpp \ + src/editor/dialogs/actions/movefreedialog.cpp \ + src/editor/dialogs/actions/movetowardsdialog.cpp \ src/editor/dialogs/genericcodeeditordialog.cpp \ src/editor/dialogs/includedfilepropertiesdialog.cpp \ src/editor/dialogs/transparentbackgroundsettingsdialog.cpp \ @@ -109,7 +114,6 @@ SOURCES += \ src/editor/mainwindow.cpp \ src/editor/dialogs/addeventdialog.cpp \ src/editor/dialogs/backgroundpropertiesdialog.cpp \ - src/editor/dialogs/codeactiondialog.cpp \ src/editor/dialogs/codeeditordialog.cpp \ src/editor/dialogs/createspritedialog.cpp \ src/editor/dialogs/deletemomentsdialog.cpp \ @@ -150,6 +154,8 @@ SOURCES += \ src/projectserialization.cpp FORMS += \ + src/editor/dialogs/actions/movefreedialog.ui \ + src/editor/dialogs/actions/movetowardsdialog.ui \ src/editor/dialogs/includedfilepropertiesdialog.ui \ src/editor/dialogs/transparentbackgroundsettingsdialog.ui \ src/editor/mainwindow.ui \ diff --git a/src/editor/dialogs/codeactiondialog.cpp b/src/editor/dialogs/actions/executecodedialog.cpp similarity index 85% rename from src/editor/dialogs/codeactiondialog.cpp rename to src/editor/dialogs/actions/executecodedialog.cpp index 06329b4..1666e72 100644 --- a/src/editor/dialogs/codeactiondialog.cpp +++ b/src/editor/dialogs/actions/executecodedialog.cpp @@ -1,4 +1,4 @@ -#include "codeactiondialog.h" +#include "executecodedialog.h" #include #include @@ -6,7 +6,7 @@ #include "projectcontainer.h" -CodeActionDialog::CodeActionDialog(ExecuteCodeAction &action, QWidget *parent) : +ExecuteCodeDialog::ExecuteCodeDialog(ExecuteCodeAction &action, QWidget *parent) : CodeEditorDialog{tr("Execute Code"), parent}, m_action{action}, m_radioButtonSelf{new QRadioButton{tr("Self"), this}}, @@ -30,14 +30,14 @@ CodeActionDialog::CodeActionDialog(ExecuteCodeAction &action, QWidget *parent) : setScript(m_action.script); connect(m_radioButtonSelf, &QRadioButton::toggled, - this, &CodeActionDialog::changed); + this, &ExecuteCodeDialog::changed); connect(m_radioButtonOther, &QRadioButton::toggled, - this, &CodeActionDialog::changed); + this, &ExecuteCodeDialog::changed); connect(m_radioButtonObject, &QRadioButton::toggled, - this, &CodeActionDialog::changed); + this, &ExecuteCodeDialog::changed); } -void CodeActionDialog::accept() +void ExecuteCodeDialog::accept() { if (!m_unsavedChanges) { diff --git a/src/editor/dialogs/codeactiondialog.h b/src/editor/dialogs/actions/executecodedialog.h similarity index 63% rename from src/editor/dialogs/codeactiondialog.h rename to src/editor/dialogs/actions/executecodedialog.h index 5af7a0f..61b817c 100644 --- a/src/editor/dialogs/codeactiondialog.h +++ b/src/editor/dialogs/actions/executecodedialog.h @@ -1,16 +1,16 @@ #pragma once -#include "codeeditordialog.h" +#include "dialogs/codeeditordialog.h" class QRadioButton; struct ExecuteCodeAction; -class CodeActionDialog : public CodeEditorDialog +class ExecuteCodeDialog : public CodeEditorDialog { Q_OBJECT public: - explicit CodeActionDialog(ExecuteCodeAction &action, QWidget *parent = nullptr); + explicit ExecuteCodeDialog(ExecuteCodeAction &action, QWidget *parent = nullptr); void accept() override; diff --git a/src/editor/dialogs/actions/movefixeddialog.ui b/src/editor/dialogs/actions/movefixeddialog.ui index 34f5595..17bee17 100644 --- a/src/editor/dialogs/actions/movefixeddialog.ui +++ b/src/editor/dialogs/actions/movefixeddialog.ui @@ -149,6 +149,10 @@ + + + :/qtgameengine/icons/blue-arrow-up-left.png:/qtgameengine/icons/blue-arrow-up-left.png + true @@ -156,6 +160,10 @@ + + + :/qtgameengine/icons/blue-stop.png:/qtgameengine/icons/blue-stop.png + true @@ -185,6 +193,10 @@ + + + :/qtgameengine/icons/blue-arrow-up-right.png:/qtgameengine/icons/blue-arrow-up-right.png + true @@ -203,6 +215,10 @@ + + + :/qtgameengine/icons/blue-arrow-down-left.png:/qtgameengine/icons/blue-arrow-down-left.png + true @@ -221,6 +237,10 @@ + + + :/qtgameengine/icons/blue-arrow-down-right.png:/qtgameengine/icons/blue-arrow-down-right.png + true diff --git a/src/editor/dialogs/actions/movefreedialog.cpp b/src/editor/dialogs/actions/movefreedialog.cpp new file mode 100644 index 0000000..1e252ff --- /dev/null +++ b/src/editor/dialogs/actions/movefreedialog.cpp @@ -0,0 +1,19 @@ +#include "movefreedialog.h" +#include "ui_movefreedialog.h" + +#include + +MoveFreeDialog::MoveFreeDialog(MoveFreeAction &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"}); +} + +MoveFreeDialog::~MoveFreeDialog() = default; diff --git a/src/editor/dialogs/actions/movefreedialog.h b/src/editor/dialogs/actions/movefreedialog.h new file mode 100644 index 0000000..260b9d6 --- /dev/null +++ b/src/editor/dialogs/actions/movefreedialog.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace Ui { class MoveFreeDialog; } +class MoveFreeAction; + +class MoveFreeDialog : public QDialog +{ + Q_OBJECT + +public: + explicit MoveFreeDialog(MoveFreeAction &action, QWidget *parent = nullptr); + ~MoveFreeDialog() override; + +private: + const std::unique_ptr m_ui; + + MoveFreeAction &m_action; +}; diff --git a/src/editor/dialogs/actions/movefreedialog.ui b/src/editor/dialogs/actions/movefreedialog.ui new file mode 100644 index 0000000..a796c4c --- /dev/null +++ b/src/editor/dialogs/actions/movefreedialog.ui @@ -0,0 +1,222 @@ + + + MoveFreeDialog + + + + 0 + 0 + 435 + 429 + + + + Move Free + + + + + + + + + + + :/qtgameengine/icons/action-move-free.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 + + + + + + + + + + direction: + + + + + + + + + + speed: + + + + + + + + + + Relative + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + MoveFreeDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + MoveFreeDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/editor/dialogs/actions/movetowardsdialog.cpp b/src/editor/dialogs/actions/movetowardsdialog.cpp new file mode 100644 index 0000000..79ec4bf --- /dev/null +++ b/src/editor/dialogs/actions/movetowardsdialog.cpp @@ -0,0 +1,12 @@ +#include "movetowardsdialog.h" +#include "ui_movetowardsdialog.h" + +MoveTowardsDialog::MoveTowardsDialog(MoveTowardsAction &action, QWidget *parent) : + QDialog{parent}, + m_ui{std::make_unique()}, + m_action{action} +{ + m_ui->setupUi(this); +} + +MoveTowardsDialog::~MoveTowardsDialog() = default; diff --git a/src/editor/dialogs/actions/movetowardsdialog.h b/src/editor/dialogs/actions/movetowardsdialog.h new file mode 100644 index 0000000..c107b2e --- /dev/null +++ b/src/editor/dialogs/actions/movetowardsdialog.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace Ui { class MoveTowardsDialog; } +class MoveTowardsAction; + +class MoveTowardsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit MoveTowardsDialog(MoveTowardsAction &action, QWidget *parent = nullptr); + ~MoveTowardsDialog() override; + +private: + const std::unique_ptr m_ui; + + MoveTowardsAction &m_action; +}; diff --git a/src/editor/dialogs/actions/movetowardsdialog.ui b/src/editor/dialogs/actions/movetowardsdialog.ui new file mode 100644 index 0000000..801fb50 --- /dev/null +++ b/src/editor/dialogs/actions/movetowardsdialog.ui @@ -0,0 +1,68 @@ + + + MoveTowardsDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + accepted() + MoveTowardsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + MoveTowardsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/editor/icons/blue-arrow-down-left.png b/src/editor/icons/blue-arrow-down-left.png new file mode 100644 index 0000000..dd3d1bf Binary files /dev/null and b/src/editor/icons/blue-arrow-down-left.png differ diff --git a/src/editor/icons/blue-arrow-down-right.png b/src/editor/icons/blue-arrow-down-right.png new file mode 100644 index 0000000..fda17f9 Binary files /dev/null and b/src/editor/icons/blue-arrow-down-right.png differ diff --git a/src/editor/icons/blue-arrow-up-left.png b/src/editor/icons/blue-arrow-up-left.png new file mode 100644 index 0000000..92f8924 Binary files /dev/null and b/src/editor/icons/blue-arrow-up-left.png differ diff --git a/src/editor/icons/blue-arrow-up-right.png b/src/editor/icons/blue-arrow-up-right.png new file mode 100644 index 0000000..a688c1a Binary files /dev/null and b/src/editor/icons/blue-arrow-up-right.png differ diff --git a/src/editor/icons/blue-stop.png b/src/editor/icons/blue-stop.png new file mode 100644 index 0000000..91e66d8 Binary files /dev/null and b/src/editor/icons/blue-stop.png differ diff --git a/src/editor/models/actionscontainermodel.cpp b/src/editor/models/actionscontainermodel.cpp index 19ad23e..cd17aff 100644 --- a/src/editor/models/actionscontainermodel.cpp +++ b/src/editor/models/actionscontainermodel.cpp @@ -207,23 +207,12 @@ bool ActionsContainerModel::dropMimeData(const QMimeData *data, Qt::DropAction a iter = m_actionsContainer->insert(iter, std::move(action)); endInsertRows(); + if (!actions.isEmpty()) + emit changed(); + return true; } -QMap ActionsContainerModel::itemData(const QModelIndex &index) const -{ - auto itemData = QAbstractListModel::itemData(index); - qDebug() << index << itemData; - return itemData; -} - -bool ActionsContainerModel::setItemData(const QModelIndex &index, const QMap &roles) -{ - auto setItemData = QAbstractListModel::setItemData(index, roles); - qDebug() << index << roles << setItemData; - return setItemData; -} - bool ActionsContainerModel::removeRows(int row, int count, const QModelIndex &parent) { qDebug() << row << count << parent.isValid(); @@ -251,6 +240,9 @@ bool ActionsContainerModel::removeRows(int row, int count, const QModelIndex &pa m_actionsContainer->erase(begin, end); endRemoveRows(); + if (count) + emit changed(); + return true; } @@ -272,6 +264,7 @@ bool ActionsContainerModel::moveRows(const QModelIndex &sourceParent, int source m_actionsContainer->splice(std::next(std::begin(*m_actionsContainer), destinationChild), *m_actionsContainer, std::next(std::begin(*m_actionsContainer), sourceRow)); endMoveRows(); + emit changed(); return true; } @@ -338,3 +331,31 @@ const Action *ActionsContainerModel::getAction(int row) const return &*std::next(std::cbegin(*m_actionsContainer), row); } + +void ActionsContainerModel::appendAction(Action &&action) +{ + if (!m_actionsContainer) + { + qWarning() << "invalid actions container"; + return; + } + + beginInsertRows({}, m_actionsContainer->size(), m_actionsContainer->size()); + m_actionsContainer->push_back(std::move(action)); + endInsertRows(); + emit changed(); +} + +void ActionsContainerModel::appendAction(const Action &action) +{ + if (!m_actionsContainer) + { + qWarning() << "invalid actions container"; + return; + } + + beginInsertRows({}, m_actionsContainer->size(), m_actionsContainer->size()); + m_actionsContainer->push_back(action); + endInsertRows(); + emit changed(); +} diff --git a/src/editor/models/actionscontainermodel.h b/src/editor/models/actionscontainermodel.h index df23735..c6748d1 100644 --- a/src/editor/models/actionscontainermodel.h +++ b/src/editor/models/actionscontainermodel.h @@ -25,9 +25,6 @@ public: bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; - QMap itemData(const QModelIndex &index) const override; - bool setItemData(const QModelIndex &index, const QMap &roles) override; - bool removeRows(int row, int count, const QModelIndex &parent) override; bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; @@ -39,6 +36,12 @@ public: Action *getAction(int row); const Action *getAction(int row) const; + void appendAction(Action &&action); + void appendAction(const Action &action); + +signals: + void changed(); + private: ActionsContainer *m_actionsContainer{}; }; diff --git a/src/editor/resources_editor.qrc b/src/editor/resources_editor.qrc index ff651c3..3b2672c 100644 --- a/src/editor/resources_editor.qrc +++ b/src/editor/resources_editor.qrc @@ -95,8 +95,13 @@ icons/undo.png icons/unlock.png icons/blue-arrow-down.png + icons/blue-arrow-down-left.png + icons/blue-arrow-down-right.png icons/blue-arrow-left.png icons/blue-arrow-right.png icons/blue-arrow-up.png + icons/blue-arrow-up-left.png + icons/blue-arrow-up-right.png + icons/blue-stop.png diff --git a/src/editor/widgets/actionscontainerwidget.cpp b/src/editor/widgets/actionscontainerwidget.cpp index 660e0f4..309fec1 100644 --- a/src/editor/widgets/actionscontainerwidget.cpp +++ b/src/editor/widgets/actionscontainerwidget.cpp @@ -7,8 +7,19 @@ #include #include "models/actionscontainermodel.h" -#include "dialogs/codeactiondialog.h" #include "dialogs/actions/movefixeddialog.h" +#include "dialogs/actions/movefreedialog.h" +#include "dialogs/actions/movetowardsdialog.h" +#include "dialogs/actions/executecodedialog.h" + +namespace { +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 = ExecuteCodeDialog; }; +template using ActionDialogFor = ActionDialogForImpl::Dialog; +} ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : QWidget{parent}, @@ -19,6 +30,9 @@ ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : m_ui->listViewActions->setModel(m_actionsModel.get()); + connect(m_actionsModel.get(), &ActionsContainerModel::changed, + this, &ActionsContainerWidget::changed); + connect(m_ui->listViewActions, &QListView::customContextMenuRequested, this, &ActionsContainerWidget::actionsContextMenuRequested); @@ -31,15 +45,13 @@ ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : }); connect(m_ui->toolButtonMoveFixed, &QAbstractButton::clicked, - this, [this](){ - MoveFixedAction action; - MoveFixedDialog dialog{action, this}; - if (dialog.exec() == QDialog::Accepted) - { - // TODO insert into model - emit changed(); - } - }); + this, &ActionsContainerWidget::createNewAction); + connect(m_ui->toolButtonMoveFree, &QAbstractButton::clicked, + this, &ActionsContainerWidget::createNewAction); + connect(m_ui->toolButtonMoveTowards, &QAbstractButton::clicked, + this, &ActionsContainerWidget::createNewAction); + connect(m_ui->toolButtonExecuteCode, &QAbstractButton::clicked, + this, &ActionsContainerWidget::createNewAction); m_ui->toolButtonMoveFixed->setAction(MoveFixedAction{}); m_ui->toolButtonMoveFree->setAction(MoveFreeAction{}); @@ -74,9 +86,21 @@ void ActionsContainerWidget::actionDoubleClicked(const QModelIndex &index) if (dialog.exec() == QDialog::Accepted) emit changed(); } + else if (auto ptr = std::get_if(action)) + { + MoveFreeDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } + else if (auto ptr = std::get_if(action)) + { + MoveTowardsDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } else if (auto ptr = std::get_if(action)) { - CodeActionDialog dialog{*ptr, this}; + ExecuteCodeDialog dialog{*ptr, this}; if (dialog.exec() == QDialog::Accepted) emit changed(); } @@ -142,3 +166,15 @@ void ActionsContainerWidget::actionsContextMenuRequested(const QPoint &pos) } menu.exec(m_ui->listViewActions->viewport()->mapToGlobal(pos)); } + +template +void ActionsContainerWidget::createNewAction() +{ + if (!m_actionsModel->actionsContainer()) + return; + + T action; + ActionDialogFor dialog{action, this}; + if (dialog.exec() == QDialog::Accepted) + m_actionsModel->appendAction(std::move(action)); +} diff --git a/src/editor/widgets/actionscontainerwidget.h b/src/editor/widgets/actionscontainerwidget.h index 1fcb962..a22f86b 100644 --- a/src/editor/widgets/actionscontainerwidget.h +++ b/src/editor/widgets/actionscontainerwidget.h @@ -28,6 +28,9 @@ private slots: void actionsContextMenuRequested(const QPoint &pos); private: + template + void createNewAction(); + const std::unique_ptr m_ui; const std::unique_ptr m_actionsModel;