diff --git a/forms/customscriptseditor.ui b/forms/customscriptseditor.ui index cc7dd4f1..e2efa2af 100644 --- a/forms/customscriptseditor.ui +++ b/forms/customscriptseditor.ui @@ -6,7 +6,7 @@ 0 0 - 540 + 582 355 @@ -33,21 +33,30 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised - QFrame::StyledPanel - - - QFrame::Raised + QFrame::Shape::StyledPanel + + 6 + + + 6 + + + 6 + + + 6 + @@ -91,9 +100,9 @@ - + - Qt::Horizontal + Qt::Orientation::Horizontal @@ -103,35 +112,33 @@ + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + + :/icons/help.ico:/icons/help.ico + + + - - - - <html><head/><body><p><a href="https://huderlem.github.io/porymap/manual/scripting-capabilities.html"><span style=" text-decoration: underline; color:#0069d9;">Help</span></a></p></body></html> - - - true - - - - - - - Qt::Vertical - - - QSizePolicy::Minimum - - - - 20 - 5 - - - - @@ -142,32 +149,32 @@ - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false - QAbstractItemView::DragOnly + QAbstractItemView::DragDropMode::DragOnly - Qt::IgnoreAction + Qt::DropAction::IgnoreAction - QAbstractItemView::ExtendedSelection + QAbstractItemView::SelectionMode::ExtendedSelection - Qt::ElideLeft + Qt::TextElideMode::ElideLeft - QListView::Free + QListView::Movement::Free - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok diff --git a/forms/projectsettingseditor.ui b/forms/projectsettingseditor.ui index dc6d730e..9aa521a8 100644 --- a/forms/projectsettingseditor.ui +++ b/forms/projectsettingseditor.ui @@ -125,7 +125,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -194,10 +194,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Maximum + QSizePolicy::Policy::Maximum @@ -276,10 +276,10 @@ .QFrame { border: 1px solid red; } - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -287,7 +287,6 @@ 12 - 75 true @@ -319,7 +318,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -338,7 +337,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -567,10 +566,10 @@ .QFrame { border: 1px solid red; } - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -578,7 +577,6 @@ 12 - 75 true @@ -693,7 +691,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -712,7 +710,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -783,10 +781,10 @@ .QFrame { border: 1px solid red; } - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -794,7 +792,6 @@ 12 - 75 true @@ -839,10 +836,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Maximum + QSizePolicy::Policy::Maximum @@ -924,10 +921,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::MinimumExpanding + QSizePolicy::Policy::MinimumExpanding @@ -975,7 +972,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -1212,7 +1209,7 @@ true - Qt::NoTextInteraction + Qt::TextInteractionFlag::NoTextInteraction Use the dropbown and buttons to add behaviors to the list... @@ -1242,10 +1239,10 @@ .QFrame { border: 1px solid red; } - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -1253,7 +1250,6 @@ 12 - 75 true @@ -1316,7 +1312,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1335,7 +1331,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -1372,18 +1368,13 @@ - + - <html><head/><body><p><a href="https://huderlem.github.io/porymap/manual/project-files.html#files"><span style=" text-decoration: underline; color:#0069d9;">Help</span></a></p></body></html> + ... - - Qt::RichText - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - true + + + :/icons/help.ico:/icons/help.ico @@ -1419,7 +1410,7 @@ 0 0 533 - 440 + 428 @@ -1466,18 +1457,13 @@ - + - <html><head/><body><p><a href="https://huderlem.github.io/porymap/manual/project-files.html#identifiers"><span style=" text-decoration: underline; color:#0069d9;">Help</span></a></p></body></html> + ... - - Qt::RichText - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - true + + + :/icons/help.ico:/icons/help.ico @@ -1513,7 +1499,7 @@ 0 0 533 - 440 + 428 @@ -1544,7 +1530,7 @@ - QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::RestoreDefaults diff --git a/include/core/tileset.h b/include/core/tileset.h index b120b2c5..bb7631d7 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -18,6 +18,7 @@ public: Tileset() = default; Tileset(const Tileset &other); Tileset &operator=(const Tileset &other); + ~Tileset(); public: QString name; @@ -33,7 +34,6 @@ public: QStringList palettePaths; QList tiles; - QList metatiles; QHash metatileLabels; QList> palettes; QList> palettePreviews; @@ -59,6 +59,19 @@ public: bool appendToHeaders(QString root, QString friendlyName, bool usingAsm); bool appendToGraphics(QString root, QString friendlyName, bool usingAsm); bool appendToMetatiles(QString root, QString friendlyName, bool usingAsm); + + void setMetatiles(const QList &metatiles); + void addMetatile(Metatile* metatile); + + QList metatiles() const { return m_metatiles; } + Metatile* metatileAt(unsigned int i) const { return m_metatiles.at(i); } + + void clearMetatiles(); + void resizeMetatiles(unsigned int newNumMetatiles); + int numMetatiles() const { return m_metatiles.length(); } + +private: + QList m_metatiles; }; #endif // TILESET_H diff --git a/include/mainwindow.h b/include/mainwindow.h index 677bd89f..06b9bf78 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -167,6 +167,7 @@ public slots: void on_mainTabBar_tabBarClicked(int index); void on_mapViewTab_tabBarClicked(int index); void onWarpBehaviorWarningClicked(); + void clearOverlay(); private slots: void on_action_Open_Project_triggered(); diff --git a/include/ui/customscriptseditor.h b/include/ui/customscriptseditor.h index c93c7b7d..8d261570 100644 --- a/include/ui/customscriptseditor.h +++ b/include/ui/customscriptseditor.h @@ -49,6 +49,7 @@ private: void restoreWindowState(); void initShortcuts(); QObjectList shortcutableObjects() const; + void openManual(); private slots: void dialogButtonClicked(QAbstractButton *button); diff --git a/include/ui/projectsettingseditor.h b/include/ui/projectsettingseditor.h index 41affa8b..a0a26982 100644 --- a/include/ui/projectsettingseditor.h +++ b/include/ui/projectsettingseditor.h @@ -65,6 +65,8 @@ private: void updateMaskOverlapWarning(QLabel * warning, QList masks); QStringList getWarpBehaviorsList(); void setWarpBehaviorsList(QStringList list); + void openFilesHelp(); + void openIdentifiersHelp(); private slots: void dialogButtonClicked(QAbstractButton *button); diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 7e5729ee..be3a04d4 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -29,8 +29,8 @@ Tileset::Tileset(const Tileset &other) tiles.append(tile.copy()); } - for (auto *metatile : other.metatiles) { - metatiles.append(new Metatile(*metatile)); + for (auto *metatile : other.m_metatiles) { + m_metatiles.append(new Metatile(*metatile)); } } @@ -55,14 +55,42 @@ Tileset &Tileset::operator=(const Tileset &other) { tiles.append(tile.copy()); } - metatiles.clear(); - for (auto *metatile : other.metatiles) { - metatiles.append(new Metatile(*metatile)); + clearMetatiles(); + for (auto *metatile : other.m_metatiles) { + m_metatiles.append(new Metatile(*metatile)); } return *this; } +Tileset::~Tileset() { + clearMetatiles(); +} + +void Tileset::clearMetatiles() { + qDeleteAll(m_metatiles); + m_metatiles.clear(); +} + +void Tileset::setMetatiles(const QList &metatiles) { + clearMetatiles(); + m_metatiles = metatiles; +} + +void Tileset::addMetatile(Metatile* metatile) { + m_metatiles.append(metatile); +} + +void Tileset::resizeMetatiles(unsigned int newNumMetatiles) { + while (m_metatiles.length() > newNumMetatiles) { + delete m_metatiles.takeLast(); + } + const int numTiles = projectConfig.getNumTilesInMetatile(); + while (m_metatiles.length() < newNumMetatiles) { + m_metatiles.append(new Metatile(numTiles)); + } +} + Tileset* Tileset::getTileTileset(int tileId, Tileset *primaryTileset, Tileset *secondaryTileset) { if (tileId < Project::getNumTilesPrimary()) { return primaryTileset; @@ -89,7 +117,7 @@ Metatile* Tileset::getMetatile(int metatileId, Tileset *primaryTileset, Tileset return nullptr; } int index = Metatile::getIndexInTileset(metatileId); - return tileset->metatiles.value(index, nullptr); + return tileset->m_metatiles.value(index, nullptr); } // Metatile labels are stored per-tileset. When looking for a metatile label, first search in the tileset @@ -178,10 +206,10 @@ bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tile if (metatileId >= Project::getNumMetatilesTotal()) return false; - if (metatileId < Project::getNumMetatilesPrimary() && metatileId >= primaryTileset->metatiles.length()) + if (metatileId < Project::getNumMetatilesPrimary() && metatileId >= primaryTileset->numMetatiles()) return false; - if (metatileId >= Project::getNumMetatilesPrimary() + secondaryTileset->metatiles.length()) + if (metatileId >= Project::getNumMetatilesPrimary() + secondaryTileset->numMetatiles()) return false; return true; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2946dbeb..08cdaf8c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1774,7 +1774,7 @@ void MainWindow::on_actionNew_Tileset_triggered() { } mt->tiles.append(tile); } - newSet.metatiles.append(mt); + newSet.addMetatile(mt); } for(int i = 0; i < 16; ++i) { QList currentPal; @@ -3564,6 +3564,11 @@ bool MainWindow::askToFixRegionMapEditor() { return false; } +void MainWindow::clearOverlay() { + if (ui->graphicsView_Map) + ui->graphicsView_Map->clearOverlayMap(); +} + // Attempt to close any open sub-windows of the main window, giving each a chance to abort the process. // Each of these windows is a widget with WA_DeleteOnClose set, so manually deleting them isn't necessary. // Because they're tracked with QPointers nullifying them shouldn't be necessary either, but it seems the diff --git a/src/project.cpp b/src/project.cpp index e6cd7a8e..f3c02ecb 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -1117,7 +1117,7 @@ void Project::saveTilesetMetatileAttributes(Tileset *tileset) { QFile attrs_file(tileset->metatile_attrs_path); if (attrs_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QByteArray data; - for (Metatile *metatile : tileset->metatiles) { + for (const auto &metatile : tileset->metatiles()) { uint32_t attributes = metatile->getAttributes(); for (int i = 0; i < projectConfig.metatileAttributesSize; i++) data.append(static_cast(attributes >> (8 * i))); @@ -1133,7 +1133,7 @@ void Project::saveTilesetMetatiles(Tileset *tileset) { if (metatiles_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QByteArray data; int numTiles = projectConfig.getNumTilesInMetatile(); - for (Metatile *metatile : tileset->metatiles) { + for (const auto &metatile : tileset->metatiles()) { for (int i = 0; i < numTiles; i++) { uint16_t tile = metatile->tiles.at(i).rawValue(); data.append(static_cast(tile)); @@ -1142,7 +1142,7 @@ void Project::saveTilesetMetatiles(Tileset *tileset) { } metatiles_file.write(data); } else { - tileset->metatiles.clear(); + tileset->clearMetatiles(); logError(QString("Could not open tileset metatiles file '%1'").arg(tileset->metatiles_path)); } } @@ -1635,16 +1635,16 @@ void Project::loadTilesetMetatiles(Tileset* tileset) { } metatiles.append(metatile); } - tileset->metatiles = metatiles; + tileset->setMetatiles(metatiles); } else { - tileset->metatiles.clear(); + tileset->clearMetatiles(); logError(QString("Could not open tileset metatiles file '%1'").arg(tileset->metatiles_path)); } QFile attrs_file(tileset->metatile_attrs_path); if (attrs_file.open(QIODevice::ReadOnly)) { QByteArray data = attrs_file.readAll(); - int num_metatiles = tileset->metatiles.count(); + int num_metatiles = tileset->numMetatiles(); int attrSize = projectConfig.metatileAttributesSize; int num_metatileAttrs = data.length() / attrSize; if (num_metatiles != num_metatileAttrs) { @@ -1657,7 +1657,7 @@ void Project::loadTilesetMetatiles(Tileset* tileset) { uint32_t attributes = 0; for (int j = 0; j < attrSize; j++) attributes |= static_cast(data.at(i * attrSize + j)) << (8 * j); - tileset->metatiles.at(i)->setAttributes(attributes); + tileset->metatileAt(i)->setAttributes(attributes); } } else { logError(QString("Could not open tileset metatile attributes file '%1'").arg(tileset->metatile_attrs_path)); diff --git a/src/scriptapi/apimap.cpp b/src/scriptapi/apimap.cpp index d40d3e1c..5df7fc58 100644 --- a/src/scriptapi/apimap.cpp +++ b/src/scriptapi/apimap.cpp @@ -533,13 +533,13 @@ QJSValue MainWindow::getSecondaryTilesetPalettesPreview() { int MainWindow::getNumPrimaryTilesetMetatiles() { if (!this->editor || !this->editor->layout || !this->editor->layout->tileset_primary) return 0; - return this->editor->layout->tileset_primary->metatiles.length(); + return this->editor->layout->tileset_primary->numMetatiles(); } int MainWindow::getNumSecondaryTilesetMetatiles() { if (!this->editor || !this->editor->layout || !this->editor->layout->tileset_secondary) return 0; - return this->editor->layout->tileset_secondary->metatiles.length(); + return this->editor->layout->tileset_secondary->numMetatiles(); } int MainWindow::getNumPrimaryTilesetTiles() { diff --git a/src/scriptapi/scripting.cpp b/src/scriptapi/scripting.cpp index 71fbabca..3eb9afd6 100644 --- a/src/scriptapi/scripting.cpp +++ b/src/scriptapi/scripting.cpp @@ -29,8 +29,6 @@ void Scripting::stop() { } void Scripting::init(MainWindow *mainWindow) { - if (mainWindow->ui->graphicsView_Map) - mainWindow->ui->graphicsView_Map->clearOverlayMap(); Scripting::stop(); instance = new Scripting(mainWindow); } @@ -50,6 +48,7 @@ Scripting::Scripting(MainWindow *mainWindow) { } Scripting::~Scripting() { + if (mainWindow) mainWindow->clearOverlay(); this->engine->setInterrupted(true); qDeleteAll(this->imageCache); delete this->engine; diff --git a/src/ui/customscriptseditor.cpp b/src/ui/customscriptseditor.cpp index 40195d18..284ea333 100644 --- a/src/ui/customscriptseditor.cpp +++ b/src/ui/customscriptseditor.cpp @@ -23,6 +23,7 @@ CustomScriptsEditor::CustomScriptsEditor(QWidget *parent) : for (int i = 0; i < paths.length(); i++) this->displayScript(paths.at(i), enabled.at(i)); + connect(ui->button_Help, &QAbstractButton::clicked, this, &CustomScriptsEditor::openManual); connect(ui->button_CreateNewScript, &QAbstractButton::clicked, this, &CustomScriptsEditor::createNewScript); connect(ui->button_LoadScript, &QAbstractButton::clicked, this, &CustomScriptsEditor::loadScript); connect(ui->button_RefreshScripts, &QAbstractButton::clicked, this, &CustomScriptsEditor::userRefreshScripts); @@ -229,6 +230,11 @@ void CustomScriptsEditor::openSelectedScripts() { this->openScript(item); } +void CustomScriptsEditor::openManual() { + static const QUrl url("https://huderlem.github.io/porymap/manual/scripting-capabilities.html"); + QDesktopServices::openUrl(url); +} + // When the user refreshes the scripts we show a little tooltip as feedback. // We don't want this tooltip to display when we refresh programmatically, like when changes are saved. void CustomScriptsEditor::userRefreshScripts() { diff --git a/src/ui/graphicsview.cpp b/src/ui/graphicsview.cpp index f4de5074..fa04c0f7 100644 --- a/src/ui/graphicsview.cpp +++ b/src/ui/graphicsview.cpp @@ -25,8 +25,9 @@ void GraphicsView::moveEvent(QMoveEvent *event) { } void MapView::drawForeground(QPainter *painter, const QRectF&) { - foreach (Overlay * overlay, this->overlayMap) - overlay->renderItems(painter); + for (auto i = this->overlayMap.constBegin(); i != this->overlayMap.constEnd(); i++) { + i.value()->renderItems(painter); + } if (!editor) return; @@ -56,9 +57,8 @@ void MapView::drawForeground(QPainter *painter, const QRectF&) { } void MapView::clearOverlayMap() { - foreach (Overlay * overlay, this->overlayMap) { - overlay->clearItems(); - delete overlay; + for (auto i = this->overlayMap.constBegin(); i != this->overlayMap.constEnd(); i++) { + delete i.value(); } this->overlayMap.clear(); } diff --git a/src/ui/gridsettings.cpp b/src/ui/gridsettings.cpp index b4e180af..d3346f11 100644 --- a/src/ui/gridsettings.cpp +++ b/src/ui/gridsettings.cpp @@ -117,6 +117,7 @@ void GridSettingsDialog::init() { connect(ui->button_LinkDimensions, &QAbstractButton::toggled, [this](bool on) { m_dimensionsLinked = on; }); connect(ui->button_LinkOffsets, &QAbstractButton::toggled, [this](bool on) { m_offsetsLinked = on; }); connect(ui->colorInput, &ColorInputWidget::colorChanged, this, &GridSettingsDialog::onColorChanged); + connect(this, &GridSettingsDialog::rejected, [this] { setSettings(m_originalSettings); }); updateInput(); } @@ -218,11 +219,10 @@ void GridSettingsDialog::dialogButtonClicked(QAbstractButton *button) { auto role = ui->buttonBox->buttonRole(button); if (role == QDialogButtonBox::AcceptRole) { // "OK" - close(); + accept(); } else if (role == QDialogButtonBox::RejectRole) { // "Cancel" - setSettings(m_originalSettings); - close(); + reject(); } else if (role == QDialogButtonBox::ResetRole) { // "Restore Defaults" setSettings(m_defaultSettings); diff --git a/src/ui/metatilelayersitem.cpp b/src/ui/metatilelayersitem.cpp index e4a1e74e..3050e761 100644 --- a/src/ui/metatilelayersitem.cpp +++ b/src/ui/metatilelayersitem.cpp @@ -24,7 +24,7 @@ void MetatileLayersItem::draw() { QPainter painter(&pixmap); // Draw tile images - int numTiles = projectConfig.getNumTilesInMetatile(); + int numTiles = qMin(projectConfig.getNumTilesInMetatile(), this->metatile ? this->metatile->tiles.length() : 0); for (int i = 0; i < numTiles; i++) { Tile tile = this->metatile->tiles.at(i); QImage tileImage = getPalettedTileImage(tile.tileId, this->primaryTileset, this->secondaryTileset, tile.palette, true) diff --git a/src/ui/metatileselector.cpp b/src/ui/metatileselector.cpp index b7a5ac75..1214e289 100644 --- a/src/ui/metatileselector.cpp +++ b/src/ui/metatileselector.cpp @@ -14,8 +14,8 @@ void MetatileSelector::draw() { this->setPixmap(QPixmap()); } - int primaryLength = this->primaryTileset->metatiles.length(); - int length_ = primaryLength + this->secondaryTileset->metatiles.length(); + int primaryLength = this->primaryTileset->numMetatiles(); + int length_ = primaryLength + this->secondaryTileset->numMetatiles(); int height_ = length_ / this->numMetatilesWide; if (length_ % this->numMetatilesWide != 0) { height_++; @@ -199,10 +199,10 @@ void MetatileSelector::updateExternalSelectedMetatiles() { uint16_t MetatileSelector::getMetatileId(int x, int y) const { int index = y * this->numMetatilesWide + x; - if (index < this->primaryTileset->metatiles.length()) { + if (index < this->primaryTileset->numMetatiles()) { return static_cast(index); } else { - return static_cast(Project::getNumMetatilesPrimary() + index - this->primaryTileset->metatiles.length()); + return static_cast(Project::getNumMetatilesPrimary() + index - this->primaryTileset->numMetatiles()); } } @@ -215,7 +215,7 @@ QPoint MetatileSelector::getMetatileIdCoords(uint16_t metatileId) { int index = metatileId < Project::getNumMetatilesPrimary() ? metatileId - : metatileId - Project::getNumMetatilesPrimary() + this->primaryTileset->metatiles.length(); + : metatileId - Project::getNumMetatilesPrimary() + this->primaryTileset->numMetatiles(); return QPoint(index % this->numMetatilesWide, index / this->numMetatilesWide); } diff --git a/src/ui/projectsettingseditor.cpp b/src/ui/projectsettingseditor.cpp index ec476558..346591f4 100644 --- a/src/ui/projectsettingseditor.cpp +++ b/src/ui/projectsettingseditor.cpp @@ -37,6 +37,8 @@ ProjectSettingsEditor::~ProjectSettingsEditor() } void ProjectSettingsEditor::connectSignals() { + connect(ui->button_HelpFiles, &QAbstractButton::clicked, this, &ProjectSettingsEditor::openFilesHelp); + connect(ui->button_HelpIdentifiers, &QAbstractButton::clicked, this, &ProjectSettingsEditor::openIdentifiersHelp); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &ProjectSettingsEditor::dialogButtonClicked); connect(ui->button_ImportDefaultPrefabs, &QAbstractButton::clicked, this, &ProjectSettingsEditor::importDefaultPrefabsClicked); connect(ui->comboBox_BaseGameVersion, &QComboBox::currentTextChanged, this, &ProjectSettingsEditor::promptRestoreDefaults); @@ -658,6 +660,16 @@ void ProjectSettingsEditor::dialogButtonClicked(QAbstractButton *button) { } } +void ProjectSettingsEditor::openFilesHelp() { + static const QUrl url("https://huderlem.github.io/porymap/manual/project-files.html#files"); + QDesktopServices::openUrl(url); +} + +void ProjectSettingsEditor::openIdentifiersHelp() { + static const QUrl url("https://huderlem.github.io/porymap/manual/project-files.html#identifiers"); + QDesktopServices::openUrl(url); +} + // Close event triggered by a project reload. User doesn't need any prompts, just close the window. void ProjectSettingsEditor::closeQuietly() { // Turn off flags that trigger prompts diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index bbb105e5..e709bed1 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -32,7 +32,6 @@ TilesetEditor::~TilesetEditor() delete tileSelector; delete metatileLayersItem; delete paletteEditor; - delete metatile; delete primaryTileset; delete secondaryTileset; delete metatilesScene; @@ -41,6 +40,7 @@ TilesetEditor::~TilesetEditor() delete selectedTileScene; delete metatileLayersScene; delete copiedMetatile; + this->metatileHistory.clear(); } void TilesetEditor::update(Layout *layout, QString primaryTilesetLabel, QString secondaryTilesetLabel) { @@ -781,8 +781,8 @@ void TilesetEditor::on_actionChange_Metatiles_Count_triggered() secondarySpinBox->setMinimum(1); primarySpinBox->setMaximum(Project::getNumMetatilesPrimary()); secondarySpinBox->setMaximum(Project::getNumMetatilesTotal() - Project::getNumMetatilesPrimary()); - primarySpinBox->setValue(this->primaryTileset->metatiles.length()); - secondarySpinBox->setValue(this->secondaryTileset->metatiles.length()); + primarySpinBox->setValue(this->primaryTileset->numMetatiles()); + secondarySpinBox->setValue(this->secondaryTileset->numMetatiles()); form.addRow(new QLabel("Primary Tileset"), primarySpinBox); form.addRow(new QLabel("Secondary Tileset"), secondarySpinBox); @@ -792,22 +792,8 @@ void TilesetEditor::on_actionChange_Metatiles_Count_triggered() form.addRow(&buttonBox); if (dialog.exec() == QDialog::Accepted) { - int numPrimaryMetatiles = primarySpinBox->value(); - int numSecondaryMetatiles = secondarySpinBox->value(); - int numTiles = projectConfig.getNumTilesInMetatile(); - while (this->primaryTileset->metatiles.length() > numPrimaryMetatiles) { - delete this->primaryTileset->metatiles.takeLast(); - } - while (this->primaryTileset->metatiles.length() < numPrimaryMetatiles) { - this->primaryTileset->metatiles.append(new Metatile(numTiles)); - } - while (this->secondaryTileset->metatiles.length() > numSecondaryMetatiles) { - delete this->secondaryTileset->metatiles.takeLast(); - } - while (this->secondaryTileset->metatiles.length() < numSecondaryMetatiles) { - this->secondaryTileset->metatiles.append(new Metatile(numTiles)); - } - + this->primaryTileset->resizeMetatiles(primarySpinBox->value()); + this->secondaryTileset->resizeMetatiles(secondarySpinBox->value()); this->metatileSelector->updateSelectedMetatile(); this->refresh(); this->hasUnsavedChanges = true; @@ -1008,20 +994,20 @@ void TilesetEditor::importTilesetMetatiles(Tileset *tileset, bool primary) // Revisit this when tiles and num metatiles are added to tileset editory history. int metatileIdBase = primary ? 0 : Project::getNumMetatilesPrimary(); for (int i = 0; i < metatiles.length(); i++) { - if (i >= tileset->metatiles.length()) { + if (i >= tileset->numMetatiles()) { break; } uint16_t metatileId = static_cast(metatileIdBase + i); QString prevLabel = Tileset::getOwnedMetatileLabel(metatileId, this->primaryTileset, this->secondaryTileset); - Metatile *prevMetatile = new Metatile(*tileset->metatiles.at(i)); + Metatile *prevMetatile = new Metatile(*tileset->metatileAt(i)); MetatileHistoryItem *commit = new MetatileHistoryItem(metatileId, prevMetatile, new Metatile(*metatiles.at(i)), prevLabel, prevLabel); metatileHistory.push(commit); } - tileset->metatiles = metatiles; + tileset->setMetatiles(metatiles); this->refresh(); this->hasUnsavedChanges = true; } @@ -1125,9 +1111,9 @@ void TilesetEditor::countTileUsage() { // check primary tilesets that are used with this secondary tileset for // reference to secondary tiles in primary metatiles - for (Tileset *tileset : primaryTilesets) { - for (Metatile *metatile : tileset->metatiles) { - for (Tile tile : metatile->tiles) { + for (const auto &tileset : primaryTilesets) { + for (const auto &metatile : tileset->metatiles()) { + for (const auto &tile : metatile->tiles) { if (tile.tileId >= Project::getNumTilesPrimary()) this->tileSelector->usedTiles[tile.tileId]++; } @@ -1136,8 +1122,8 @@ void TilesetEditor::countTileUsage() { // do the opposite for primary tiles in secondary metatiles for (Tileset *tileset : secondaryTilesets) { - for (Metatile *metatile : tileset->metatiles) { - for (Tile tile : metatile->tiles) { + for (const auto &metatile : tileset->metatiles()) { + for (const auto &tile : metatile->tiles) { if (tile.tileId < Project::getNumTilesPrimary()) this->tileSelector->usedTiles[tile.tileId]++; } @@ -1145,15 +1131,15 @@ void TilesetEditor::countTileUsage() { } // check this primary tileset metatiles - for (Metatile *metatile : this->primaryTileset->metatiles) { - for (Tile tile : metatile->tiles) { + for (const auto &metatile : this->primaryTileset->metatiles()) { + for (const auto &tile : metatile->tiles) { this->tileSelector->usedTiles[tile.tileId]++; } } // and the secondary metatiles - for (Metatile *metatile : this->secondaryTileset->metatiles) { - for (Tile tile : metatile->tiles) { + for (const auto &metatile : this->secondaryTileset->metatiles()) { + for (const auto &tile : metatile->tiles) { this->tileSelector->usedTiles[tile.tileId]++; } } diff --git a/src/ui/tileseteditormetatileselector.cpp b/src/ui/tileseteditormetatileselector.cpp index b18fcca6..778fde9c 100644 --- a/src/ui/tileseteditormetatileselector.cpp +++ b/src/ui/tileseteditormetatileselector.cpp @@ -22,24 +22,24 @@ int TilesetEditorMetatileSelector::numRows(int numMetatiles) { } int TilesetEditorMetatileSelector::numRows() { - return this->numRows(this->primaryTileset->metatiles.length() + this->secondaryTileset->metatiles.length()); + return this->numRows(this->primaryTileset->numMetatiles() + this->secondaryTileset->numMetatiles()); } QImage TilesetEditorMetatileSelector::buildAllMetatilesImage() { - return this->buildImage(0, this->primaryTileset->metatiles.length() + this->secondaryTileset->metatiles.length()); + return this->buildImage(0, this->primaryTileset->numMetatiles() + this->secondaryTileset->numMetatiles()); } QImage TilesetEditorMetatileSelector::buildPrimaryMetatilesImage() { - return this->buildImage(0, this->primaryTileset->metatiles.length()); + return this->buildImage(0, this->primaryTileset->numMetatiles()); } QImage TilesetEditorMetatileSelector::buildSecondaryMetatilesImage() { - return this->buildImage(Project::getNumMetatilesPrimary(), this->secondaryTileset->metatiles.length()); + return this->buildImage(Project::getNumMetatilesPrimary(), this->secondaryTileset->numMetatiles()); } QImage TilesetEditorMetatileSelector::buildImage(int metatileIdStart, int numMetatiles) { int numMetatilesHigh = this->numRows(numMetatiles); - int numPrimary = this->primaryTileset->metatiles.length(); + int numPrimary = this->primaryTileset->numMetatiles(); int maxPrimary = Project::getNumMetatilesPrimary(); bool includesPrimary = metatileIdStart < maxPrimary; @@ -96,7 +96,7 @@ void TilesetEditorMetatileSelector::updateSelectedMetatile() { if (Tileset::metatileIsValid(metatileId, this->primaryTileset, this->secondaryTileset)) this->selectedMetatile = metatileId; else - this->selectedMetatile = Project::getNumMetatilesPrimary() + this->secondaryTileset->metatiles.length() - 1; + this->selectedMetatile = Project::getNumMetatilesPrimary() + this->secondaryTileset->numMetatiles() - 1; emit selectedMetatileChanged(this->selectedMetatile); } @@ -106,10 +106,10 @@ uint16_t TilesetEditorMetatileSelector::getSelectedMetatileId() { uint16_t TilesetEditorMetatileSelector::getMetatileId(int x, int y) { int index = y * this->numMetatilesWide + x; - if (index < this->primaryTileset->metatiles.length()) { + if (index < this->primaryTileset->numMetatiles()) { return static_cast(index); } else { - return static_cast(Project::getNumMetatilesPrimary() + index - this->primaryTileset->metatiles.length()); + return static_cast(Project::getNumMetatilesPrimary() + index - this->primaryTileset->numMetatiles()); } } @@ -155,7 +155,7 @@ QPoint TilesetEditorMetatileSelector::getMetatileIdCoords(uint16_t metatileId) { } int index = metatileId < Project::getNumMetatilesPrimary() ? metatileId - : metatileId - Project::getNumMetatilesPrimary() + this->primaryTileset->metatiles.length(); + : metatileId - Project::getNumMetatilesPrimary() + this->primaryTileset->numMetatiles(); return QPoint(index % this->numMetatilesWide, index / this->numMetatilesWide); } @@ -232,8 +232,8 @@ void TilesetEditorMetatileSelector::drawUnused() { QPainter unusedPainter(&metatilesPixmap); unusedPainter.setOpacity(0.5); - int primaryLength = this->primaryTileset->metatiles.length(); - int length_ = primaryLength + this->secondaryTileset->metatiles.length(); + int primaryLength = this->primaryTileset->numMetatiles(); + int length_ = primaryLength + this->secondaryTileset->numMetatiles(); for (int i = 0; i < length_; i++) { int tile = i; @@ -271,8 +271,8 @@ void TilesetEditorMetatileSelector::drawCounts() { whitePen.setWidth(1); countPainter.setPen(whitePen); - int primaryLength = this->primaryTileset->metatiles.length(); - int length_ = primaryLength + this->secondaryTileset->metatiles.length(); + int primaryLength = this->primaryTileset->numMetatiles(); + int length_ = primaryLength + this->secondaryTileset->numMetatiles(); for (int i = 0; i < length_; i++) { int tile = i; diff --git a/src/ui/wildmonchart.cpp b/src/ui/wildmonchart.cpp index 375edbf4..32ff9bc9 100644 --- a/src/ui/wildmonchart.cpp +++ b/src/ui/wildmonchart.cpp @@ -82,6 +82,7 @@ void WildMonChart::clearTableData() { ui->comboBox_Species->clear(); ui->comboBox_Group->clear(); ui->comboBox_Group->setEnabled(false); + ui->label_Group->setEnabled(false); } // Extract all the data from the table that we need for the charts @@ -152,7 +153,9 @@ void WildMonChart::readTable() { ui->comboBox_Species->addItems(getSpeciesNamesAlphabetical()); ui->comboBox_Group->clear(); ui->comboBox_Group->addItems(this->groupNames); - ui->comboBox_Group->setEnabled(usesGroupLabels()); + bool enableGroupSelection = usesGroupLabels(); + ui->comboBox_Group->setEnabled(enableGroupSelection); + ui->label_Group->setEnabled(enableGroupSelection); } void WildMonChart::refresh() { @@ -438,23 +441,33 @@ void WildMonChart::limitChartAnimation() { void WildMonChart::showHelpDialog() { static const QString text = "This window provides some visualizations of the data in your current Wild Pokémon tab"; - static const QString informative = - "The Species Distribution tab shows the cumulative encounter chance for each species " + + // Describe the Species Distribution tab + static const QString speciesTabInfo = + "The Species Distribution tab shows the cumulative encounter chance for each species " "in the table. In other words, it answers the question \"What is the likelihood of encountering " - "each species in a single encounter?\"" - "

" + "each species in a single encounter?\""; + + // Describe the Level Distribution tab + static const QString levelTabInfo = "The Level Distribution tab shows the chance of encountering each species at a particular level. " "In the top left under Group you can select which encounter group to show data for. " - "In the top right under Species you can select which species to show data for. " + "In the top right you can enable Individual Mode. When enabled data will be shown for only the selected species." "

" - "Individual Mode on the Level Distribution tab toggles whether data is shown for all species in the table. " - "The percentages will update to reflect whether you're showing all species or just that individual species. " "In other words, while Individual Mode is checked the chart is answering the question \"If a species x " "is encountered, what is the likelihood that it will be level y\", and while Individual Mode is not checked, " "it answers the question \"For a single encounter, what is the likelihood of encountering a species x at level y.\""; + + QString informativeText; + if (ui->tabWidget->currentWidget() == ui->tabSpecies) { + informativeText = speciesTabInfo; + } else if (ui->tabWidget->currentWidget() == ui->tabLevels) { + informativeText = levelTabInfo; + } + QMessageBox msgBox(QMessageBox::Information, "porymap", text, QMessageBox::Close, this); msgBox.setTextFormat(Qt::RichText); - msgBox.setInformativeText(informative); + msgBox.setInformativeText(informativeText); msgBox.exec(); }