Merge branch 'master' of https://github.com/huderlem/porymap into slam

This commit is contained in:
garak 2024-01-12 15:57:56 -05:00
commit 0296c22845
11 changed files with 678 additions and 579 deletions

View file

@ -8,19 +8,27 @@ The **"Breaking Changes"** listed below are changes that have been made in the d
## [Unreleased] ## [Unreleased]
### Added ### Added
- Add zoom sliders to the Tileset Editor.
- Add `getMetatileBehaviorName` and `setMetatileBehaviorName` to the API. - Add `getMetatileBehaviorName` and `setMetatileBehaviorName` to the API.
- Add `metatile_behaviors`, `num_primary_palettes`, and `num_secondary_palettes` to `constants` in the API. - Add `metatile_behaviors`, `num_primary_palettes`, and `num_secondary_palettes` to `constants` in the API.
### Changed ### Changed
- Metatile ID strings are now padded to their current max, not the overall max. - Metatile ID strings are now padded to their current max, not the overall max.
- Non-existent directories are now removed from the Open Recent Project menu.
- Hovering on the layer view in the Tileset Editor now displays the tile ID.
- Labels in the Script dropdown are now sorted alphabetically.
- The name of the Heal Locations table is no longer enforced. - The name of the Heal Locations table is no longer enforced.
- The API functions `addImage` and `createImage` now support project-relative paths. - The API functions `addImage` and `createImage` now support project-relative paths.
### Fixed ### Fixed
- Fix the metatile selector rectangle jumping when selecting up or left of the origin. - Fix the metatile selector rectangle jumping when selecting up or left of the origin.
- Fix the event group tabs sometimes showing an event from the wrong group - Fix the event group tabs sometimes showing an event from the wrong group.
- Fix the clear buttons in the Shortcuts Editor not actually removing shortcuts. - Fix the clear buttons in the Shortcuts Editor not actually removing shortcuts.
- Fix API error reporting - Fix slow speed for the script label autcomplete.
- Fix deleted script labels still appearing in the autocomplete after project reload.
- Fix the map search bar stealing focus on startup.
- Fix Open Recent Project not clearing the API overlay
- Fix API error reporting.
## [5.2.0] - 2024-01-02 ## [5.2.0] - 2024-01-02
### Added ### Added

File diff suppressed because it is too large Load diff

View file

@ -58,6 +58,8 @@ public:
this->collisionOpacity = 50; this->collisionOpacity = 50;
this->collisionZoom = 30; this->collisionZoom = 30;
this->metatilesZoom = 30; this->metatilesZoom = 30;
this->tilesetEditorMetatilesZoom = 30;
this->tilesetEditorTilesZoom = 30;
this->showPlayerView = false; this->showPlayerView = false;
this->showCursorTile = true; this->showCursorTile = true;
this->showBorder = true; this->showBorder = true;
@ -87,6 +89,8 @@ public:
void setCollisionOpacity(int opacity); void setCollisionOpacity(int opacity);
void setCollisionZoom(int zoom); void setCollisionZoom(int zoom);
void setMetatilesZoom(int zoom); void setMetatilesZoom(int zoom);
void setTilesetEditorMetatilesZoom(int zoom);
void setTilesetEditorTilesZoom(int zoom);
void setShowPlayerView(bool enabled); void setShowPlayerView(bool enabled);
void setShowCursorTile(bool enabled); void setShowCursorTile(bool enabled);
void setShowBorder(bool enabled); void setShowBorder(bool enabled);
@ -115,6 +119,8 @@ public:
int getCollisionOpacity(); int getCollisionOpacity();
int getCollisionZoom(); int getCollisionZoom();
int getMetatilesZoom(); int getMetatilesZoom();
int getTilesetEditorMetatilesZoom();
int getTilesetEditorTilesZoom();
bool getShowPlayerView(); bool getShowPlayerView();
bool getShowCursorTile(); bool getShowCursorTile();
bool getShowBorder(); bool getShowBorder();
@ -160,6 +166,8 @@ private:
int collisionOpacity; int collisionOpacity;
int collisionZoom; int collisionZoom;
int metatilesZoom; int metatilesZoom;
int tilesetEditorMetatilesZoom;
int tilesetEditorTilesZoom;
bool showPlayerView; bool showPlayerView;
bool showCursorTile; bool showCursorTile;
bool showBorder; bool showBorder;

View file

@ -205,8 +205,6 @@ public:
static QString getScriptFileExtension(bool usePoryScript); static QString getScriptFileExtension(bool usePoryScript);
QString getScriptDefaultString(bool usePoryScript, QString mapName) const; QString getScriptDefaultString(bool usePoryScript, QString mapName) const;
QStringList getEventScriptsFilePaths() const; QStringList getEventScriptsFilePaths() const;
QCompleter *getEventScriptLabelCompleter(QStringList additionalScriptLabels);
QStringList getGlobalScriptLabels();
QString getDefaultPrimaryTilesetLabel(); QString getDefaultPrimaryTilesetLabel();
QString getDefaultSecondaryTilesetLabel(); QString getDefaultSecondaryTilesetLabel();
@ -256,9 +254,6 @@ private:
static int default_map_size; static int default_map_size;
static int max_object_events; static int max_object_events;
QStringListModel eventScriptLabelModel;
QCompleter eventScriptLabelCompleter;
signals: signals:
void reloadProject(); void reloadProject();
void uncheckMonitorFilesAction(); void uncheckMonitorFilesAction();

View file

@ -31,6 +31,8 @@ public:
void invalidateUi(); void invalidateUi();
void invalidateValues(); void invalidateValues();
void populateScriptDropdown(NoScrollComboBox * combo, Project * project);
virtual void setActive(bool active); virtual void setActive(bool active);
public: public:
@ -87,8 +89,6 @@ public:
private: private:
ObjectEvent *object; ObjectEvent *object;
QCompleter *scriptCompleter = nullptr;
}; };
@ -158,8 +158,6 @@ public:
private: private:
TriggerEvent *trigger; TriggerEvent *trigger;
QCompleter *scriptCompleter = nullptr;
}; };
@ -203,8 +201,6 @@ public:
private: private:
SignEvent *sign; SignEvent *sign;
QCompleter *scriptCompleter = nullptr;
}; };

View file

@ -116,6 +116,8 @@ private slots:
void on_actionCut_triggered(); void on_actionCut_triggered();
void on_actionCopy_triggered(); void on_actionCopy_triggered();
void on_actionPaste_triggered(); void on_actionPaste_triggered();
void on_horizontalSlider_MetatilesZoom_valueChanged(int value);
void on_horizontalSlider_TilesZoom_valueChanged(int value);
private: private:
void initUi(); void initUi();

View file

@ -368,6 +368,10 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) {
this->metatilesZoom = getConfigInteger(key, value, 10, 100, 30); this->metatilesZoom = getConfigInteger(key, value, 10, 100, 30);
} else if (key == "collision_zoom") { } else if (key == "collision_zoom") {
this->collisionZoom = getConfigInteger(key, value, 10, 100, 30); this->collisionZoom = getConfigInteger(key, value, 10, 100, 30);
} else if (key == "tileset_editor_metatiles_zoom") {
this->tilesetEditorMetatilesZoom = getConfigInteger(key, value, 10, 100, 30);
} else if (key == "tileset_editor_tiles_zoom") {
this->tilesetEditorTilesZoom = getConfigInteger(key, value, 10, 100, 30);
} else if (key == "show_player_view") { } else if (key == "show_player_view") {
this->showPlayerView = getConfigBool(key, value); this->showPlayerView = getConfigBool(key, value);
} else if (key == "show_cursor_tile") { } else if (key == "show_cursor_tile") {
@ -427,6 +431,8 @@ QMap<QString, QString> PorymapConfig::getKeyValueMap() {
map.insert("collision_opacity", QString::number(this->collisionOpacity)); map.insert("collision_opacity", QString::number(this->collisionOpacity));
map.insert("collision_zoom", QString::number(this->collisionZoom)); map.insert("collision_zoom", QString::number(this->collisionZoom));
map.insert("metatiles_zoom", QString::number(this->metatilesZoom)); map.insert("metatiles_zoom", QString::number(this->metatilesZoom));
map.insert("tileset_editor_metatiles_zoom", QString::number(this->tilesetEditorMetatilesZoom));
map.insert("tileset_editor_tiles_zoom", QString::number(this->tilesetEditorTilesZoom));
map.insert("show_player_view", this->showPlayerView ? "1" : "0"); map.insert("show_player_view", this->showPlayerView ? "1" : "0");
map.insert("show_cursor_tile", this->showCursorTile ? "1" : "0"); map.insert("show_cursor_tile", this->showCursorTile ? "1" : "0");
map.insert("show_border", this->showBorder ? "1" : "0"); map.insert("show_border", this->showBorder ? "1" : "0");
@ -552,6 +558,16 @@ void PorymapConfig::setMetatilesZoom(int zoom) {
// don't auto-save here because this can be called very frequently. // don't auto-save here because this can be called very frequently.
} }
void PorymapConfig::setTilesetEditorMetatilesZoom(int zoom) {
this->tilesetEditorMetatilesZoom = zoom;
// don't auto-save here because this can be called very frequently.
}
void PorymapConfig::setTilesetEditorTilesZoom(int zoom) {
this->tilesetEditorTilesZoom = zoom;
// don't auto-save here because this can be called very frequently.
}
void PorymapConfig::setShowPlayerView(bool enabled) { void PorymapConfig::setShowPlayerView(bool enabled) {
this->showPlayerView = enabled; this->showPlayerView = enabled;
this->save(); this->save();
@ -694,6 +710,14 @@ int PorymapConfig::getMetatilesZoom() {
return this->metatilesZoom; return this->metatilesZoom;
} }
int PorymapConfig::getTilesetEditorMetatilesZoom() {
return this->tilesetEditorMetatilesZoom;
}
int PorymapConfig::getTilesetEditorTilesZoom() {
return this->tilesetEditorTilesZoom;
}
bool PorymapConfig::getShowPlayerView() { bool PorymapConfig::getShowPlayerView() {
return this->showPlayerView; return this->showPlayerView;
} }

View file

@ -137,6 +137,7 @@ QStringList Map::getScriptLabels(Event::Group group) const {
// Add scripts from map's scripts file, and empty names. // Add scripts from map's scripts file, and empty names.
scriptLabels.append(scriptsFileLabels); scriptLabels.append(scriptsFileLabels);
scriptLabels.sort(Qt::CaseInsensitive);
scriptLabels.prepend("0x0"); scriptLabels.prepend("0x0");
scriptLabels.prepend("NULL"); scriptLabels.prepend("NULL");

View file

@ -2454,18 +2454,13 @@ bool Project::readMiscellaneousConstants() {
return true; return true;
} }
QStringList Project::getGlobalScriptLabels() {
return this->eventScriptLabelModel.stringList();
}
bool Project::readEventScriptLabels() { bool Project::readEventScriptLabels() {
globalScriptLabels.clear();
for (const auto &filePath : getEventScriptsFilePaths()) for (const auto &filePath : getEventScriptsFilePaths())
globalScriptLabels << ParseUtil::getGlobalScriptLabels(filePath); globalScriptLabels << ParseUtil::getGlobalScriptLabels(filePath);
eventScriptLabelModel.setStringList(globalScriptLabels); globalScriptLabels.sort(Qt::CaseInsensitive);
eventScriptLabelCompleter.setModel(&eventScriptLabelModel); globalScriptLabels.removeDuplicates();
eventScriptLabelCompleter.setCaseSensitivity(Qt::CaseInsensitive);
eventScriptLabelCompleter.setFilterMode(Qt::MatchContains);
return true; return true;
} }
@ -2526,13 +2521,6 @@ QStringList Project::getEventScriptsFilePaths() const {
return filePaths; return filePaths;
} }
QCompleter *Project::getEventScriptLabelCompleter(QStringList additionalScriptLabels) {
additionalScriptLabels << globalScriptLabels;
additionalScriptLabels.removeDuplicates();
eventScriptLabelModel.setStringList(additionalScriptLabels);
return &eventScriptLabelCompleter;
}
void Project::setEventPixmap(Event *event, bool forceLoad) { void Project::setEventPixmap(Event *event, bool forceLoad) {
if (event && (event->getPixmap().isNull() || forceLoad)) if (event && (event->getPixmap().isNull() || forceLoad))
event->loadPixmap(this); event->loadPixmap(this);

View file

@ -168,6 +168,23 @@ void EventFrame::setActive(bool active) {
this->blockSignals(!active); this->blockSignals(!active);
} }
void EventFrame::populateScriptDropdown(NoScrollComboBox * combo, Project * project) {
// The script dropdown is populated with scripts used by the map's events and from its scripts file.
if (this->event->getMap())
combo->addItems(this->event->getMap()->getScriptLabels());
// The dropdown's autocomplete has all script labels across the full project.
auto completer = new QCompleter(project->globalScriptLabels, combo);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
completer->setFilterMode(Qt::MatchContains);
// Improve display speed for the autocomplete popup
auto popup = (QListView *)completer->popup();
if (popup) popup->setUniformItemSizes(true);
combo->setCompleter(completer);
}
void ObjectFrame::setup() { void ObjectFrame::setup() {
@ -367,20 +384,7 @@ void ObjectFrame::populate(Project *project) {
this->combo_flag->addItems(project->flagNames); this->combo_flag->addItems(project->flagNames);
this->combo_trainer_type->addItems(project->trainerTypes); this->combo_trainer_type->addItems(project->trainerTypes);
// The script dropdown is populated with scripts used by the map's events and from its scripts file. this->populateScriptDropdown(this->combo_script, project);
QStringList scriptLabels;
if (this->object->getMap()) {
scriptLabels.append(this->object->getMap()->getScriptLabels());
this->combo_script->addItems(scriptLabels);
}
// The dropdown's autocomplete has all script labels across the full project.
scriptLabels.append(project->getGlobalScriptLabels());
scriptLabels.removeDuplicates();
this->scriptCompleter = new QCompleter(scriptLabels, this);
this->scriptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
this->scriptCompleter->setFilterMode(Qt::MatchContains);
this->combo_script->setCompleter(this->scriptCompleter);
} }
@ -637,20 +641,7 @@ void TriggerFrame::populate(Project *project) {
// var combo // var combo
this->combo_var->addItems(project->varNames); this->combo_var->addItems(project->varNames);
// The script dropdown is populated with scripts used by the map's events and from its scripts file. this->populateScriptDropdown(this->combo_script, project);
QStringList scriptLabels;
if (this->trigger->getMap()) {
scriptLabels.append(this->trigger->getMap()->getScriptLabels());
this->combo_script->addItems(scriptLabels);
}
// The dropdown's autocomplete has all script labels across the full project.
scriptLabels.append(project->getGlobalScriptLabels());
scriptLabels.removeDuplicates();
this->scriptCompleter = new QCompleter(scriptLabels, this);
this->scriptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
this->scriptCompleter->setFilterMode(Qt::MatchContains);
this->combo_script->setCompleter(this->scriptCompleter);
} }
@ -772,20 +763,7 @@ void SignFrame::populate(Project *project) {
// facing dir // facing dir
this->combo_facing_dir->addItems(project->bgEventFacingDirections); this->combo_facing_dir->addItems(project->bgEventFacingDirections);
// The script dropdown is populated with scripts used by the map's events and from its scripts file. this->populateScriptDropdown(this->combo_script, project);
QStringList scriptLabels;
if (this->sign->getMap()) {
scriptLabels.append(this->sign->getMap()->getScriptLabels());
this->combo_script->addItems(scriptLabels);
}
// The dropdown's autocomplete has all script labels across the full project.
scriptLabels.append(project->getGlobalScriptLabels());
scriptLabels.removeDuplicates();
this->scriptCompleter = new QCompleter(scriptLabels, this);
this->scriptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
this->scriptCompleter->setFilterMode(Qt::MatchContains);
this->combo_script->setCompleter(this->scriptCompleter);
} }

View file

@ -196,7 +196,7 @@ void TilesetEditor::initMetatileSelector()
this->metatileSelector->draw(); this->metatileSelector->draw();
this->ui->graphicsView_Metatiles->setScene(this->metatilesScene); this->ui->graphicsView_Metatiles->setScene(this->metatilesScene);
this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); this->ui->horizontalSlider_MetatilesZoom->setValue(porymapConfig.getTilesetEditorMetatilesZoom());
} }
void TilesetEditor::initMetatileLayersItem() { void TilesetEditor::initMetatileLayersItem() {
@ -236,7 +236,7 @@ void TilesetEditor::initTileSelector()
this->tileSelector->draw(); this->tileSelector->draw();
this->ui->graphicsView_Tiles->setScene(this->tilesScene); this->ui->graphicsView_Tiles->setScene(this->tilesScene);
this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); this->ui->horizontalSlider_TilesZoom->setValue(porymapConfig.getTilesetEditorTilesZoom());
} }
void TilesetEditor::initSelectedTileItem() { void TilesetEditor::initSelectedTileItem() {
@ -1182,3 +1182,31 @@ void TilesetEditor::on_copyButton_metatileLabel_clicked() {
QGuiApplication::clipboard()->setText(label); QGuiApplication::clipboard()->setText(label);
QToolTip::showText(this->ui->copyButton_metatileLabel->mapToGlobal(QPoint(0, 0)), "Copied!"); QToolTip::showText(this->ui->copyButton_metatileLabel->mapToGlobal(QPoint(0, 0)), "Copied!");
} }
void TilesetEditor::on_horizontalSlider_MetatilesZoom_valueChanged(int value) {
porymapConfig.setTilesetEditorMetatilesZoom(value);
double scale = pow(3.0, static_cast<double>(value - 30) / 30.0);
QTransform transform;
transform.scale(scale, scale);
QSize size(this->metatileSelector->pixmap().width(), this->metatileSelector->pixmap().height());
size *= scale;
this->ui->graphicsView_Metatiles->setResizeAnchor(QGraphicsView::NoAnchor);
this->ui->graphicsView_Metatiles->setTransform(transform);
this->ui->graphicsView_Metatiles->setFixedSize(size.width() + 2, size.height() + 2);
}
void TilesetEditor::on_horizontalSlider_TilesZoom_valueChanged(int value) {
porymapConfig.setTilesetEditorTilesZoom(value);
double scale = pow(3.0, static_cast<double>(value - 30) / 30.0);
QTransform transform;
transform.scale(scale, scale);
QSize size(this->tileSelector->pixmap().width(), this->tileSelector->pixmap().height());
size *= scale;
this->ui->graphicsView_Tiles->setResizeAnchor(QGraphicsView::NoAnchor);
this->ui->graphicsView_Tiles->setTransform(transform);
this->ui->graphicsView_Tiles->setFixedSize(size.width() + 2, size.height() + 2);
}