From 6136280507a676323133cab40d037dc578db02c0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jan 2024 22:27:02 +0100 Subject: [PATCH] Move Action change dialogs --- QtGameMaker.pro | 10 +- .../executecodedialog.cpp} | 12 +- .../executecodedialog.h} | 6 +- src/editor/dialogs/actions/movefixeddialog.ui | 20 ++ src/editor/dialogs/actions/movefreedialog.cpp | 19 ++ src/editor/dialogs/actions/movefreedialog.h | 22 ++ src/editor/dialogs/actions/movefreedialog.ui | 222 ++++++++++++++++++ .../dialogs/actions/movetowardsdialog.cpp | 12 + .../dialogs/actions/movetowardsdialog.h | 22 ++ .../dialogs/actions/movetowardsdialog.ui | 68 ++++++ src/editor/icons/blue-arrow-down-left.png | Bin 0 -> 7849 bytes src/editor/icons/blue-arrow-down-right.png | Bin 0 -> 8042 bytes src/editor/icons/blue-arrow-up-left.png | Bin 0 -> 8171 bytes src/editor/icons/blue-arrow-up-right.png | Bin 0 -> 8075 bytes src/editor/icons/blue-stop.png | Bin 0 -> 5757 bytes src/editor/models/actionscontainermodel.cpp | 49 ++-- src/editor/models/actionscontainermodel.h | 9 +- src/editor/resources_editor.qrc | 5 + src/editor/widgets/actionscontainerwidget.cpp | 58 ++++- src/editor/widgets/actionscontainerwidget.h | 3 + 20 files changed, 498 insertions(+), 39 deletions(-) rename src/editor/dialogs/{codeactiondialog.cpp => actions/executecodedialog.cpp} (85%) rename src/editor/dialogs/{codeactiondialog.h => actions/executecodedialog.h} (63%) create mode 100644 src/editor/dialogs/actions/movefreedialog.cpp create mode 100644 src/editor/dialogs/actions/movefreedialog.h create mode 100644 src/editor/dialogs/actions/movefreedialog.ui create mode 100644 src/editor/dialogs/actions/movetowardsdialog.cpp create mode 100644 src/editor/dialogs/actions/movetowardsdialog.h create mode 100644 src/editor/dialogs/actions/movetowardsdialog.ui create mode 100644 src/editor/icons/blue-arrow-down-left.png create mode 100644 src/editor/icons/blue-arrow-down-right.png create mode 100644 src/editor/icons/blue-arrow-up-left.png create mode 100644 src/editor/icons/blue-arrow-up-right.png create mode 100644 src/editor/icons/blue-stop.png 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 0000000000000000000000000000000000000000..dd3d1bf17521dcc0b3cd532dafff133a16aaca94 GIT binary patch literal 7849 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 L{an^LB{Ts5BO^ui literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fda17f9352dcccf24b849c88eb88191662ba684d GIT binary patch literal 8042 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 BrxySK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..92f892450dcbcaf4ae1b9b2843c41669cb80ec07 GIT binary patch literal 8171 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a688c1a84cadf89ad7781b42a247df1b9aca1bbe GIT binary patch literal 8075 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 literal 0 HcmV?d00001 diff --git a/src/editor/icons/blue-stop.png b/src/editor/icons/blue-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..91e66d812be057f041ce3caa2c9cbda6577e819b GIT binary patch literal 5757 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, 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;