mirror of
https://github.com/huderlem/porymap.git
synced 2026-04-26 07:48:05 -05:00
Add utility.cpp, fix bug when map/layout name is just underscores
This commit is contained in:
parent
67c3a4befd
commit
1b510b6a6e
|
|
@ -45,7 +45,8 @@ public:
|
||||||
void setConstantName(const QString &constantName) { m_constantName = constantName; }
|
void setConstantName(const QString &constantName) { m_constantName = constantName; }
|
||||||
QString constantName() const { return m_constantName; }
|
QString constantName() const { return m_constantName; }
|
||||||
|
|
||||||
static QString mapConstantFromName(QString mapName, bool includePrefix = true);
|
static QString mapConstantFromName(const QString &name);
|
||||||
|
QString expectedConstantName() const { return Map::mapConstantFromName(m_name); }
|
||||||
|
|
||||||
void setLayout(Layout *layout);
|
void setLayout(Layout *layout);
|
||||||
Layout* layout() const { return m_layout; }
|
Layout* layout() const { return m_layout; }
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,7 @@ public:
|
||||||
Layout() {}
|
Layout() {}
|
||||||
Layout(const Layout &other);
|
Layout(const Layout &other);
|
||||||
|
|
||||||
static QString layoutConstantFromName(QString mapName);
|
static QString layoutConstantFromName(const QString &name);
|
||||||
static QString defaultSuffix();
|
|
||||||
|
|
||||||
|
|
||||||
bool loaded = false;
|
bool loaded = false;
|
||||||
|
|
||||||
|
|
|
||||||
13
include/core/utility.h
Normal file
13
include/core/utility.h
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
#ifndef UTILITY_H
|
||||||
|
#define UTILITY_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace Util {
|
||||||
|
void numericalModeSort(QStringList &list);
|
||||||
|
int roundUp(int numToRound, int multiple);
|
||||||
|
QString toDefineCase(QString input);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // UTILITY_H
|
||||||
|
|
@ -248,8 +248,6 @@ public:
|
||||||
static QString getEmptyMapsecName();
|
static QString getEmptyMapsecName();
|
||||||
static QString getMapGroupPrefix();
|
static QString getMapGroupPrefix();
|
||||||
|
|
||||||
static void numericalModeSort(QStringList &list);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMap<QString, QString> mapSectionDisplayNames;
|
QMap<QString, QString> mapSectionDisplayNames;
|
||||||
QMap<QString, qint64> modifiedFileTimestamps;
|
QMap<QString, qint64> modifiedFileTimestamps;
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ SOURCES += src/core/advancemapparser.cpp \
|
||||||
src/core/parseutil.cpp \
|
src/core/parseutil.cpp \
|
||||||
src/core/tile.cpp \
|
src/core/tile.cpp \
|
||||||
src/core/tileset.cpp \
|
src/core/tileset.cpp \
|
||||||
|
src/core/utility.cpp \
|
||||||
src/core/validator.cpp \
|
src/core/validator.cpp \
|
||||||
src/core/regionmap.cpp \
|
src/core/regionmap.cpp \
|
||||||
src/core/wildmoninfo.cpp \
|
src/core/wildmoninfo.cpp \
|
||||||
|
|
@ -162,6 +163,7 @@ HEADERS += include/core/advancemapparser.h \
|
||||||
include/core/parseutil.h \
|
include/core/parseutil.h \
|
||||||
include/core/tile.h \
|
include/core/tile.h \
|
||||||
include/core/tileset.h \
|
include/core/tileset.h \
|
||||||
|
include/core/utility.h \
|
||||||
include/core/validator.h \
|
include/core/validator.h \
|
||||||
include/core/regionmap.h \
|
include/core/regionmap.h \
|
||||||
include/core/wildmoninfo.h \
|
include/core/wildmoninfo.h \
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "imageproviders.h"
|
#include "imageproviders.h"
|
||||||
#include "scripting.h"
|
#include "scripting.h"
|
||||||
|
#include "utility.h"
|
||||||
#include "editcommands.h"
|
#include "editcommands.h"
|
||||||
|
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
@ -56,14 +56,9 @@ void Map::setLayout(Layout *layout) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Map::mapConstantFromName(QString mapName, bool includePrefix) {
|
// We don't enforce this for existing maps, but for creating new maps we need to formulaically generate a new MAP_NAME ID.
|
||||||
// Transform map names of the form 'GraniteCave_B1F` into map constants like 'MAP_GRANITE_CAVE_B1F'.
|
QString Map::mapConstantFromName(const QString &name) {
|
||||||
static const QRegularExpression caseChange("([a-z])([A-Z])");
|
return projectConfig.getIdentifier(ProjectIdentifier::define_map_prefix) + Util::toDefineCase(name);
|
||||||
QString nameWithUnderscores = mapName.replace(caseChange, "\\1_\\2");
|
|
||||||
const QString prefix = includePrefix ? projectConfig.getIdentifier(ProjectIdentifier::define_map_prefix) : "";
|
|
||||||
QString withMapAndUppercase = prefix + nameWithUnderscores.toUpper();
|
|
||||||
static const QRegularExpression underscores("_+");
|
|
||||||
return withMapAndUppercase.replace(underscores, "_");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Map::getWidth() const {
|
int Map::getWidth() const {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "scripting.h"
|
#include "scripting.h"
|
||||||
#include "imageproviders.h"
|
#include "imageproviders.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
Layout::Layout(const Layout &other) : Layout() {
|
Layout::Layout(const Layout &other) : Layout() {
|
||||||
copyFrom(&other);
|
copyFrom(&other);
|
||||||
|
|
@ -32,13 +33,9 @@ void Layout::copyFrom(const Layout *other) {
|
||||||
this->border = other->border;
|
this->border = other->border;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Layout::layoutConstantFromName(QString mapName) {
|
QString Layout::layoutConstantFromName(const QString &name) {
|
||||||
// Transform map names of the form 'GraniteCave_B1F` into layout constants like 'LAYOUT_GRANITE_CAVE_B1F'.
|
// TODO: Expose "LAYOUT_" to config
|
||||||
static const QRegularExpression caseChange("([a-z])([A-Z])");
|
return "LAYOUT_" + Util::toDefineCase(name);
|
||||||
QString nameWithUnderscores = mapName.replace(caseChange, "\\1_\\2");
|
|
||||||
QString withMapAndUppercase = "LAYOUT_" + nameWithUnderscores.toUpper();
|
|
||||||
static const QRegularExpression underscores("_+");
|
|
||||||
return withMapAndUppercase.replace(underscores, "_");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Layout::Settings Layout::settings() const {
|
Layout::Settings Layout::settings() const {
|
||||||
|
|
|
||||||
40
src/core/utility.cpp
Normal file
40
src/core/utility.cpp
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
|
#include <QCollator>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
|
||||||
|
// Sometimes we want to sort names alphabetically to make them easier to find in large combo box lists.
|
||||||
|
// QStringList::sort (as of writing) can only sort numbers in lexical order, which has an undesirable
|
||||||
|
// effect (e.g. MAPSEC_ROUTE_10 comes after MAPSEC_ROUTE_1, rather than MAPSEC_ROUTE_9).
|
||||||
|
// We can use QCollator to sort these lists with better handling for numbers.
|
||||||
|
void Util::numericalModeSort(QStringList &list) {
|
||||||
|
static QCollator collator;
|
||||||
|
collator.setNumericMode(true);
|
||||||
|
std::sort(list.begin(), list.end(), collator);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Util::roundUp(int numToRound, int multiple) {
|
||||||
|
if (multiple <= 0)
|
||||||
|
return numToRound;
|
||||||
|
|
||||||
|
int remainder = abs(numToRound) % multiple;
|
||||||
|
if (remainder == 0)
|
||||||
|
return numToRound;
|
||||||
|
|
||||||
|
if (numToRound < 0)
|
||||||
|
return -(abs(numToRound) - remainder);
|
||||||
|
else
|
||||||
|
return numToRound + multiple - remainder;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ex: input 'GraniteCave_B1F' returns 'GRANITE_CAVE_B1F'.
|
||||||
|
QString Util::toDefineCase(QString input) {
|
||||||
|
static const QRegularExpression re_CaseChange("([a-z])([A-Z])");
|
||||||
|
input.replace(re_CaseChange, "\\1_\\2");
|
||||||
|
|
||||||
|
// Remove sequential underscores
|
||||||
|
static const QRegularExpression re_Underscores("_+");
|
||||||
|
input.replace(re_Underscores, "_");
|
||||||
|
|
||||||
|
return input.toUpper();
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include "filedialog.h"
|
#include "filedialog.h"
|
||||||
#include "validator.h"
|
#include "validator.h"
|
||||||
#include "orderedjson.h"
|
#include "orderedjson.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
|
@ -349,7 +350,7 @@ Map *Project::createNewMap(const Project::NewMapSettings &settings, const Map* t
|
||||||
map->setNeedsHealLocation(settings.canFlyTo);
|
map->setNeedsHealLocation(settings.canFlyTo);
|
||||||
|
|
||||||
// Generate a unique MAP constant.
|
// Generate a unique MAP constant.
|
||||||
map->setConstantName(toUniqueIdentifier(Map::mapConstantFromName(map->name())));
|
map->setConstantName(toUniqueIdentifier(map->expectedConstantName()));
|
||||||
|
|
||||||
Layout *layout = this->mapLayouts.value(settings.layout.id);
|
Layout *layout = this->mapLayouts.value(settings.layout.id);
|
||||||
if (!layout) {
|
if (!layout) {
|
||||||
|
|
@ -2074,8 +2075,8 @@ bool Project::readTilesetLabels() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
numericalModeSort(this->primaryTilesetLabels);
|
Util::numericalModeSort(this->primaryTilesetLabels);
|
||||||
numericalModeSort(this->secondaryTilesetLabels);
|
Util::numericalModeSort(this->secondaryTilesetLabels);
|
||||||
|
|
||||||
bool success = true;
|
bool success = true;
|
||||||
if (this->secondaryTilesetLabels.isEmpty()) {
|
if (this->secondaryTilesetLabels.isEmpty()) {
|
||||||
|
|
@ -2348,7 +2349,7 @@ bool Project::readRegionMapSections() {
|
||||||
if (!this->mapSectionIdNames.contains(defaultName)) {
|
if (!this->mapSectionIdNames.contains(defaultName)) {
|
||||||
this->mapSectionIdNames.append(defaultName);
|
this->mapSectionIdNames.append(defaultName);
|
||||||
}
|
}
|
||||||
numericalModeSort(this->mapSectionIdNames);
|
Util::numericalModeSort(this->mapSectionIdNames);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -2372,7 +2373,7 @@ void Project::addNewMapsec(const QString &idName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this->mapSectionIdNames.append(idName);
|
this->mapSectionIdNames.append(idName);
|
||||||
numericalModeSort(this->mapSectionIdNames);
|
Util::numericalModeSort(this->mapSectionIdNames);
|
||||||
|
|
||||||
this->hasUnsavedDataChanges = true;
|
this->hasUnsavedDataChanges = true;
|
||||||
|
|
||||||
|
|
@ -2596,7 +2597,7 @@ bool Project::readSongNames() {
|
||||||
// Song names don't have a very useful order (esp. if we include SE_* values), so sort them alphabetically.
|
// Song names don't have a very useful order (esp. if we include SE_* values), so sort them alphabetically.
|
||||||
// The default song should be the first in the list, not the first alphabetically, so save that before sorting.
|
// The default song should be the first in the list, not the first alphabetically, so save that before sorting.
|
||||||
this->defaultSong = this->songNames.value(0, "0");
|
this->defaultSong = this->songNames.value(0, "0");
|
||||||
numericalModeSort(this->songNames);
|
Util::numericalModeSort(this->songNames);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3058,14 +3059,3 @@ bool Project::hasUnsavedChanges() {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This belongs in a more general utility file, once we have one.
|
|
||||||
// Sometimes we want to sort names alphabetically to make them easier to find in large combo box lists.
|
|
||||||
// QStringList::sort (as of writing) can only sort numbers in lexical order, which has an undesirable
|
|
||||||
// effect (e.g. MAPSEC_ROUTE_10 comes after MAPSEC_ROUTE_1, rather than MAPSEC_ROUTE_9).
|
|
||||||
// We can use QCollator to sort these lists with better handling for numbers.
|
|
||||||
void Project::numericalModeSort(QStringList &list) {
|
|
||||||
QCollator collator;
|
|
||||||
collator.setNumericMode(true);
|
|
||||||
std::sort(list.begin(), list.end(), collator);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
#include "movablerect.h"
|
#include "movablerect.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
MovableRect::MovableRect(bool *enabled, int width, int height, QRgb color)
|
MovableRect::MovableRect(bool *enabled, int width, int height, QRgb color)
|
||||||
: QGraphicsRectItem(0, 0, width, height)
|
: QGraphicsRectItem(0, 0, width, height)
|
||||||
|
|
@ -22,10 +23,6 @@ void MovableRect::updateLocation(int x, int y) {
|
||||||
************************************************************************
|
************************************************************************
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
int roundUp(int numToRound, int multiple) {
|
|
||||||
return (numToRound + multiple - 1) & -multiple;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResizableRect::ResizableRect(QObject *parent, bool *enabled, int width, int height, QRgb color)
|
ResizableRect::ResizableRect(QObject *parent, bool *enabled, int width, int height, QRgb color)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
MovableRect(enabled, width * 16, height * 16, color)
|
MovableRect(enabled, width * 16, height * 16, color)
|
||||||
|
|
@ -117,8 +114,8 @@ void ResizableRect::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResizableRect::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
void ResizableRect::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
||||||
int dx = roundUp(event->scenePos().x() - this->clickedPos.x(), 16);
|
int dx = Util::roundUp(event->scenePos().x() - this->clickedPos.x(), 16);
|
||||||
int dy = roundUp(event->scenePos().y() - this->clickedPos.y(), 16);
|
int dy = Util::roundUp(event->scenePos().y() - this->clickedPos.y(), 16);
|
||||||
|
|
||||||
QRect resizedRect = this->clickedRect;
|
QRect resizedRect = this->clickedRect;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include "noscrollcombobox.h"
|
#include "noscrollcombobox.h"
|
||||||
#include "prefab.h"
|
#include "prefab.h"
|
||||||
#include "filedialog.h"
|
#include "filedialog.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
#include <QAbstractButton>
|
#include <QAbstractButton>
|
||||||
#include <QFormLayout>
|
#include <QFormLayout>
|
||||||
|
|
@ -293,7 +294,7 @@ QStringList ProjectSettingsEditor::getWarpBehaviorsList() {
|
||||||
|
|
||||||
void ProjectSettingsEditor::setWarpBehaviorsList(QStringList list) {
|
void ProjectSettingsEditor::setWarpBehaviorsList(QStringList list) {
|
||||||
list.removeDuplicates();
|
list.removeDuplicates();
|
||||||
Project::numericalModeSort(list);
|
Util::numericalModeSort(list);
|
||||||
ui->textEdit_WarpBehaviors->setText(list.join("\n"));
|
ui->textEdit_WarpBehaviors->setText(list.join("\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,10 @@
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
#include "movablerect.h"
|
#include "movablerect.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
#include "ui_resizelayoutpopup.h"
|
#include "ui_resizelayoutpopup.h"
|
||||||
|
|
||||||
// TODO: put this in a util file or something
|
|
||||||
extern int roundUp(int, int);
|
|
||||||
|
|
||||||
CheckeredBgScene::CheckeredBgScene(QObject *parent) : QGraphicsScene(parent) { }
|
CheckeredBgScene::CheckeredBgScene(QObject *parent) : QGraphicsScene(parent) { }
|
||||||
|
|
||||||
void CheckeredBgScene::drawBackground(QPainter *painter, const QRectF &rect) {
|
void CheckeredBgScene::drawBackground(QPainter *painter, const QRectF &rect) {
|
||||||
|
|
@ -62,7 +60,7 @@ void BoundedPixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
|
||||||
QVariant BoundedPixmapItem::itemChange(GraphicsItemChange change, const QVariant &value) {
|
QVariant BoundedPixmapItem::itemChange(GraphicsItemChange change, const QVariant &value) {
|
||||||
if (change == ItemPositionChange && scene()) {
|
if (change == ItemPositionChange && scene()) {
|
||||||
QPointF newPos = value.toPointF();
|
QPointF newPos = value.toPointF();
|
||||||
return QPointF(roundUp(newPos.x(), 16), roundUp(newPos.y(), 16));
|
return QPointF(Util::roundUp(newPos.x(), 16), Util::roundUp(newPos.y(), 16));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return QGraphicsItem::itemChange(change, value);
|
return QGraphicsItem::itemChange(change, value);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "wildmonchart.h"
|
#include "wildmonchart.h"
|
||||||
#include "ui_wildmonchart.h"
|
#include "ui_wildmonchart.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
static const QString baseWindowTitle = QString("Wild Pokémon Summary Charts");
|
static const QString baseWindowTitle = QString("Wild Pokémon Summary Charts");
|
||||||
|
|
||||||
|
|
@ -367,13 +368,7 @@ QChart* WildMonChart::createLevelDistributionChart() {
|
||||||
series->attachAxis(axisY);
|
series->attachAxis(axisY);
|
||||||
|
|
||||||
// We round the y-axis max up to a multiple of 5.
|
// We round the y-axis max up to a multiple of 5.
|
||||||
auto roundUp = [](int num, int multiple) {
|
axisY->setMax(Util::roundUp(qCeil(axisY->max()), 5));
|
||||||
auto remainder = num % multiple;
|
|
||||||
if (remainder == 0)
|
|
||||||
return num;
|
|
||||||
return num + multiple - remainder;
|
|
||||||
};
|
|
||||||
axisY->setMax(roundUp(qCeil(axisY->max()), 5));
|
|
||||||
|
|
||||||
return chart;
|
return chart;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user