diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h index a3aa4589..283f9cde 100644 --- a/include/ui/tileseteditor.h +++ b/include/ui/tileseteditor.h @@ -93,13 +93,17 @@ private slots: void on_actionImport_Secondary_Metatiles_triggered(); private: - void init(Project*, Map*); - void closeEvent(QCloseEvent*); - void initMetatileSelector(Map*); + void initUi(); + void setMetatileBehaviors(); + void setMetatileLayersUi(); + void setVersionSpecificUi(); + void setMetatileLabelValidator(); + void initMetatileSelector(); void initTileSelector(); void initSelectedTileItem(); void initMetatileLayersItem(); void restoreWindowState(); + void initMetatileHistory(); void setTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel); void reset(); void drawSelectedTiles(); @@ -107,6 +111,7 @@ private: void importTilesetMetatiles(Tileset*, bool); void refresh(); void saveMetatileLabel(); + void closeEvent(QCloseEvent*); Ui::TilesetEditor *ui; History metatileHistory; TilesetEditorMetatileSelector *metatileSelector = nullptr; diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index af5da658..950b8d46 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -14,10 +14,14 @@ TilesetEditor::TilesetEditor(Project *project, Map *map, QWidget *parent) : QMainWindow(parent), - ui(new Ui::TilesetEditor) + ui(new Ui::TilesetEditor), + project(project), + map(map), + hasUnsavedChanges(false) { - this->init(project, map); - new QShortcut(QKeySequence("Ctrl+Shift+Z"), this, SLOT(on_actionRedo_triggered())); + this->setTilesets(this->map->layout->tileset_primary_label, this->map->layout->tileset_secondary_label); + this->initUi(); + this->initMetatileHistory(); } TilesetEditor::~TilesetEditor() @@ -37,83 +41,6 @@ TilesetEditor::~TilesetEditor() delete metatileLayersScene; } -void TilesetEditor::init(Project *project, Map *map) { - ui->setupUi(this); - this->project = project; - - this->hasUnsavedChanges = false; - this->tileXFlip = ui->checkBox_xFlip->isChecked(); - this->tileYFlip = ui->checkBox_yFlip->isChecked(); - this->paletteId = ui->spinBox_paletteSelector->value(); - - Tileset *primaryTileset = project->getTileset(map->layout->tileset_primary_label); - Tileset *secondaryTileset = project->getTileset(map->layout->tileset_secondary_label); - if (this->primaryTileset) delete this->primaryTileset; - if (this->secondaryTileset) delete this->secondaryTileset; - this->primaryTileset = primaryTileset->copy(); - this->secondaryTileset = secondaryTileset->copy(); - - QList sortedBehaviors; - for (int num : project->metatileBehaviorMapInverse.keys()) { - this->ui->comboBox_metatileBehaviors->addItem(project->metatileBehaviorMapInverse[num], num); - } - - if (!projectConfig.getTripleLayerMetatilesEnabled()) { - this->ui->comboBox_layerType->addItem("Normal - Middle/Top", 0); - this->ui->comboBox_layerType->addItem("Covered - Bottom/Middle", 1); - this->ui->comboBox_layerType->addItem("Split - Bottom/Top", 2); - } else { - this->ui->comboBox_layerType->setVisible(false); - this->ui->label_layerType->setVisible(false); - this->ui->label_BottomTop->setText("Bottom/Middle/Top"); - } - - this->ui->spinBox_paletteSelector->setMinimum(0); - this->ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1); - - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { - this->ui->comboBox_encounterType->setVisible(true); - this->ui->label_encounterType->setVisible(true); - this->ui->comboBox_encounterType->addItem("None", 0); - this->ui->comboBox_encounterType->addItem("Land", 1); - this->ui->comboBox_encounterType->addItem("Water", 2); - this->ui->comboBox_terrainType->setVisible(true); - this->ui->label_terrainType->setVisible(true); - this->ui->comboBox_terrainType->addItem("Normal", 0); - this->ui->comboBox_terrainType->addItem("Grass", 1); - this->ui->comboBox_terrainType->addItem("Water", 2); - this->ui->comboBox_terrainType->addItem("Waterfall", 3); - } else { - this->ui->comboBox_encounterType->setVisible(false); - this->ui->label_encounterType->setVisible(false); - this->ui->comboBox_terrainType->setVisible(false); - this->ui->label_terrainType->setVisible(false); - } - - //only allow characters valid for a symbol - QRegExp expression("[_A-Za-z0-9]*$"); - QRegExpValidator *validator = new QRegExpValidator(expression); - this->ui->lineEdit_metatileLabel->setValidator(validator); - - this->initMetatileSelector(map); - this->initMetatileLayersItem(); - this->initTileSelector(); - this->initSelectedTileItem(); - this->metatileSelector->select(0); - this->restoreWindowState(); - - MetatileHistoryItem *commit = new MetatileHistoryItem(0, nullptr, this->metatile->copy()); - metatileHistory.push(commit); -} - -bool TilesetEditor::selectMetatile(uint16_t metatileId) { - if (!Tileset::metatileIsValid(metatileId, this->primaryTileset, this->secondaryTileset)) return false; - this->metatileSelector->select(metatileId); - QPoint pos = this->metatileSelector->getMetatileIdCoordsOnWidget(metatileId); - this->ui->scrollArea_Metatiles->ensureVisible(pos.x(), pos.y()); - return true; -} - void TilesetEditor::update(Map *map, QString primaryTilesetLabel, QString secondaryTilesetLabel) { this->updateMap(map); this->updateTilesets(primaryTilesetLabel, secondaryTilesetLabel); @@ -140,6 +67,14 @@ void TilesetEditor::updateTilesets(QString primaryTilesetLabel, QString secondar this->refresh(); } +bool TilesetEditor::selectMetatile(uint16_t metatileId) { + if (!Tileset::metatileIsValid(metatileId, this->primaryTileset, this->secondaryTileset)) return false; + this->metatileSelector->select(metatileId); + QPoint pos = this->metatileSelector->getMetatileIdCoordsOnWidget(metatileId); + this->ui->scrollArea_Metatiles->ensureVisible(pos.x(), pos.y()); + return true; +} + void TilesetEditor::setTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel) { Tileset *primaryTileset = project->getTileset(primaryTilesetLabel); Tileset *secondaryTileset = project->getTileset(secondaryTilesetLabel); @@ -149,23 +84,77 @@ void TilesetEditor::setTilesets(QString primaryTilesetLabel, QString secondaryTi this->secondaryTileset = secondaryTileset->copy(); } -void TilesetEditor::refresh() { - this->metatileLayersItem->setTilesets(this->primaryTileset, this->secondaryTileset); - this->tileSelector->setTilesets(this->primaryTileset, this->secondaryTileset); - this->metatileSelector->setTilesets(this->primaryTileset, this->secondaryTileset); - this->metatileSelector->select(this->metatileSelector->getSelectedMetatile()); - this->drawSelectedTiles(); +void TilesetEditor::initUi() { + ui->setupUi(this); + new QShortcut(QKeySequence("Ctrl+Shift+Z"), this, SLOT(on_actionRedo_triggered())); + this->tileXFlip = ui->checkBox_xFlip->isChecked(); + this->tileYFlip = ui->checkBox_yFlip->isChecked(); + this->paletteId = ui->spinBox_paletteSelector->value(); + this->ui->spinBox_paletteSelector->setMinimum(0); + this->ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1); - this->ui->graphicsView_Tiles->setSceneRect(0, 0, this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); - this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); - this->ui->graphicsView_Metatiles->setSceneRect(0, 0, this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); - this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); - this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width() + 2, this->selectedTilePixmapItem->pixmap().height() + 2); + this->setMetatileBehaviors(); + this->setMetatileLayersUi(); + this->setVersionSpecificUi(); + this->setMetatileLabelValidator(); + + this->initMetatileSelector(); + this->initMetatileLayersItem(); + this->initTileSelector(); + this->initSelectedTileItem(); + this->metatileSelector->select(0); + this->restoreWindowState(); } -void TilesetEditor::initMetatileSelector(Map *map) +void TilesetEditor::setMetatileBehaviors() { + for (int num : project->metatileBehaviorMapInverse.keys()) { + this->ui->comboBox_metatileBehaviors->addItem(project->metatileBehaviorMapInverse[num], num); + } +} + +void TilesetEditor::setMetatileLayersUi() { + if (!projectConfig.getTripleLayerMetatilesEnabled()) { + this->ui->comboBox_layerType->addItem("Normal - Middle/Top", 0); + this->ui->comboBox_layerType->addItem("Covered - Bottom/Middle", 1); + this->ui->comboBox_layerType->addItem("Split - Bottom/Top", 2); + } else { + this->ui->comboBox_layerType->setVisible(false); + this->ui->label_layerType->setVisible(false); + this->ui->label_BottomTop->setText("Bottom/Middle/Top"); + } +} + +void TilesetEditor::setVersionSpecificUi() { + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + this->ui->comboBox_encounterType->setVisible(true); + this->ui->label_encounterType->setVisible(true); + this->ui->comboBox_encounterType->addItem("None", 0); + this->ui->comboBox_encounterType->addItem("Land", 1); + this->ui->comboBox_encounterType->addItem("Water", 2); + this->ui->comboBox_terrainType->setVisible(true); + this->ui->label_terrainType->setVisible(true); + this->ui->comboBox_terrainType->addItem("Normal", 0); + this->ui->comboBox_terrainType->addItem("Grass", 1); + this->ui->comboBox_terrainType->addItem("Water", 2); + this->ui->comboBox_terrainType->addItem("Waterfall", 3); + } else { + this->ui->comboBox_encounterType->setVisible(false); + this->ui->label_encounterType->setVisible(false); + this->ui->comboBox_terrainType->setVisible(false); + this->ui->label_terrainType->setVisible(false); + } +} + +void TilesetEditor::setMetatileLabelValidator() { + //only allow characters valid for a symbol + QRegExp expression("[_A-Za-z0-9]*$"); + QRegExpValidator *validator = new QRegExpValidator(expression); + this->ui->lineEdit_metatileLabel->setValidator(validator); +} + +void TilesetEditor::initMetatileSelector() { - this->metatileSelector = new TilesetEditorMetatileSelector(this->primaryTileset, this->secondaryTileset, map); + this->metatileSelector = new TilesetEditorMetatileSelector(this->primaryTileset, this->secondaryTileset, this->map); connect(this->metatileSelector, SIGNAL(hoveredMetatileChanged(uint16_t)), this, SLOT(onHoveredMetatileChanged(uint16_t))); connect(this->metatileSelector, SIGNAL(hoveredMetatileCleared()), @@ -181,6 +170,19 @@ void TilesetEditor::initMetatileSelector(Map *map) this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); } +void TilesetEditor::initMetatileLayersItem() { + Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), this->primaryTileset, this->secondaryTileset); + this->metatileLayersItem = new MetatileLayersItem(metatile, this->primaryTileset, this->secondaryTileset); + connect(this->metatileLayersItem, SIGNAL(tileChanged(int, int)), + this, SLOT(onMetatileLayerTileChanged(int, int))); + connect(this->metatileLayersItem, SIGNAL(selectedTilesChanged(QPoint, int, int)), + this, SLOT(onMetatileLayerSelectionChanged(QPoint, int, int))); + + this->metatileLayersScene = new QGraphicsScene; + this->metatileLayersScene->addItem(this->metatileLayersItem); + this->ui->graphicsView_metatileLayers->setScene(this->metatileLayersScene); +} + void TilesetEditor::initTileSelector() { this->tileSelector = new TilesetEditorTileSelector(this->primaryTileset, this->secondaryTileset, projectConfig.getTripleLayerMetatilesEnabled()); @@ -214,6 +216,11 @@ void TilesetEditor::restoreWindowState() { this->restoreState(geometry.value("tileset_editor_state")); } +void TilesetEditor::initMetatileHistory() { + MetatileHistoryItem *commit = new MetatileHistoryItem(0, nullptr, this->metatile->copy()); + metatileHistory.push(commit); +} + void TilesetEditor::reset() { this->hasUnsavedChanges = false; this->setTilesets(this->primaryTileset->name, this->secondaryTileset->name); @@ -222,6 +229,20 @@ void TilesetEditor::reset() { this->refresh(); } +void TilesetEditor::refresh() { + this->metatileLayersItem->setTilesets(this->primaryTileset, this->secondaryTileset); + this->tileSelector->setTilesets(this->primaryTileset, this->secondaryTileset); + this->metatileSelector->setTilesets(this->primaryTileset, this->secondaryTileset); + this->metatileSelector->select(this->metatileSelector->getSelectedMetatile()); + this->drawSelectedTiles(); + + this->ui->graphicsView_Tiles->setSceneRect(0, 0, this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); + this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); + this->ui->graphicsView_Metatiles->setSceneRect(0, 0, this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); + this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2); + this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width() + 2, this->selectedTilePixmapItem->pixmap().height() + 2); +} + void TilesetEditor::drawSelectedTiles() { if (!this->selectedTileScene) { return; @@ -248,19 +269,6 @@ void TilesetEditor::drawSelectedTiles() { this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width() + 2, this->selectedTilePixmapItem->pixmap().height() + 2); } -void TilesetEditor::initMetatileLayersItem() { - Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), this->primaryTileset, this->secondaryTileset); - this->metatileLayersItem = new MetatileLayersItem(metatile, this->primaryTileset, this->secondaryTileset); - connect(this->metatileLayersItem, SIGNAL(tileChanged(int, int)), - this, SLOT(onMetatileLayerTileChanged(int, int))); - connect(this->metatileLayersItem, SIGNAL(selectedTilesChanged(QPoint, int, int)), - this, SLOT(onMetatileLayerSelectionChanged(QPoint, int, int))); - - this->metatileLayersScene = new QGraphicsScene; - this->metatileLayersScene->addItem(this->metatileLayersItem); - this->ui->graphicsView_metatileLayers->setScene(this->metatileLayersScene); -} - void TilesetEditor::onHoveredMetatileChanged(uint16_t metatileId) { Metatile *metatile = Tileset::getMetatile(metatileId, this->primaryTileset, this->secondaryTileset); QString message;