diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a57764b..efc31aab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ and this project somewhat adheres to [Semantic Versioning](https://semver.org/sp The **"Breaking Changes"** listed below are changes that have been made in the decompilation projects (e.g. pokeemerald), which porymap requires in order to work properly. If porymap is used on a project that is not up-to-date with the breaking changes, then porymap will likely break or behave improperly. ## [Unreleased] -- None +### Fixed +- Fix bug in zoomed metatile selector where a large selection rectangle was being rendered. +- Fix bug where edited map icons were not rendered properly. +- Fix bug where right-click copying a tile from the tileset editor's metatile layers wouldn't copy the x/y flip status. ## [1.2.1] - 2019-02-16 ### Added @@ -77,7 +80,7 @@ The **"Breaking Changes"** listed below are changes that have been made in the d ## [1.0.0] - 2018-10-26 This was the initial release. -[Unreleased]: https://github.com/huderlem/porymap/compare/1.2.0...HEAD +[Unreleased]: https://github.com/huderlem/porymap/compare/1.2.1...HEAD [1.2.1]: https://github.com/huderlem/porymap/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/huderlem/porymap/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/huderlem/porymap/compare/1.0.0...1.1.0 diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 4e60a96a..8aa623ee 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -561,8 +561,8 @@ 0 0 - 545 - 587 + 522 + 601 @@ -876,8 +876,8 @@ 0 0 - 256 - 74 + 259 + 70 @@ -1064,10 +1064,10 @@ - 8 + 0 0 - 222 - 353 + 263 + 338 @@ -1166,7 +1166,7 @@ 10 - 100 + 90 30 @@ -1344,8 +1344,8 @@ 0 0 - 371 - 643 + 385 + 652 @@ -1617,8 +1617,8 @@ 0 0 - 430 - 534 + 432 + 554 @@ -2531,8 +2531,8 @@ 0 0 - 818 - 539 + 829 + 543 @@ -2748,6 +2748,7 @@ + @@ -2798,7 +2799,7 @@ - New Map + New Map... Ctrl+N @@ -2982,6 +2983,14 @@ Region Map Editor + + + New Tileset... + + + Ctrl+Shift+N + + diff --git a/forms/newtilesetdialog.ui b/forms/newtilesetdialog.ui new file mode 100644 index 00000000..c0aa791d --- /dev/null +++ b/forms/newtilesetdialog.ui @@ -0,0 +1,222 @@ + + + NewTilesetDialog + + + + 0 + 0 + 400 + 190 + + + + + 0 + 0 + + + + Add new Tileset + + + + + 0 + 0 + 400 + 190 + + + + + 0 + 0 + + + + + 10 + + + 10 + + + 10 + + + 10 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 380 + 135 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 380 + 129 + + + + + 6 + + + 10 + + + 10 + + + 10 + + + + + Name + + + + + + + + + + Type + + + + + + + + Primary + + + + + Secondary + + + + + + + + Path + + + + + + + false + + + + + + + Symbol Name + + + + + + + false + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + + + + + buttonBox + accepted() + NewTilesetDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + NewTilesetDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/include/core/tileset.h b/include/core/tileset.h index ce735e35..37a9ee78 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -35,6 +35,10 @@ public: static Metatile* getMetatile(int, Tileset*, Tileset*); static QList> getBlockPalettes(Tileset*, Tileset*); static QList getPalette(int, Tileset*, Tileset*); + + bool appendToHeaders(QString headerFile, QString friendlyName); + bool appendToGraphics(QString graphicsFile, QString friendlyName, bool primary); + bool appendToMetatiles(QString metatileFile, QString friendlyName, bool primary); }; #endif // TILESET_H diff --git a/include/mainwindow.h b/include/mainwindow.h index b437f879..2915e169 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -18,6 +18,7 @@ #include "regionmapeditor.h" #include "filterchildrenproxymodel.h" #include "newmappopup.h" +#include "newtilesetdialog.h" namespace Ui { class MainWindow; @@ -53,6 +54,7 @@ private slots: void onNewMapCreated(); void on_action_NewMap_triggered(); + void on_actionNew_Tileset_triggered(); void on_action_Save_triggered(); void on_tabWidget_2_currentChanged(int index); void on_action_Exit_triggered(); @@ -175,6 +177,7 @@ private: Editor *editor = nullptr; QIcon* mapIcon; QIcon* mapEditedIcon; + QIcon* mapOpenedIcon; QWidget *eventTabObjectWidget; QWidget *eventTabWarpWidget; @@ -204,8 +207,7 @@ private: void setRecentMap(QString map_name); QStandardItem* createMapItem(QString mapName, int groupNum, int inGroupNum); - void markAllEdited(QAbstractItemModel *model); - void markEdited(QModelIndex index); + void drawMapListIcons(QAbstractItemModel *model); void updateMapList(); void displayMapProperties(); diff --git a/include/project.h b/include/project.h index c1d55ff0..eea9751a 100644 --- a/include/project.h +++ b/include/project.h @@ -92,11 +92,15 @@ public: void saveMapConstantsHeader(); void saveHealLocationStruct(Map*); void saveTilesets(Tileset*, Tileset*); + void saveTilesetMetatileAttributes(Tileset*); + void saveTilesetMetatiles(Tileset*); + void saveTilesetTilesImage(Tileset*); + void saveTilesetPalettes(Tileset*, bool); QList* parseAsm(QString text); QStringList getSongNames(); QStringList getVisibilities(); - QMap getTilesets(); + QMap getTilesetLabels(); void readTilesetProperties(); void readRegionMapSections(); void readItemNames(); @@ -131,10 +135,6 @@ public: static int getNumPalettesPrimary(); static int getNumPalettesTotal(); private: - void saveTilesetMetatileAttributes(Tileset*); - void saveTilesetMetatiles(Tileset*); - void saveTilesetTilesImage(Tileset*); - void saveTilesetPalettes(Tileset*, bool); void updateMapLayout(Map*); void readCDefinesSorted(QString, QStringList, QStringList*); void readCDefinesSorted(QString, QStringList, QStringList*, QString, int); diff --git a/include/ui/newtilesetdialog.h b/include/ui/newtilesetdialog.h new file mode 100644 index 00000000..a292c67e --- /dev/null +++ b/include/ui/newtilesetdialog.h @@ -0,0 +1,32 @@ +#ifndef NEWTILESETDIALOG_H +#define NEWTILESETDIALOG_H + +#include +#include "project.h" + +namespace Ui { +class NewTilesetDialog; +} + +class NewTilesetDialog : public QDialog +{ + Q_OBJECT + +public: + explicit NewTilesetDialog(Project *project, QWidget *parent = nullptr); + ~NewTilesetDialog(); + QString path; + QString fullSymbolName; + QString friendlyName; + bool isSecondary; + +private slots: + void NameOrSecondaryChanged(); + void SecondaryChanged(); + +private: + Ui::NewTilesetDialog *ui; + Project *project = nullptr; +}; + +#endif // NEWTILESETDIALOG_H diff --git a/porymap.pro b/porymap.pro index b3a19b8d..be747371 100644 --- a/porymap.pro +++ b/porymap.pro @@ -66,7 +66,8 @@ SOURCES += src/core/block.cpp \ src/mainwindow.cpp \ src/project.cpp \ src/settings.cpp \ - src/log.cpp + src/log.cpp \ + src/ui/newtilesetdialog.cpp HEADERS += include/core/block.h \ include/core/blockdata.h \ @@ -121,7 +122,8 @@ HEADERS += include/core/block.h \ include/mainwindow.h \ include/project.h \ include/settings.h \ - include/log.h + include/log.h \ + include/ui/newtilesetdialog.h FORMS += forms/mainwindow.ui \ forms/eventpropertiesframe.ui \ @@ -129,7 +131,8 @@ FORMS += forms/mainwindow.ui \ forms/paletteeditor.ui \ forms/regionmapeditor.ui \ forms/newmappopup.ui \ - forms/aboutporymap.ui + forms/aboutporymap.ui \ + forms/newtilesetdialog.ui RESOURCES += \ resources/images.qrc diff --git a/resources/images.qrc b/resources/images.qrc index 2955b156..1f4fbf12 100644 --- a/resources/images.qrc +++ b/resources/images.qrc @@ -30,5 +30,6 @@ icons/sort_number.ico icons/collapse_all.ico icons/expand_all.ico + images/blank_tileset.png diff --git a/resources/images/blank_tileset.png b/resources/images/blank_tileset.png new file mode 100644 index 00000000..f71b1459 Binary files /dev/null and b/resources/images/blank_tileset.png differ diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 430f2582..a6a04229 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -1,6 +1,7 @@ #include "tileset.h" #include "metatile.h" #include "project.h" +#include "log.h" #include #include @@ -86,3 +87,68 @@ QList Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset } return paletteTable; } + +bool Tileset::appendToHeaders(QString headerFile, QString friendlyName){ + QFile file(headerFile); + if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) { + logError(QString("Could not write to file \"%1\"").arg(headerFile)); + return false; + } + QString dataString = "\n\t.align 2\n"; + dataString.append(QString("%1::\n").arg(this->name)); + dataString.append(QString("\t.byte %1 @ is compressed\n").arg(this->is_compressed)); + dataString.append(QString("\t.byte %1 @ is secondary\n").arg(this->is_secondary)); + dataString.append(QString("\t.2byte %1\n").arg(this->padding)); + dataString.append(QString("\t.4byte gTilesetTiles_%1\n").arg(friendlyName)); + dataString.append(QString("\t.4byte gTilesetPalettes_%1\n").arg(friendlyName)); + dataString.append(QString("\t.4byte gMetatiles_%1\n").arg(friendlyName)); + dataString.append(QString("\t.4byte gMetatileAttributes_%1\n").arg(friendlyName)); + dataString.append("\t.4byte NULL\n"); + file.write(dataString.toUtf8()); + file.flush(); + file.close(); + return true; +} + +bool Tileset::appendToGraphics(QString graphicsFile, QString friendlyName, bool primary) { + QString primaryString = primary ? "primary" : "secondary"; + QFile file(graphicsFile); + if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) { + logError(QString("Could not write to file \"%1\"").arg(graphicsFile)); + return false; + } + QString dataString = "\n\t.align 2\n"; + dataString.append(QString("gTilesetPalettes_%1::\n").arg(friendlyName)); + for(int i = 0; i < Project::getNumPalettesTotal(); ++i) { + QString paletteString; + paletteString.sprintf("%02d.gbapal", i); + dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/palettes/%3\"\n").arg(primaryString, friendlyName.toLower(), paletteString)); + + } + dataString.append("\n\t.align 2\n"); + dataString.append(QString("gTilesetTiles_%1::\n").arg(friendlyName)); + dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/tiles.4bpp.lz\"\n").arg(primaryString, friendlyName.toLower())); + file.write(dataString.toUtf8()); + file.flush(); + file.close(); + return true; +} + +bool Tileset::appendToMetatiles(QString metatileFile, QString friendlyName, bool primary) { + QString primaryString = primary ? "primary" : "secondary"; + QFile file(metatileFile); + if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) { + logError(QString("Could not write to file \"%1\"").arg(metatileFile)); + return false; + } + QString dataString = "\n\t.align 1\n"; + dataString.append(QString("gMetatiles_%1::\n").arg(friendlyName)); + dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/metatiles.bin\"\n").arg(primaryString, friendlyName.toLower())); + dataString.append(QString("\n\t.align 1\n")); + dataString.append(QString("gMetatileAttributes_%1::\n").arg(friendlyName)); + dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/metatile_attributes.bin\"").arg(primaryString, friendlyName.toLower())); + file.write(dataString.toUtf8()); + file.flush(); + file.close(); + return true; +} diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 07c62fdc..3c27512a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -10,6 +10,7 @@ #include "currentselectedmetatilespixmapitem.h" #include "customattributestable.h" + #include #include #include @@ -101,13 +102,9 @@ void MainWindow::initEditor() { } void MainWindow::initMiscHeapObjects() { - mapIcon = new QIcon; - mapIcon->addFile(QStringLiteral(":/icons/map.ico"), QSize(), QIcon::Normal, QIcon::Off); - mapIcon->addFile(QStringLiteral(":/icons/map_opened.ico"), QSize(), QIcon::Normal, QIcon::On); - - mapEditedIcon = new QIcon; - mapEditedIcon->addFile(QStringLiteral(":/icons/map_edited.ico"), QSize(), QIcon::Normal, QIcon::Off); - mapEditedIcon->addFile(QStringLiteral(":/icons/map_opened.ico"), QSize(), QIcon::Normal , QIcon::On); + mapIcon = new QIcon(QStringLiteral(":/icons/map.ico")); + mapEditedIcon = new QIcon(QStringLiteral(":/icons/map_edited.ico")); + mapOpenedIcon = new QIcon(QStringLiteral(":/icons/map_opened.ico")); mapListModel = new QStandardItemModel; mapGroupItemsList = new QList; @@ -472,7 +469,7 @@ void MainWindow::displayMapProperties() { ui->comboBox_Location->addItems(project->mapSectionValueToName.values()); ui->comboBox_Location->setCurrentText(map->location); - QMap tilesets = project->getTilesets(); + QMap tilesets = project->getTilesetLabels(); ui->comboBox_PrimaryTileset->addItems(tilesets.value("primary")); ui->comboBox_PrimaryTileset->setCurrentText(map->layout->tileset_primary_label); ui->comboBox_SecondaryTileset->addItems(tilesets.value("secondary")); @@ -856,6 +853,116 @@ void MainWindow::on_action_NewMap_triggered() { openNewMapPopupWindow(MapSortOrder::Group, 0); } +void MainWindow::on_actionNew_Tileset_triggered() { + NewTilesetDialog *createTilesetDialog = new NewTilesetDialog(editor->project, this); + if(createTilesetDialog->exec() == QDialog::Accepted){ + if(createTilesetDialog->friendlyName.isEmpty()) { + logError(QString("Tried to create a directory with an empty name.")); + QMessageBox msgBox(this); + msgBox.setText("Failed to add new tileset."); + QString message = QString("The given name was empty."); + msgBox.setInformativeText(message); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Icon::Critical); + msgBox.exec(); + return; + } + QString fullDirectoryPath = editor->project->root + createTilesetDialog->path; + QDir directory; + if(directory.exists(fullDirectoryPath)) { + logError(QString("Could not create tileset \"%1\", the folder \"%2\" already exists.").arg(createTilesetDialog->friendlyName, fullDirectoryPath)); + QMessageBox msgBox(this); + msgBox.setText("Failed to add new tileset."); + QString message = QString("The folder for tileset \"%1\" already exists. View porymap.log for specific errors.").arg(createTilesetDialog->friendlyName); + msgBox.setInformativeText(message); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Icon::Critical); + msgBox.exec(); + return; + } + QMap tilesets = this->editor->project->getTilesetLabels(); + if(tilesets.value("primary").contains(createTilesetDialog->fullSymbolName) || tilesets.value("secondary").contains(createTilesetDialog->fullSymbolName)) { + logError(QString("Could not create tileset \"%1\", the symbol \"%2\" already exists.").arg(createTilesetDialog->friendlyName, createTilesetDialog->fullSymbolName)); + QMessageBox msgBox(this); + msgBox.setText("Failed to add new tileset."); + QString message = QString("The symbol for tileset \"%1\" (\"%2\") already exists.").arg(createTilesetDialog->friendlyName, createTilesetDialog->fullSymbolName); + msgBox.setInformativeText(message); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Icon::Critical); + msgBox.exec(); + return; + } + directory.mkdir(fullDirectoryPath); + directory.mkdir(fullDirectoryPath + "/palettes"); + Tileset *newSet = new Tileset(); + newSet->name = createTilesetDialog->fullSymbolName; + newSet->tilesImagePath = fullDirectoryPath + "/tiles.png"; + newSet->metatiles_path = fullDirectoryPath + "/metatiles.bin"; + newSet->metatile_attrs_path = fullDirectoryPath + "/metatile_attributes.bin"; + newSet->is_secondary = createTilesetDialog->isSecondary ? "TRUE" : "FALSE"; + int numMetaTiles = createTilesetDialog->isSecondary ? (Project::getNumTilesTotal() - Project::getNumTilesPrimary()) : Project::getNumTilesPrimary(); + QImage *tilesImage = new QImage(":/images/blank_tileset.png"); + editor->project->loadTilesetTiles(newSet, *tilesImage); + newSet->metatiles = new QList(); + for(int i = 0; i < numMetaTiles; ++i) { + Metatile *mt = new Metatile(); + for(int j = 0; j < 8; ++j){ + Tile *tile = new Tile(); + //Create a checkerboard-style dummy tileset + if(((i / 8) % 2) == 0) + tile->tile = ((i % 2) == 0) ? 1 : 2; + else + tile->tile = ((i % 2) == 1) ? 1 : 2; + tile->xflip = false; + tile->yflip = false; + tile->palette = 0; + mt->tiles->append(*tile); + } + mt->behavior = 0; + mt->layerType = 0; + + newSet->metatiles->append(mt); + } + newSet->palettes = new QList>(); + newSet->palettePaths = *new QList(); + for(int i = 0; i < 16; ++i) { + QList *currentPal = new QList(); + for(int i = 0; i < 16;++i) { + currentPal->append(qRgb(0,0,0)); + } + newSet->palettes->append(*currentPal); + QString fileName; + fileName.sprintf("%02d.pal", i); + newSet->palettePaths.append(fullDirectoryPath+"/palettes/" + fileName); + } + (*newSet->palettes)[0][1] = qRgb(255,0,255); + newSet->is_compressed = "TRUE"; + newSet->padding = "0"; + editor->project->saveTilesetTilesImage(newSet); + editor->project->saveTilesetMetatiles(newSet); + editor->project->saveTilesetMetatileAttributes(newSet); + editor->project->saveTilesetPalettes(newSet, !createTilesetDialog->isSecondary); + + //append to tileset specific files + + newSet->appendToHeaders(editor->project->root + "/data/tilesets/headers.inc", createTilesetDialog->friendlyName); + newSet->appendToGraphics(editor->project->root + "/data/tilesets/graphics.inc", createTilesetDialog->friendlyName, !createTilesetDialog->isSecondary); + newSet->appendToMetatiles(editor->project->root + "/data/tilesets/metatiles.inc", createTilesetDialog->friendlyName, !createTilesetDialog->isSecondary); + if(!createTilesetDialog->isSecondary) { + this->ui->comboBox_PrimaryTileset->addItem(createTilesetDialog->fullSymbolName); + } else { + this->ui->comboBox_SecondaryTileset->addItem(createTilesetDialog->fullSymbolName); + } + QMessageBox msgBox(this); + msgBox.setText("Successfully created tileset."); + QString message = QString("Tileset \"%1\" was created successfully.").arg(createTilesetDialog->friendlyName); + msgBox.setInformativeText(message); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Icon::Information); + msgBox.exec(); + } +} + void MainWindow::onTilesetChanged(QString mapName) { setMap(mapName); @@ -869,13 +976,15 @@ void MainWindow::updateTilesetEditor() { void MainWindow::currentMetatilesSelectionChanged() { - ui->graphicsView_currentMetatileSelection->setFixedSize(editor->scene_current_metatile_selection_item->pixmap().width() + 2, editor->scene_current_metatile_selection_item->pixmap().height() + 2); - ui->graphicsView_currentMetatileSelection->setSceneRect(0, 0, editor->scene_current_metatile_selection_item->pixmap().width(), editor->scene_current_metatile_selection_item->pixmap().height()); + double scale = pow(3.0, static_cast(porymapConfig.getMetatilesZoom() - 30) / 30.0); + ui->graphicsView_currentMetatileSelection->setFixedSize(editor->scene_current_metatile_selection_item->pixmap().width() * scale + 2, editor->scene_current_metatile_selection_item->pixmap().height() * scale + 2); + ui->graphicsView_currentMetatileSelection->setSceneRect(0, 0, editor->scene_current_metatile_selection_item->pixmap().width() * scale, editor->scene_current_metatile_selection_item->pixmap().height() * scale); QPoint size = editor->metatile_selector_item->getSelectionDimensions(); if (size.x() == 1 && size.y() == 1) { QPoint pos = editor->metatile_selector_item->getMetatileIdCoordsOnWidget(editor->metatile_selector_item->getSelectedMetatiles()->at(0)); - ui->scrollArea_2->ensureVisible(pos.x(), pos.y(), 8, 8); + pos *= scale; + ui->scrollArea_2->ensureVisible(pos.x(), pos.y(), 8 * scale, 8 * scale); } } @@ -887,7 +996,7 @@ void MainWindow::on_mapList_activated(const QModelIndex &index) } } -void MainWindow::markAllEdited(QAbstractItemModel *model) { +void MainWindow::drawMapListIcons(QAbstractItemModel *model) { QList list; list.append(QModelIndex()); while (list.length()) { @@ -897,19 +1006,18 @@ void MainWindow::markAllEdited(QAbstractItemModel *model) { if (model->hasChildren(index)) { list.append(index); } - markEdited(index); - } - } -} - -void MainWindow::markEdited(QModelIndex index) { - QVariant data = index.data(Qt::UserRole); - if (!data.isNull()) { - QString map_name = data.toString(); - if (editor->project) { - if (editor->project->map_cache->contains(map_name)) { - if (editor->project->map_cache->value(map_name)->hasUnsavedChanges()) { - mapListModel->itemFromIndex(mapListIndexes.value(map_name))->setIcon(*mapEditedIcon); + QVariant data = index.data(Qt::UserRole); + if (!data.isNull()) { + QString map_name = data.toString(); + if (editor->project && editor->project->map_cache->contains(map_name)) { + QStandardItem *map = mapListModel->itemFromIndex(mapListIndexes.value(map_name)); + map->setIcon(*mapIcon); + if (editor->project->map_cache->value(map_name)->hasUnsavedChanges()) { + map->setIcon(*mapEditedIcon); + } + if (editor->map->name == map_name) { + map->setIcon(*mapOpenedIcon); + } } } } @@ -918,7 +1026,7 @@ void MainWindow::markEdited(QModelIndex index) { void MainWindow::updateMapList() { QAbstractItemModel *model = ui->mapList->model(); - markAllEdited(model); + drawMapListIcons(model); } void MainWindow::on_action_Save_Project_triggered() @@ -1977,6 +2085,13 @@ void MainWindow::on_horizontalSlider_MetatileZoom_valueChanged(int value) { ui->graphicsView_Metatiles->setResizeAnchor(QGraphicsView::NoAnchor); ui->graphicsView_Metatiles->setMatrix(matrix); ui->graphicsView_Metatiles->setFixedSize(size.width() + 2, size.height() + 2); + + ui->graphicsView_BorderMetatile->setMatrix(matrix); + ui->graphicsView_BorderMetatile->setFixedSize(ceil(static_cast(editor->selected_border_metatiles_item->pixmap().width()) * scale) + 2, + ceil(static_cast(editor->selected_border_metatiles_item->pixmap().height()) * scale) + 2); + + ui->graphicsView_currentMetatileSelection->setMatrix(matrix); + currentMetatilesSelectionChanged(); } void MainWindow::on_actionRegion_Map_Editor_triggered() { diff --git a/src/project.cpp b/src/project.cpp index 79c15d60..ab01eb21 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -720,9 +720,7 @@ void Project::saveTilesetTilesImage(Tileset *tileset) { } void Project::saveTilesetPalettes(Tileset *tileset, bool primary) { - int startPaletteId = primary ? 0 : Project::getNumPalettesPrimary(); - int endPaletteId = primary ? Project::getNumPalettesPrimary() : Project::getNumPalettesTotal(); - for (int i = startPaletteId; i < endPaletteId; i++) { + for (int i = 0; i < Project::getNumPalettesTotal(); i++) { QString filepath = tileset->palettePaths.at(i); QString content = "JASC-PAL\r\n"; content += "0100\r\n"; @@ -1408,7 +1406,7 @@ QStringList Project::getVisibilities() { return names; } -QMap Project::getTilesets() { +QMap Project::getTilesetLabels() { QMap allTilesets; QStringList primaryTilesets; QStringList secondaryTilesets; diff --git a/src/ui/newmappopup.cpp b/src/ui/newmappopup.cpp index 941ddd44..c07691e9 100644 --- a/src/ui/newmappopup.cpp +++ b/src/ui/newmappopup.cpp @@ -48,7 +48,7 @@ void NewMapPopup::useLayout(QString layoutId) { void NewMapPopup::setDefaultValues(int groupNum, QString mapSec) { ui->lineEdit_NewMap_Name->setText(project->getNewMapName()); - QMap tilesets = project->getTilesets(); + QMap tilesets = project->getTilesetLabels(); ui->comboBox_NewMap_Primary_Tileset->addItems(tilesets.value("primary")); ui->comboBox_NewMap_Secondary_Tileset->addItems(tilesets.value("secondary")); diff --git a/src/ui/newtilesetdialog.cpp b/src/ui/newtilesetdialog.cpp new file mode 100644 index 00000000..a2d5f3f4 --- /dev/null +++ b/src/ui/newtilesetdialog.cpp @@ -0,0 +1,40 @@ +#include "newtilesetdialog.h" +#include "ui_newtilesetdialog.h" +#include +#include "project.h" + +NewTilesetDialog::NewTilesetDialog(Project* project, QWidget *parent) : + QDialog(parent), + ui(new Ui::NewTilesetDialog) +{ + ui->setupUi(this); + this->setFixedSize(this->width(), this->height()); + this->project = project; + //only allow characters valid for a symbol + QRegExp expression("[-_.A-Za-z0-9]+$"); + QRegExpValidator *validator = new QRegExpValidator(expression); + this->ui->nameLineEdit->setValidator(validator); + + connect(this->ui->nameLineEdit, &QLineEdit::textChanged, this, &NewTilesetDialog::NameOrSecondaryChanged); + connect(this->ui->typeComboBox, &QComboBox::currentTextChanged, this, &NewTilesetDialog::SecondaryChanged); + //connect(this->ui->toolButton, &QToolButton::clicked, this, &NewTilesetDialog::ChangeFilePath); + this->SecondaryChanged(); +} + +NewTilesetDialog::~NewTilesetDialog() +{ + delete ui; +} + +void NewTilesetDialog::SecondaryChanged(){ + this->isSecondary = (this->ui->typeComboBox->currentIndex() == 1); + NameOrSecondaryChanged(); +} + +void NewTilesetDialog::NameOrSecondaryChanged() { + this->friendlyName = this->ui->nameLineEdit->text(); + this->fullSymbolName = "gTileset_" + this->friendlyName; + this->ui->symbolNameLineEdit->setText(this->fullSymbolName); + this->path = QString("/data/tilesets/") + (this->isSecondary ? "secondary/" : "primary/") + this->friendlyName.toLower(); + this->ui->pathLineEdit->setText(this->path); +} diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 58d07217..1df9f2b9 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -253,6 +253,8 @@ void TilesetEditor::onMetatileLayerSelectionChanged(QPoint selectionOrigin, int if (width == 1 && height == 1) { this->tileSelector->select(static_cast(tiles[0].tile)); ui->spinBox_paletteSelector->setValue(tiles[0].palette); + ui->checkBox_xFlip->setChecked(tiles[0].xflip); + ui->checkBox_yFlip->setChecked(tiles[0].yflip); QPoint pos = tileSelector->getTileCoordsOnWidget(static_cast(tiles[0].tile)); ui->scrollArea_Tiles->ensureVisible(pos.x(), pos.y()); }