diff --git a/CHANGELOG.md b/CHANGELOG.md
index e6020a2f..861883dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@ The **"Breaking Changes"** listed below are changes that have been made in the d
- 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
### Added
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 08e5a51b..f1061bdb 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -344,117 +344,37 @@
0
-
-
+
- 1
+ 0
0
-
- true
+
+ false
+
+
+ false
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ QAbstractScrollArea::AdjustIgnored
+
+
+ QGraphicsView::NoDrag
+
+
+ QGraphicsView::AnchorUnderMouse
+
+
+ QGraphicsView::AnchorUnderMouse
-
-
-
- 0
- 0
- 543
- 600
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 166
- 16
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 166
- 16
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 16
- 166
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- false
-
-
- false
-
-
- QAbstractScrollArea::AdjustIgnored
-
-
- QGraphicsView::NoDrag
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 16
- 166
-
-
-
-
-
-
@@ -2197,7 +2117,7 @@
0
- -
+
-
@@ -2321,7 +2241,41 @@
- -
+
-
+
+
+
+ 0
+ 0
+
+
+
+ false
+
+
+ false
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ QAbstractScrollArea::AdjustIgnored
+
+
+ QGraphicsView::NoDrag
+
+
+ QGraphicsView::AnchorUnderMouse
+
+
+ QGraphicsView::AnchorUnderMouse
+
+
+
+ -
@@ -2437,200 +2391,83 @@
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
QFrame::StyledPanel
QFrame::Raised
-
+
+
+ 4
+
- 0
+ 4
- 0
+ 4
- 0
+ 4
- 0
+ 4
-
- 0
-
-
-
-
-
-
- 1
- 0
-
+
-
+
+
+ Dive Map
-
- true
-
-
-
-
- 0
- 0
- 118
- 118
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
-
- 0
- 0
- 0
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
+
-
+
+
+ <html><head/><body><p>Destination map name when using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html>
-
- QFrame::StyledPanel
+
+ true
-
- QFrame::Raised
-
-
-
- 4
-
-
- 4
-
-
- 4
-
-
- 4
-
-
- 4
-
-
-
-
-
- Dive Map
-
-
-
- -
-
-
- <html><head/><body><p>Destination map name when using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html>
-
-
- true
-
-
-
- -
-
-
- Emerge Map
-
-
-
- -
-
-
- <html><head/><body><p>Destination map name when emerging using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html>
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
+ -
+
+
+ Emerge Map
+
+
+
+ -
+
+
+ <html><head/><body><p>Destination map name when emerging using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html>
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
diff --git a/include/editor.h b/include/editor.h
index c9f7bcea..b887d558 100644
--- a/include/editor.h
+++ b/include/editor.h
@@ -64,6 +64,7 @@ public:
void displayMapBorder();
void displayMapGrid();
void displayWildMonTables();
+ void maskNonVisibleConnectionTiles();
void updateMapBorder();
void updateMapConnections();
@@ -109,6 +110,7 @@ public:
ConnectionPixmapItem* selected_connection_item = nullptr;
QList connection_items;
QList connection_edit_items;
+ QGraphicsPathItem *connection_mask = nullptr;
CollisionPixmapItem *collision_item = nullptr;
QGraphicsItemGroup *events_group = nullptr;
QList borderItems;
@@ -148,6 +150,7 @@ public:
bool selectingEvent = false;
void shouldReselectEvents();
+ void scaleMapView(int);
private:
void setConnectionItemsVisible(bool);
@@ -198,6 +201,7 @@ private slots:
void onHoveredMapMovementPermissionChanged(int, int);
void onHoveredMapMovementPermissionCleared();
void onSelectedMetatilesChanged();
+ void onWheelZoom(int);
signals:
void objectsChanged();
@@ -206,7 +210,6 @@ signals:
void wildMonDataChanged();
void warpEventDoubleClicked(QString mapName, QString warpNum);
void currentMetatilesSelectionChanged();
- void wheelZoom(int delta);
};
#endif // EDITOR_H
diff --git a/include/mainwindow.h b/include/mainwindow.h
index f6b382c2..a9180402 100644
--- a/include/mainwindow.h
+++ b/include/mainwindow.h
@@ -109,11 +109,6 @@ public:
Q_INVOKABLE QList getMetatileLayerOpacity();
Q_INVOKABLE void setMetatileLayerOpacity(QList order);
-
-public slots:
- void scaleMapView(int);
- void onWheelZoom(int);
-
private slots:
void on_action_Open_Project_triggered();
void on_action_Reload_Project_triggered();
diff --git a/src/editor.cpp b/src/editor.cpp
index 2c7ad55c..2471f32d 100644
--- a/src/editor.cpp
+++ b/src/editor.cpp
@@ -759,11 +759,13 @@ void Editor::updateCurrentConnectionDirection(QString curDirection) {
QString originalDirection = selected_connection_item->connection->direction;
setCurrentConnectionDirection(curDirection);
updateMirroredConnectionDirection(selected_connection_item->connection, originalDirection);
+ maskNonVisibleConnectionTiles();
}
void Editor::onConnectionMoved(MapConnection* connection) {
updateMirroredConnectionOffset(connection);
onConnectionOffsetChanged(connection->offset.toInt());
+ maskNonVisibleConnectionTiles();
}
void Editor::onConnectionOffsetChanged(int newOffset) {
@@ -887,6 +889,27 @@ void Editor::onSelectedMetatilesChanged() {
this->redrawCurrentMetatilesSelection();
}
+void Editor::onWheelZoom(int s) {
+ // Don't zoom the map when the user accidentally scrolls while performing a magic fill. (ctrl + middle button click)
+ if (!(QApplication::mouseButtons() & Qt::MiddleButton)) {
+ scaleMapView(s);
+ }
+}
+
+void Editor::scaleMapView(int s) {
+ if ((scale_exp + s) <= 5 && (scale_exp + s) >= -2) // sane limits
+ {
+ if (s == 0)
+ scale_exp = 0;
+ else
+ scale_exp += s;
+
+ double sfactor = pow(scale_base, s);
+ ui->graphicsView_Map->scale(sfactor, sfactor);
+ ui->graphicsView_Connections->scale(sfactor, sfactor);
+ }
+}
+
void Editor::onHoveredMapMetatileChanged(int x, int y) {
this->playerViewRect->updateLocation(x, y);
this->cursorMapTileRect->updateLocation(x, y);
@@ -1209,7 +1232,7 @@ bool Editor::displayMap() {
scene = new QGraphicsScene;
MapSceneEventFilter *filter = new MapSceneEventFilter();
scene->installEventFilter(filter);
- connect(filter, &MapSceneEventFilter::wheelZoom, this, &Editor::wheelZoom);
+ connect(filter, &MapSceneEventFilter::wheelZoom, this, &Editor::onWheelZoom);
}
if (map_item && scene) {
@@ -1437,6 +1460,8 @@ void Editor::displayMapConnections() {
if (!connection_edit_items.empty()) {
onConnectionItemSelected(connection_edit_items.first());
}
+
+ maskNonVisibleConnectionTiles();
}
void Editor::createConnectionItem(MapConnection* connection, bool hide) {
@@ -1481,6 +1506,31 @@ void Editor::createConnectionItem(MapConnection* connection, bool hide) {
connection_edit_items.append(connection_edit_item);
}
+// Hides connected map tiles that cannot be seen from the current map (beyond BORDER_DISTANCE).
+void Editor::maskNonVisibleConnectionTiles() {
+ if (connection_mask) {
+ if (connection_mask->scene()) {
+ connection_mask->scene()->removeItem(connection_mask);
+ }
+ delete connection_mask;
+ }
+
+ QPainterPath mask;
+ mask.addRect(scene->itemsBoundingRect().toRect());
+ mask.addRect(
+ -BORDER_DISTANCE * 16,
+ -BORDER_DISTANCE * 16,
+ (map->getWidth() + BORDER_DISTANCE * 2) * 16,
+ (map->getHeight() + BORDER_DISTANCE * 2) * 16
+ );
+
+ // Mask the tiles with the current theme's background color.
+ QPen pen(ui->graphicsView_Map->palette().color(QPalette::Active, QPalette::Base));
+ QBrush brush(ui->graphicsView_Map->palette().color(QPalette::Active, QPalette::Base));
+
+ connection_mask = scene->addPath(mask, pen, brush);
+}
+
void Editor::displayMapBorder() {
for (QGraphicsPixmapItem* item : borderItems) {
if (item->scene()) {
@@ -1527,6 +1577,8 @@ void Editor::updateMapConnections() {
connection_edit_items[i]->basePixmap = pixmap;
connection_edit_items[i]->setPixmap(pixmap);
}
+
+ maskNonVisibleConnectionTiles();
}
int Editor::getBorderDrawDistance(int dimension) {
@@ -1583,6 +1635,7 @@ void Editor::updateConnectionOffset(int offset) {
}
selected_connection_item->blockSignals(false);
updateMirroredConnectionOffset(selected_connection_item->connection);
+ maskNonVisibleConnectionTiles();
}
void Editor::setConnectionMap(QString mapName) {
@@ -1603,6 +1656,7 @@ void Editor::setConnectionMap(QString mapName) {
selected_connection_item->connection->map_name = mapName;
setCurrentConnectionDirection(selected_connection_item->connection->direction);
updateMirroredConnectionMap(selected_connection_item->connection, originalMapName);
+ maskNonVisibleConnectionTiles();
}
void Editor::addNewConnection() {
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 27d67427..a477aaa2 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -164,7 +164,6 @@ void MainWindow::initEditor() {
connect(this->editor, SIGNAL(warpEventDoubleClicked(QString,QString)), this, SLOT(openWarpMap(QString,QString)));
connect(this->editor, SIGNAL(currentMetatilesSelectionChanged()), this, SLOT(currentMetatilesSelectionChanged()));
connect(this->editor, SIGNAL(wildMonDataChanged()), this, SLOT(onWildMonDataChanged()));
- connect(this->editor, &Editor::wheelZoom, this, &MainWindow::onWheelZoom);
this->loadUserSettings();
@@ -572,20 +571,12 @@ void MainWindow::refreshMapScene()
{
on_mainTabBar_tabBarClicked(ui->mainTabBar->currentIndex());
- double base = editor->scale_base;
- double exp = editor->scale_exp;
-
- int width = static_cast(ceil((editor->scene->width()) * pow(base,exp))) + 2;
- int height = static_cast(ceil((editor->scene->height()) * pow(base,exp))) + 2;
-
ui->graphicsView_Map->setScene(editor->scene);
ui->graphicsView_Map->setSceneRect(editor->scene->sceneRect());
- ui->graphicsView_Map->setFixedSize(width, height);
ui->graphicsView_Map->editor = editor;
ui->graphicsView_Connections->setScene(editor->scene);
ui->graphicsView_Connections->setSceneRect(editor->scene->sceneRect());
- ui->graphicsView_Connections->setFixedSize(width, height);
ui->graphicsView_Metatiles->setScene(editor->scene_metatiles);
//ui->graphicsView_Metatiles->setSceneRect(editor->scene_metatiles->sceneRect());
@@ -1368,11 +1359,11 @@ void MainWindow::on_mainTabBar_tabBarClicked(int index)
}
void MainWindow::on_actionZoom_In_triggered() {
- scaleMapView(1);
+ editor->scaleMapView(1);
}
void MainWindow::on_actionZoom_Out_triggered() {
- scaleMapView(-1);
+ editor->scaleMapView(-1);
}
void MainWindow::on_actionBetter_Cursors_triggered() {
@@ -1449,39 +1440,8 @@ void MainWindow::on_actionMap_Shift_triggered()
on_toolButton_Shift_clicked();
}
-void MainWindow::onWheelZoom(int s) {
- // Don't zoom the map when the user accidentally scrolls while performing a magic fill. (ctrl + middle button click)
- if (!(QApplication::mouseButtons() & Qt::MiddleButton)) {
- scaleMapView(s);
- }
-}
-
-void MainWindow::scaleMapView(int s) {
- if ((editor->scale_exp + s) <= 5 && (editor->scale_exp + s) >= -2) // sane limits
- {
- if (s == 0)
- {
- s = -editor->scale_exp;
- }
-
- editor->scale_exp += s;
-
- double base = editor->scale_base;
- double exp = editor->scale_exp;
- double sfactor = pow(base,s);
-
- ui->graphicsView_Map->scale(sfactor,sfactor);
- ui->graphicsView_Connections->scale(sfactor,sfactor);
-
- int width = static_cast(ceil((editor->scene->width()) * pow(base,exp))) + 2;
- int height = static_cast(ceil((editor->scene->height()) * pow(base,exp))) + 2;
- ui->graphicsView_Map->setFixedSize(width, height);
- ui->graphicsView_Connections->setFixedSize(width, height);
- }
-}
-
void MainWindow::resetMapViewScale() {
- scaleMapView(0);
+ editor->scaleMapView(0);
}
void MainWindow::addNewEvent(QString event_type)
@@ -2158,9 +2118,9 @@ void MainWindow::on_toolButton_Paint_clicked()
if (ui->tabWidget_2->currentIndex() == 0)
editor->cursorMapTileRect->stopSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- QScroller::ungrabGesture(ui->scrollArea);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ QScroller::ungrabGesture(ui->graphicsView_Map);
checkToolButtons();
}
@@ -2175,9 +2135,9 @@ void MainWindow::on_toolButton_Select_clicked()
editor->settings->mapCursor = QCursor();
editor->cursorMapTileRect->setSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- QScroller::ungrabGesture(ui->scrollArea);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ QScroller::ungrabGesture(ui->graphicsView_Map);
checkToolButtons();
}
@@ -2192,9 +2152,9 @@ void MainWindow::on_toolButton_Fill_clicked()
editor->settings->mapCursor = QCursor(QPixmap(":/icons/fill_color_cursor.ico"), 10, 10);
editor->cursorMapTileRect->setSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- QScroller::ungrabGesture(ui->scrollArea);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ QScroller::ungrabGesture(ui->graphicsView_Map);
checkToolButtons();
}
@@ -2209,9 +2169,9 @@ void MainWindow::on_toolButton_Dropper_clicked()
editor->settings->mapCursor = QCursor(QPixmap(":/icons/pipette_cursor.ico"), 10, 10);
editor->cursorMapTileRect->setSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- QScroller::ungrabGesture(ui->scrollArea);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ QScroller::ungrabGesture(ui->graphicsView_Map);
checkToolButtons();
}
@@ -2226,9 +2186,9 @@ void MainWindow::on_toolButton_Move_clicked()
editor->settings->mapCursor = QCursor(QPixmap(":/icons/move.ico"), 7, 7);
editor->cursorMapTileRect->setSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ QScroller::grabGesture(ui->graphicsView_Map, QScroller::LeftMouseButtonGesture);
checkToolButtons();
}
@@ -2243,9 +2203,9 @@ void MainWindow::on_toolButton_Shift_clicked()
editor->settings->mapCursor = QCursor(QPixmap(":/icons/shift_cursor.ico"), 10, 10);
editor->cursorMapTileRect->setSingleTileMode();
- ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- QScroller::ungrabGesture(ui->scrollArea);
+ ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ QScroller::ungrabGesture(ui->graphicsView_Map);
checkToolButtons();
}
@@ -2594,6 +2554,7 @@ void MainWindow::on_actionThemes_triggered()
QString theme = themeSelector->currentText();
porymapConfig.setTheme(theme);
this->setTheme(theme);
+ editor->maskNonVisibleConnectionTiles();
}
});
connect(&buttonBox, SIGNAL(rejected()), &themeSelectorWindow, SLOT(reject()));