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 +
widgets/roomeditwidget.h
+ 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