diff --git a/CHANGELOG.md b/CHANGELOG.md
index 245fcc7e..861883dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ The **"Breaking Changes"** listed below are changes that have been made in the d
- The New Map dialog now gives an option to specify the "Show Location Name" field.
- Some new shortcuts were added in [porymap/#290](https://github.com/huderlem/porymap/pull/290).
- All plain text boxes now have a clear button to delete the text.
+- The window sizes and positions of the tileset editor, palette editor, and region map editor are now stored in `porymap.cfg`.
### Changed
- Holding `shift` now toggles "Smart Path" drawing; when the "Smart Paths" checkbox is checked, holding `shift` will temporarily disable it.
@@ -23,6 +24,7 @@ The **"Breaking Changes"** listed below are changes that have been made in the d
- Fix a bug with the current metatile selection zoom.
- Fix bug preventing the status bar from updating the current position while dragging events.
- Fix porymap icon not showing on window or panel on Linux.
+- The main window can now be resized to fit on lower resolution displays.
- Zooming the map in/out will now focus on the cursor.
## [4.3.1] - 2020-07-17
diff --git a/docsrc/_static/css/custom.css b/docsrc/_static/css/custom.css
new file mode 100644
index 00000000..11221bf6
--- /dev/null
+++ b/docsrc/_static/css/custom.css
@@ -0,0 +1,9 @@
+/* do not limit the width of the page */
+.wy-nav-content {
+ max-width: 75%;
+}
+
+.wy-side-scroll {
+ width: auto;
+ overflow-y: auto;
+}
diff --git a/docsrc/conf.py b/docsrc/conf.py
index 61a5c36f..b3b45935 100644
--- a/docsrc/conf.py
+++ b/docsrc/conf.py
@@ -99,6 +99,8 @@ html_context = {
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
+html_favicon = '../resources/icons/porymap-icon-2.ico'
+
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
diff --git a/forms/eventpropertiesframe.ui b/forms/eventpropertiesframe.ui
index bd739561..4629438f 100644
--- a/forms/eventpropertiesframe.ui
+++ b/forms/eventpropertiesframe.ui
@@ -243,13 +243,10 @@
-
-
-
- 0
- 0
-
-
+
+ QFormLayout::WrapLongRows
+
9
@@ -274,12 +271,6 @@
true
-
-
- 0
- 0
-
-
Qt::StrongFocus
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index d9d28960..f1061bdb 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -15,6 +15,18 @@
+
+ 9
+
+
+ 6
+
+
+ 9
+
+
+ 0
+
-
@@ -41,7 +53,7 @@
0
- 0
+ 3
0
@@ -94,24 +106,6 @@
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 16777215
-
-
<html><head/><body><p>Expand all map folders</p></body></html>
@@ -132,24 +126,6 @@
-
-
-
- 0
- 0
-
-
-
-
- 23
- 22
-
-
-
-
- 23
- 22
-
-
<html><head/><body><p>Collapse all map list folders</p></body></html>
@@ -230,10 +206,28 @@
+
+
+ 1
+ 0
+
+
0
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
-
-
@@ -387,7 +381,7 @@
-
-
+
0
@@ -408,132 +402,159 @@
- 4
+ 3
- 4
+ 3
- 4
+ 3
- 4
+ 3
- 4
+ 3
-
-
-
- true
+
+
+ QFrame::NoFrame
-
- <html><head/><body><p>Pencil</p><p><span style=" font-weight:600;">Click</span> and drag to draw on the map.</p><p><span style=" font-weight:600;">Right-click</span> and drag to select tiles.</p></body></html>
-
-
- Paint
-
-
-
- :/icons/pencil.ico:/icons/pencil.ico
-
-
- true
-
-
- true
-
-
- false
-
-
-
- -
-
-
- true
-
-
- <html><head/><body><p>Pointer</p><p>Does nothing</p></body></html>
-
-
- Select
-
-
-
- :/icons/cursor.ico:/icons/cursor.ico
-
-
- true
-
-
-
- -
-
-
- <html><head/><body><p>Bucket Fill</p><p>Fills all similar tiles in a region with the selected metatiles or collision attributes</p></body></html>
-
-
- Fill
-
-
-
- :/icons/fill_color.ico:/icons/fill_color.ico
-
-
- true
-
-
-
- -
-
-
- <html><head/><body><p>Eyedropper</p><p><span style=" font-weight:600;">Click</span> to select a metatile or collision attribute.</p></body></html>
-
-
- Dropper
-
-
-
- :/icons/pipette.ico:/icons/pipette.ico
-
-
- true
-
-
-
- -
-
-
- <html><head/><body><p>Move</p><p>Click to drag map around.</p></body></html>
-
-
- ...
-
-
-
- :/icons/move.ico:/icons/move.ico
-
-
- true
-
-
-
- -
-
-
- <html><head/><body><p>Map Shift</p><p><span style=" font-weight:600;">Click and drag</span> on the map to shift the positions of all metatiles (Map tab) or events (Events tab) at once. This is useful after resizing a map.</p></body></html>
-
-
- Shift
-
-
-
- :/icons/shift.ico:/icons/shift.ico
-
-
- true
+
+ QFrame::Raised
+
+
+ 3
+
+
+ 0
+
+
+ 0
+
+
+ 9
+
+
+ 0
+
+
-
+
+
+ true
+
+
+ <html><head/><body><p>Pencil</p><p><span style=" font-weight:600;">Click</span> and drag to draw on the map.</p><p><span style=" font-weight:600;">Right-click</span> and drag to select tiles.</p></body></html>
+
+
+ Paint
+
+
+
+ :/icons/pencil.ico:/icons/pencil.ico
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+
+ -
+
+
+ true
+
+
+ <html><head/><body><p>Pointer</p><p>Does nothing</p></body></html>
+
+
+ Select
+
+
+
+ :/icons/cursor.ico:/icons/cursor.ico
+
+
+ true
+
+
+
+ -
+
+
+ <html><head/><body><p>Bucket Fill</p><p>Fills all similar tiles in a region with the selected metatiles or collision attributes</p></body></html>
+
+
+ Fill
+
+
+
+ :/icons/fill_color.ico:/icons/fill_color.ico
+
+
+ true
+
+
+
+ -
+
+
+ <html><head/><body><p>Eyedropper</p><p><span style=" font-weight:600;">Click</span> to select a metatile or collision attribute.</p></body></html>
+
+
+ Dropper
+
+
+
+ :/icons/pipette.ico:/icons/pipette.ico
+
+
+ true
+
+
+
+ -
+
+
+ <html><head/><body><p>Move</p><p>Click to drag map around.</p></body></html>
+
+
+ ...
+
+
+
+ :/icons/move.ico:/icons/move.ico
+
+
+ true
+
+
+
+ -
+
+
+ <html><head/><body><p>Map Shift</p><p><span style=" font-weight:600;">Click and drag</span> on the map to shift the positions of all metatiles (Map tab) or events (Events tab) at once. This is useful after resizing a map.</p></body></html>
+
+
+ Shift
+
+
+
+ :/icons/shift.ico:/icons/shift.ico
+
+
+ true
+
+
+
+
-
@@ -541,9 +562,6 @@
<html><head/><body><p>Smart-path mode allows easier drawing of paths. If a 3x3 metatile block is selcted in the right panel, then smart path mode will automatically form a pathway using those selected blocks.</p><p>When smart-path mode is <span style=" font-weight:600;">not</span> enabled, clicking and dragging a selection will tile it in a grid.</p><p>Hold down the <span style=" font-weight:600;">shift</span> key while editing to quickly enable smart-path mode.</p></body></html>
-
- margin-left: 10px
-
Smart Paths
@@ -1133,93 +1151,127 @@
QLayout::SetDefaultConstraint
- 0
+ 3
- 0
+ 3
- 0
+ 3
- 0
+ 3
-
-
-
-
-
- 0
- 0
-
-
-
-
- 64
- 512
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- 0
-
-
- 100
-
-
- 50
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Opacity
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+ 434
+ 643
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Opacity
+
+
+
+ -
+
+
+ 0
+
+
+ 100
+
+
+ 50
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 86
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 64
+ 512
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 86
+ 20
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 94
+
+
+
+
+
+
@@ -1230,6 +1282,18 @@
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
-
@@ -1243,7 +1307,7 @@
- 444
+ 330
0
@@ -1299,11 +1363,11 @@
-
-
-
- 40
- 32
-
+
+
+ 0
+ 0
+
<html><head/><body><p>Add a new event to the map.</p></body></html>
@@ -1323,17 +1387,11 @@
-
-
+
0
0
-
-
- 40
- 32
-
-
<html><head/><body><p>Delete the selected event from the map.</p></body></html>
@@ -1357,18 +1415,12 @@
Qt::Horizontal
-
-
- 40
- 20
-
-
-
-
+
0
0
@@ -1678,12 +1730,6 @@
-
-
- 0
- 0
-
-
0
diff --git a/forms/paletteeditor.ui b/forms/paletteeditor.ui
index 03650e9f..b87b4398 100644
--- a/forms/paletteeditor.ui
+++ b/forms/paletteeditor.ui
@@ -14,7 +14,7 @@
Qt::ClickFocus
- MainWindow
+ Palette Editor
diff --git a/include/config.h b/include/config.h
index 4bd21cfe..008eeeb7 100644
--- a/include/config.h
+++ b/include/config.h
@@ -50,7 +50,10 @@ public:
void setRecentMap(QString map);
void setMapSortOrder(MapSortOrder order);
void setPrettyCursors(bool enabled);
- void setGeometry(QByteArray, QByteArray, QByteArray, QByteArray);
+ void setMainGeometry(QByteArray, QByteArray, QByteArray, QByteArray);
+ void setTilesetEditorGeometry(QByteArray, QByteArray);
+ void setPaletteEditorGeometry(QByteArray, QByteArray);
+ void setRegionMapEditorGeometry(QByteArray, QByteArray);
void setCollisionOpacity(int opacity);
void setMetatilesZoom(int zoom);
void setShowPlayerView(bool enabled);
@@ -62,7 +65,10 @@ public:
QString getRecentMap();
MapSortOrder getMapSortOrder();
bool getPrettyCursors();
- QMap getGeometry();
+ QMap getMainGeometry();
+ QMap getTilesetEditorGeometry();
+ QMap getPaletteEditorGeometry();
+ QMap getRegionMapEditorGeometry();
int getCollisionOpacity();
int getMetatilesZoom();
bool getShowPlayerView();
@@ -83,11 +89,17 @@ private:
QByteArray bytesFromString(QString);
MapSortOrder mapSortOrder;
bool prettyCursors;
- QByteArray windowGeometry;
- QByteArray windowState;
+ QByteArray mainWindowGeometry;
+ QByteArray mainWindowState;
QByteArray mapSplitterState;
QByteArray eventsSlpitterState;
QByteArray mainSplitterState;
+ QByteArray tilesetEditorGeometry;
+ QByteArray tilesetEditorState;
+ QByteArray paletteEditorGeometry;
+ QByteArray paletteEditorState;
+ QByteArray regionMapEditorGeometry;
+ QByteArray regionMapEditorState;
int collisionOpacity;
int metatilesZoom;
bool showPlayerView;
diff --git a/include/log.h b/include/log.h
index c908eee9..87e0ae01 100644
--- a/include/log.h
+++ b/include/log.h
@@ -20,5 +20,6 @@ void logError(QString message);
void log(QString message, LogType type);
QString getLogPath();
QString getMostRecentError();
+bool cleanupLargeLog();
#endif // LOG_H
diff --git a/include/ui/flowlayout.h b/include/ui/flowlayout.h
new file mode 100644
index 00000000..6364dfd0
--- /dev/null
+++ b/include/ui/flowlayout.h
@@ -0,0 +1,37 @@
+#ifndef FLOWLAYOUT_H
+#define FLOWLAYOUT_H
+
+#include
+#include
+
+
+class FlowLayout : public QLayout
+{
+public:
+ explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
+ explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
+ ~FlowLayout();
+
+ void addItem(QLayoutItem *item) override;
+ int horizontalSpacing() const;
+ int verticalSpacing() const;
+ Qt::Orientations expandingDirections() const override;
+ bool hasHeightForWidth() const override;
+ int heightForWidth(int) const override;
+ int count() const override;
+ QLayoutItem *itemAt(int index) const override;
+ QSize minimumSize() const override;
+ void setGeometry(const QRect &rect) override;
+ QSize sizeHint() const override;
+ QLayoutItem *takeAt(int index) override;
+
+private:
+ int doLayout(const QRect &rect, bool testOnly) const;
+ int smartSpacing(QStyle::PixelMetric pm) const;
+
+ QList itemList;
+ int horzSpace;
+ int vertSpace;
+};
+
+#endif // FLOWLAYOUT_H
diff --git a/include/ui/paletteeditor.h b/include/ui/paletteeditor.h
index 9cd4da03..2dbd6d29 100644
--- a/include/ui/paletteeditor.h
+++ b/include/ui/paletteeditor.h
@@ -45,7 +45,9 @@ private:
void refreshColor(int);
void setColor(int);
void commitEditHistory(int paletteid);
+ void restoreWindowState();
void setColorsFromHistory(PaletteHistoryItem*, int);
+ void closeEvent(QCloseEvent*);
signals:
void closed();
diff --git a/include/ui/regionmapeditor.h b/include/ui/regionmapeditor.h
index a664df77..484103f3 100644
--- a/include/ui/regionmapeditor.h
+++ b/include/ui/regionmapeditor.h
@@ -97,6 +97,7 @@ private:
bool createCityMap(QString name);
bool tryInsertNewMapEntry(QString);
+ void restoreWindowState();
void closeEvent(QCloseEvent* event);
private slots:
diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h
index fde5a4be..283f9cde 100644
--- a/include/ui/tileseteditor.h
+++ b/include/ui/tileseteditor.h
@@ -37,8 +37,9 @@ class TilesetEditor : public QMainWindow
public:
explicit TilesetEditor(Project*, Map*, QWidget *parent = nullptr);
~TilesetEditor();
- void setMap(Map*);
- void setTilesets(QString, QString);
+ void update(Map *map, QString primaryTilsetLabel, QString secondaryTilesetLabel);
+ void updateMap(Map *map);
+ void updateTilesets(QString primaryTilsetLabel, QString secondaryTilesetLabel);
bool selectMetatile(uint16_t metatileId);
private slots:
@@ -92,17 +93,25 @@ 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();
void importTilesetTiles(Tileset*, bool);
void importTilesetMetatiles(Tileset*, bool);
void refresh();
void saveMetatileLabel();
+ void closeEvent(QCloseEvent*);
Ui::TilesetEditor *ui;
History metatileHistory;
TilesetEditorMetatileSelector *metatileSelector = nullptr;
@@ -110,6 +119,7 @@ private:
MetatileLayersItem *metatileLayersItem = nullptr;
PaletteEditor *paletteEditor = nullptr;
Project *project = nullptr;
+ Map *map = nullptr;
Metatile *metatile = nullptr;
int paletteId;
bool tileXFlip;
diff --git a/porymap.pro b/porymap.pro
index 04fb94e2..da274dba 100644
--- a/porymap.pro
+++ b/porymap.pro
@@ -68,6 +68,7 @@ SOURCES += src/core/block.cpp \
src/ui/regionmapeditor.cpp \
src/ui/newmappopup.cpp \
src/ui/mapimageexporter.cpp \
+ src/ui/flowlayout.cpp \
src/config.cpp \
src/editor.cpp \
src/main.cpp \
@@ -134,6 +135,7 @@ HEADERS += include/core/block.h \
include/ui/regionmapeditor.h \
include/ui/newmappopup.h \
include/ui/mapimageexporter.h \
+ include/ui/flowlayout.h \
include/config.h \
include/editor.h \
include/mainwindow.h \
diff --git a/src/config.cpp b/src/config.cpp
index 8934f707..3c9fe33d 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -122,10 +122,10 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) {
this->mapSortOrder = MapSortOrder::Group;
logWarn(QString("Invalid config value for map_sort_order: '%1'. Must be 'group', 'area', or 'layout'.").arg(value));
}
- } else if (key == "window_geometry") {
- this->windowGeometry = bytesFromString(value);
- } else if (key == "window_state") {
- this->windowState = bytesFromString(value);
+ } else if (key == "main_window_geometry") {
+ this->mainWindowGeometry = bytesFromString(value);
+ } else if (key == "main_window_state") {
+ this->mainWindowState = bytesFromString(value);
} else if (key == "map_splitter_state") {
this->mapSplitterState = bytesFromString(value);
} else if (key == "main_splitter_state") {
@@ -137,6 +137,18 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) {
logWarn(QString("Invalid config value for collision_opacity: '%1'. Must be an integer.").arg(value));
this->collisionOpacity = 50;
}
+ } else if (key == "tileset_editor_geometry") {
+ this->tilesetEditorGeometry = bytesFromString(value);
+ } else if (key == "tileset_editor_state") {
+ this->tilesetEditorState = bytesFromString(value);
+ } else if (key == "palette_editor_geometry") {
+ this->paletteEditorGeometry = bytesFromString(value);
+ } else if (key == "palette_editor_state") {
+ this->paletteEditorState = bytesFromString(value);
+ } else if (key == "region_map_editor_geometry") {
+ this->regionMapEditorGeometry = bytesFromString(value);
+ } else if (key == "region_map_editor_state") {
+ this->regionMapEditorState = bytesFromString(value);
} else if (key == "metatiles_zoom") {
bool ok;
this->metatilesZoom = qMax(10, qMin(100, value.toInt(&ok)));
@@ -186,10 +198,16 @@ QMap PorymapConfig::getKeyValueMap() {
map.insert("recent_map", this->recentMap);
map.insert("pretty_cursors", this->prettyCursors ? "1" : "0");
map.insert("map_sort_order", mapSortOrderMap.value(this->mapSortOrder));
- map.insert("window_geometry", stringFromByteArray(this->windowGeometry));
- map.insert("window_state", stringFromByteArray(this->windowState));
+ map.insert("main_window_geometry", stringFromByteArray(this->mainWindowGeometry));
+ map.insert("main_window_state", stringFromByteArray(this->mainWindowState));
map.insert("map_splitter_state", stringFromByteArray(this->mapSplitterState));
map.insert("main_splitter_state", stringFromByteArray(this->mainSplitterState));
+ map.insert("tileset_editor_geometry", stringFromByteArray(this->tilesetEditorGeometry));
+ map.insert("tileset_editor_state", stringFromByteArray(this->tilesetEditorState));
+ map.insert("palette_editor_geometry", stringFromByteArray(this->paletteEditorGeometry));
+ map.insert("palette_editor_state", stringFromByteArray(this->paletteEditorState));
+ map.insert("region_map_editor_geometry", stringFromByteArray(this->regionMapEditorGeometry));
+ map.insert("region_map_editor_state", stringFromByteArray(this->regionMapEditorState));
map.insert("collision_opacity", QString("%1").arg(this->collisionOpacity));
map.insert("metatiles_zoom", QString("%1").arg(this->metatilesZoom));
map.insert("show_player_view", this->showPlayerView ? "1" : "0");
@@ -243,15 +261,33 @@ void PorymapConfig::setMonitorFiles(bool monitor) {
this->save();
}
-void PorymapConfig::setGeometry(QByteArray windowGeometry_, QByteArray windowState_,
+void PorymapConfig::setMainGeometry(QByteArray mainWindowGeometry_, QByteArray mainWindowState_,
QByteArray mapSplitterState_, QByteArray mainSplitterState_) {
- this->windowGeometry = windowGeometry_;
- this->windowState = windowState_;
+ this->mainWindowGeometry = mainWindowGeometry_;
+ this->mainWindowState = mainWindowState_;
this->mapSplitterState = mapSplitterState_;
this->mainSplitterState = mainSplitterState_;
this->save();
}
+void PorymapConfig::setTilesetEditorGeometry(QByteArray tilesetEditorGeometry_, QByteArray tilesetEditorState_) {
+ this->tilesetEditorGeometry = tilesetEditorGeometry_;
+ this->tilesetEditorState = tilesetEditorState_;
+ this->save();
+}
+
+void PorymapConfig::setPaletteEditorGeometry(QByteArray paletteEditorGeometry_, QByteArray paletteEditorState_) {
+ this->paletteEditorGeometry = paletteEditorGeometry_;
+ this->paletteEditorState = paletteEditorState_;
+ this->save();
+}
+
+void PorymapConfig::setRegionMapEditorGeometry(QByteArray regionMapEditorGeometry_, QByteArray regionMapEditorState_) {
+ this->regionMapEditorGeometry = regionMapEditorGeometry_;
+ this->regionMapEditorState = regionMapEditorState_;
+ this->save();
+}
+
void PorymapConfig::setCollisionOpacity(int opacity) {
this->collisionOpacity = opacity;
// don't auto-save here because this can be called very frequently.
@@ -296,17 +332,44 @@ bool PorymapConfig::getPrettyCursors() {
return this->prettyCursors;
}
-QMap PorymapConfig::getGeometry() {
+QMap PorymapConfig::getMainGeometry() {
QMap geometry;
- geometry.insert("window_geometry", this->windowGeometry);
- geometry.insert("window_state", this->windowState);
+ geometry.insert("main_window_geometry", this->mainWindowGeometry);
+ geometry.insert("main_window_state", this->mainWindowState);
geometry.insert("map_splitter_state", this->mapSplitterState);
geometry.insert("main_splitter_state", this->mainSplitterState);
return geometry;
}
+QMap PorymapConfig::getTilesetEditorGeometry() {
+ QMap geometry;
+
+ geometry.insert("tileset_editor_geometry", this->tilesetEditorGeometry);
+ geometry.insert("tileset_editor_state", this->tilesetEditorState);
+
+ return geometry;
+}
+
+QMap PorymapConfig::getPaletteEditorGeometry() {
+ QMap geometry;
+
+ geometry.insert("palette_editor_geometry", this->paletteEditorGeometry);
+ geometry.insert("palette_editor_state", this->paletteEditorState);
+
+ return geometry;
+}
+
+QMap PorymapConfig::getRegionMapEditorGeometry() {
+ QMap geometry;
+
+ geometry.insert("region_map_editor_geometry", this->regionMapEditorGeometry);
+ geometry.insert("region_map_editor_state", this->regionMapEditorState);
+
+ return geometry;
+}
+
int PorymapConfig::getCollisionOpacity() {
return this->collisionOpacity;
}
diff --git a/src/editor.cpp b/src/editor.cpp
index 97a693e6..2471f32d 100644
--- a/src/editor.cpp
+++ b/src/editor.cpp
@@ -1646,7 +1646,7 @@ void Editor::setConnectionMap(QString mapName) {
if (!selected_connection_item)
return;
- if (mapName.isEmpty()) {
+ if (mapName.isEmpty() || mapName == NONE_MAP_NAME) {
removeCurrentConnection();
return;
}
@@ -1798,7 +1798,7 @@ void Editor::updateDiveEmergeMap(QString mapName, QString direction) {
}
}
- if (mapName.isEmpty()) {
+ if (mapName.isEmpty() || mapName == NONE_MAP_NAME) {
// Remove dive/emerge connection
if (connection) {
map->connections.removeOne(connection);
diff --git a/src/log.cpp b/src/log.cpp
index 3b5d5eb0..64f6753a 100644
--- a/src/log.cpp
+++ b/src/log.cpp
@@ -86,3 +86,14 @@ QString getLogPath() {
QString getMostRecentError() {
return mostRecentError;
}
+
+bool cleanupLargeLog() {
+ QFile logFile(getLogPath());
+ if (logFile.size() < 20000000)
+ return false;
+
+ bool removed = logFile.remove();
+ if (removed)
+ logWarn(QString("Previous log file %1 was cleared due to being over 20MB in size.").arg(getLogPath()));
+ return removed;
+}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 6814c2fc..a477aaa2 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -13,6 +13,7 @@
#include "adjustingstackedwidget.h"
#include "draggablepixmapitem.h"
#include "editcommands.h"
+#include "flowlayout.h"
#include
#include
@@ -53,6 +54,8 @@ MainWindow::MainWindow(QWidget *parent) :
QApplication::setWindowIcon(QIcon(":/icons/porymap-icon-2.ico"));
ui->setupUi(this);
+ cleanupLargeLog();
+
this->initWindow();
if (!this->openRecentProject()) {
// Re-initialize everything to a blank slate if opening the recent project failed.
@@ -133,6 +136,19 @@ void MainWindow::initCustomUI() {
connect(labelCombo, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){
stack->setCurrentIndex(index);
});
+
+ // Convert the layout of the map tools' frame into an adjustable FlowLayout
+ FlowLayout *flowLayout = new FlowLayout;
+ flowLayout->setContentsMargins(ui->frame_mapTools->layout()->contentsMargins());
+ flowLayout->setSpacing(ui->frame_mapTools->layout()->spacing());
+ for (auto *child : ui->frame_mapTools->findChildren(QString(), Qt::FindDirectChildrenOnly)) {
+ flowLayout->addWidget(child);
+ child->setFixedHeight(
+ ui->frame_mapTools->height() - flowLayout->contentsMargins().top() - flowLayout->contentsMargins().bottom()
+ );
+ }
+ delete ui->frame_mapTools->layout();
+ ui->frame_mapTools->setLayout(flowLayout);
}
void MainWindow::initExtraSignals() {
@@ -347,10 +363,10 @@ void MainWindow::loadUserSettings() {
}
void MainWindow::restoreWindowState() {
- logInfo("Restoring window geometry from previous session.");
- QMap geometry = porymapConfig.getGeometry();
- this->restoreGeometry(geometry.value("window_geometry"));
- this->restoreState(geometry.value("window_state"));
+ logInfo("Restoring main window geometry from previous session.");
+ QMap geometry = porymapConfig.getMainGeometry();
+ this->restoreGeometry(geometry.value("main_window_geometry"));
+ this->restoreState(geometry.value("main_window_state"));
this->ui->splitter_map->restoreState(geometry.value("map_splitter_state"));
this->ui->splitter_main->restoreState(geometry.value("main_splitter_state"));
}
@@ -1195,8 +1211,11 @@ void MainWindow::on_actionNew_Tileset_triggered() {
void MainWindow::updateTilesetEditor() {
if (this->tilesetEditor) {
- this->tilesetEditor->setMap(this->editor->map);
- this->tilesetEditor->setTilesets(editor->ui->comboBox_PrimaryTileset->currentText(), editor->ui->comboBox_SecondaryTileset->currentText());
+ this->tilesetEditor->update(
+ this->editor->map,
+ editor->ui->comboBox_PrimaryTileset->currentText(),
+ editor->ui->comboBox_SecondaryTileset->currentText()
+ );
}
}
@@ -2476,7 +2495,6 @@ void MainWindow::on_actionTileset_Editor_triggered()
this->tilesetEditor = new TilesetEditor(this->editor->project, this->editor->map, this);
connect(this->tilesetEditor, SIGNAL(tilesetsSaved(QString, QString)), this, SLOT(onTilesetsSaved(QString, QString)));
connect(this->tilesetEditor, &QObject::destroyed, [=](QObject *) { this->tilesetEditor = nullptr; });
- this->tilesetEditor->setAttribute(Qt::WA_DeleteOnClose);
}
if (!this->tilesetEditor->isVisible()) {
@@ -2617,7 +2635,6 @@ void MainWindow::on_actionRegion_Map_Editor_triggered() {
return;
}
connect(this->regionMapEditor, &QObject::destroyed, [=](QObject *) { this->regionMapEditor = nullptr; });
- this->regionMapEditor->setAttribute(Qt::WA_DeleteOnClose);
}
if (!this->regionMapEditor->isVisible()) {
@@ -2656,7 +2673,7 @@ void MainWindow::closeEvent(QCloseEvent *event) {
}
}
- porymapConfig.setGeometry(
+ porymapConfig.setMainGeometry(
this->saveGeometry(),
this->saveState(),
this->ui->splitter_map->saveState(),
diff --git a/src/mainwindow_scriptapi.cpp b/src/mainwindow_scriptapi.cpp
index cc89fc0b..b60ba820 100644
--- a/src/mainwindow_scriptapi.cpp
+++ b/src/mainwindow_scriptapi.cpp
@@ -247,7 +247,7 @@ void MainWindow::addImage(int x, int y, QString filepath) {
void MainWindow::refreshAfterPaletteChange(Tileset *tileset) {
if (this->tilesetEditor) {
- this->tilesetEditor->setTilesets(this->editor->map->layout->tileset_primary_label, this->editor->map->layout->tileset_secondary_label);
+ this->tilesetEditor->updateTilesets(this->editor->map->layout->tileset_primary_label, this->editor->map->layout->tileset_secondary_label);
}
this->editor->metatile_selector_item->draw();
this->editor->selected_border_metatiles_item->draw();
diff --git a/src/ui/flowlayout.cpp b/src/ui/flowlayout.cpp
new file mode 100644
index 00000000..2d5a5faa
--- /dev/null
+++ b/src/ui/flowlayout.cpp
@@ -0,0 +1,136 @@
+#include
+
+#include
+
+
+FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) :
+ QLayout(parent),
+ horzSpace(hSpacing),
+ vertSpace(vSpacing)
+{
+ setContentsMargins(margin, margin, margin, margin);
+}
+
+FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) :
+ horzSpace(hSpacing),
+ vertSpace(vSpacing)
+{
+ setContentsMargins(margin, margin, margin, margin);
+}
+
+FlowLayout::~FlowLayout()
+{
+ QLayoutItem *item;
+ while ((item = takeAt(0)))
+ delete item;
+}
+
+void FlowLayout::addItem(QLayoutItem *item) {
+ itemList.append(item);
+}
+
+int FlowLayout::horizontalSpacing() const {
+ if (horzSpace >= 0)
+ return horzSpace;
+ else
+ return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
+}
+
+int FlowLayout::verticalSpacing() const {
+ if (vertSpace >= 0)
+ return vertSpace;
+ else
+ return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
+}
+
+int FlowLayout::count() const {
+ return itemList.size();
+}
+
+QLayoutItem *FlowLayout::itemAt(int index) const {
+ return itemList.value(index);
+}
+
+QLayoutItem *FlowLayout::takeAt(int index) {
+ if (index >= 0 && index < itemList.size())
+ return itemList.takeAt(index);
+ return nullptr;
+}
+
+Qt::Orientations FlowLayout::expandingDirections() const {
+ return { };
+}
+
+bool FlowLayout::hasHeightForWidth() const {
+ return true;
+}
+
+int FlowLayout::heightForWidth(int width) const {
+ int height = doLayout(QRect(0, 0, width, 0), true);
+ return height;
+}
+
+void FlowLayout::setGeometry(const QRect &rect) {
+ QLayout::setGeometry(rect);
+ doLayout(rect, false);
+}
+
+QSize FlowLayout::sizeHint() const {
+ return minimumSize();
+}
+
+QSize FlowLayout::minimumSize() const {
+ QSize size;
+ for (const QLayoutItem *item : qAsConst(itemList))
+ size = size.expandedTo(item->minimumSize());
+
+ const QMargins margins = contentsMargins();
+ size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
+ return size;
+}
+
+int FlowLayout::doLayout(const QRect &rect, bool testOnly) const {
+ int left, top, right, bottom;
+ getContentsMargins(&left, &top, &right, &bottom);
+ QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
+ int x = effectiveRect.x();
+ int y = effectiveRect.y();
+ int lineHeight = 0;
+
+ for (QLayoutItem *item : qAsConst(itemList)) {
+ const QWidget *wid = item->widget();
+ int spaceX = horizontalSpacing();
+ if (spaceX == -1)
+ spaceX = wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
+ int spaceY = verticalSpacing();
+ if (spaceY == -1)
+ spaceY = wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
+
+ int nextX = x + item->sizeHint().width() + spaceX;
+ if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
+ x = effectiveRect.x();
+ y = y + lineHeight + spaceY;
+ nextX = x + item->sizeHint().width() + spaceX;
+ lineHeight = 0;
+ }
+
+ if (!testOnly)
+ item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
+
+ x = nextX;
+ lineHeight = qMax(lineHeight, item->sizeHint().height());
+ }
+ return y + lineHeight - rect.y() + bottom;
+}
+
+int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const {
+ QObject *parent = this->parent();
+ if (!parent) {
+ return -1;
+ } else if (parent->isWidgetType()) {
+ QWidget *pw = static_cast(parent);
+ return pw->style()->pixelMetric(pm, nullptr, pw);
+ } else {
+ return static_cast(parent)->spacing();
+ }
+}
diff --git a/src/ui/paletteeditor.cpp b/src/ui/paletteeditor.cpp
index fd9eeb9a..0e1366e6 100644
--- a/src/ui/paletteeditor.cpp
+++ b/src/ui/paletteeditor.cpp
@@ -1,9 +1,10 @@
#include "paletteeditor.h"
#include "ui_paletteeditor.h"
#include "paletteutil.h"
+#include "config.h"
+#include "log.h"
#include
#include
-#include "log.h"
PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId, QWidget *parent) :
QMainWindow(parent),
@@ -112,6 +113,7 @@ PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset
this->initColorSliders();
this->setPaletteId(paletteId);
this->commitEditHistory(this->ui->spinBox_PaletteId->value());
+ this->restoreWindowState();
}
PaletteEditor::~PaletteEditor()
@@ -227,6 +229,13 @@ void PaletteEditor::commitEditHistory(int paletteId) {
this->palettesHistory[paletteId].push(commit);
}
+void PaletteEditor::restoreWindowState() {
+ logInfo("Restoring palette editor geometry from previous session.");
+ QMap geometry = porymapConfig.getPaletteEditorGeometry();
+ this->restoreGeometry(geometry.value("palette_editor_geometry"));
+ this->restoreState(geometry.value("palette_editor_state"));
+}
+
void PaletteEditor::on_actionUndo_triggered()
{
int paletteId = this->ui->spinBox_PaletteId->value();
@@ -311,3 +320,10 @@ void PaletteEditor::on_actionImport_Palette_triggered()
this->commitEditHistory(paletteId);
emit this->changedPaletteColor();
}
+
+void PaletteEditor::closeEvent(QCloseEvent*) {
+ porymapConfig.setPaletteEditorGeometry(
+ this->saveGeometry(),
+ this->saveState()
+ );
+}
diff --git a/src/ui/regionmapeditor.cpp b/src/ui/regionmapeditor.cpp
index 1ced19b6..ce3440dd 100644
--- a/src/ui/regionmapeditor.cpp
+++ b/src/ui/regionmapeditor.cpp
@@ -24,6 +24,7 @@ RegionMapEditor::RegionMapEditor(QWidget *parent, Project *project_) :
this->project = project_;
this->region_map = new RegionMap;
this->ui->action_RegionMap_Resize->setVisible(false);
+ this->restoreWindowState();
}
RegionMapEditor::~RegionMapEditor()
@@ -42,6 +43,13 @@ RegionMapEditor::~RegionMapEditor()
delete scene_region_map_tiles;
}
+void RegionMapEditor::restoreWindowState() {
+ logInfo("Restoring region map editor geometry from previous session.");
+ QMap geometry = porymapConfig.getRegionMapEditorGeometry();
+ this->restoreGeometry(geometry.value("region_map_editor_geometry"));
+ this->restoreState(geometry.value("region_map_editor_state"));
+}
+
void RegionMapEditor::on_action_RegionMap_Save_triggered() {
setCurrentSquareOptions();
if (project && region_map) {
@@ -899,6 +907,11 @@ void RegionMapEditor::closeEvent(QCloseEvent *event)
} else {
event->accept();
}
+
+ porymapConfig.setRegionMapEditorGeometry(
+ this->saveGeometry(),
+ this->saveState()
+ );
}
void RegionMapEditor::on_verticalSlider_Zoom_Map_Image_valueChanged(int val) {
diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp
index 75a60b9a..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,27 +41,78 @@ TilesetEditor::~TilesetEditor()
delete metatileLayersScene;
}
-void TilesetEditor::init(Project *project, Map *map) {
- ui->setupUi(this);
- this->project = project;
+void TilesetEditor::update(Map *map, QString primaryTilesetLabel, QString secondaryTilesetLabel) {
+ this->updateMap(map);
+ this->updateTilesets(primaryTilesetLabel, secondaryTilesetLabel);
+}
+void TilesetEditor::updateMap(Map *map) {
+ this->map = map;
+ this->metatileSelector->map = map;
+}
+
+void TilesetEditor::updateTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel) {
+ if (this->hasUnsavedChanges) {
+ QMessageBox::StandardButton result = QMessageBox::question(
+ this,
+ "porymap",
+ "Tileset has been modified, save changes?",
+ QMessageBox::No | QMessageBox::Yes,
+ QMessageBox::Yes);
+ if (result == QMessageBox::Yes)
+ this->on_actionSave_Tileset_triggered();
+ }
this->hasUnsavedChanges = false;
- this->tileXFlip = ui->checkBox_xFlip->isChecked();
- this->tileYFlip = ui->checkBox_yFlip->isChecked();
- this->paletteId = ui->spinBox_paletteSelector->value();
+ this->setTilesets(primaryTilesetLabel, secondaryTilesetLabel);
+ this->refresh();
+}
- Tileset *primaryTileset = project->getTileset(map->layout->tileset_primary_label);
- Tileset *secondaryTileset = project->getTileset(map->layout->tileset_secondary_label);
+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);
if (this->primaryTileset) delete this->primaryTileset;
if (this->secondaryTileset) delete this->secondaryTileset;
this->primaryTileset = primaryTileset->copy();
this->secondaryTileset = secondaryTileset->copy();
+}
- QList sortedBehaviors;
+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->setMetatileBehaviors();
+ this->setMetatileLayersUi();
+ this->setVersionSpecificUi();
+ this->setMetatileLabelValidator();
+
+ this->initMetatileSelector();
+ this->initMetatileLayersItem();
+ this->initTileSelector();
+ this->initSelectedTileItem();
+ this->metatileSelector->select(0);
+ this->restoreWindowState();
+}
+
+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);
@@ -67,10 +122,9 @@ void TilesetEditor::init(Project *project, Map *map) {
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);
-
+void TilesetEditor::setVersionSpecificUi() {
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
this->ui->comboBox_encounterType->setVisible(true);
this->ui->label_encounterType->setVisible(true);
@@ -89,72 +143,18 @@ void TilesetEditor::init(Project *project, Map *map) {
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);
-
- this->initMetatileSelector(map);
- this->initMetatileLayersItem();
- this->initTileSelector();
- this->initSelectedTileItem();
- this->metatileSelector->select(0);
-
- 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::setMap(Map *map) {
- this->metatileSelector->map = map;
-}
-
-void TilesetEditor::setTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel) {
- if (this->hasUnsavedChanges) {
- QMessageBox::StandardButton result = QMessageBox::question(
- this,
- "porymap",
- "Tileset has been modified, save changes?",
- QMessageBox::No | QMessageBox::Yes,
- QMessageBox::Yes);
- if (result == QMessageBox::Yes)
- this->on_actionSave_Tileset_triggered();
- }
- this->hasUnsavedChanges = false;
- delete this->primaryTileset;
- delete this->secondaryTileset;
- Tileset *primaryTileset = project->getTileset(primaryTilesetLabel);
- Tileset *secondaryTileset = project->getTileset(secondaryTilesetLabel);
- this->primaryTileset = primaryTileset->copy();
- this->secondaryTileset = secondaryTileset->copy();
- 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::initMetatileSelector(Map *map)
+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()),
@@ -170,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());
@@ -196,6 +209,40 @@ void TilesetEditor::initSelectedTileItem() {
this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width() + 2, this->selectedTilePixmapItem->pixmap().height() + 2);
}
+void TilesetEditor::restoreWindowState() {
+ logInfo("Restoring tileset editor geometry from previous session.");
+ QMap geometry = porymapConfig.getTilesetEditorGeometry();
+ this->restoreGeometry(geometry.value("tileset_editor_geometry"));
+ 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);
+ if (this->paletteEditor)
+ this->paletteEditor->setTilesets(this->primaryTileset, this->secondaryTileset);
+ 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;
@@ -222,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;
@@ -599,6 +633,7 @@ void TilesetEditor::closeEvent(QCloseEvent *event)
this->on_actionSave_Tileset_triggered();
event->accept();
} else if (result == QMessageBox::No) {
+ this->reset();
event->accept();
} else if (result == QMessageBox::Cancel) {
event->ignore();
@@ -606,6 +641,14 @@ void TilesetEditor::closeEvent(QCloseEvent *event)
} else {
event->accept();
}
+
+ if (event->isAccepted()) {
+ if (this->paletteEditor) this->paletteEditor->close();
+ porymapConfig.setTilesetEditorGeometry(
+ this->saveGeometry(),
+ this->saveState()
+ );
+ }
}
void TilesetEditor::on_actionChange_Metatiles_Count_triggered()