diff --git a/QtGameMaker.pro b/QtGameMaker.pro index ce0494b..d0e57ec 100644 --- a/QtGameMaker.pro +++ b/QtGameMaker.pro @@ -1,7 +1,10 @@ QT = core gui widgets multimedia CONFIG += c++latest -QMAKE_CXXFLAGS += -std=c++23 +QMAKE_CXXFLAGS += \ + -std=c++23 \ + -Wno-missing-field-initializers \ + -Wno-sign-compare DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 @@ -13,6 +16,7 @@ HEADERS += \ dialogs/fontpropertiesdialog.h \ dialogs/imageeditordialog.h \ dialogs/includedfilesdialog.h \ + dialogs/installextensiondialog.h \ dialogs/maskpropertiesdialog.h \ dialogs/objectinformationdialog.h \ dialogs/objectpropertiesdialog.h \ @@ -28,6 +32,8 @@ HEADERS += \ includedfilesmodel.h \ jshighlighter.h \ mainwindow.h \ + objectactionsmodel.h \ + objecteventsmodel.h \ pathpointsmodel.h \ pathpointswidget.h \ projectcontainer.h \ @@ -41,6 +47,8 @@ HEADERS += \ dialogs/soundpropertiesdialog.h \ dialogs/spritepropertiesdialog.h \ spritesmodel.h \ + timelineactionsmodel.h \ + timelinemomentsmodel.h \ triggersmodel.h SOURCES += main.cpp \ @@ -51,6 +59,7 @@ SOURCES += main.cpp \ dialogs/fontpropertiesdialog.cpp \ dialogs/imageeditordialog.cpp \ dialogs/includedfilesdialog.cpp \ + dialogs/installextensiondialog.cpp \ dialogs/maskpropertiesdialog.cpp \ dialogs/objectinformationdialog.cpp \ dialogs/objectpropertiesdialog.cpp \ @@ -65,6 +74,8 @@ SOURCES += main.cpp \ includedfilesmodel.cpp \ jshighlighter.cpp \ mainwindow.cpp \ + objectactionsmodel.cpp \ + objecteventsmodel.cpp \ pathpointsmodel.cpp \ pathpointswidget.cpp \ projectcontainer.cpp \ @@ -78,6 +89,8 @@ SOURCES += main.cpp \ dialogs/soundpropertiesdialog.cpp \ dialogs/spritepropertiesdialog.cpp \ spritesmodel.cpp \ + timelineactionsmodel.cpp \ + timelinemomentsmodel.cpp \ triggersmodel.cpp FORMS += \ @@ -86,6 +99,7 @@ FORMS += \ dialogs/fontpropertiesdialog.ui \ dialogs/imageeditordialog.ui \ dialogs/includedfilesdialog.ui \ + dialogs/installextensiondialog.ui \ dialogs/maskpropertiesdialog.ui \ dialogs/objectinformationdialog.ui \ dialogs/objectpropertiesdialog.ui \ diff --git a/codeeditorwidget.cpp b/codeeditorwidget.cpp index 9dc5cd0..96f0a06 100644 --- a/codeeditorwidget.cpp +++ b/codeeditorwidget.cpp @@ -21,6 +21,7 @@ CodeEditorWidget::CodeEditorWidget(QWidget *parent) : void CodeEditorWidget::updateLineNumberAreaWidth(int newBlockCount) { + Q_UNUSED(newBlockCount) setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); } diff --git a/constantsmodel.cpp b/constantsmodel.cpp index 0a41401..04e9c24 100644 --- a/constantsmodel.cpp +++ b/constantsmodel.cpp @@ -18,16 +18,20 @@ ConstantsModel::ConstantsModel(ProjectContainer &project, QObject *parent) : int ConstantsModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent) return 0; } int ConstantsModel::columnCount(const QModelIndex &parent) const { + Q_UNUSED(parent) return NumberOfColumns; } QVariant ConstantsModel::data(const QModelIndex &index, int role) const { + Q_UNUSED(index) + Q_UNUSED(role) return {}; } diff --git a/dialogs/backgroundpropertiesdialog.cpp b/dialogs/backgroundpropertiesdialog.cpp index 7f49bb8..2f02bca 100644 --- a/dialogs/backgroundpropertiesdialog.cpp +++ b/dialogs/backgroundpropertiesdialog.cpp @@ -32,11 +32,11 @@ BackgroundPropertiesDialog::BackgroundPropertiesDialog(Background &background, P connect(&m_projectModel, &ProjectTreeModel::backgroundNameChanged, this, &BackgroundPropertiesDialog::backgroundNameChanged); - connect(m_ui->pushButtonLoad, &QAbstractButton::pressed, + connect(m_ui->pushButtonLoad, &QAbstractButton::clicked, this, &BackgroundPropertiesDialog::loadBackground); - connect(m_ui->pushButtonSave, &QAbstractButton::pressed, + connect(m_ui->pushButtonSave, &QAbstractButton::clicked, this, &BackgroundPropertiesDialog::saveBackground); - connect(m_ui->pushButtonEdit, &QAbstractButton::pressed, + connect(m_ui->pushButtonEdit, &QAbstractButton::clicked, this, &BackgroundPropertiesDialog::editBackground); connect(m_ui->lineEditName, &QLineEdit::textChanged, diff --git a/dialogs/backgroundpropertiesdialog.h b/dialogs/backgroundpropertiesdialog.h index 32b4f1e..f88d63f 100644 --- a/dialogs/backgroundpropertiesdialog.h +++ b/dialogs/backgroundpropertiesdialog.h @@ -4,7 +4,6 @@ #include #include -#include namespace Ui { class BackgroundPropertiesDialog; } struct Background; diff --git a/dialogs/codeeditordialog.cpp b/dialogs/codeeditordialog.cpp index 12c943a..3af08a8 100644 --- a/dialogs/codeeditordialog.cpp +++ b/dialogs/codeeditordialog.cpp @@ -5,16 +5,21 @@ #include #include #include +#include +#include #include "jshighlighter.h" -CodeEditorDialog::CodeEditorDialog(QWidget *parent) : +CodeEditorDialog::CodeEditorDialog(const QString &title, QWidget *parent) : QDialog{parent}, m_ui{std::make_unique()}, + m_title{title}, m_labelPosition{new QLabel{this}} { m_ui->setupUi(this); + updateTitle(); + m_labelPosition->setFrameStyle(QFrame::Sunken); m_ui->statusbar->addWidget(m_labelPosition); @@ -37,6 +42,8 @@ CodeEditorDialog::CodeEditorDialog(QWidget *parent) : connect(m_ui->actionPrint, &QAction::triggered, this, &CodeEditorDialog::print); + connect(m_ui->codeEdit, &QPlainTextEdit::textChanged, + this, &CodeEditorDialog::changed); connect(m_ui->codeEdit, &QPlainTextEdit::textChanged, this, &CodeEditorDialog::updatePosition); connect(m_ui->codeEdit, &QPlainTextEdit::cursorPositionChanged, @@ -45,6 +52,72 @@ CodeEditorDialog::CodeEditorDialog(QWidget *parent) : CodeEditorDialog::~CodeEditorDialog() = default; +void CodeEditorDialog::accept() +{ + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + + QDialog::accept(); +} + +void CodeEditorDialog::reject() +{ + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + + const auto result = QMessageBox::warning( + this, + tr("The Script 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; + } +} + +QString CodeEditorDialog::script() const +{ + return m_ui->codeEdit->toPlainText(); +} + +void CodeEditorDialog::setScript(const QString &script) +{ + QSignalBlocker blocker{m_ui->codeEdit}; + m_ui->codeEdit->setPlainText(script); +} + +void CodeEditorDialog::changed() +{ + if (!m_unsavedChanges) + { + m_unsavedChanges = true; + updateTitle(); + } +} + +void CodeEditorDialog::addToolbarWidget(QWidget *widget) +{ + m_ui->toolBar->addWidget(widget); +} + void CodeEditorDialog::load() { @@ -82,3 +155,11 @@ void CodeEditorDialog::updatePosition() m_labelPosition->setText(tr("%0/%1: %2").arg(lines).arg(m_ui->codeEdit->blockCount()).arg(position)); } + +void CodeEditorDialog::updateTitle() +{ + setWindowTitle(tr("%0%1") + .arg(m_title) + .arg(m_unsavedChanges ? tr("*") : QString{}) + ); +} diff --git a/dialogs/codeeditordialog.h b/dialogs/codeeditordialog.h index 2958080..1dfafa2 100644 --- a/dialogs/codeeditordialog.h +++ b/dialogs/codeeditordialog.h @@ -12,9 +12,26 @@ class CodeEditorDialog : public QDialog Q_OBJECT public: - explicit CodeEditorDialog(QWidget *parent = nullptr); + explicit CodeEditorDialog(const QString &title, QWidget *parent = nullptr); ~CodeEditorDialog(); + void accept() override; + void reject() override; + + const QString &title() const { return m_title; } + void setTitle(const QString &title) { if (m_title == title) return; m_title = title; updateTitle(); } + + QString script() const; + void setScript(const QString &script); + +protected slots: + void changed(); + +protected: + bool m_unsavedChanges{}; + + void addToolbarWidget(QWidget *widget); + private slots: void load(); void save(); @@ -22,9 +39,12 @@ private slots: void updatePosition(); -protected: +private: + void updateTitle(); + const std::unique_ptr m_ui; -private: + QString m_title; + QLabel * const m_labelPosition; }; diff --git a/dialogs/createspritedialog.cpp b/dialogs/createspritedialog.cpp index 1ad7527..f7702ed 100644 --- a/dialogs/createspritedialog.cpp +++ b/dialogs/createspritedialog.cpp @@ -10,7 +10,7 @@ CreateSpriteDialog::CreateSpriteDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowCloseButtonHint); diff --git a/dialogs/createspritedialog.ui b/dialogs/createspritedialog.ui index 52a2de5..aff8b14 100644 --- a/dialogs/createspritedialog.ui +++ b/dialogs/createspritedialog.ui @@ -36,6 +36,9 @@ Width: + + spinBoxWidth + @@ -43,6 +46,9 @@ Height: + + spinBoxHeight + diff --git a/dialogs/editspritedialog.cpp b/dialogs/editspritedialog.cpp index 68c33eb..1a26006 100644 --- a/dialogs/editspritedialog.cpp +++ b/dialogs/editspritedialog.cpp @@ -18,7 +18,7 @@ EditSpriteDialog::EditSpriteDialog(const std::vector &pixmaps, const QS m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowMinimizeButtonHint); setWindowFlag(Qt::WindowMaximizeButtonHint); diff --git a/dialogs/extensionpackagesdialog.cpp b/dialogs/extensionpackagesdialog.cpp index 4ca611e..e3c6b2f 100644 --- a/dialogs/extensionpackagesdialog.cpp +++ b/dialogs/extensionpackagesdialog.cpp @@ -1,6 +1,8 @@ #include "extensionpackagesdialog.h" #include "ui_extensionpackagesdialog.h" +#include "installextensiondialog.h" + ExtensionPackagesDialog::ExtensionPackagesDialog(QWidget *parent) : QDialog{parent}, m_ui{std::make_unique()} @@ -8,7 +10,7 @@ ExtensionPackagesDialog::ExtensionPackagesDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowCloseButtonHint); @@ -16,8 +18,19 @@ ExtensionPackagesDialog::ExtensionPackagesDialog(QWidget *parent) : button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); - m_ui->buttonBox->addButton(tr("Install"), QDialogButtonBox::ActionRole) - ->setIcon(QIcon{":/qtgameengine/icons/extension-packages-file.png"}); + + if (auto button = m_ui->buttonBox->addButton(tr("Install"), QDialogButtonBox::ActionRole)) + { + button->setIcon(QIcon{":/qtgameengine/icons/extension-packages-file.png"}); + connect(button, &QAbstractButton::clicked, + this, &ExtensionPackagesDialog::install); + } } ExtensionPackagesDialog::~ExtensionPackagesDialog() = default; + +void ExtensionPackagesDialog::install() +{ + InstallExtensionDialog dialog{this}; + dialog.exec(); +} diff --git a/dialogs/extensionpackagesdialog.h b/dialogs/extensionpackagesdialog.h index 28d09e4..56fc24a 100644 --- a/dialogs/extensionpackagesdialog.h +++ b/dialogs/extensionpackagesdialog.h @@ -14,6 +14,9 @@ public: explicit ExtensionPackagesDialog(QWidget *parent = nullptr); ~ExtensionPackagesDialog(); +private slots: + void install(); + private: const std::unique_ptr m_ui; }; diff --git a/dialogs/fontpropertiesdialog.cpp b/dialogs/fontpropertiesdialog.cpp index 22ba06f..c697588 100644 --- a/dialogs/fontpropertiesdialog.cpp +++ b/dialogs/fontpropertiesdialog.cpp @@ -35,13 +35,13 @@ FontPropertiesDialog::FontPropertiesDialog(Font &font, ProjectTreeModel &project connect(&m_projectModel, &ProjectTreeModel::fontNameChanged, this, &FontPropertiesDialog::fontNameChanged); - connect(m_ui->pushButtonNormal, &QAbstractButton::pressed, + connect(m_ui->pushButtonNormal, &QAbstractButton::clicked, this, &FontPropertiesDialog::normalRange); - connect(m_ui->pushButtonDigits, &QAbstractButton::pressed, + connect(m_ui->pushButtonDigits, &QAbstractButton::clicked, this, &FontPropertiesDialog::digitsRange); - connect(m_ui->pushButtonAll, &QAbstractButton::pressed, + connect(m_ui->pushButtonAll, &QAbstractButton::clicked, this, &FontPropertiesDialog::allRange); - connect(m_ui->pushButtonLetters, &QAbstractButton::pressed, + connect(m_ui->pushButtonLetters, &QAbstractButton::clicked, this, &FontPropertiesDialog::lettersRange); connect(m_ui->lineEditName, &QLineEdit::textChanged, @@ -64,6 +64,12 @@ FontPropertiesDialog::~FontPropertiesDialog() = default; void FontPropertiesDialog::accept() { + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + if (m_font.name != m_ui->lineEditName->text()) { if (!m_projectModel.rename(m_font, m_ui->lineEditName->text())) diff --git a/dialogs/gameinformationdialog.cpp b/dialogs/gameinformationdialog.cpp index f7f3020..0bb4fc3 100644 --- a/dialogs/gameinformationdialog.cpp +++ b/dialogs/gameinformationdialog.cpp @@ -8,7 +8,7 @@ GameInformationDialog::GameInformationDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowMinimizeButtonHint); setWindowFlag(Qt::WindowMaximizeButtonHint); diff --git a/dialogs/globalgamesettingsdialog.cpp b/dialogs/globalgamesettingsdialog.cpp index 903699b..db5ab1e 100644 --- a/dialogs/globalgamesettingsdialog.cpp +++ b/dialogs/globalgamesettingsdialog.cpp @@ -11,7 +11,7 @@ GlobalGameSettingsDialog::GlobalGameSettingsDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowCloseButtonHint); diff --git a/dialogs/globalgamesettingsdialog.ui b/dialogs/globalgamesettingsdialog.ui index f4fb4de..07c8735 100644 --- a/dialogs/globalgamesettingsdialog.ui +++ b/dialogs/globalgamesettingsdialog.ui @@ -106,6 +106,9 @@ Color outside the room region: + + toolButtonColorOutside + diff --git a/dialogs/imageeditordialog.cpp b/dialogs/imageeditordialog.cpp index 58e72fc..c5bda6f 100644 --- a/dialogs/imageeditordialog.cpp +++ b/dialogs/imageeditordialog.cpp @@ -12,7 +12,7 @@ ImageEditorDialog::ImageEditorDialog(const QPixmap &pixmap, const QString &title m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowMinimizeButtonHint); setWindowFlag(Qt::WindowMaximizeButtonHint); diff --git a/dialogs/includedfilesdialog.ui b/dialogs/includedfilesdialog.ui index aff0970..f36e070 100644 --- a/dialogs/includedfilesdialog.ui +++ b/dialogs/includedfilesdialog.ui @@ -25,35 +25,67 @@ - + + + This is the list of files to be included when creating a stand-alone game. + + + + Add a file to be included + - Add + &Add + + + + :/qtgameengine/icons/add.png:/qtgameengine/icons/add.png + + Change the properties of the included file + - Change + &Change + + + + :/qtgameengine/icons/replace.png:/qtgameengine/icons/replace.png + + Delete the indicated included file + - Delete + &Delete + + + + :/qtgameengine/icons/delete.png:/qtgameengine/icons/delete.png + + Clear the list of included files + - Clear + &Clear + + + + :/qtgameengine/icons/new.png:/qtgameengine/icons/new.png @@ -74,7 +106,9 @@ - + + + buttonBox diff --git a/dialogs/installextensiondialog.cpp b/dialogs/installextensiondialog.cpp new file mode 100644 index 0000000..fb050a4 --- /dev/null +++ b/dialogs/installextensiondialog.cpp @@ -0,0 +1,16 @@ +#include "installextensiondialog.h" +#include "ui_installextensiondialog.h" + +InstallExtensionDialog::InstallExtensionDialog(QWidget *parent) : + QDialog{parent}, + m_ui{std::make_unique()} +{ + m_ui->setupUi(this); + +#ifdef Q_OS_LINUX + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); +#endif + setWindowFlag(Qt::WindowCloseButtonHint); +} + +InstallExtensionDialog::~InstallExtensionDialog() = default; diff --git a/dialogs/installextensiondialog.h b/dialogs/installextensiondialog.h new file mode 100644 index 0000000..6fa63a8 --- /dev/null +++ b/dialogs/installextensiondialog.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include + +namespace Ui { class InstallExtensionDialog; } + +class InstallExtensionDialog : public QDialog +{ + Q_OBJECT + +public: + explicit InstallExtensionDialog(QWidget *parent = nullptr); + ~InstallExtensionDialog(); + +private: + const std::unique_ptr m_ui; +}; diff --git a/dialogs/installextensiondialog.ui b/dialogs/installextensiondialog.ui new file mode 100644 index 0000000..2d02a46 --- /dev/null +++ b/dialogs/installextensiondialog.ui @@ -0,0 +1,78 @@ + + + InstallExtensionDialog + + + + 0 + 0 + 400 + 300 + + + + Installing Extension Packages + + + + + + + + Installed Packages: + + + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + InstallExtensionDialog + accept() + + + 350 + 149 + + + 199 + 149 + + + + + buttonBox + rejected() + InstallExtensionDialog + reject() + + + 350 + 149 + + + 199 + 149 + + + + + diff --git a/dialogs/maskpropertiesdialog.cpp b/dialogs/maskpropertiesdialog.cpp index 389a3f2..693192f 100644 --- a/dialogs/maskpropertiesdialog.cpp +++ b/dialogs/maskpropertiesdialog.cpp @@ -8,7 +8,7 @@ MaskPropertiesDialog::MaskPropertiesDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowCloseButtonHint); } diff --git a/dialogs/objectpropertiesdialog.cpp b/dialogs/objectpropertiesdialog.cpp index 5c34295..63ea67e 100644 --- a/dialogs/objectpropertiesdialog.cpp +++ b/dialogs/objectpropertiesdialog.cpp @@ -1,11 +1,228 @@ #include "objectpropertiesdialog.h" #include "ui_objectpropertiesdialog.h" +#include +#include +#include + +#include + +#include "projectcontainer.h" +#include "projecttreemodel.h" +#include "objecteventsmodel.h" +#include "objectactionsmodel.h" + ObjectPropertiesDialog::ObjectPropertiesDialog(Object &object, ProjectTreeModel &projectModel, QWidget *parent) : QDialog{parent}, - m_ui{std::make_unique()} + m_ui{std::make_unique()}, + m_object{object}, + m_projectModel{projectModel}, + m_eventsModel{std::make_unique()}, + m_actionsModel{std::make_unique()}, + m_spritesMenu{new QMenu{m_ui->toolButtonSprite}}, + m_spriteName{object.spriteName} { m_ui->setupUi(this); + + updateTitle(); + + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok)) + button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) + button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); + + m_ui->lineEditName->setText(m_object.name); + m_ui->lineEditSprite->setText(m_spriteName.isEmpty() ? tr("") : m_spriteName); + if (!m_spriteName.isEmpty()) + { + const auto &sprites = m_projectModel.project()->sprites; + const auto iter = std::find_if(std::cbegin(sprites), std::cend(sprites), + [&](const Sprite &sprite){ return sprite.name == m_spriteName; }); + if (iter == std::cend(sprites)) + qWarning() << "sprite" << m_spriteName << "not found"; + else + m_ui->labelSpritePreview->setPixmap(iter->pixmaps.empty() ? QPixmap{} : iter->pixmaps.front().scaled(m_ui->labelSpritePreview->size(), Qt::KeepAspectRatio)); + } + m_ui->toolButtonSprite->setMenu(m_spritesMenu); + m_ui->checkBoxVisible->setChecked(m_object.visible); + m_ui->checkBoxSolid->setChecked(m_object.solid); + m_ui->spinBoxDepth->setValue(m_object.depth); + m_ui->checkBoxPersistent->setChecked(m_object.persistent); + + m_ui->listViewEvents->setModel(m_eventsModel.get()); + + connect(&m_projectModel, &ProjectTreeModel::objectNameChanged, + this, &ObjectPropertiesDialog::objectNameChanged); + + connect(m_ui->pushButtonNewSprite, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::newSprite); + connect(m_ui->pushButtonEditSprite, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::editSprite); + connect(m_ui->pushButtonShowInformation, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::showInformation); + connect(m_ui->pushButtonAddEvent, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::addEvent); + connect(m_ui->pushButtonDeleteEvent, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::deleteEvent); + connect(m_ui->pushButtonChangeEvent, &QAbstractButton::clicked, + this, &ObjectPropertiesDialog::replaceEvent); + + connect(m_ui->lineEditName, &QLineEdit::textChanged, + this, &ObjectPropertiesDialog::changed); + connect(m_ui->checkBoxVisible, &QCheckBox::toggled, + this, &ObjectPropertiesDialog::changed); + connect(m_ui->checkBoxSolid, &QCheckBox::toggled, + this, &ObjectPropertiesDialog::changed); + connect(m_ui->spinBoxDepth, &QSpinBox::valueChanged, + this, &ObjectPropertiesDialog::changed); + connect(m_ui->checkBoxPersistent, &QCheckBox::toggled, + this, &ObjectPropertiesDialog::changed); + + connect(m_spritesMenu, &QMenu::aboutToShow, + this, &ObjectPropertiesDialog::spritesMenuAboutToShow); } ObjectPropertiesDialog::~ObjectPropertiesDialog() = default; + +void ObjectPropertiesDialog::accept() +{ + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + + if (m_object.name != m_ui->lineEditName->text()) + { + if (!m_projectModel.rename(m_object, m_ui->lineEditName->text())) + { + QMessageBox::critical(this, tr("Renaming Object failed!"), tr("Renaming Object failed!")); + return; + } + } + + m_object.spriteName = m_spriteName; + m_object.visible = m_ui->checkBoxVisible->isChecked(); + m_object.solid = m_ui->checkBoxSolid->isChecked(); + m_object.depth = m_ui->spinBoxDepth->value(); + m_object.persistent = m_ui->checkBoxPersistent->isChecked(); + + QDialog::accept(); +} + +void ObjectPropertiesDialog::reject() +{ + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + + const auto result = QMessageBox::warning( + this, + tr("The Object 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 ObjectPropertiesDialog::newSprite() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::editSprite() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::showInformation() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::addEvent() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::deleteEvent() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::replaceEvent() +{ + QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented")); +} + +void ObjectPropertiesDialog::changed() +{ + if (!m_unsavedChanges) + { + m_unsavedChanges = true; + updateTitle(); + } +} + +void ObjectPropertiesDialog::objectNameChanged(const Object &object) +{ + if (&object != &m_object) + return; + + { + QSignalBlocker blocker{m_ui->lineEditName}; + m_ui->lineEditName->setText(object.name); + } + + updateTitle(); +} + +void ObjectPropertiesDialog::spritesMenuAboutToShow() +{ + m_spritesMenu->clear(); + m_spritesMenu->addAction(tr(""), this, &ObjectPropertiesDialog::clearSprite); + for (const auto &sprite : m_projectModel.project()->sprites) + m_spritesMenu->addAction(sprite.pixmaps.empty() ? QPixmap{} : sprite.pixmaps.front(), + sprite.name, + this, + [&sprite,this](){ setSprite(sprite); }); +} + +void ObjectPropertiesDialog::clearSprite() +{ + m_ui->labelSpritePreview->setPixmap(QPixmap{}); + m_ui->lineEditSprite->setText(tr("")); + m_spriteName = QString{}; + changed(); +} + +void ObjectPropertiesDialog::setSprite(const Sprite &sprite) +{ + m_ui->labelSpritePreview->setPixmap(sprite.pixmaps.empty() ? QPixmap{} : sprite.pixmaps.front().scaled(m_ui->labelSpritePreview->size(), Qt::KeepAspectRatio)); + m_ui->lineEditSprite->setText(sprite.name); + m_spriteName = sprite.name; + changed(); +} + +void ObjectPropertiesDialog::updateTitle() +{ + setWindowTitle(tr("Object Properties: %0%1") + .arg(m_object.name) + .arg(m_unsavedChanges ? tr("*") : QString{}) + ); +} diff --git a/dialogs/objectpropertiesdialog.h b/dialogs/objectpropertiesdialog.h index be33e33..0404614 100644 --- a/dialogs/objectpropertiesdialog.h +++ b/dialogs/objectpropertiesdialog.h @@ -4,9 +4,13 @@ #include +class QMenu; namespace Ui { class ObjectPropertiesDialog; } struct Object; class ProjectTreeModel; +class ObjectEventsModel; +class ObjectActionsModel; +class Sprite; class ObjectPropertiesDialog : public QDialog { @@ -16,6 +20,40 @@ public: explicit ObjectPropertiesDialog(Object &object, ProjectTreeModel &projectModel, QWidget *parent = nullptr); ~ObjectPropertiesDialog(); + void accept() override; + void reject() override; + +private slots: + void newSprite(); + void editSprite(); + void showInformation(); + void addEvent(); + void deleteEvent(); + void replaceEvent(); + + void changed(); + + void objectNameChanged(const Object &object); + + void spritesMenuAboutToShow(); + + void clearSprite(); + void setSprite(const Sprite &sprite); + private: + void updateTitle(); + const std::unique_ptr m_ui; + + Object &m_object; + ProjectTreeModel &m_projectModel; + + const std::unique_ptr m_eventsModel; + const std::unique_ptr m_actionsModel; + + QMenu * const m_spritesMenu; + + QString m_spriteName; + + bool m_unsavedChanges{}; }; diff --git a/dialogs/objectpropertiesdialog.ui b/dialogs/objectpropertiesdialog.ui index 139e94c..8fc8052 100644 --- a/dialogs/objectpropertiesdialog.ui +++ b/dialogs/objectpropertiesdialog.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 794 + 466 @@ -17,9 +17,473 @@ :/qtgameengine/icons/object-file.png:/qtgameengine/icons/object-file.png + + + + + + + + + Name: + + + lineEditName + + + + + + + + 0 + 0 + + + + The name of the object + + + + + + + + + Sprite + + + + + + + 32 + 0 + + + + + 32 + 16777215 + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + + The sprite used to represent the object + + + true + + + + + + + ... + + + QToolButton::InstantPopup + + + + + + + + + + + + 0 + 0 + + + + Create a new sprite for this object + + + New + + + + + + + + 0 + 0 + + + + Edit the sprite for this object + + + Edit + + + + + + + + + + + + + + + + Whether the object is visible + + + Visible + + + + + + + Whether the object is solid + + + Solid + + + + + + + + + + + Depth: + + + spinBoxDepth + + + + + + + + 0 + 0 + + + + The depth at which the object is drawn + + + + + + + Wheter the object is persistent between rooms + + + Persistent + + + + + + + Parent: + + + lineEditParent + + + + + + + + + + 0 + 0 + + + + The parent from which events and actions are + + + <no parent> + + + + + + + ... + + + + + + + + + + + + 0 + 0 + + + + The image used as a collision mask for the object + + + <same as sprite> + + + + + + + ... + + + + + + + + + Mask: + + + lineEditMask + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 10 + + + + + + + + + 0 + 0 + + + + Show the information about the object + + + Show Information + + + + :/qtgameengine/icons/info.png:/qtgameengine/icons/info.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + QDialogButtonBox::Ok + + + true + + + + + + + + + + + Events: + + + listViewEvents + + + + + + + + 0 + 0 + + + + + + + + Click here to add another event + + + Add Event + + + + + + + + + Delete the currently selected event + + + Delete + + + + + + + Change which event has this behaviour + + + Change + + + + + + + + + + + + + Actions: + + + listViewActions + + + + + + + Drag actions here + + + + + + + + + 0 + + + + + 0 + 0 + 68 + 390 + + + + Page 1 + + + + + + 0 + 0 + 68 + 390 + + + + Page 2 + + + + + - + + + buttonBox + accepted() + ObjectPropertiesDialog + accept() + + + 138 + 511 + + + 423 + 266 + + + + + buttonBox + rejected() + ObjectPropertiesDialog + reject() + + + 138 + 511 + + + 423 + 266 + + + + diff --git a/dialogs/pathpropertiesdialog.cpp b/dialogs/pathpropertiesdialog.cpp index dd1ed4d..db4e13f 100644 --- a/dialogs/pathpropertiesdialog.cpp +++ b/dialogs/pathpropertiesdialog.cpp @@ -108,11 +108,11 @@ PathPropertiesDialog::PathPropertiesDialog(Path &path, ProjectTreeModel &project connect(m_ui->checkBoxClosed, &QCheckBox::toggled, m_ui->widget, &PathPointsWidget::setClosed); - connect(m_ui->pushButtonAdd, &QAbstractButton::pressed, + connect(m_ui->pushButtonAdd, &QAbstractButton::clicked, this, &PathPropertiesDialog::add); - connect(m_ui->pushButtonInsert, &QAbstractButton::pressed, + connect(m_ui->pushButtonInsert, &QAbstractButton::clicked, this, &PathPropertiesDialog::insert); - connect(m_ui->pushButtonDelete, &QAbstractButton::pressed, + connect(m_ui->pushButtonDelete, &QAbstractButton::clicked, this, &PathPropertiesDialog::delete_); connect(m_ui->lineEditName, &QLineEdit::textChanged, diff --git a/dialogs/pathpropertiesdialog.ui b/dialogs/pathpropertiesdialog.ui index 4c9fbd7..71da15e 100644 --- a/dialogs/pathpropertiesdialog.ui +++ b/dialogs/pathpropertiesdialog.ui @@ -191,6 +191,9 @@ X: + + spinBoxX + @@ -208,6 +211,9 @@ Y: + + spinBoxY + @@ -225,6 +231,9 @@ sp: + + spinBoxSp + @@ -341,6 +350,9 @@ Precision: + + spinBoxPrecision + diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 3a1fbaa..3728ea0 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -10,7 +10,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : m_ui->setupUi(this); #ifdef Q_OS_LINUX - setWindowFlags(windowFlags() & ~Qt::Dialog | Qt::Window); + setWindowFlags((windowFlags() & ~Qt::Dialog) | Qt::Window); #endif setWindowFlag(Qt::WindowCloseButtonHint); diff --git a/dialogs/scriptpropertiesdialog.cpp b/dialogs/scriptpropertiesdialog.cpp index 46384b8..908bd84 100644 --- a/dialogs/scriptpropertiesdialog.cpp +++ b/dialogs/scriptpropertiesdialog.cpp @@ -10,36 +10,38 @@ #include "projecttreemodel.h" ScriptPropertiesDialog::ScriptPropertiesDialog(Script &script, ProjectTreeModel &projectModel, QWidget *parent) : - CodeEditorDialog{parent}, + CodeEditorDialog{tr("Script Properties: %0").arg(script.name), parent}, m_script{script}, m_projectModel{projectModel}, m_lineEditName{new QLineEdit{this}} { - updateTitle(); - { auto label = new QLabel{tr("Name:"), this}; label->setBuddy(m_lineEditName); - m_ui->toolBar->addWidget(label); + addToolbarWidget(label); } m_lineEditName->setMaximumWidth(100); - m_ui->toolBar->addWidget(m_lineEditName); + addToolbarWidget(m_lineEditName); m_lineEditName->setText(m_script.name); - m_ui->codeEdit->setPlainText(m_script.script); + setScript(m_script.script); connect(&m_projectModel, &ProjectTreeModel::scriptNameChanged, this, &ScriptPropertiesDialog::scriptNameChanged); connect(m_lineEditName, &QLineEdit::textChanged, this, &ScriptPropertiesDialog::changed); - connect(m_ui->codeEdit, &QPlainTextEdit::textChanged, - this, &ScriptPropertiesDialog::changed); } void ScriptPropertiesDialog::accept() { + if (!m_unsavedChanges) + { + QDialog::reject(); + return; + } + if (m_script.name != m_lineEditName->text()) { if (!m_projectModel.rename