diff --git a/include/editor.h b/include/editor.h index fd773e68..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; diff --git a/src/editor.cpp b/src/editor.cpp index 2652c4e6..020e925c 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) { @@ -1458,6 +1460,8 @@ void Editor::displayMapConnections() { if (!connection_edit_items.empty()) { onConnectionItemSelected(connection_edit_items.first()); } + + maskNonVisibleConnectionTiles(); } void Editor::createConnectionItem(MapConnection* connection, bool hide) { @@ -1502,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::Base)); + QBrush brush(ui->graphicsView_Map->palette().color(QPalette::Base)); + + connection_mask = scene->addPath(mask, pen, brush); +} + void Editor::displayMapBorder() { for (QGraphicsPixmapItem* item : borderItems) { if (item->scene()) { @@ -1548,6 +1577,8 @@ void Editor::updateMapConnections() { connection_edit_items[i]->basePixmap = pixmap; connection_edit_items[i]->setPixmap(pixmap); } + + maskNonVisibleConnectionTiles(); } int Editor::getBorderDrawDistance(int dimension) { @@ -1604,6 +1635,7 @@ void Editor::updateConnectionOffset(int offset) { } selected_connection_item->blockSignals(false); updateMirroredConnectionOffset(selected_connection_item->connection); + maskNonVisibleConnectionTiles(); } void Editor::setConnectionMap(QString mapName) { @@ -1624,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 3d2edab6..6814c2fc 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2536,6 +2536,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()));