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();
}