From 7fdcd5386d5240b48dc35e503e9bb9a7c5dc0ea2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 11 Jan 2022 02:35:26 +0100 Subject: [PATCH] Lots of fixes and added more dialogs --- QtGameMaker.pro | 16 +- codeeditorwidget.cpp | 1 + constantsmodel.cpp | 4 + dialogs/backgroundpropertiesdialog.cpp | 6 +- dialogs/backgroundpropertiesdialog.h | 1 - dialogs/codeeditordialog.cpp | 83 ++++- dialogs/codeeditordialog.h | 26 +- dialogs/createspritedialog.cpp | 2 +- dialogs/createspritedialog.ui | 6 + dialogs/editspritedialog.cpp | 2 +- dialogs/extensionpackagesdialog.cpp | 19 +- dialogs/extensionpackagesdialog.h | 3 + dialogs/fontpropertiesdialog.cpp | 14 +- dialogs/gameinformationdialog.cpp | 2 +- dialogs/globalgamesettingsdialog.cpp | 2 +- dialogs/globalgamesettingsdialog.ui | 3 + dialogs/imageeditordialog.cpp | 2 +- dialogs/includedfilesdialog.ui | 46 ++- dialogs/installextensiondialog.cpp | 16 + dialogs/installextensiondialog.h | 19 + dialogs/installextensiondialog.ui | 78 ++++ dialogs/maskpropertiesdialog.cpp | 2 +- dialogs/objectpropertiesdialog.cpp | 219 +++++++++++- dialogs/objectpropertiesdialog.h | 38 ++ dialogs/objectpropertiesdialog.ui | 470 ++++++++++++++++++++++++- dialogs/pathpropertiesdialog.cpp | 6 +- dialogs/pathpropertiesdialog.ui | 12 + dialogs/preferencesdialog.cpp | 2 +- dialogs/scriptpropertiesdialog.cpp | 72 +--- dialogs/scriptpropertiesdialog.h | 7 - dialogs/soundpropertiesdialog.cpp | 10 +- dialogs/soundpropertiesdialog.h | 1 - dialogs/spritepropertiesdialog.cpp | 10 +- dialogs/spritepropertiesdialog.h | 1 - dialogs/timelinepropertiesdialog.cpp | 179 +++++++++- dialogs/timelinepropertiesdialog.h | 30 ++ dialogs/timelinepropertiesdialog.ui | 338 +++++++++++++++++- dialogs/triggerconditiondialog.cpp | 4 +- dialogs/triggersdialog.cpp | 43 ++- dialogs/triggersdialog.h | 6 + dialogs/triggersdialog.ui | 66 +++- dialogs/userdefinedconstantsdialog.cpp | 67 ++++ dialogs/userdefinedconstantsdialog.h | 11 + dialogs/userdefinedconstantsdialog.ui | 63 ++++ drawingcanvaswidget.cpp | 28 +- futurecpp.h | 3 + icons/add.png | Bin 0 -> 4769 bytes icons/arrow-down.png | Bin 3178 -> 3488 bytes icons/arrow-left.png | Bin 3201 -> 3820 bytes icons/arrow-right.png | Bin 3238 -> 3839 bytes icons/arrow-up.png | Bin 3091 -> 3639 bytes icons/info.png | Bin 0 -> 5918 bytes icons/merge.png | Bin 0 -> 10622 bytes icons/replace.png | Bin 0 -> 6358 bytes icons/sort.png | Bin 0 -> 4338 bytes includedfilesmodel.cpp | 3 + main.cpp | 16 +- mainwindow.cpp | 140 ++++---- mainwindow.h | 3 +- objectactionsmodel.cpp | 19 + objectactionsmodel.h | 14 + objecteventsmodel.cpp | 19 + objecteventsmodel.h | 14 + pathpointsmodel.cpp | 2 + pathpointswidget.cpp | 4 + projectcontainer.cpp | 10 + projectcontainer.h | 5 + projecttreemodel.cpp | 26 +- projecttreemodel.h | 3 + resources.qrc | 5 + spritesmodel.cpp | 1 + timelineactionsmodel.cpp | 19 + timelineactionsmodel.h | 14 + timelinemomentsmodel.cpp | 19 + timelinemomentsmodel.h | 14 + triggersmodel.cpp | 3 + 76 files changed, 2196 insertions(+), 196 deletions(-) create mode 100644 dialogs/installextensiondialog.cpp create mode 100644 dialogs/installextensiondialog.h create mode 100644 dialogs/installextensiondialog.ui create mode 100644 icons/add.png create mode 100644 icons/info.png create mode 100644 icons/merge.png create mode 100644 icons/replace.png create mode 100644 icons/sort.png create mode 100644 objectactionsmodel.cpp create mode 100644 objectactionsmodel.h create mode 100644 objecteventsmodel.cpp create mode 100644 objecteventsmodel.h create mode 100644 timelineactionsmodel.cpp create mode 100644 timelineactionsmodel.h create mode 100644 timelinemomentsmodel.cpp create mode 100644 timelinemomentsmodel.h 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