diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 61aaa45a..4e60a96a 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -2976,6 +2976,7 @@ Cursor Tile Outline + Region Map Editor diff --git a/forms/regionmapeditor.ui b/forms/regionmapeditor.ui index 6e2e06ce..1d521a36 100644 --- a/forms/regionmapeditor.ui +++ b/forms/regionmapeditor.ui @@ -61,8 +61,8 @@ 0 0 - 345 - 188 + 348 + 225 @@ -182,8 +182,8 @@ 0 0 - 345 - 188 + 348 + 225 @@ -332,8 +332,8 @@ 8 0 - 281 - 225 + 278 + 262 @@ -652,7 +652,7 @@ 0 0 440 - 267 + 230 @@ -788,7 +788,7 @@ 8 0 254 - 311 + 274 @@ -902,6 +902,9 @@ 160 + + Qt::StrongFocus + 1 @@ -946,6 +949,9 @@ 160 + + Qt::StrongFocus + 1 @@ -981,6 +987,9 @@ 160 + + Qt::StrongFocus + 1 @@ -1025,6 +1034,9 @@ 160 + + Qt::StrongFocus + 1 diff --git a/include/core/historyitem.h b/include/core/historyitem.h index 7d87795d..92675055 100644 --- a/include/core/historyitem.h +++ b/include/core/historyitem.h @@ -2,7 +2,6 @@ #define HISTORYITEM_H #include "blockdata.h" -//#include "regionmap.h" class HistoryItem { public: @@ -16,17 +15,15 @@ public: enum RegionMapEditorBox { BackgroundImage = 1, CityMapImage = 2, - BackroundResize = 3, }; class RegionMapHistoryItem { public: int which; - int mapWidth; - int mapHeight; + int mapWidth = 0; + int mapHeight = 0; QVector tiles; QString cityMap; - RegionMapHistoryItem(int type, QVector tiles); RegionMapHistoryItem(int type, QVector tiles, QString cityMap); RegionMapHistoryItem(int type, QVector tiles, int width, int height); ~RegionMapHistoryItem(); diff --git a/include/core/regionmap.h b/include/core/regionmap.h index 7c4b70a9..7e7733e3 100644 --- a/include/core/regionmap.h +++ b/include/core/regionmap.h @@ -15,15 +15,6 @@ #include #include - - -struct CityMapPosition -{ - QString tilemap; - int x; - int y; -}; - struct RegionMapEntry { int x; @@ -38,14 +29,14 @@ class RegionMapSquare public: int x = -1; int y = -1; - uint8_t tile_img_id; + uint8_t tile_img_id = 0x00; + uint8_t secid = 0x00; bool has_map = false; + bool has_city_map = false; + bool duplicated = false; QString map_name; QString mapsec; - uint8_t secid; - bool has_city_map = false; QString city_map_name; - bool duplicated = false; }; class RegionMap : public QObject @@ -57,18 +48,45 @@ public: ~RegionMap() {}; - static QString mapSecToMapConstant(QString); - Project *project; QVector map_squares; + History history; const int padLeft = 1; const int padRight = 3; const int padTop = 2; const int padBottom = 3; - History history; + void init(Project*); + + void readBkgImgBin(); + void readLayout(); + + void save(); + void saveBkgImgBin(); + void saveLayout(); + void saveOptions(int id, QString sec, QString name, int x, int y); + + void resize(int width, int height); + void resetSquare(int index); + + int width(); + int height(); + QSize imgSize(); + unsigned getTileId(int x, int y); + int getMapSquareIndex(int x, int y); + QString pngPath(); + QString cityTilesPath(); + + QVector getTiles(); + void setTiles(QVector tileIds); + +private: + int layout_width_; + int layout_height_; + int img_width_; + int img_height_; QString region_map_png_path; QString region_map_bin_path; @@ -76,65 +94,14 @@ public: QString region_map_layout_bin_path; QString city_map_tiles_path; - QByteArray mapBinData; - - QMap sMapNamesMap;// {"{/sMapName_/}LittlerootTown" : "LITTLEROOT{NAME_END} TOWN"} - QMap mapSecToMapName;// {"MAPSEC_LITTLEROOT_TOWN" : "LITTLEROOT{NAME_END} TOWN"} - QMap mapSecToMapEntry;// TODO: add to this on creation of new map - + QMap sMapNamesMap; + QMap mapSecToMapEntry; QVector sMapNames; - bool hasUnsavedChanges(); - - void init(Project*); - - void readBkgImgBin(); - void readCityMaps(); - void readLayout(); - - QString newAbbr(QString);// makes a *unique* 5 character abbreviation from mapname to add to mapname_abbr - - // TODO: did I use these like, at all? - // editing functions - // if they are booleans, returns true if successful? - bool placeTile(char, int, int);// place tile at x, y - bool removeTile(char, int, int);// replaces with 0x00 byte at x,y - bool placeMap(QString, int, int); - bool removeMap(QString, int, int); - bool removeMap(QString);// remove all instances of map - - void save(); - void saveBkgImgBin(); - void saveLayout(); - void saveOptions(int, QString, QString, int, int); - void saveCityMaps(); - - void resize(int, int); - void setWidth(int); - void setHeight(int); - void setBackgroundImageData(QVector *); - int width(); - int height(); - QSize imgSize(); - unsigned getTileId(int, int); - int getMapSquareIndex(int, int); - - QVector getTiles(); - void setTiles(QVector); - - void resetSquare(int); - -// TODO: move read / write functions to private (and others) -private: - int layout_width_; - int layout_height_; - int img_width_; - int img_height_; - int img_index_(int, int);// returns index int at x,y args (x + y * width_ * 2) // 2 because - int layout_index_(int, int); - void fillMapSquaresFromLayout(); - QString fix_case(QString);// CAPS_WITH_UNDERSCORE to CamelCase + int img_index_(int x, int y); + int layout_index_(int x, int y); + QString fix_case(QString); }; #endif // REGIONMAP_H diff --git a/include/ui/regionmapeditor.h b/include/ui/regionmapeditor.h index 1a44a873..b9af6fd4 100644 --- a/include/ui/regionmapeditor.h +++ b/include/ui/regionmapeditor.h @@ -30,19 +30,19 @@ public: void loadRegionMapData(); void loadCityMaps(); - void onRegionMapTileSelectorSelectedTileChanged(unsigned); - void onCityMapTileSelectorSelectedTileChanged(unsigned); - void onRegionMapTileSelectorHoveredTileChanged(unsigned); + void onRegionMapTileSelectorSelectedTileChanged(unsigned id); + void onCityMapTileSelectorSelectedTileChanged(unsigned id); + void onRegionMapTileSelectorHoveredTileChanged(unsigned id); void onRegionMapTileSelectorHoveredTileCleared(); - void onRegionMapLayoutSelectedTileChanged(int); - void onRegionMapLayoutHoveredTileChanged(int); + void onRegionMapLayoutSelectedTileChanged(int index); + void onRegionMapLayoutHoveredTileChanged(int index); void onRegionMapLayoutHoveredTileCleared(); void undo(); void redo(); - void resize(int, int); + void resize(int width, int height); private: Ui::RegionMapEditor *ui; @@ -55,6 +55,8 @@ private: unsigned selectedImageTile; bool hasUnsavedChanges = false; + bool cityMapFirstDraw = true; + bool regionMapFirstDraw = true; double scaleUpFactor = 2.0; double scaleDownFactor = 1.0 / scaleUpFactor; @@ -81,14 +83,14 @@ private: void displayRegionMapImage(); void displayRegionMapLayout(); void displayRegionMapLayoutOptions(); - void updateRegionMapLayoutOptions(int); + void updateRegionMapLayoutOptions(int index); void displayRegionMapTileSelector(); void displayCityMapTileSelector(); - void displayCityMap(QString); + void displayCityMap(QString name); - bool createCityMap(QString); + bool createCityMap(QString name); - void closeEvent(QCloseEvent*); + void closeEvent(QCloseEvent* event); private slots: void on_action_RegionMap_Save_triggered(); @@ -98,20 +100,20 @@ private slots: void on_action_RegionMap_Generate_triggered(); void on_tabWidget_Region_Map_currentChanged(int); void on_pushButton_RM_Options_delete_clicked(); - void on_comboBox_RM_ConnectedMap_activated(const QString &); + void on_comboBox_RM_ConnectedMap_activated(const QString &text); void on_pushButton_CityMap_add_clicked(); void on_verticalSlider_Zoom_Map_Image_valueChanged(int); void on_verticalSlider_Zoom_Image_Tiles_valueChanged(int); void on_verticalSlider_Zoom_City_Map_valueChanged(int); void on_verticalSlider_Zoom_City_Tiles_valueChanged(int); - void on_comboBox_CityMap_picker_currentTextChanged(const QString &); - void on_spinBox_RM_Options_x_valueChanged(int); - void on_spinBox_RM_Options_y_valueChanged(int); - void on_lineEdit_RM_MapName_textEdited(const QString &); - void onHoveredRegionMapTileChanged(int, int); + void on_comboBox_CityMap_picker_currentTextChanged(const QString &text); + void on_spinBox_RM_Options_x_valueChanged(int val); + void on_spinBox_RM_Options_y_valueChanged(int val); + void on_lineEdit_RM_MapName_textEdited(const QString &text); + void onHoveredRegionMapTileChanged(int x, int y); void onHoveredRegionMapTileCleared(); - void mouseEvent_region_map(QGraphicsSceneMouseEvent *, RegionMapPixmapItem *); - void mouseEvent_city_map(QGraphicsSceneMouseEvent *, CityMapPixmapItem *); + void mouseEvent_region_map(QGraphicsSceneMouseEvent *event, RegionMapPixmapItem *item); + void mouseEvent_city_map(QGraphicsSceneMouseEvent *event, CityMapPixmapItem *item); }; #endif // REGIONMAPEDITOR_H diff --git a/include/ui/tilemaptileselector.h b/include/ui/tilemaptileselector.h index 7bf2b632..293ad3af 100644 --- a/include/ui/tilemaptileselector.h +++ b/include/ui/tilemaptileselector.h @@ -6,9 +6,10 @@ class TilemapTileSelector: public SelectablePixmapItem { Q_OBJECT public: - TilemapTileSelector(QPixmap pixmap): SelectablePixmapItem(8, 8, 1, 1) { - this->pixmap = pixmap; - this->numTilesWide = pixmap.width() / 8; + TilemapTileSelector(QPixmap pixmap_): SelectablePixmapItem(8, 8, 1, 1) { + this->tilemap = pixmap_; + this->setPixmap(this->tilemap); + this->numTilesWide = tilemap.width() / 8; this->selectedTile = 0x00; setAcceptHoverEvents(true); } @@ -21,10 +22,7 @@ public: unsigned selectedTile = 0; - // TODO: which of these need to be made public? - // call this tilemap? or is tilemap the binary file? - QPixmap pixmap;// pointer? - QImage currTile;// image of just the currently selected tile to draw onto graphicsview + QPixmap tilemap; QImage tileImg(unsigned tileId); protected: @@ -40,7 +38,6 @@ private: void updateSelectedTile(); unsigned getTileId(int x, int y); QPoint getTileIdCoords(unsigned); - unsigned getValidTileId(unsigned);// TODO: implement this to prevent segfaults signals: void hoveredTileChanged(unsigned); diff --git a/porymap.pro b/porymap.pro index 7a72c3d8..754f45f1 100644 --- a/porymap.pro +++ b/porymap.pro @@ -28,7 +28,6 @@ SOURCES += src/core/block.cpp \ src/core/parseutil.cpp \ src/core/tile.cpp \ src/core/tileset.cpp \ - src/core/regionmapeditor.cpp \ src/core/regionmap.cpp \ src/core/regionmapgenerator.cpp \ src/ui/aboutporymap.cpp \ @@ -86,7 +85,6 @@ HEADERS += include/core/block.h \ include/core/parseutil.h \ include/core/tile.h \ include/core/tileset.h \ - include/core/regionmapeditor.h \ include/core/regionmap.h \ include/core/regionmapgenerator.h \ include/ui/aboutporymap.h \ diff --git a/src/core/historyitem.cpp b/src/core/historyitem.cpp index 997de9f6..1b0f3888 100644 --- a/src/core/historyitem.cpp +++ b/src/core/historyitem.cpp @@ -10,11 +10,6 @@ HistoryItem::~HistoryItem() { if (this->metatiles) delete this->metatiles; } -RegionMapHistoryItem::RegionMapHistoryItem(int which, QVector tiles) { - this->which = which; - this->tiles = tiles; -} - RegionMapHistoryItem::RegionMapHistoryItem(int which, QVector tiles, QString cityMap) { this->which = which; this->tiles = tiles; diff --git a/src/core/regionmap.cpp b/src/core/regionmap.cpp index 678ed2a2..3720e03d 100644 --- a/src/core/regionmap.cpp +++ b/src/core/regionmap.cpp @@ -7,8 +7,7 @@ #include #include #include - - +#include void RegionMap::init(Project *pro) { QString path = pro->root; @@ -29,10 +28,15 @@ void RegionMap::init(Project *pro) { readBkgImgBin(); readLayout(); - readCityMaps(); } -// TODO: if the tileId is not valid for the provided image, make sure it does not crash +void RegionMap::save() { + logInfo("Saving region map data."); + saveBkgImgBin(); + saveLayout(); + porymapConfig.setRegionMapDimensions(this->img_width_, this->img_height_); +} + void RegionMap::readBkgImgBin() { QFile binFile(region_map_bin_path); if (!binFile.open(QIODevice::ReadOnly)) return; @@ -54,7 +58,7 @@ void RegionMap::readBkgImgBin() { } void RegionMap::saveBkgImgBin() { - QByteArray data(4096,0);// use a constant here? maybe read the original size? + QByteArray data(pow(img_width_ * 2, 2),0); for (int m = 0; m < img_height_; m++) { for (int n = 0; n < img_width_; n++) { @@ -68,9 +72,7 @@ void RegionMap::saveBkgImgBin() { file.close(); } -// TODO: reorganize this into project? the i/o stuff. use regionMapSections void RegionMap::readLayout() { - // QFile file(region_map_entries_path); if (!file.open(QIODevice::ReadOnly)) return; @@ -111,17 +113,16 @@ void RegionMap::readLayout() { QByteArray mapBinData = binFile.readAll(); binFile.close(); - // TODO: improve this? - for (int m = 0; m < layout_height_; m++) { - for (int n = 0; n < layout_width_; n++) { - int i = img_index_(n,m); - map_squares[i].secid = static_cast(mapBinData.at(layout_index_(n,m))); - QString secname = (*(project->regionMapSections))[static_cast(mapBinData.at(layout_index_(n,m)))]; + for (int y = 0; y < layout_height_; y++) { + for (int x = 0; x < layout_width_; x++) { + int i = img_index_(x,y); + map_squares[i].secid = static_cast(mapBinData.at(layout_index_(x,y))); + QString secname = (*(project->regionMapSections))[static_cast(mapBinData.at(layout_index_(x,y)))]; if (secname != "MAPSEC_NONE") map_squares[i].has_map = true; map_squares[i].mapsec = secname; - map_squares[i].map_name = sMapNamesMap.value(mapSecToMapEntry.value(secname).name);// TODO: this is atrocious - map_squares[i].x = n; - map_squares[i].y = m; + map_squares[i].map_name = sMapNamesMap.value(mapSecToMapEntry.value(secname).name); + map_squares[i].x = x; + map_squares[i].y = y; } } } @@ -162,69 +163,11 @@ void RegionMap::saveLayout() { bfile.close(); } -void RegionMap::readCityMaps() {} - -// layout coords to image index -int RegionMap::img_index_(int x, int y) { - return ((x + this->padLeft) + (y + this->padTop) * img_width_); -} - -// layout coords to layout index -int RegionMap::layout_index_(int x, int y) { - return (x + y * layout_width_); -} - -int RegionMap::width() { - return this->img_width_; -} - -int RegionMap::height() { - return this->img_height_; -} - -QSize RegionMap::imgSize() { - return QSize(img_width_ * 8, img_height_ * 8); -} - -QVector RegionMap::getTiles() { - // - QVector tileIds; - for (auto square : map_squares) { - tileIds.append(square.tile_img_id); - } - return tileIds; -} - -void RegionMap::setTiles(QVector tileIds) { - // - if (tileIds.size() != map_squares.size()) { - qDebug() << "YOU SHOULD RESIZE"; - return; - } - int i = 0; - for (uint8_t tileId : tileIds) { - map_squares[i].tile_img_id = tileId; - i++; - } -} - -// TODO: rename to getTileIdAt()? -unsigned RegionMap::getTileId(int x, int y) { - return map_squares[x + y * img_width_].tile_img_id; -} - -void RegionMap::save() { - logInfo("Saving region map info."); - saveBkgImgBin(); - saveLayout(); - porymapConfig.setRegionMapDimensions(this->img_width_, this->img_height_); -} - void RegionMap::saveOptions(int id, QString sec, QString name, int x, int y) { resetSquare(id); int index = getMapSquareIndex(x + this->padLeft, y + this->padTop); if (!sec.isEmpty()) { - this->map_squares[index].has_map = true; + this->map_squares[index].has_map = sec == "MAPSEC_NONE" ? false : true; this->map_squares[index].secid = static_cast(project->regionMapSections->indexOf(sec)); this->map_squares[index].mapsec = sec; if (!name.isEmpty()) { @@ -234,7 +177,7 @@ void RegionMap::saveOptions(int id, QString sec, QString name, int x, int y) { QString sName = fix_case(sec); sMapNames.append(sName); sMapNamesMap.insert(sName, name); - struct RegionMapEntry entry = {x, y, 1, 1, sName};// TODO: change width, height? + struct RegionMapEntry entry = {x, y, 1, 1, sName}; mapSecToMapEntry.insert(sec, entry); } } @@ -242,32 +185,6 @@ void RegionMap::saveOptions(int id, QString sec, QString name, int x, int y) { this->map_squares[index].y = y; this->map_squares[index].duplicated = false; } - //resetSquare(id); -} - -// from x, y of image -int RegionMap::getMapSquareIndex(int x, int y) { - int index = (x + y * img_width_); - return index < map_squares.length() ? index : 0; -} - -// For turning a MAPSEC_NAME into a unique identifier sMapName-style variable. -QString RegionMap::fix_case(QString caps) { - bool big = true; - QString camel; - - for (auto ch : caps.remove(QRegularExpression("({.*})")).remove("MAPSEC")) { - if (ch == '_' || ch == ' ') { - big = true; - continue; - } - if (big) { - camel += ch.toUpper(); - big = false; - } - else camel += ch.toLower(); - } - return camel; } void RegionMap::resetSquare(int index) { @@ -282,7 +199,6 @@ void RegionMap::resetSquare(int index) { } void RegionMap::resize(int newWidth, int newHeight) { - // QVector new_squares; for (int y = 0; y < newHeight; y++) { @@ -301,10 +217,87 @@ void RegionMap::resize(int newWidth, int newHeight) { new_squares.append(square); } } - this->map_squares = new_squares; this->img_width_ = newWidth; this->img_height_ = newHeight; this->layout_width_ = newWidth - this->padLeft - this->padRight; this->layout_height_ = newHeight - this->padTop - this->padBottom; } + +QVector RegionMap::getTiles() { + QVector tileIds; + for (auto square : map_squares) { + tileIds.append(square.tile_img_id); + } + return tileIds; +} + +void RegionMap::setTiles(QVector tileIds) { + if (tileIds.size() != map_squares.size()) return; + + int i = 0; + for (uint8_t tileId : tileIds) { + map_squares[i].tile_img_id = tileId; + i++; + } +} + +// Layout coords to image index. +int RegionMap::img_index_(int x, int y) { + return ((x + this->padLeft) + (y + this->padTop) * img_width_); +} + +// Layout coords to layout index. +int RegionMap::layout_index_(int x, int y) { + return (x + y * layout_width_); +} + +int RegionMap::width() { + return this->img_width_; +} + +int RegionMap::height() { + return this->img_height_; +} + +QSize RegionMap::imgSize() { + return QSize(img_width_ * 8, img_height_ * 8); +} + +unsigned RegionMap::getTileId(int x, int y) { + return map_squares.at(x + y * img_width_).tile_img_id; +} + +QString RegionMap::pngPath() { + return this->region_map_png_path; +} + +QString RegionMap::cityTilesPath() { + return this->city_map_tiles_path; +} + +// From x, y of image. +int RegionMap::getMapSquareIndex(int x, int y) { + int index = (x + y * img_width_); + return index < map_squares.length() ? index : 0; +} + +// For turning a MAPSEC_NAME into a unique identifier sMapName-style variable. +// CAPS_WITH_UNDERSCORE to CamelCase +QString RegionMap::fix_case(QString caps) { + bool big = true; + QString camel; + + for (auto ch : caps.remove(QRegularExpression("({.*})")).remove("MAPSEC")) { + if (ch == '_' || ch == ' ') { + big = true; + continue; + } + if (big) { + camel += ch.toUpper(); + big = false; + } + else camel += ch.toLower(); + } + return camel; +} diff --git a/src/project.cpp b/src/project.cpp index d7e99ce3..d763efba 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -1512,7 +1512,6 @@ void Project::readRegionMapSections() { QString filepath = root + "/include/constants/region_map_sections.h"; QStringList prefixes = (QStringList() << "MAPSEC_"); readCDefinesSorted(filepath, prefixes, regionMapSections); - regionMapSections->removeAll("MAPSEC_SUBTRACT_KANTO");// TODO: fix this (in repos?) } void Project::readItemNames() { diff --git a/src/ui/citymappixmapitem.cpp b/src/ui/citymappixmapitem.cpp index da920ca6..bbe31f65 100644 --- a/src/ui/citymappixmapitem.cpp +++ b/src/ui/citymappixmapitem.cpp @@ -6,8 +6,6 @@ #include #include - - void CityMapPixmapItem::init() { width_ = 10; height_ = 10; @@ -78,7 +76,6 @@ void CityMapPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { } QVector CityMapPixmapItem::getTiles() { - // QVector tiles; for (auto tile : data) { tiles.append(tile); @@ -87,7 +84,6 @@ QVector CityMapPixmapItem::getTiles() { } void CityMapPixmapItem::setTiles(QVector tiles) { - // QByteArray newData; for (auto tile : tiles) { newData.append(tile); diff --git a/src/ui/regionmapeditor.cpp b/src/ui/regionmapeditor.cpp index 3c9ea146..42fff3ef 100644 --- a/src/ui/regionmapeditor.cpp +++ b/src/ui/regionmapeditor.cpp @@ -19,6 +19,7 @@ RegionMapEditor::RegionMapEditor(QWidget *parent, Project *project_) : this->ui->setupUi(this); this->project = project_; this->region_map = new RegionMap; + this->ui->action_RegionMap_Generate->setVisible(false); } RegionMapEditor::~RegionMapEditor() @@ -48,6 +49,7 @@ void RegionMapEditor::on_action_RegionMap_Save_triggered() { this->ui->spinBox_RM_Options_x->value(), this->ui->spinBox_RM_Options_y->value() ); + this->currIndex = this->region_map_layout_item->highlightedTile; this->region_map_layout_item->highlightedTile = -1; displayRegionMap(); } @@ -104,8 +106,13 @@ void RegionMapEditor::displayRegionMapImage() { this->ui->graphicsView_Region_Map_BkgImg->setFixedSize(this->region_map->imgSize().width() * scaleRegionMapImage + 2, this->region_map->imgSize().height() * scaleRegionMapImage + 2); - RegionMapHistoryItem *commit = new RegionMapHistoryItem(RegionMapEditorBox::BackgroundImage, this->region_map->getTiles()); - history.push(commit); + if (regionMapFirstDraw) { + RegionMapHistoryItem *commit = new RegionMapHistoryItem( + RegionMapEditorBox::BackgroundImage, this->region_map->getTiles(), this->region_map->width(), this->region_map->height() + ); + history.push(commit); + regionMapFirstDraw = false; + } } void RegionMapEditor::displayRegionMapLayout() { @@ -179,7 +186,7 @@ void RegionMapEditor::displayRegionMapTileSelector() { delete mapsquare_selector_item; } - this->mapsquare_selector_item = new TilemapTileSelector(QPixmap(this->region_map->region_map_png_path)); + this->mapsquare_selector_item = new TilemapTileSelector(QPixmap(this->region_map->pngPath())); this->mapsquare_selector_item->draw(); this->scene_region_map_tiles->addItem(this->mapsquare_selector_item); @@ -207,7 +214,7 @@ void RegionMapEditor::displayCityMapTileSelector() { delete city_map_selector_item; } - this->city_map_selector_item = new TilemapTileSelector(QPixmap(this->region_map->city_map_tiles_path)); + this->city_map_selector_item = new TilemapTileSelector(QPixmap(this->region_map->cityTilesPath())); this->city_map_selector_item->draw(); this->scene_city_map_tiles->addItem(this->city_map_selector_item); @@ -245,11 +252,6 @@ void RegionMapEditor::displayCityMap(QString f) { this->ui->graphicsView_City_Map->setScene(scene_city_map_image); this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width() * scaleCityMapImage + 2, 8 * city_map_item->height() * scaleCityMapImage + 2); - - RegionMapHistoryItem *commit = new RegionMapHistoryItem( - RegionMapEditorBox::CityMapImage, this->city_map_item->getTiles(), this->city_map_item->file - ); - history.push(commit); } bool RegionMapEditor::createCityMap(QString name) { @@ -302,9 +304,10 @@ void RegionMapEditor::onRegionMapTileSelectorHoveredTileCleared() { void RegionMapEditor::onRegionMapLayoutSelectedTileChanged(int index) { QString message = QString(); this->currIndex = index; + this->region_map_layout_item->highlightedTile = index; if (this->region_map->map_squares[index].has_map) { message = QString("\t %1").arg(this->project->mapSecToMapHoverName->value( - this->region_map->map_squares[index].mapsec)).remove("{NAME_END}");// ruby-specific + this->region_map->map_squares[index].mapsec)).remove("{NAME_END}"); } this->ui->statusbar->showMessage(message); @@ -319,7 +322,7 @@ void RegionMapEditor::onRegionMapLayoutHoveredTileChanged(int index) { message = QString("(%1, %2)").arg(x).arg(y); if (this->region_map->map_squares[index].has_map) { message += QString("\t %1").arg(this->project->mapSecToMapHoverName->value( - this->region_map->map_squares[index].mapsec)).remove("{NAME_END}"); + this->region_map->map_squares[index].mapsec)).remove("{NAME_END}"); } } this->ui->statusbar->showMessage(message); @@ -330,7 +333,7 @@ void RegionMapEditor::onRegionMapLayoutHoveredTileCleared() { } void RegionMapEditor::onHoveredRegionMapTileChanged(int x, int y) { - QString message = QString("x: %1, y: %2 Tile: 0x").arg(x).arg(y) + QString message = QString("x: %1, y: %2 Tile: 0x").arg(x).arg(y) + QString("%1").arg(this->region_map->getTileId(x, y), 4, 16, QChar('0')).toUpper(); this->ui->statusbar->showMessage(message); } @@ -357,7 +360,7 @@ void RegionMapEditor::mouseEvent_region_map(QGraphicsSceneMouseEvent *event, Reg bool addToHistory = !(current && current->tiles == this->region_map->getTiles()); if (addToHistory) { RegionMapHistoryItem *commit = new RegionMapHistoryItem( - RegionMapEditorBox::BackgroundImage, this->region_map->getTiles() + RegionMapEditorBox::BackgroundImage, this->region_map->getTiles(), this->region_map->width(), this->region_map->height() ); history.push(commit); } @@ -366,12 +369,19 @@ void RegionMapEditor::mouseEvent_region_map(QGraphicsSceneMouseEvent *event, Reg } void RegionMapEditor::mouseEvent_city_map(QGraphicsSceneMouseEvent *event, CityMapPixmapItem *item) { - // QPointF pos = event->pos(); int x = static_cast(pos.x()) / 8; int y = static_cast(pos.y()) / 8; int index = this->city_map_item->getIndexAt(x, y); + if (cityMapFirstDraw) { + RegionMapHistoryItem *commit = new RegionMapHistoryItem( + RegionMapEditorBox::CityMapImage, this->city_map_item->getTiles(), this->city_map_item->file + ); + history.push(commit); + cityMapFirstDraw = false; + } + if (event->buttons() & Qt::RightButton) {// TODO //} else if (event->buttons() & Qt::MiddleButton) {// TODO } else { @@ -473,7 +483,7 @@ void RegionMapEditor::on_action_RegionMap_Resize_triggered() { QSpinBox *heightSpinBox = new QSpinBox(); widthSpinBox->setMinimum(32); heightSpinBox->setMinimum(20); - widthSpinBox->setMaximum(60);// w * h * 2 <= 4960 + widthSpinBox->setMaximum(60);// TODO: find real limits heightSpinBox->setMaximum(40); widthSpinBox->setValue(this->region_map->width()); heightSpinBox->setValue(this->region_map->height()); @@ -488,6 +498,10 @@ void RegionMapEditor::on_action_RegionMap_Resize_triggered() { if (popup.exec() == QDialog::Accepted) { resize(widthSpinBox->value(), heightSpinBox->value()); + RegionMapHistoryItem *commit = new RegionMapHistoryItem( + RegionMapEditorBox::BackgroundImage, this->region_map->getTiles(), widthSpinBox->value(), heightSpinBox->value() + ); + history.push(commit); } this->hasUnsavedChanges = true; @@ -498,7 +512,6 @@ void RegionMapEditor::on_action_RegionMap_Undo_triggered() { this->hasUnsavedChanges = true; } -// TODO: add resizing void RegionMapEditor::undo() { RegionMapHistoryItem *commit = history.back(); if (!commit) return; @@ -506,6 +519,8 @@ void RegionMapEditor::undo() { switch (commit->which) { case RegionMapEditorBox::BackgroundImage: + if (commit->mapWidth != this->region_map->width() || commit->mapHeight != this->region_map->height()) + this->resize(commit->mapWidth, commit->mapHeight); this->region_map->setTiles(commit->tiles); this->region_map_item->draw(); break; @@ -514,10 +529,6 @@ void RegionMapEditor::undo() { this->city_map_item->setTiles(commit->tiles); this->city_map_item->draw(); break; - case RegionMapEditorBox::BackroundResize: - this->region_map->resize(commit->mapWidth, commit->mapHeight); - displayRegionMap(); - break; } } @@ -533,6 +544,8 @@ void RegionMapEditor::redo() { switch (commit->which) { case RegionMapEditorBox::BackgroundImage: + if (commit->mapWidth != this->region_map->width() || commit->mapHeight != this->region_map->height()) + this->resize(commit->mapWidth, commit->mapHeight); this->region_map->setTiles(commit->tiles); this->region_map_item->draw(); break; @@ -540,31 +553,20 @@ void RegionMapEditor::redo() { this->city_map_item->setTiles(commit->tiles); this->city_map_item->draw(); break; - case RegionMapEditorBox::BackroundResize: - this->region_map->resize(commit->mapWidth, commit->mapHeight); - displayRegionMap(); - break; } } void RegionMapEditor::resize(int w, int h) { - RegionMapHistoryItem *commitOld = new RegionMapHistoryItem( - RegionMapEditorBox::BackroundResize, this->region_map->getTiles(), this->region_map->width(), this->region_map->height() - ); - RegionMapHistoryItem *commitNew = new RegionMapHistoryItem( - RegionMapEditorBox::BackroundResize, this->region_map->getTiles(), w, h - ); - history.push(commitOld); - history.push(commitNew); - history.back(); - this->region_map->resize(w, h); - this->currIndex = 2 * w + 1; - displayRegionMap(); + this->currIndex = this->region_map->padLeft * w + this->region_map->padTop; + displayRegionMapImage(); + displayRegionMapLayout(); + displayRegionMapLayoutOptions(); } void RegionMapEditor::on_comboBox_CityMap_picker_currentTextChanged(const QString &file) { this->displayCityMap(file); + this->cityMapFirstDraw = true; } void RegionMapEditor::closeEvent(QCloseEvent *event) @@ -652,7 +654,6 @@ void RegionMapEditor::on_verticalSlider_Zoom_City_Tiles_valueChanged(int val) { } void RegionMapEditor::on_action_RegionMap_Generate_triggered() { - // RegionMapGenerator generator(this->project); generator.generate("LittlerootTown"); this->hasUnsavedChanges = true; diff --git a/src/ui/regionmaplayoutpixmapitem.cpp b/src/ui/regionmaplayoutpixmapitem.cpp index 8654b66b..82edc5ba 100644 --- a/src/ui/regionmaplayoutpixmapitem.cpp +++ b/src/ui/regionmaplayoutpixmapitem.cpp @@ -1,7 +1,5 @@ #include "regionmaplayoutpixmapitem.h" - - void RegionMapLayoutPixmapItem::draw() { if (!region_map) return; @@ -76,9 +74,7 @@ void RegionMapLayoutPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) mousePressEvent(event); } -void RegionMapLayoutPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - // -} +void RegionMapLayoutPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {} void RegionMapLayoutPixmapItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { QPoint pos = this->getCellPos(event->pos()); diff --git a/src/ui/regionmappixmapitem.cpp b/src/ui/regionmappixmapitem.cpp index 6f3886c7..976d1ae9 100644 --- a/src/ui/regionmappixmapitem.cpp +++ b/src/ui/regionmappixmapitem.cpp @@ -1,7 +1,4 @@ #include "regionmappixmapitem.h" -#include "imageproviders.h" - - void RegionMapPixmapItem::draw() { if (!region_map) return; diff --git a/src/ui/tilemaptileselector.cpp b/src/ui/tilemaptileselector.cpp index af7dfdc5..770b20b5 100644 --- a/src/ui/tilemaptileselector.cpp +++ b/src/ui/tilemaptileselector.cpp @@ -3,16 +3,15 @@ #include void TilemapTileSelector::draw() { - size_t width_ = this->pixmap.width(); + size_t width_ = this->tilemap.width(); this->pixelWidth = width_; - size_t height_ = this->pixmap.height(); + size_t height_ = this->tilemap.height(); this->pixelHeight = height_; size_t ntiles_ = (width_/8) * (height_/8); this->numTilesWide = width_ / 8; this->numTiles = ntiles_; - this->setPixmap(this->pixmap); this->drawSelection(); } @@ -37,6 +36,16 @@ unsigned TilemapTileSelector::getTileId(int x, int y) { return index < this->numTiles ? index : this->numTiles % index; } +QPoint TilemapTileSelector::getTileIdCoords(unsigned tileId) { + int index = tileId < this->numTiles ? tileId : this->numTiles % tileId; + return QPoint(index % this->numTilesWide, index / this->numTilesWide); +} + +QImage TilemapTileSelector::tileImg(unsigned tileId) { + QPoint pos = getTileIdCoords(tileId); + return this->tilemap.copy(pos.x() * 8, pos.y() * 8, 8, 8).toImage(); +} + void TilemapTileSelector::mousePressEvent(QGraphicsSceneMouseEvent *event) { SelectablePixmapItem::mousePressEvent(event); this->updateSelectedTile(); @@ -65,14 +74,3 @@ void TilemapTileSelector::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { void TilemapTileSelector::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) { emit this->hoveredTileCleared(); } - -QPoint TilemapTileSelector::getTileIdCoords(unsigned tileId) { - int index = tileId < this->numTiles ? tileId : this->numTiles % tileId; - return QPoint(index % this->numTilesWide, index / this->numTilesWide); -} - -QImage TilemapTileSelector::tileImg(unsigned tileId) { - // - QPoint pos = getTileIdCoords(tileId); - return pixmap.copy(pos.x() * 8, pos.y() * 8, 8, 8).toImage(); -}