diff --git a/QtGameMaker.pro b/QtGameMaker.pro
index 7c1db4a..8123270 100644
--- a/QtGameMaker.pro
+++ b/QtGameMaker.pro
@@ -22,6 +22,8 @@ INCLUDEPATH += \
HEADERS += \
src/closeeventfilter.h \
+ src/editor/dialogs/genericcodeeditordialog.h \
+ src/editor/widgets/roomeditwidget.h \
src/futurecpp.h \
src/projectcontainer.h \
src/editor/jshighlighter.h \
@@ -50,7 +52,6 @@ HEADERS += \
src/editor/dialogs/soundpropertiesdialog.h \
src/editor/dialogs/spritepropertiesdialog.h \
src/editor/dialogs/timelinepropertiesdialog.h \
- src/editor/dialogs/triggerconditiondialog.h \
src/editor/dialogs/triggersdialog.h \
src/editor/dialogs/userdefinedconstantsdialog.h \
src/editor/models/actionscontainermodel.h \
@@ -70,6 +71,8 @@ HEADERS += \
SOURCES += \
src/closeeventfilter.cpp \
+ src/editor/dialogs/genericcodeeditordialog.cpp \
+ src/editor/widgets/roomeditwidget.cpp \
src/main.cpp \
src/projectcontainer.cpp \
src/editor/jshighlighter.cpp \
@@ -98,7 +101,6 @@ SOURCES += \
src/editor/dialogs/soundpropertiesdialog.cpp \
src/editor/dialogs/spritepropertiesdialog.cpp \
src/editor/dialogs/timelinepropertiesdialog.cpp \
- src/editor/dialogs/triggerconditiondialog.cpp \
src/editor/dialogs/triggersdialog.cpp \
src/editor/dialogs/userdefinedconstantsdialog.cpp \
src/editor/models/actionscontainermodel.cpp \
diff --git a/icons/isometric.png b/icons/isometric.png
new file mode 100644
index 0000000..7b6ec02
Binary files /dev/null and b/icons/isometric.png differ
diff --git a/icons/lock.png b/icons/lock.png
new file mode 100644
index 0000000..8e44e8b
Binary files /dev/null and b/icons/lock.png differ
diff --git a/icons/sort-x.png b/icons/sort-x.png
new file mode 100644
index 0000000..0fa57ef
Binary files /dev/null and b/icons/sort-x.png differ
diff --git a/icons/sort-y.png b/icons/sort-y.png
new file mode 100644
index 0000000..451cde3
Binary files /dev/null and b/icons/sort-y.png differ
diff --git a/icons/unlock.png b/icons/unlock.png
new file mode 100644
index 0000000..de6d1d2
Binary files /dev/null and b/icons/unlock.png differ
diff --git a/resources.qrc b/resources.qrc
index 7f166bc..8a7be93 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -82,5 +82,10 @@
icons/action.png
icons/code-action.png
icons/event-draw.png
+ icons/lock.png
+ icons/unlock.png
+ icons/sort-x.png
+ icons/sort-y.png
+ icons/isometric.png
diff --git a/src/editor/dialogs/addeventdialog.ui b/src/editor/dialogs/addeventdialog.ui
index acaca55..f42ec56 100644
--- a/src/editor/dialogs/addeventdialog.ui
+++ b/src/editor/dialogs/addeventdialog.ui
@@ -22,7 +22,7 @@
Dra&w
-
+
:/qtgameengine/icons/event-draw.png:/qtgameengine/icons/event-draw.png
@@ -54,7 +54,7 @@
&Step
-
+
:/qtgameengine/icons/event-step.png:/qtgameengine/icons/event-step.png
@@ -65,7 +65,7 @@
C&reate
-
+
:/qtgameengine/icons/event-create.png:/qtgameengine/icons/event-create.png
@@ -90,7 +90,7 @@
&Destroy
-
+
:/qtgameengine/icons/event-destroy.png:/qtgameengine/icons/event-destroy.png
@@ -131,7 +131,7 @@
-
+
diff --git a/src/editor/dialogs/backgroundpropertiesdialog.ui b/src/editor/dialogs/backgroundpropertiesdialog.ui
index 74f7a03..0c855fe 100644
--- a/src/editor/dialogs/backgroundpropertiesdialog.ui
+++ b/src/editor/dialogs/backgroundpropertiesdialog.ui
@@ -14,7 +14,7 @@
Dialog
-
+
:/qtgameengine/icons/background-file.png:/qtgameengine/icons/background-file.png
@@ -69,7 +69,7 @@
&Load Background
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -83,7 +83,7 @@
&Save Background
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -97,7 +97,7 @@
&Edit Background
-
+
:/qtgameengine/icons/edit.png:/qtgameengine/icons/edit.png
@@ -178,7 +178,7 @@
-
+
diff --git a/src/editor/dialogs/codeeditordialog.ui b/src/editor/dialogs/codeeditordialog.ui
index 71f1c3c..fb771a8 100644
--- a/src/editor/dialogs/codeeditordialog.ui
+++ b/src/editor/dialogs/codeeditordialog.ui
@@ -14,7 +14,7 @@
Code Editor
-
+
:/qtgameengine/icons/script-file.png:/qtgameengine/icons/script-file.png
@@ -225,7 +225,7 @@
-
+
:/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
@@ -237,7 +237,7 @@
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -249,7 +249,7 @@
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -261,7 +261,7 @@
-
+
:/qtgameengine/icons/print.png:/qtgameengine/icons/print.png
@@ -276,7 +276,7 @@
false
-
+
:/qtgameengine/icons/undo.png:/qtgameengine/icons/undo.png
@@ -291,7 +291,7 @@
false
-
+
:/qtgameengine/icons/redo.png:/qtgameengine/icons/redo.png
@@ -306,7 +306,7 @@
false
-
+
:/qtgameengine/icons/cut.png:/qtgameengine/icons/cut.png
@@ -321,7 +321,7 @@
false
-
+
:/qtgameengine/icons/copy.png:/qtgameengine/icons/copy.png
@@ -333,7 +333,7 @@
-
+
:/qtgameengine/icons/paste.png:/qtgameengine/icons/paste.png
@@ -351,7 +351,7 @@
false
-
+
:/qtgameengine/icons/find.png:/qtgameengine/icons/find.png
@@ -369,7 +369,7 @@
true
-
+
:/qtgameengine/icons/check.png:/qtgameengine/icons/check.png
@@ -388,7 +388,7 @@
-
+
diff --git a/src/editor/dialogs/createspritedialog.ui b/src/editor/dialogs/createspritedialog.ui
index aff8b14..1e84c41 100644
--- a/src/editor/dialogs/createspritedialog.ui
+++ b/src/editor/dialogs/createspritedialog.ui
@@ -57,7 +57,7 @@
0
- 16384
+ 2147483647
32
@@ -67,7 +67,7 @@
-
- 16384
+ 2147483647
32
diff --git a/src/editor/dialogs/editspritedialog.ui b/src/editor/dialogs/editspritedialog.ui
index 4c5f468..78ef083 100644
--- a/src/editor/dialogs/editspritedialog.ui
+++ b/src/editor/dialogs/editspritedialog.ui
@@ -168,7 +168,7 @@
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -177,7 +177,7 @@
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -186,7 +186,7 @@
-
+
:/qtgameengine/icons/create-group.png:/qtgameengine/icons/create-group.png
@@ -198,7 +198,7 @@
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -223,7 +223,7 @@
-
+
:/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
@@ -232,7 +232,7 @@
-
+
diff --git a/src/editor/dialogs/fontpropertiesdialog.ui b/src/editor/dialogs/fontpropertiesdialog.ui
index e6be99c..69ba919 100644
--- a/src/editor/dialogs/fontpropertiesdialog.ui
+++ b/src/editor/dialogs/fontpropertiesdialog.ui
@@ -14,7 +14,7 @@
Font Properties
-
+
:/qtgameengine/icons/font-file.png:/qtgameengine/icons/font-file.png
@@ -220,7 +220,7 @@
-
+
diff --git a/src/editor/dialogs/triggerconditiondialog.cpp b/src/editor/dialogs/genericcodeeditordialog.cpp
similarity index 59%
rename from src/editor/dialogs/triggerconditiondialog.cpp
rename to src/editor/dialogs/genericcodeeditordialog.cpp
index bff7cac..1b6b03c 100644
--- a/src/editor/dialogs/triggerconditiondialog.cpp
+++ b/src/editor/dialogs/genericcodeeditordialog.cpp
@@ -1,7 +1,7 @@
-#include "triggerconditiondialog.h"
+#include "genericcodeeditordialog.h"
-TriggerConditionDialog::TriggerConditionDialog(QWidget *parent) :
- CodeEditorDialog{tr("Trigger condition"), parent}
+GenericCodeEditorDialog::GenericCodeEditorDialog(const QString &title, QWidget *parent) :
+ CodeEditorDialog{title, parent}
{
#ifdef Q_OS_LINUX
setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window);
diff --git a/src/editor/dialogs/genericcodeeditordialog.h b/src/editor/dialogs/genericcodeeditordialog.h
new file mode 100644
index 0000000..42759a2
--- /dev/null
+++ b/src/editor/dialogs/genericcodeeditordialog.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "codeeditordialog.h"
+
+class GenericCodeEditorDialog : public CodeEditorDialog
+{
+ Q_OBJECT
+
+public:
+ explicit GenericCodeEditorDialog(const QString &title, QWidget *parent = nullptr);
+};
diff --git a/src/editor/dialogs/imageeditordialog.ui b/src/editor/dialogs/imageeditordialog.ui
index d2df2ce..513f8ce 100644
--- a/src/editor/dialogs/imageeditordialog.ui
+++ b/src/editor/dialogs/imageeditordialog.ui
@@ -176,7 +176,7 @@
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -188,7 +188,7 @@
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -200,7 +200,7 @@
-
+
:/qtgameengine/icons/arrow-left.png:/qtgameengine/icons/arrow-left.png
@@ -212,7 +212,7 @@
-
+
:/qtgameengine/icons/arrow-right.png:/qtgameengine/icons/arrow-right.png
@@ -224,7 +224,7 @@
-
+
:/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
@@ -236,7 +236,7 @@
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -245,7 +245,7 @@
-
+
:/qtgameengine/icons/undo.png:/qtgameengine/icons/undo.png
@@ -254,7 +254,7 @@
-
+
:/qtgameengine/icons/redo.png:/qtgameengine/icons/redo.png
@@ -305,7 +305,7 @@
-
+
diff --git a/src/editor/dialogs/includedfilesdialog.ui b/src/editor/dialogs/includedfilesdialog.ui
index f36e070..72e0368 100644
--- a/src/editor/dialogs/includedfilesdialog.ui
+++ b/src/editor/dialogs/includedfilesdialog.ui
@@ -42,7 +42,7 @@
&Add
-
+
:/qtgameengine/icons/add.png:/qtgameengine/icons/add.png
@@ -56,7 +56,7 @@
&Change
-
+
:/qtgameengine/icons/replace.png:/qtgameengine/icons/replace.png
@@ -70,7 +70,7 @@
&Delete
-
+
:/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png
@@ -84,7 +84,7 @@
&Clear
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -107,7 +107,7 @@
-
+
diff --git a/src/editor/dialogs/objectinformationdialog.ui b/src/editor/dialogs/objectinformationdialog.ui
index 8a10df6..205fdf1 100644
--- a/src/editor/dialogs/objectinformationdialog.ui
+++ b/src/editor/dialogs/objectinformationdialog.ui
@@ -14,7 +14,7 @@
Information about all Objects
-
+
:/qtgameengine/icons/object-file.png:/qtgameengine/icons/object-file.png
@@ -58,7 +58,7 @@
-
+
:/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
@@ -70,7 +70,7 @@
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -82,7 +82,7 @@
-
+
:/qtgameengine/icons/print.png:/qtgameengine/icons/print.png
@@ -94,7 +94,7 @@
-
+
diff --git a/src/editor/dialogs/objectpropertiesdialog.cpp b/src/editor/dialogs/objectpropertiesdialog.cpp
index e7083b8..947f736 100644
--- a/src/editor/dialogs/objectpropertiesdialog.cpp
+++ b/src/editor/dialogs/objectpropertiesdialog.cpp
@@ -18,7 +18,7 @@ ObjectPropertiesDialog::ObjectPropertiesDialog(Object &object, ProjectTreeModel
m_projectModel{projectModel},
m_events{m_object.events},
m_eventsModel{std::make_unique(m_events)},
- m_spritesMenu{new QMenu{m_ui->toolButtonSprite}},
+ m_menuSprites{new QMenu{this}},
m_spriteName{object.spriteName}
{
m_ui->setupUi(this);
@@ -33,7 +33,8 @@ ObjectPropertiesDialog::ObjectPropertiesDialog(Object &object, ProjectTreeModel
m_ui->lineEditName->setText(m_object.name);
m_ui->lineEditSprite->setText(m_spriteName.isEmpty() ? tr("") : m_spriteName);
updateSpritePreview();
- m_ui->toolButtonSprite->setMenu(m_spritesMenu);
+ m_menuSprites->setParent(m_ui->toolButtonSprite);
+ m_ui->toolButtonSprite->setMenu(m_menuSprites);
m_ui->checkBoxVisible->setChecked(m_object.visible);
m_ui->checkBoxSolid->setChecked(m_object.solid);
m_ui->spinBoxDepth->setValue(m_object.depth);
@@ -83,7 +84,7 @@ ObjectPropertiesDialog::ObjectPropertiesDialog(Object &object, ProjectTreeModel
connect(m_ui->checkBoxPersistent, &QCheckBox::toggled,
this, &ObjectPropertiesDialog::changed);
- connect(m_spritesMenu, &QMenu::aboutToShow,
+ connect(m_menuSprites, &QMenu::aboutToShow,
this, &ObjectPropertiesDialog::spritesMenuAboutToShow);
connect(m_ui->listViewEvents->selectionModel(), &QItemSelectionModel::currentChanged,
@@ -289,10 +290,10 @@ void ObjectPropertiesDialog::spritePixmapsChanged(const Sprite &sprite)
void ObjectPropertiesDialog::spritesMenuAboutToShow()
{
- m_spritesMenu->clear();
- m_spritesMenu->addAction(tr(""), this, &ObjectPropertiesDialog::clearSprite);
+ m_menuSprites->clear();
+ m_menuSprites->addAction(tr(""), this, &ObjectPropertiesDialog::clearSprite);
for (const auto &sprite : m_projectModel.project()->sprites)
- m_spritesMenu->addAction(sprite.pixmaps.empty() ? QPixmap{} : sprite.pixmaps.front(),
+ m_menuSprites->addAction(sprite.pixmaps.empty() ? QPixmap{} : sprite.pixmaps.front(),
sprite.name,
this,
[&sprite,this](){ setSprite(sprite); });
diff --git a/src/editor/dialogs/objectpropertiesdialog.h b/src/editor/dialogs/objectpropertiesdialog.h
index 39ee415..bdf4c46 100644
--- a/src/editor/dialogs/objectpropertiesdialog.h
+++ b/src/editor/dialogs/objectpropertiesdialog.h
@@ -60,7 +60,7 @@ private:
const std::unique_ptr m_eventsModel;
- QMenu * const m_spritesMenu;
+ QMenu * const m_menuSprites;
QString m_spriteName;
diff --git a/src/editor/dialogs/objectpropertiesdialog.ui b/src/editor/dialogs/objectpropertiesdialog.ui
index 493a475..4e391f1 100644
--- a/src/editor/dialogs/objectpropertiesdialog.ui
+++ b/src/editor/dialogs/objectpropertiesdialog.ui
@@ -14,7 +14,7 @@
Object Properties
-
+
:/qtgameengine/icons/object-file.png:/qtgameengine/icons/object-file.png
@@ -305,7 +305,7 @@
Show Information
-
+
:/qtgameengine/icons/info.png:/qtgameengine/icons/info.png
@@ -416,7 +416,7 @@
-
+
diff --git a/src/editor/dialogs/pathpropertiesdialog.cpp b/src/editor/dialogs/pathpropertiesdialog.cpp
index 2718b7f..62041f0 100644
--- a/src/editor/dialogs/pathpropertiesdialog.cpp
+++ b/src/editor/dialogs/pathpropertiesdialog.cpp
@@ -3,6 +3,8 @@
#include
#include
+#include
+#include
#include
#include
#include
@@ -16,39 +18,60 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project
m_ui{std::make_unique()},
m_path{path},
m_projectModel{projectModel},
- m_points{path.points},
+ m_points{m_path.points},
m_pointsModel{std::make_unique(m_points, this)},
m_spinBoxSnapX{new QSpinBox{this}},
m_spinBoxSnapY{new QSpinBox{this}},
+ m_menuRooms{new QMenu{this}},
m_labelX{new QLabel{tr("x: %0").arg(0)}},
m_labelY{new QLabel{tr("y: %0").arg(0)}},
m_labelArea{new QLabel{tr("Area: (%0,%1)->(%2,%3)").arg(0).arg(0).arg(0).arg(0)}}
{
m_ui->setupUi(this);
- m_ui->widget->setPoints(&m_points);
+ m_ui->pathPointsWidget->setPoints(&m_points);
+ m_ui->pathPointsWidget->setSnapX(m_path.snapX);
+ m_ui->pathPointsWidget->setSnapY(m_path.snapY);
+ m_ui->pathPointsWidget->setGridEnabled(m_path.gridEnabled);
updateTitle();
{
- auto label = new QLabel{tr("Snap X:"), this};
- label->setBuddy(m_spinBoxSnapX);
- m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(18), label);
+ int index{18};
+
+ {
+ auto label = new QLabel{tr("Snap &X:"), this};
+ label->setBuddy(m_spinBoxSnapX);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), label);
+ }
+ m_spinBoxSnapX->setValue(m_ui->pathPointsWidget->snapX());
+ m_spinBoxSnapX->setMaximumWidth(50);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), m_spinBoxSnapX);
+
+ {
+ auto label = new QLabel{tr("Snap &Y:"), this};
+ label->setBuddy(m_spinBoxSnapY);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), label);
+ }
+ m_spinBoxSnapY->setValue(m_ui->pathPointsWidget->snapY());
+ m_spinBoxSnapY->setMaximumWidth(50);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), m_spinBoxSnapY);
}
- m_spinBoxSnapX->setValue(m_ui->widget->gridX());
- m_spinBoxSnapX->setMaximumWidth(50);
- m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(19), m_spinBoxSnapX);
+
+ m_ui->actionGridEnabled->setChecked(m_ui->pathPointsWidget->gridEnabled());
{
- auto label = new QLabel{tr("Snap Y:"), this};
- label->setBuddy(m_spinBoxSnapY);
- m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(20), label);
+ auto toolButton = new QToolButton{this};
+ toolButton->setText(tr("Show"));
+ toolButton->setWhatsThis(tr("Indicate the room to show as background"));
+ toolButton->setIcon(QIcon{":/qtgameengine/icons/room.png"});
+ toolButton->setPopupMode(QToolButton::InstantPopup);
+ toolButton->setMenu(m_menuRooms);
+ m_ui->toolBar->addWidget(toolButton);
}
- m_spinBoxSnapY->setValue(m_ui->widget->gridY());
- m_spinBoxSnapY->setMaximumWidth(50);
- m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(21), m_spinBoxSnapY);
- m_ui->actionGrid->setChecked(m_ui->widget->showGrid());
+ connect(m_menuRooms, &QMenu::aboutToShow,
+ this, &PathPropertiesDialog::roomsMenuAboutToShow);
m_ui->treeView->setModel(m_pointsModel.get());
@@ -57,7 +80,7 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project
m_ui->checkBoxClosed->setChecked(m_path.closed);
m_ui->spinBoxPrecision->setValue(m_path.precision);
- m_ui->widget->setClosed(m_path.closed);
+ m_ui->pathPointsWidget->setClosed(m_path.closed);
m_labelX->setFrameStyle(QFrame::Sunken);
m_ui->statusbar->addWidget(m_labelX, 1);
@@ -76,9 +99,9 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project
m_ui->treeView->setColumnWidth(1, 75);
- connect(m_ui->widget, &PathPointsWidget::pointInserted,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::pointInserted,
m_pointsModel.get(), &PathPointsModel::pointInserted);
- connect(m_ui->widget, &PathPointsWidget::pointMoved,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::pointMoved,
m_pointsModel.get(), &PathPointsModel::pointMoved);
connect(&m_projectModel, &ProjectTreeModel::pathNameChanged,
@@ -87,27 +110,61 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project
connect(m_ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &PathPropertiesDialog::selectionChanged);
- connect(m_ui->widget, &PathPointsWidget::gridXChanged,
+ connect(m_ui->actionUndo, &QAction::triggered,
+ this, &PathPropertiesDialog::undo);
+ connect(m_ui->actionClear, &QAction::triggered,
+ this, &PathPropertiesDialog::clearPath);
+ connect(m_ui->actionReverse, &QAction::triggered,
+ this, &PathPropertiesDialog::reversePath);
+ connect(m_ui->actionShift, &QAction::triggered,
+ this, &PathPropertiesDialog::shiftPath);
+ connect(m_ui->actionMirrorHorizontally, &QAction::triggered,
+ this, &PathPropertiesDialog::mirrorPathHorizontally);
+ connect(m_ui->actionMirrorVertically, &QAction::triggered,
+ this, &PathPropertiesDialog::mirrorPathVertically);
+ connect(m_ui->actionRotate, &QAction::triggered,
+ this, &PathPropertiesDialog::rotatePath);
+ connect(m_ui->actionScale, &QAction::triggered,
+ this, &PathPropertiesDialog::scalePath);
+ connect(m_ui->actionShiftLeft, &QAction::triggered,
+ this, &PathPropertiesDialog::shiftViewLeft);
+ connect(m_ui->actionShiftRight, &QAction::triggered,
+ this, &PathPropertiesDialog::shiftViewRight);
+ connect(m_ui->actionShiftUp, &QAction::triggered,
+ this, &PathPropertiesDialog::shiftViewUp);
+ connect(m_ui->actionShiftDown, &QAction::triggered,
+ this, &PathPropertiesDialog::shiftViewDown);
+ connect(m_ui->actionCenterView, &QAction::triggered,
+ this, &PathPropertiesDialog::centerView);
+
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::snapXChanged,
m_spinBoxSnapX, &QSpinBox::setValue);
- connect(m_ui->widget, &PathPointsWidget::gridYChanged,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::snapYChanged,
m_spinBoxSnapY, &QSpinBox::setValue);
- connect(m_ui->widget, &PathPointsWidget::showGridChanged,
- m_ui->actionGrid, &QAction::setChecked);
- connect(m_ui->widget, &PathPointsWidget::closedChanged,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::gridEnabledChanged,
+ m_ui->actionGridEnabled, &QAction::setChecked);
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::closedChanged,
m_ui->checkBoxClosed, &QCheckBox::setChecked);
- connect(m_ui->widget, &PathPointsWidget::cursorMoved,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::cursorMoved,
this, &PathPropertiesDialog::cursorMoved);
- connect(m_ui->widget, &PathPointsWidget::selectedIndexChanged,
+ connect(m_ui->pathPointsWidget, &PathPointsWidget::selectedIndexChanged,
this, &PathPropertiesDialog::selectedPointChanged);
connect(m_spinBoxSnapX, &QSpinBox::valueChanged,
- m_ui->widget, &PathPointsWidget::setGridX);
+ m_ui->pathPointsWidget, &PathPointsWidget::setSnapX);
connect(m_spinBoxSnapY, &QSpinBox::valueChanged,
- m_ui->widget, &PathPointsWidget::setGridY);
- connect(m_ui->actionGrid, &QAction::toggled,
- m_ui->widget, &PathPointsWidget::setShowGrid);
+ m_ui->pathPointsWidget, &PathPointsWidget::setSnapY);
+ connect(m_ui->actionGridEnabled, &QAction::toggled,
+ m_ui->pathPointsWidget, &PathPointsWidget::setGridEnabled);
connect(m_ui->checkBoxClosed, &QCheckBox::toggled,
- m_ui->widget, &PathPointsWidget::setClosed);
+ m_ui->pathPointsWidget, &PathPointsWidget::setClosed);
+
+ connect(m_spinBoxSnapX, &QSpinBox::valueChanged,
+ this, &PathPropertiesDialog::changed);
+ connect(m_spinBoxSnapY, &QSpinBox::valueChanged,
+ this, &PathPropertiesDialog::changed);
+ connect(m_ui->actionGridEnabled, &QAction::toggled,
+ this, &PathPropertiesDialog::changed);
connect(m_ui->spinBoxX, &QSpinBox::valueChanged,
this, &PathPropertiesDialog::pointFieldsChanged);
@@ -129,17 +186,17 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project
connect(m_pointsModel.get(), &QAbstractTableModel::rowsInserted,
this, &PathPropertiesDialog::changed);
connect(m_pointsModel.get(), &QAbstractTableModel::rowsInserted,
- m_ui->widget, qOverload<>(&PathPointsWidget::update));
+ m_ui->pathPointsWidget, qOverload<>(&PathPointsWidget::update));
connect(m_pointsModel.get(), &QAbstractTableModel::rowsRemoved,
this, &PathPropertiesDialog::changed);
connect(m_pointsModel.get(), &QAbstractTableModel::rowsRemoved,
- m_ui->widget, qOverload<>(&PathPointsWidget::update));
+ m_ui->pathPointsWidget, qOverload<>(&PathPointsWidget::update));
connect(m_pointsModel.get(), &QAbstractTableModel::dataChanged,
this, &PathPropertiesDialog::dataChanged);
connect(m_pointsModel.get(), &QAbstractTableModel::dataChanged,
this, &PathPropertiesDialog::changed);
connect(m_pointsModel.get(), &QAbstractTableModel::dataChanged,
- m_ui->widget, qOverload<>(&PathPointsWidget::update));
+ m_ui->pathPointsWidget, qOverload<>(&PathPointsWidget::update));
connect(m_ui->radioButtonStraight, &QRadioButton::toggled,
this, &PathPropertiesDialog::changed);
connect(m_ui->radioButtonSmooth, &QRadioButton::toggled,
@@ -183,8 +240,9 @@ void PathPropertiesDialog::accept()
m_path.closed = m_ui->checkBoxClosed->isChecked();
m_path.precision = m_ui->spinBoxPrecision->value();
-
- // TODO update points
+ m_path.snapX = m_spinBoxSnapX->value();
+ m_path.snapY = m_spinBoxSnapY->value();
+ m_path.gridEnabled = m_ui->actionGridEnabled->isChecked();
QDialog::accept();
}
@@ -223,11 +281,11 @@ void PathPropertiesDialog::selectionChanged(const QModelIndex &index)
{
if (!index.isValid())
{
- m_ui->widget->setSelectedIndex(std::nullopt);
+ m_ui->pathPointsWidget->setSelectedIndex(std::nullopt);
return;
}
- m_ui->widget->setSelectedIndex(index.row());
+ m_ui->pathPointsWidget->setSelectedIndex(index.row());
updatePointFields();
}
@@ -284,6 +342,71 @@ void PathPropertiesDialog::deletePoint()
}
}
+void PathPropertiesDialog::undo()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::clearPath()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::reversePath()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::shiftPath()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::mirrorPathHorizontally()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::mirrorPathVertically()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::rotatePath()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::scalePath()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::shiftViewLeft()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::shiftViewRight()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::shiftViewUp()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::shiftViewDown()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void PathPropertiesDialog::centerView()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
void PathPropertiesDialog::pointFieldsChanged()
{
const auto index = m_ui->treeView->currentIndex();
@@ -321,6 +444,18 @@ void PathPropertiesDialog::pathNameChanged(const Path &path)
updateTitle();
}
+void PathPropertiesDialog::roomsMenuAboutToShow()
+{
+ m_menuRooms->clear();
+ qDebug() << "called" << tr("No Room");
+ m_menuRooms->addAction(tr("No Room"));
+ for (const auto &room : m_projectModel.project()->rooms)
+ {
+ qDebug() << "called" << room.name;
+ m_menuRooms->addAction(room.name);
+ }
+}
+
void PathPropertiesDialog::updateTitle()
{
setWindowTitle(tr("Path Properties: %0%1")
diff --git a/src/editor/dialogs/pathpropertiesdialog.h b/src/editor/dialogs/pathpropertiesdialog.h
index 21c2299..f0a615a 100644
--- a/src/editor/dialogs/pathpropertiesdialog.h
+++ b/src/editor/dialogs/pathpropertiesdialog.h
@@ -9,6 +9,7 @@
class QSpinBox;
class QLabel;
+class QMenu;
namespace Ui { class PathPropertiesDialog; }
class ProjectTreeModel;
class PathPointsModel;
@@ -34,11 +35,27 @@ private slots:
void insertPoint();
void deletePoint();
+ void undo();
+ void clearPath();
+ void reversePath();
+ void shiftPath();
+ void mirrorPathHorizontally();
+ void mirrorPathVertically();
+ void rotatePath();
+ void scalePath();
+ void shiftViewLeft();
+ void shiftViewRight();
+ void shiftViewUp();
+ void shiftViewDown();
+ void centerView();
+
void pointFieldsChanged();
void changed();
void pathNameChanged(const Path &path);
+ void roomsMenuAboutToShow();
+
private:
void updateTitle();
void updatePointFields();
@@ -59,6 +76,8 @@ private:
QSpinBox * const m_spinBoxSnapX;
QSpinBox * const m_spinBoxSnapY;
+ QMenu * const m_menuRooms;
+
QLabel * const m_labelX;
QLabel * const m_labelY;
QLabel * const m_labelArea;
diff --git a/src/editor/dialogs/pathpropertiesdialog.ui b/src/editor/dialogs/pathpropertiesdialog.ui
index b276450..2bd5b28 100644
--- a/src/editor/dialogs/pathpropertiesdialog.ui
+++ b/src/editor/dialogs/pathpropertiesdialog.ui
@@ -14,7 +14,7 @@
Path Properties
-
+
:/qtgameengine/icons/path-file.png:/qtgameengine/icons/path-file.png
@@ -79,19 +79,18 @@
-
+
-
-
+
+
-
-
+
@@ -158,6 +157,9 @@
0
+
+ true
+
-
@@ -196,7 +198,7 @@
X-coordinate of the point
- 16384
+ 2147483647
@@ -216,7 +218,7 @@
Y-coordinate of the point
- 16384
+ 2147483647
@@ -236,7 +238,7 @@
Relative speed at this point (100 = default)
- 16384
+ 2147483647
@@ -391,7 +393,7 @@
-
-
-
+
300
@@ -410,7 +412,7 @@
-
+
:/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
@@ -422,7 +424,7 @@
-
+
:/qtgameengine/icons/undo.png:/qtgameengine/icons/undo.png
@@ -434,7 +436,7 @@
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -446,7 +448,7 @@
-
+
:/qtgameengine/icons/rotate.png:/qtgameengine/icons/rotate.png
@@ -458,7 +460,7 @@
-
+
:/qtgameengine/icons/move.png:/qtgameengine/icons/move.png
@@ -470,7 +472,7 @@
-
+
:/qtgameengine/icons/flip-horizontal.png:/qtgameengine/icons/flip-horizontal.png
@@ -480,9 +482,9 @@
Mirror the path horizontally
-
+
-
+
:/qtgameengine/icons/flip-vertical.png:/qtgameengine/icons/flip-vertical.png
@@ -494,7 +496,7 @@
-
+
:/qtgameengine/icons/rotate.png:/qtgameengine/icons/rotate.png
@@ -506,7 +508,7 @@
-
+
:/qtgameengine/icons/scale.png:/qtgameengine/icons/scale.png
@@ -518,7 +520,7 @@
-
+
:/qtgameengine/icons/arrow-left.png:/qtgameengine/icons/arrow-left.png
@@ -530,7 +532,7 @@
-
+
:/qtgameengine/icons/arrow-right.png:/qtgameengine/icons/arrow-right.png
@@ -540,9 +542,9 @@
Shift the view to the right
-
+
-
+
:/qtgameengine/icons/arrow-up.png:/qtgameengine/icons/arrow-up.png
@@ -552,9 +554,9 @@
Shift the view to the top
-
+
-
+
:/qtgameengine/icons/arrow-down.png:/qtgameengine/icons/arrow-down.png
@@ -566,7 +568,7 @@
-
+
:/qtgameengine/icons/center.png:/qtgameengine/icons/center.png
@@ -576,7 +578,7 @@
Center view around the path
-
+
true
@@ -584,7 +586,7 @@
true
-
+
:/qtgameengine/icons/grid.png:/qtgameengine/icons/grid.png
@@ -594,18 +596,6 @@
Toggle the showing of the grid
-
-
-
- :/qtgameengine/icons/room.png:/qtgameengine/icons/room.png
-
-
- Room
-
-
- Indicate the room to show as background
-
-
@@ -616,7 +606,7 @@
-
+
diff --git a/src/editor/dialogs/roompropertiesdialog.cpp b/src/editor/dialogs/roompropertiesdialog.cpp
index 024da6a..5e79760 100644
--- a/src/editor/dialogs/roompropertiesdialog.cpp
+++ b/src/editor/dialogs/roompropertiesdialog.cpp
@@ -1,14 +1,306 @@
#include "roompropertiesdialog.h"
#include "ui_roompropertiesdialog.h"
+#include
+#include
+#include
+#include
+#include
+
+#include "projectcontainer.h"
+#include "models/projecttreemodel.h"
+#include "genericcodeeditordialog.h"
+
RoomPropertiesDialog::RoomPropertiesDialog(Room &room, ProjectTreeModel &projectModel, QWidget *parent) :
QDialog{parent},
- m_ui{std::make_unique()}
+ m_ui{std::make_unique()},
+ m_room{room},
+ m_projectModel{projectModel},
+ m_creationCode{m_room.creationCode},
+ m_spinBoxSnapX{new QSpinBox{this}},
+ m_spinBoxSnapY{new QSpinBox{this}},
+ m_labelX{new QLabel{tr("x: %0").arg(0)}},
+ m_labelY{new QLabel{tr("y: %0").arg(0)}}
{
- Q_UNUSED(room)
- Q_UNUSED(projectModel)
-
m_ui->setupUi(this);
+
+ updateTitle();
+
+ m_ui->roomEditWidget->setFixedWidth(m_room.width);
+ m_ui->roomEditWidget->setFixedHeight(m_room.height);
+ m_ui->roomEditWidget->setSnapX(m_room.snapX);
+ m_ui->roomEditWidget->setSnapY(m_room.snapY);
+ m_ui->roomEditWidget->setGridEnabled(m_room.gridEnabled);
+ m_ui->roomEditWidget->setIsometricGrid(m_room.isometricGrid);
+
+ {
+ int index{11};
+
+ {
+ auto label = new QLabel{tr("Snap &X:"), this};
+ label->setBuddy(m_spinBoxSnapX);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), label);
+ }
+ m_spinBoxSnapX->setValue(m_ui->roomEditWidget->snapX());
+ m_spinBoxSnapX->setMaximumWidth(50);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), m_spinBoxSnapX);
+
+ {
+ auto label = new QLabel{tr("Snap &Y:"), this};
+ label->setBuddy(m_spinBoxSnapY);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), label);
+ }
+ m_spinBoxSnapY->setValue(m_ui->roomEditWidget->snapY());
+ m_spinBoxSnapY->setMaximumWidth(50);
+ m_ui->toolBar->insertWidget(m_ui->toolBar->actions().at(index++), m_spinBoxSnapY);
+ }
+
+ m_ui->actionGridEnabled->setChecked(m_ui->roomEditWidget->gridEnabled());
+ m_ui->actionIsometricGrid->setChecked(m_ui->roomEditWidget->isometricGrid());
+
+ {
+ auto toolButton = new QToolButton{this};
+ toolButton->setText(tr("Show"));
+ toolButton->setIcon(QIcon{":/qtgameengine/icons/find.png"});
+ toolButton->setPopupMode(QToolButton::InstantPopup);
+ toolButton->addAction(m_ui->actionShowObjects);
+ toolButton->addAction(m_ui->actionShowTiles);
+ toolButton->addAction(m_ui->actionShowBackgrounds);
+ toolButton->addAction(m_ui->actionShowForegrounds);
+ toolButton->addAction(m_ui->actionShowViews);
+ m_ui->toolBar->addWidget(toolButton);
+ }
+
+ m_ui->scrollArea->setBackgroundRole(QPalette::Dark);
+
+ m_labelX->setFrameStyle(QFrame::Sunken);
+ m_ui->statusbar->addWidget(m_labelX, 1);
+ m_labelY->setFrameStyle(QFrame::Sunken);
+ m_ui->statusbar->addWidget(m_labelY, 1);
+
+ {
+ auto frame = new QFrame{this};
+ frame->setFrameStyle(QFrame::Sunken);
+ m_ui->statusbar->addPermanentWidget(frame, 4);
+ }
+
+ m_ui->lineEditName->setText(m_room.name);
+ m_ui->lineEditCaption->setText(m_room.caption);
+ m_ui->spinBoxWidth->setValue(m_ui->roomEditWidget->width());
+ m_ui->spinBoxHeight->setValue(m_ui->roomEditWidget->height());
+ m_ui->spinBoxSpeed->setValue(m_room.speed);
+ m_ui->checkBoxPersistent->setChecked(m_room.persistent);
+
+ connect(&m_projectModel, &ProjectTreeModel::roomNameChanged,
+ this, &RoomPropertiesDialog::roomNameChanged);
+
+ connect(m_ui->actionUndo, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionClear, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionShift, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionSortX, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionSortY, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionLock, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+ connect(m_ui->actionUnlock, &QAction::triggered,
+ this, &RoomPropertiesDialog::undo);
+
+ connect(m_spinBoxSnapX, &QSpinBox::valueChanged,
+ m_ui->roomEditWidget, &RoomEditWidget::setSnapX);
+ connect(m_spinBoxSnapY, &QSpinBox::valueChanged,
+ m_ui->roomEditWidget, &RoomEditWidget::setSnapY);
+ connect(m_ui->actionGridEnabled, &QAction::toggled,
+ m_ui->roomEditWidget, &RoomEditWidget::setGridEnabled);
+ connect(m_ui->actionIsometricGrid, &QAction::toggled,
+ m_ui->roomEditWidget, &RoomEditWidget::setIsometricGrid);
+
+ connect(m_ui->spinBoxWidth, &QSpinBox::valueChanged,
+ m_ui->roomEditWidget, &RoomEditWidget::setFixedWidth);
+ connect(m_ui->spinBoxHeight, &QSpinBox::valueChanged,
+ m_ui->roomEditWidget, &RoomEditWidget::setFixedHeight);
+
+ connect(m_spinBoxSnapX, &QSpinBox::valueChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_spinBoxSnapY, &QSpinBox::valueChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->actionGridEnabled, &QAction::toggled,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->actionIsometricGrid, &QAction::toggled,
+ this, &RoomPropertiesDialog::changed);
+
+ connect(m_ui->lineEditName, &QLineEdit::textChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->lineEditCaption, &QLineEdit::textChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->spinBoxWidth, &QSpinBox::valueChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->spinBoxHeight, &QSpinBox::valueChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->spinBoxSpeed, &QSpinBox::valueChanged,
+ this, &RoomPropertiesDialog::changed);
+ connect(m_ui->checkBoxPersistent, &QCheckBox::toggled,
+ this, &RoomPropertiesDialog::changed);
+
+ connect(m_ui->pushButtonCreationCode, &QAbstractButton::clicked,
+ this, &RoomPropertiesDialog::editCreationCode);
+
+ connect(m_ui->roomEditWidget, &RoomEditWidget::snapXChanged,
+ m_spinBoxSnapX, &QSpinBox::setValue);
+ connect(m_ui->roomEditWidget, &RoomEditWidget::snapYChanged,
+ m_spinBoxSnapY, &QSpinBox::setValue);
+ connect(m_ui->roomEditWidget, &RoomEditWidget::gridEnabledChanged,
+ m_ui->actionGridEnabled, &QAction::setChecked);
+ connect(m_ui->roomEditWidget, &RoomEditWidget::isometricGridChanged,
+ m_ui->actionIsometricGrid, &QAction::setChecked);
+ connect(m_ui->roomEditWidget, &RoomEditWidget::cursorMoved,
+ this, &RoomPropertiesDialog::cursorMoved);
}
RoomPropertiesDialog::~RoomPropertiesDialog() = default;
+
+void RoomPropertiesDialog::accept()
+{
+ if (!m_unsavedChanges)
+ {
+ QDialog::reject();
+ return;
+ }
+
+ if (m_room.name != m_ui->lineEditName->text())
+ {
+ if (!m_projectModel.rename(m_room, m_ui->lineEditName->text()))
+ {
+ QMessageBox::critical(this, tr("Renaming Room failed!"), tr("Renaming Room failed!"));
+ return;
+ }
+ }
+
+ m_room.caption = m_ui->lineEditCaption->text();
+ m_room.width = m_ui->spinBoxWidth->value();
+ m_room.height = m_ui->spinBoxHeight->value();
+ m_room.speed = m_ui->spinBoxSpeed->value();
+ m_room.persistent = m_ui->checkBoxPersistent->isChecked();
+ m_room.creationCode = m_creationCode;
+ m_room.snapX = m_spinBoxSnapX->value();
+ m_room.snapY = m_spinBoxSnapY->value();
+ m_room.gridEnabled = m_ui->actionGridEnabled->isChecked();
+ m_room.isometricGrid = m_ui->actionIsometricGrid->isChecked();
+
+ QDialog::accept();
+}
+
+void RoomPropertiesDialog::reject()
+{
+ if (!m_unsavedChanges)
+ {
+ QDialog::reject();
+ return;
+ }
+
+ const auto result = QMessageBox::warning(
+ this,
+ tr("The Room has been modified."),
+ tr("Do you want to save your changes?"),
+ QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
+ QMessageBox::Save
+ );
+ switch (result)
+ {
+ case QMessageBox::Save:
+ accept();
+ return;
+ case QMessageBox::Discard:
+ QDialog::reject();
+ return;
+ case QMessageBox::Cancel:
+ return;
+ default:
+ qWarning() << "unexpected dialog result" << result;
+ }
+}
+
+void RoomPropertiesDialog::undo()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::clearInstances()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::shiftInstances()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::sortInstancesX()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::sortInstancesY()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::lockInstances()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::unlockInstances()
+{
+ QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
+}
+
+void RoomPropertiesDialog::editCreationCode()
+{
+ GenericCodeEditorDialog dialog{tr("Room Creation Code"), this};
+ dialog.setScript(m_creationCode);
+ if (dialog.exec() == QDialog::Accepted)
+ {
+ m_creationCode = dialog.script();
+ changed();
+ }
+}
+
+void RoomPropertiesDialog::changed()
+{
+ if (!m_unsavedChanges)
+ {
+ m_unsavedChanges = true;
+ updateTitle();
+ }
+}
+
+void RoomPropertiesDialog::roomNameChanged(const Room &room)
+{
+ if (&room != &m_room)
+ return;
+
+ {
+ QSignalBlocker blocker{m_ui->lineEditName};
+ m_ui->lineEditName->setText(room.name);
+ }
+
+ updateTitle();
+}
+
+void RoomPropertiesDialog::cursorMoved(const QPoint &point)
+{
+ m_labelX->setText(tr("X: %0").arg(point.x()));
+ m_labelY->setText(tr("Y: %0").arg(point.y()));
+}
+
+void RoomPropertiesDialog::updateTitle()
+{
+ setWindowTitle(tr("Room Properties: %0%1")
+ .arg(m_room.name)
+ .arg(m_unsavedChanges ? tr("*") : QString{})
+ );
+}
diff --git a/src/editor/dialogs/roompropertiesdialog.h b/src/editor/dialogs/roompropertiesdialog.h
index 4799276..48e4e76 100644
--- a/src/editor/dialogs/roompropertiesdialog.h
+++ b/src/editor/dialogs/roompropertiesdialog.h
@@ -4,6 +4,8 @@
#include
+class QSpinBox;
+class QLabel;
namespace Ui { class RoomPropertiesDialog; }
struct Room;
class ProjectTreeModel;
@@ -16,6 +18,40 @@ public:
explicit RoomPropertiesDialog(Room &room, ProjectTreeModel &projectModel, QWidget *parent = nullptr);
~RoomPropertiesDialog();
+ void accept() override;
+ void reject() override;
+
+private slots:
+ void undo();
+ void clearInstances();
+ void shiftInstances();
+ void sortInstancesX();
+ void sortInstancesY();
+ void lockInstances();
+ void unlockInstances();
+ void editCreationCode();
+
+ void changed();
+
+ void roomNameChanged(const Room &room);
+
+ void cursorMoved(const QPoint &point);
+
private:
+ void updateTitle();
+
const std::unique_ptr m_ui;
+
+ Room &m_room;
+ ProjectTreeModel &m_projectModel;
+
+ QString m_creationCode;
+
+ bool m_unsavedChanges{};
+
+ QSpinBox * const m_spinBoxSnapX;
+ QSpinBox * const m_spinBoxSnapY;
+
+ QLabel * const m_labelX;
+ QLabel * const m_labelY;
};
diff --git a/src/editor/dialogs/roompropertiesdialog.ui b/src/editor/dialogs/roompropertiesdialog.ui
index 7c3f317..8cd6f35 100644
--- a/src/editor/dialogs/roompropertiesdialog.ui
+++ b/src/editor/dialogs/roompropertiesdialog.ui
@@ -6,20 +6,532 @@
0
0
- 400
- 300
+ 921
+ 576
Room Properties
-
+
:/qtgameengine/icons/room-file.png:/qtgameengine/icons/room-file.png
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ QFrame::Panel
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ toolBar
+
+
+ false
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+ QTabWidget::West
+
+
+ 0
+
+
+
+ &Objects
+
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
+
+
+
+ &Settings
+
+
+
-
+
+
-
+
+
+ &Name:
+
+
+ lineEditName
+
+
+
+ -
+
+
+
+
+ -
+
+
+ &Caption for the room:
+
+
+ lineEditCaption
+
+
+
+ -
+
+
+ -
+
+
-
+
+
+ &Width:
+
+
+ spinBoxWidth
+
+
+
+ -
+
+
+ 2147483647
+
+
+ 640
+
+
+
+ -
+
+
+ &Height:
+
+
+ spinBoxHeight
+
+
+
+ -
+
+
+ 2147483647
+
+
+ 480
+
+
+
+ -
+
+
+ S&peed:
+
+
+ spinBoxSpeed
+
+
+
+ -
+
+
+ 2147483647
+
+
+ 30
+
+
+
+
+
+ -
+
+
+ P&ersistent
+
+
+
+ -
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ CreationCode
+
+
+
+ :/qtgameengine/icons/script.png:/qtgameengine/icons/script.png
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+ &Tiles
+
+
+
+
+ &Backgrounds
+
+
+
+
+ &Views
+
+
+
+
+ -
+
+
-
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ :/qtgameengine/icons/ok.png:/qtgameengine/icons/ok.png
+
+
+ OK
+
+
+ Close the form, saving the changes
+
+
+
+
+
+ :/qtgameengine/icons/undo.png:/qtgameengine/icons/undo.png
+
+
+ Undo
+
+
+ Undo the last changes in the room
+
+
+
+
+
+ :/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
+
+
+ Clear
+
+
+ Clear all instances from the room
+
+
+
+
+
+ :/qtgameengine/icons/arrow-right.png:/qtgameengine/icons/arrow-right.png
+
+
+ Shift
+
+
+ Shift all instances by a given amount
+
+
+
+
+
+ :/qtgameengine/icons/sort-x.png:/qtgameengine/icons/sort-x.png
+
+
+ Sort X
+
+
+ Sort all instances by x-coordinate
+
+
+
+
+
+ :/qtgameengine/icons/sort-y.png:/qtgameengine/icons/sort-y.png
+
+
+ Sort Y
+
+
+ Sort all instances by y-coordinate
+
+
+
+
+
+ :/qtgameengine/icons/lock.png:/qtgameengine/icons/lock.png
+
+
+ Lock
+
+
+ Lock all instances
+
+
+
+
+
+ :/qtgameengine/icons/unlock.png:/qtgameengine/icons/unlock.png
+
+
+ Unlock
+
+
+ Unlock all instances
+
+
+
+
+ true
+
+
+ true
+
+
+
+ :/qtgameengine/icons/grid.png:/qtgameengine/icons/grid.png
+
+
+ Grid
+
+
+ Toggle the showing of the grid
+
+
+
+
+ true
+
+
+
+ :/qtgameengine/icons/isometric.png:/qtgameengine/icons/isometric.png
+
+
+ Isometric
+
+
+ Turn the grid into an isometric grid
+
+
+
+
+ true
+
+
+ true
+
+
+ Show Objects
+
+
+
+
+ true
+
+
+ true
+
+
+ Show Tiles
+
+
+
+
+ true
+
+
+ true
+
+
+ Show Backgrounds
+
+
+
+
+ true
+
+
+ true
+
+
+ Show Foregrounds
+
+
+
+
+ true
+
+
+ Show Views
+
+
+
+
+ RoomEditWidget
+ QWidget
+
+ 1
+
+
-
+
-
+
+
+ actionOk
+ triggered()
+ RoomPropertiesDialog
+ accept()
+
+
+ -1
+ -1
+
+
+ 363
+ 224
+
+
+
+
diff --git a/src/editor/dialogs/soundpropertiesdialog.ui b/src/editor/dialogs/soundpropertiesdialog.ui
index 847ba71..e40cde2 100644
--- a/src/editor/dialogs/soundpropertiesdialog.ui
+++ b/src/editor/dialogs/soundpropertiesdialog.ui
@@ -14,7 +14,7 @@
Sound Properties
-
+
:/qtgameengine/icons/sound-file.png:/qtgameengine/icons/sound-file.png
@@ -50,7 +50,7 @@
&Load Sound
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -64,7 +64,7 @@
-
+
:/qtgameengine/icons/run.png:/qtgameengine/icons/run.png
@@ -78,7 +78,7 @@
-
+
:/qtgameengine/icons/exit.png:/qtgameengine/icons/exit.png
@@ -94,7 +94,7 @@
Sa&ve Sound
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -292,7 +292,7 @@
&Edit Sound
-
+
:/qtgameengine/icons/sound.png:/qtgameengine/icons/sound.png
@@ -325,7 +325,7 @@
-
+
diff --git a/src/editor/dialogs/spritepropertiesdialog.ui b/src/editor/dialogs/spritepropertiesdialog.ui
index 4f8308f..641aaea 100644
--- a/src/editor/dialogs/spritepropertiesdialog.ui
+++ b/src/editor/dialogs/spritepropertiesdialog.ui
@@ -14,7 +14,7 @@
Sprite Properties
-
+
:/qtgameengine/icons/sprite-file.png:/qtgameengine/icons/sprite-file.png
@@ -67,7 +67,7 @@
&Load Sprite
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -81,7 +81,7 @@
&Save Sprite
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -95,7 +95,7 @@
&Edit Sprite
-
+
:/qtgameengine/icons/edit.png:/qtgameengine/icons/edit.png
@@ -339,7 +339,7 @@
-
+
diff --git a/src/editor/dialogs/timelinepropertiesdialog.ui b/src/editor/dialogs/timelinepropertiesdialog.ui
index 4312d3d..a0f83ff 100644
--- a/src/editor/dialogs/timelinepropertiesdialog.ui
+++ b/src/editor/dialogs/timelinepropertiesdialog.ui
@@ -14,7 +14,7 @@
Time Line Properties
-
+
:/qtgameengine/icons/timeline-file.png:/qtgameengine/icons/timeline-file.png
@@ -61,7 +61,7 @@
&Add
-
+
:/qtgameengine/icons/add.png:/qtgameengine/icons/add.png
@@ -75,7 +75,7 @@
&Change
-
+
:/qtgameengine/icons/replace.png:/qtgameengine/icons/replace.png
@@ -89,7 +89,7 @@
&Delete
-
+
:/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png
@@ -103,7 +103,7 @@
&Shift
-
+
:/qtgameengine/icons/arrow-right.png:/qtgameengine/icons/arrow-right.png
@@ -117,7 +117,7 @@
C&lear
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -131,7 +131,7 @@
D&uplicate
-
+
:/qtgameengine/icons/copy.png:/qtgameengine/icons/copy.png
@@ -158,7 +158,7 @@
S&pread
-
+
:/qtgameengine/icons/scale.png:/qtgameengine/icons/scale.png
@@ -172,7 +172,7 @@
&Merge
-
+
:/qtgameengine/icons/merge.png:/qtgameengine/icons/merge.png
@@ -201,7 +201,7 @@
Show &Information
-
+
:/qtgameengine/icons/info.png:/qtgameengine/icons/info.png
@@ -278,7 +278,7 @@
-
+
diff --git a/src/editor/dialogs/triggerconditiondialog.h b/src/editor/dialogs/triggerconditiondialog.h
deleted file mode 100644
index 95c948d..0000000
--- a/src/editor/dialogs/triggerconditiondialog.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-#include "codeeditordialog.h"
-
-class TriggerConditionDialog : public CodeEditorDialog
-{
- Q_OBJECT
-
-public:
- explicit TriggerConditionDialog(QWidget *parent = nullptr);
-};
diff --git a/src/editor/dialogs/triggersdialog.cpp b/src/editor/dialogs/triggersdialog.cpp
index 368cd76..b1f8d4a 100644
--- a/src/editor/dialogs/triggersdialog.cpp
+++ b/src/editor/dialogs/triggersdialog.cpp
@@ -6,7 +6,7 @@
#include "projectcontainer.h"
#include "models/triggersmodel.h"
-#include "triggerconditiondialog.h"
+#include "genericcodeeditordialog.h"
TriggersDialog::TriggersDialog(ProjectContainer &project, QWidget *parent) :
QDialog{parent},
@@ -66,7 +66,7 @@ TriggersDialog::~TriggersDialog() = default;
void TriggersDialog::openCodeEditor()
{
- TriggerConditionDialog dialog{this};
+ GenericCodeEditorDialog dialog{tr("Trigger condition"), this};
dialog.setScript(m_ui->plainTextEdit->toPlainText());
if (dialog.exec() == QDialog::Accepted)
{
diff --git a/src/editor/dialogs/triggersdialog.ui b/src/editor/dialogs/triggersdialog.ui
index 57f1f8a..9c9606d 100644
--- a/src/editor/dialogs/triggersdialog.ui
+++ b/src/editor/dialogs/triggersdialog.ui
@@ -40,7 +40,7 @@
&Load
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -54,7 +54,7 @@
&Delete
-
+
:/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png
@@ -68,7 +68,7 @@
&Add
-
+
:/qtgameengine/icons/add.png:/qtgameengine/icons/add.png
@@ -82,7 +82,7 @@
&Clear
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -96,7 +96,7 @@
&Save
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -246,7 +246,7 @@
-
+
diff --git a/src/editor/dialogs/userdefinedconstantsdialog.ui b/src/editor/dialogs/userdefinedconstantsdialog.ui
index 5d746d1..df1486d 100644
--- a/src/editor/dialogs/userdefinedconstantsdialog.ui
+++ b/src/editor/dialogs/userdefinedconstantsdialog.ui
@@ -14,7 +14,7 @@
User-Defined Constants
-
+
:/qtgameengine/icons/constants.png:/qtgameengine/icons/constants.png
@@ -39,7 +39,7 @@
&Insert
-
+
:/qtgameengine/icons/add.png:/qtgameengine/icons/add.png
@@ -53,7 +53,7 @@
&Sort
-
+
:/qtgameengine/icons/sort.png:/qtgameengine/icons/sort.png
@@ -67,7 +67,7 @@
&Delete
-
+
:/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png
@@ -81,7 +81,7 @@
&Load
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -95,7 +95,7 @@
&Up
-
+
:/qtgameengine/icons/arrow-up.png:/qtgameengine/icons/arrow-up.png
@@ -109,7 +109,7 @@
&Add
-
+
:/qtgameengine/icons/add.png:/qtgameengine/icons/add.png
@@ -123,7 +123,7 @@
&Clear
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -137,7 +137,7 @@
Do&wn
-
+
:/qtgameengine/icons/arrow-down.png:/qtgameengine/icons/arrow-down.png
@@ -151,7 +151,7 @@
Sa&ve
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -174,7 +174,7 @@
-
+
diff --git a/src/editor/mainwindow.cpp b/src/editor/mainwindow.cpp
index b5d40e7..f42142c 100644
--- a/src/editor/mainwindow.cpp
+++ b/src/editor/mainwindow.cpp
@@ -55,12 +55,10 @@ MainWindow::MainWindow(const QString &filePath, QWidget *parent) :
{
m_ui->setupUi(this);
- {
- QList sizes;
- sizes.append(0.5 * m_ui->splitter->width());
- sizes.append(0.5 * m_ui->splitter->width());
- m_ui->splitter->setSizes(sizes);
- }
+ m_ui->splitter->setSizes({
+ m_ui->splitter->width() / 2,
+ m_ui->splitter->width() / 2
+ });
m_ui->actionNew->setShortcut(QKeySequence::New);
m_ui->actionOpen->setShortcut(QKeySequence::Open);
diff --git a/src/editor/mainwindow.ui b/src/editor/mainwindow.ui
index 730120c..85deec2 100644
--- a/src/editor/mainwindow.ui
+++ b/src/editor/mainwindow.ui
@@ -264,7 +264,7 @@
-
+
:/qtgameengine/icons/new.png:/qtgameengine/icons/new.png
@@ -273,7 +273,7 @@
-
+
:/qtgameengine/icons/open.png:/qtgameengine/icons/open.png
@@ -282,7 +282,7 @@
-
+
:/qtgameengine/icons/save.png:/qtgameengine/icons/save.png
@@ -291,7 +291,7 @@
-
+
:/qtgameengine/icons/save-as.png:/qtgameengine/icons/save-as.png
@@ -300,7 +300,7 @@
-
+
:/qtgameengine/icons/create-executable.png:/qtgameengine/icons/create-executable.png
@@ -309,7 +309,7 @@
-
+
:/qtgameengine/icons/publish-game.png:/qtgameengine/icons/publish-game.png
@@ -318,7 +318,7 @@
-
+
:/qtgameengine/icons/import-resources.png:/qtgameengine/icons/import-resources.png
@@ -327,7 +327,7 @@
-
+
:/qtgameengine/icons/export-resources.png:/qtgameengine/icons/export-resources.png
@@ -347,7 +347,7 @@
-
+
:/qtgameengine/icons/preferences.png:/qtgameengine/icons/preferences.png
@@ -359,7 +359,7 @@
-
+
:/qtgameengine/icons/exit.png:/qtgameengine/icons/exit.png
@@ -379,7 +379,7 @@
-
+
:/qtgameengine/icons/create.png:/qtgameengine/icons/create.png
@@ -388,7 +388,7 @@
-
+
:/qtgameengine/icons/duplicate.png:/qtgameengine/icons/duplicate.png
@@ -400,7 +400,7 @@
-
+
:/qtgameengine/icons/create-group.png:/qtgameengine/icons/create-group.png
@@ -414,7 +414,7 @@
-
+
:/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png
@@ -423,7 +423,7 @@
-
+
:/qtgameengine/icons/rename.png:/qtgameengine/icons/rename.png
@@ -432,7 +432,7 @@
-
+
:/qtgameengine/icons/properties.png:/qtgameengine/icons/properties.png
@@ -444,7 +444,7 @@
-
+
:/qtgameengine/icons/find.png:/qtgameengine/icons/find.png
@@ -463,7 +463,7 @@
-
+
:/qtgameengine/icons/object-file.png:/qtgameengine/icons/object-file.png
@@ -472,7 +472,7 @@
-
+
:/qtgameengine/icons/sprite.png:/qtgameengine/icons/sprite.png
@@ -484,7 +484,7 @@
-
+
:/qtgameengine/icons/sound.png:/qtgameengine/icons/sound.png
@@ -496,7 +496,7 @@
-
+
:/qtgameengine/icons/background.png:/qtgameengine/icons/background.png
@@ -508,7 +508,7 @@
-
+
:/qtgameengine/icons/path.png:/qtgameengine/icons/path.png
@@ -520,7 +520,7 @@
-
+
:/qtgameengine/icons/script.png:/qtgameengine/icons/script.png
@@ -532,7 +532,7 @@
-
+
:/qtgameengine/icons/font.png:/qtgameengine/icons/font.png
@@ -544,7 +544,7 @@
-
+
:/qtgameengine/icons/timeline.png:/qtgameengine/icons/timeline.png
@@ -556,7 +556,7 @@
-
+
:/qtgameengine/icons/object.png:/qtgameengine/icons/object.png
@@ -568,7 +568,7 @@
-
+
:/qtgameengine/icons/room.png:/qtgameengine/icons/room.png
@@ -580,7 +580,7 @@
-
+
:/qtgameengine/icons/game-information.png:/qtgameengine/icons/game-information.png
@@ -592,7 +592,7 @@
-
+
:/qtgameengine/icons/global-game-settings.png:/qtgameengine/icons/global-game-settings.png
@@ -604,7 +604,7 @@
-
+
:/qtgameengine/icons/extension-packages.png:/qtgameengine/icons/extension-packages.png
@@ -616,7 +616,7 @@
-
+
:/qtgameengine/icons/constants.png:/qtgameengine/icons/constants.png
@@ -644,7 +644,7 @@
-
+
:/qtgameengine/icons/run.png:/qtgameengine/icons/run.png
@@ -656,7 +656,7 @@
-
+
:/qtgameengine/icons/debug.png:/qtgameengine/icons/debug.png
@@ -673,7 +673,7 @@
-
+
:/qtgameengine/icons/help.png:/qtgameengine/icons/help.png
@@ -783,7 +783,7 @@
-
+
:/qtgameengine/icons/tile.png:/qtgameengine/icons/tile.png
@@ -792,7 +792,7 @@
-
+
:/qtgameengine/icons/cascade.png:/qtgameengine/icons/cascade.png
@@ -827,7 +827,7 @@
-
+
diff --git a/src/editor/widgets/pathpointswidget.cpp b/src/editor/widgets/pathpointswidget.cpp
index 98eba03..92568fe 100644
--- a/src/editor/widgets/pathpointswidget.cpp
+++ b/src/editor/widgets/pathpointswidget.cpp
@@ -2,6 +2,7 @@
#include
#include
+#include
#include
#include
@@ -24,27 +25,27 @@ void PathPointsWidget::setPoints(std::vector *points)
update();
}
-void PathPointsWidget::setShowGrid(bool showGrid)
+void PathPointsWidget::setSnapX(int snapX)
{
- if (m_showGrid == showGrid)
+ if (m_snapX == snapX)
return;
- emit showGridChanged(m_showGrid = showGrid);
+ emit snapXChanged(m_snapX = snapX);
update();
}
-void PathPointsWidget::setGridX(int gridX)
+void PathPointsWidget::setSnapY(int snapY)
{
- if (m_gridX == gridX)
+ if (m_snapY == snapY)
return;
- emit gridXChanged(m_gridX = gridX);
+ emit snapYChanged(m_snapY = snapY);
update();
}
-void PathPointsWidget::setGridY(int gridY)
+void PathPointsWidget::setGridEnabled(bool gridEnabled)
{
- if (m_gridY == gridY)
+ if (m_gridEnabled == gridEnabled)
return;
- emit gridYChanged(m_gridY = gridY);
+ emit gridEnabledChanged(m_gridEnabled = gridEnabled);
update();
}
@@ -64,28 +65,36 @@ void PathPointsWidget::setSelectedIndex(const std::optional &select
update();
}
+void PathPointsWidget::setGridRole(QPalette::ColorRole gridRole)
+{
+ if (gridRole == m_gridRole)
+ return;
+ m_gridRole = gridRole;
+ update();
+}
+
void PathPointsWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
- if (m_showGrid)
+ if (m_gridEnabled)
{
- if (!m_gridBrush || m_gridBrush->gridX != m_gridX || m_gridBrush->gridY != m_gridY)
+ if (!m_gridBrush || m_gridBrush->snapX != m_snapX || m_gridBrush->snapY != m_snapY)
{
- QPixmap pixmap{m_gridX, m_gridY};
+ QPixmap pixmap{m_snapX, m_snapY};
{
QPainter painter{&pixmap};
painter.setPen(palette().color(m_gridRole));
- painter.drawLine(0, 0, m_gridX, 0);
- painter.drawLine(0, 0, 0, m_gridY);
+ painter.drawLine(0, 0, m_snapX, 0);
+ painter.drawLine(0, 0, 0, m_snapY);
- painter.fillRect(1, 1, m_gridX - 1, m_gridY - 1, palette().color(backgroundRole()));
+ painter.fillRect(1, 1, m_snapX - 1, m_snapY - 1, palette().color(backgroundRole()));
}
m_gridBrush = GridBrush {
- .gridX = m_gridX,
- .gridY = m_gridY,
+ .snapX = m_snapX,
+ .snapY = m_snapY,
.brush = QBrush{std:: move(pixmap)}
};
}
@@ -216,10 +225,8 @@ void PathPointsWidget::mouseMoveEvent(QMouseEvent *event)
QPoint PathPointsWidget::snapPoint(const QPoint &point) const
{
- if (!m_showGrid)
- return point;
return QPoint{
- (point.x() + (m_gridX / 2)) / m_gridX * m_gridX,
- (point.y() + (m_gridY / 2)) / m_gridY * m_gridY,
+ m_snapX > 1 ? ((point.x() + (m_snapX / 2)) / m_snapX * m_snapX) : point.x(),
+ m_snapY > 1 ? ((point.y() + (m_snapY / 2)) / m_snapY * m_snapY) : point.y(),
};
}
diff --git a/src/editor/widgets/pathpointswidget.h b/src/editor/widgets/pathpointswidget.h
index baccf77..d2f0b98 100644
--- a/src/editor/widgets/pathpointswidget.h
+++ b/src/editor/widgets/pathpointswidget.h
@@ -11,9 +11,9 @@
class PathPointsWidget : public QWidget
{
Q_OBJECT
- Q_PROPERTY(bool showGrid READ showGrid WRITE setShowGrid NOTIFY showGridChanged)
- Q_PROPERTY(int gridX READ gridX WRITE setGridX NOTIFY gridXChanged)
- Q_PROPERTY(int gridY READ gridY WRITE setGridY NOTIFY gridYChanged)
+ Q_PROPERTY(int snapX READ snapX WRITE setSnapX NOTIFY snapXChanged)
+ Q_PROPERTY(int snapY READ snapY WRITE setSnapY NOTIFY snapYChanged)
+ Q_PROPERTY(bool gridEnabled READ gridEnabled WRITE setGridEnabled NOTIFY gridEnabledChanged)
Q_PROPERTY(bool closed READ closed WRITE setClosed NOTIFY closedChanged)
public:
@@ -22,14 +22,14 @@ public:
void setPoints(std::vector *points);
- bool showGrid() const { return m_showGrid; }
- void setShowGrid(bool showGrid);
+ int snapX() const { return m_snapX; }
+ void setSnapX(int snapX);
- int gridX() const { return m_gridX; }
- void setGridX(int gridX);
+ int snapY() const { return m_snapY; }
+ void setSnapY(int snapY);
- int gridY() const { return m_gridY; }
- void setGridY(int gridY);
+ bool gridEnabled() const { return m_gridEnabled; }
+ void setGridEnabled(bool gridEnabled);
bool closed() const { return m_closed; }
void setClosed(bool closed);
@@ -38,12 +38,12 @@ public:
void setSelectedIndex(const std::optional &selectedIndex);
QPalette::ColorRole gridRole() const { return m_gridRole; }
- void setGridRole(QPalette::ColorRole gridRole) { if (gridRole == m_gridRole) return; m_gridRole = gridRole; update(); }
+ void setGridRole(QPalette::ColorRole gridRole);
signals:
- void showGridChanged(bool showGrid);
- void gridXChanged(int gridX);
- void gridYChanged(int gridY);
+ void snapXChanged(int snapX);
+ void snapYChanged(int snapY);
+ void gridEnabledChanged(bool gridEnabled);
void closedChanged(bool closed);
void selectedIndexChanged(const std::optional &selectedIndex);
@@ -63,9 +63,9 @@ private:
std::vector *m_points{};
- bool m_showGrid{true};
- int m_gridX{16};
- int m_gridY{16};
+ int m_snapX{16};
+ int m_snapY{16};
+ bool m_gridEnabled{true};
bool m_closed{true};
@@ -73,8 +73,8 @@ private:
std::optional m_dragIndex;
struct GridBrush {
- int gridX;
- int gridY;
+ int snapX;
+ int snapY;
QBrush brush;
};
diff --git a/src/editor/widgets/roomeditwidget.cpp b/src/editor/widgets/roomeditwidget.cpp
new file mode 100644
index 0000000..cae259a
--- /dev/null
+++ b/src/editor/widgets/roomeditwidget.cpp
@@ -0,0 +1,112 @@
+#include "roomeditwidget.h"
+
+#include
+#include
+#include
+#include
+
+RoomEditWidget::RoomEditWidget(QWidget *parent) :
+ QWidget{parent}
+{
+ setBackgroundRole(QPalette::Light);
+ setMouseTracking(true);
+ setFixedSize(640, 480);
+}
+
+void RoomEditWidget::setSnapX(int snapX)
+{
+ if (m_snapX == snapX)
+ return;
+ emit snapXChanged(m_snapX = snapX);
+ update();
+}
+
+void RoomEditWidget::setSnapY(int snapY)
+{
+ if (m_snapY == snapY)
+ return;
+ emit snapYChanged(m_snapY = snapY);
+ update();
+}
+
+void RoomEditWidget::setGridEnabled(bool gridEnabled)
+{
+ if (m_gridEnabled == gridEnabled)
+ return;
+ emit gridEnabledChanged(m_gridEnabled = gridEnabled);
+ update();
+}
+
+void RoomEditWidget::setIsometricGrid(bool isometricGrid)
+{
+ if (m_isometricGrid == isometricGrid)
+ return;
+ emit isometricGridChanged(m_isometricGrid = isometricGrid);
+ update();
+}
+
+void RoomEditWidget::setGridRole(QPalette::ColorRole gridRole)
+{
+ if (gridRole == m_gridRole)
+ return;
+ m_gridRole = gridRole;
+ update();
+}
+
+void RoomEditWidget::paintEvent(QPaintEvent *event)
+{
+ Q_UNUSED(event)
+
+ if (m_gridEnabled)
+ {
+ if (!m_gridBrush || m_gridBrush->snapX != m_snapX || m_gridBrush->snapY != m_snapY)
+ {
+ QPixmap pixmap{m_snapX, m_snapY};
+
+ {
+ QPainter painter{&pixmap};
+ painter.setPen(palette().color(m_gridRole));
+ painter.drawLine(0, 0, m_snapX, 0);
+ painter.drawLine(0, 0, 0, m_snapY);
+
+ painter.fillRect(1, 1, m_snapX - 1, m_snapY - 1, palette().color(backgroundRole()));
+ }
+
+ m_gridBrush = GridBrush {
+ .snapX = m_snapX,
+ .snapY = m_snapY,
+ .brush = QBrush{std:: move(pixmap)}
+ };
+ }
+ }
+ else
+ m_gridBrush = std::nullopt;
+
+ QPainter painter{this};
+ painter.fillRect(rect(), m_gridBrush ? m_gridBrush->brush : palette().color(backgroundRole()));
+}
+
+void RoomEditWidget::mousePressEvent(QMouseEvent *event)
+{
+ QWidget::mousePressEvent(event);
+}
+
+void RoomEditWidget::mouseReleaseEvent(QMouseEvent *event)
+{
+ QWidget::mouseReleaseEvent(event);
+}
+
+void RoomEditWidget::mouseMoveEvent(QMouseEvent *event)
+{
+ QWidget::mouseMoveEvent(event);
+
+ emit cursorMoved(snapPoint(event->pos()));
+}
+
+QPoint RoomEditWidget::snapPoint(const QPoint &point) const
+{
+ return QPoint{
+ m_snapX > 1 ? ((point.x() + (m_snapX / 2)) / m_snapX * m_snapX) : point.x(),
+ m_snapY > 1 ? ((point.y() + (m_snapY / 2)) / m_snapY * m_snapY) : point.y(),
+ };
+}
diff --git a/src/editor/widgets/roomeditwidget.h b/src/editor/widgets/roomeditwidget.h
new file mode 100644
index 0000000..ffaf8a3
--- /dev/null
+++ b/src/editor/widgets/roomeditwidget.h
@@ -0,0 +1,65 @@
+#pragma once
+
+#include
+#include
+
+#include
+
+class RoomEditWidget : public QWidget
+{
+ Q_OBJECT
+ Q_PROPERTY(int snapX READ snapX WRITE setSnapX NOTIFY snapXChanged)
+ Q_PROPERTY(int snapY READ snapY WRITE setSnapY NOTIFY snapYChanged)
+ Q_PROPERTY(bool gridEnabled READ gridEnabled WRITE setGridEnabled NOTIFY gridEnabledChanged)
+ Q_PROPERTY(bool isometricGrid READ isometricGrid WRITE setIsometricGrid NOTIFY isometricGridChanged)
+
+public:
+ explicit RoomEditWidget(QWidget *parent = nullptr);
+
+ int snapX() const { return m_snapX; }
+ void setSnapX(int snapX);
+
+ int snapY() const { return m_snapY; }
+ void setSnapY(int snapY);
+
+ bool gridEnabled() const { return m_gridEnabled; }
+ void setGridEnabled(bool gridEnabled);
+
+ bool isometricGrid() const { return m_isometricGrid; }
+ void setIsometricGrid(bool isometricGrid);
+
+ QPalette::ColorRole gridRole() const { return m_gridRole; }
+ void setGridRole(QPalette::ColorRole gridRole);
+
+signals:
+ void snapXChanged(int snapX);
+ void snapYChanged(int snapY);
+ void gridEnabledChanged(bool gridEnabled);
+ void isometricGridChanged(bool isometricGrid);
+
+ void cursorMoved(const QPoint &point);
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *event) override;
+ void mouseMoveEvent(QMouseEvent *event) override;
+
+private:
+ QPoint snapPoint(const QPoint &point) const;
+
+ int m_snapX{16};
+ int m_snapY{16};
+ bool m_gridEnabled{true};
+ bool m_isometricGrid{false};
+
+ struct GridBrush {
+ int snapX;
+ int snapY;
+ QBrush brush;
+ };
+
+ std::optional m_gridBrush;
+
+ QPalette::ColorRole m_gridRole{QPalette::Dark};
+};
diff --git a/src/projectcontainer.cpp b/src/projectcontainer.cpp
index 271e5c7..7d36b88 100644
--- a/src/projectcontainer.cpp
+++ b/src/projectcontainer.cpp
@@ -222,7 +222,10 @@ QDataStream &operator<<(QDataStream &ds, const Path &path)
<< path.points
<< path.type
<< path.closed
- << path.precision;
+ << path.precision
+ << path.snapX
+ << path.snapY
+ << path.gridEnabled;
return ds;
}
@@ -232,7 +235,10 @@ QDataStream &operator>>(QDataStream &ds, Path &path)
>> path.points
>> path.type
>> path.closed
- >> path.precision;
+ >> path.precision
+ >> path.snapX
+ >> path.snapY
+ >> path.gridEnabled;
return ds;
}
@@ -318,13 +324,33 @@ QDataStream &operator>>(QDataStream &ds, Object &object)
QDataStream &operator<<(QDataStream &ds, const Room &room)
{
- ds << room.name;
+ ds << room.name
+ << room.caption
+ << room.width
+ << room.height
+ << room.speed
+ << room.persistent
+ << room.creationCode
+ << room.snapX
+ << room.snapY
+ << room.gridEnabled
+ << room.isometricGrid;
return ds;
}
QDataStream &operator>>(QDataStream &ds, Room &room)
{
- ds >> room.name;
+ ds >> room.name
+ >> room.caption
+ >> room.width
+ >> room.height
+ >> room.speed
+ >> room.persistent
+ >> room.creationCode
+ >> room.snapX
+ >> room.snapY
+ >> room.gridEnabled
+ >> room.isometricGrid;
return ds;
}
diff --git a/src/projectcontainer.h b/src/projectcontainer.h
index 9db1410..26d664b 100644
--- a/src/projectcontainer.h
+++ b/src/projectcontainer.h
@@ -63,6 +63,9 @@ struct Path
Type type{Type::Straight};
bool closed{true};
int precision{4};
+ int snapX{16};
+ int snapY{16};
+ bool gridEnabled{true};
};
struct Script
@@ -127,6 +130,16 @@ struct Object
struct Room
{
QString name;
+ QString caption;
+ int width{640};
+ int height{480};
+ int speed{30};
+ bool persistent{};
+ QString creationCode;
+ int snapX{16};
+ int snapY{16};
+ bool gridEnabled{true};
+ bool isometricGrid{};
};
struct ProjectContainer