Always allow connection warps
This commit is contained in:
parent
ab6d035ad8
commit
ca0c667135
3 changed files with 49 additions and 69 deletions
|
@ -110,8 +110,7 @@ public:
|
||||||
QGraphicsPixmapItem *current_view = nullptr;
|
QGraphicsPixmapItem *current_view = nullptr;
|
||||||
MapPixmapItem *map_item = nullptr;
|
MapPixmapItem *map_item = nullptr;
|
||||||
ConnectionPixmapItem* selected_connection_item = nullptr;
|
ConnectionPixmapItem* selected_connection_item = nullptr;
|
||||||
QList<QGraphicsPixmapItem*> connection_items;
|
QList<ConnectionPixmapItem*> connection_items;
|
||||||
QList<ConnectionPixmapItem*> connection_edit_items;
|
|
||||||
QGraphicsPathItem *connection_mask = nullptr;
|
QGraphicsPathItem *connection_mask = nullptr;
|
||||||
CollisionPixmapItem *collision_item = nullptr;
|
CollisionPixmapItem *collision_item = nullptr;
|
||||||
QGraphicsItemGroup *events_group = nullptr;
|
QGraphicsItemGroup *events_group = nullptr;
|
||||||
|
@ -147,6 +146,7 @@ public:
|
||||||
QUndoGroup editGroup; // Manages the undo history for each map
|
QUndoGroup editGroup; // Manages the undo history for each map
|
||||||
|
|
||||||
bool selectingEvent = false;
|
bool selectingEvent = false;
|
||||||
|
bool editingConnections = false;
|
||||||
|
|
||||||
void shouldReselectEvents();
|
void shouldReselectEvents();
|
||||||
void scaleMapView(int);
|
void scaleMapView(int);
|
||||||
|
@ -166,6 +166,7 @@ private:
|
||||||
void setBorderItemsVisible(bool, qreal = 1);
|
void setBorderItemsVisible(bool, qreal = 1);
|
||||||
void setConnectionEditControlValues(MapConnection*);
|
void setConnectionEditControlValues(MapConnection*);
|
||||||
void setConnectionEditControlsEnabled(bool);
|
void setConnectionEditControlsEnabled(bool);
|
||||||
|
void setConnectionHighlights(bool);
|
||||||
void createConnectionItem(MapConnection* connection, bool hide);
|
void createConnectionItem(MapConnection* connection, bool hide);
|
||||||
void populateConnectionMapPickers();
|
void populateConnectionMapPickers();
|
||||||
void setDiveEmergeControls();
|
void setDiveEmergeControls();
|
||||||
|
|
111
src/editor.cpp
111
src/editor.cpp
|
@ -86,7 +86,6 @@ void Editor::setEditingMap() {
|
||||||
displayMapConnections();
|
displayMapConnections();
|
||||||
map_item->draw();
|
map_item->draw();
|
||||||
map_item->setVisible(true);
|
map_item->setVisible(true);
|
||||||
setConnectionsVisibility(ui->checkBox_ToggleBorder->isChecked());
|
|
||||||
}
|
}
|
||||||
if (collision_item) {
|
if (collision_item) {
|
||||||
collision_item->setVisible(false);
|
collision_item->setVisible(false);
|
||||||
|
@ -95,7 +94,9 @@ void Editor::setEditingMap() {
|
||||||
events_group->setVisible(false);
|
events_group->setVisible(false);
|
||||||
}
|
}
|
||||||
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
setConnectionItemsVisible(false);
|
setConnectionItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
|
setConnectionHighlights(false);
|
||||||
|
this->editingConnections = false;
|
||||||
this->cursorMapTileRect->stopSingleTileMode();
|
this->cursorMapTileRect->stopSingleTileMode();
|
||||||
this->cursorMapTileRect->setActive(true);
|
this->cursorMapTileRect->setActive(true);
|
||||||
|
|
||||||
|
@ -108,7 +109,6 @@ void Editor::setEditingCollision() {
|
||||||
displayMapConnections();
|
displayMapConnections();
|
||||||
collision_item->draw();
|
collision_item->draw();
|
||||||
collision_item->setVisible(true);
|
collision_item->setVisible(true);
|
||||||
setConnectionsVisibility(ui->checkBox_ToggleBorder->isChecked());
|
|
||||||
}
|
}
|
||||||
if (map_item) {
|
if (map_item) {
|
||||||
map_item->paintingMode = MapPixmapItem::PaintMode::Metatiles;
|
map_item->paintingMode = MapPixmapItem::PaintMode::Metatiles;
|
||||||
|
@ -118,7 +118,9 @@ void Editor::setEditingCollision() {
|
||||||
events_group->setVisible(false);
|
events_group->setVisible(false);
|
||||||
}
|
}
|
||||||
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
setConnectionItemsVisible(false);
|
setConnectionItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
|
setConnectionHighlights(false);
|
||||||
|
this->editingConnections = false;
|
||||||
this->cursorMapTileRect->setSingleTileMode();
|
this->cursorMapTileRect->setSingleTileMode();
|
||||||
this->cursorMapTileRect->setActive(true);
|
this->cursorMapTileRect->setActive(true);
|
||||||
|
|
||||||
|
@ -135,13 +137,14 @@ void Editor::setEditingObjects() {
|
||||||
displayMapConnections();
|
displayMapConnections();
|
||||||
map_item->draw();
|
map_item->draw();
|
||||||
map_item->setVisible(true);
|
map_item->setVisible(true);
|
||||||
setConnectionsVisibility(ui->checkBox_ToggleBorder->isChecked());
|
|
||||||
}
|
}
|
||||||
if (collision_item) {
|
if (collision_item) {
|
||||||
collision_item->setVisible(false);
|
collision_item->setVisible(false);
|
||||||
}
|
}
|
||||||
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
setBorderItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
setConnectionItemsVisible(false);
|
setConnectionItemsVisible(ui->checkBox_ToggleBorder->isChecked());
|
||||||
|
setConnectionHighlights(false);
|
||||||
|
this->editingConnections = false;
|
||||||
this->cursorMapTileRect->setSingleTileMode();
|
this->cursorMapTileRect->setSingleTileMode();
|
||||||
this->cursorMapTileRect->setActive(false);
|
this->cursorMapTileRect->setActive(false);
|
||||||
|
|
||||||
|
@ -172,7 +175,6 @@ void Editor::setEditingConnections() {
|
||||||
map_item->setVisible(true);
|
map_item->setVisible(true);
|
||||||
populateConnectionMapPickers();
|
populateConnectionMapPickers();
|
||||||
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
||||||
setConnectionsVisibility(false);
|
|
||||||
setDiveEmergeControls();
|
setDiveEmergeControls();
|
||||||
bool controlsEnabled = selected_connection_item != nullptr;
|
bool controlsEnabled = selected_connection_item != nullptr;
|
||||||
setConnectionEditControlsEnabled(controlsEnabled);
|
setConnectionEditControlsEnabled(controlsEnabled);
|
||||||
|
@ -190,6 +192,8 @@ void Editor::setEditingConnections() {
|
||||||
}
|
}
|
||||||
setBorderItemsVisible(true, 0.4);
|
setBorderItemsVisible(true, 0.4);
|
||||||
setConnectionItemsVisible(true);
|
setConnectionItemsVisible(true);
|
||||||
|
setConnectionHighlights(true);
|
||||||
|
this->editingConnections = true;
|
||||||
this->cursorMapTileRect->setSingleTileMode();
|
this->cursorMapTileRect->setSingleTileMode();
|
||||||
this->cursorMapTileRect->setActive(false);
|
this->cursorMapTileRect->setActive(false);
|
||||||
}
|
}
|
||||||
|
@ -747,7 +751,7 @@ void Editor::populateConnectionMapPickers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::setConnectionItemsVisible(bool visible) {
|
void Editor::setConnectionItemsVisible(bool visible) {
|
||||||
for (ConnectionPixmapItem* item : connection_edit_items) {
|
for (ConnectionPixmapItem* item : connection_items) {
|
||||||
item->setVisible(visible);
|
item->setVisible(visible);
|
||||||
item->setEnabled(visible);
|
item->setEnabled(visible);
|
||||||
}
|
}
|
||||||
|
@ -856,17 +860,14 @@ void Editor::setConnectionEditControlsEnabled(bool enabled) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::onConnectionItemSelected(ConnectionPixmapItem* connectionItem) {
|
void Editor::setConnectionHighlights(bool enabled) {
|
||||||
if (!connectionItem)
|
for (ConnectionPixmapItem* item : connection_items) {
|
||||||
return;
|
bool isSelectedItem = item == selected_connection_item;
|
||||||
|
int zValue = (isSelectedItem || !enabled) ? 0 : -1;
|
||||||
for (ConnectionPixmapItem* item : connection_edit_items) {
|
qreal opacity = (isSelectedItem || !enabled) ? 1 : 0.75;
|
||||||
bool isSelectedItem = item == connectionItem;
|
|
||||||
int zValue = isSelectedItem ? 0 : -1;
|
|
||||||
qreal opacity = isSelectedItem ? 1 : 0.75;
|
|
||||||
item->setZValue(zValue);
|
item->setZValue(zValue);
|
||||||
item->render(opacity);
|
item->render(opacity);
|
||||||
if (isSelectedItem) {
|
if (enabled && isSelectedItem) {
|
||||||
QPixmap pixmap = item->pixmap();
|
QPixmap pixmap = item->pixmap();
|
||||||
QPainter painter(&pixmap);
|
QPainter painter(&pixmap);
|
||||||
painter.setPen(QColor(255, 0, 255));
|
painter.setPen(QColor(255, 0, 255));
|
||||||
|
@ -875,7 +876,14 @@ void Editor::onConnectionItemSelected(ConnectionPixmapItem* connectionItem) {
|
||||||
item->setPixmap(pixmap);
|
item->setPixmap(pixmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::onConnectionItemSelected(ConnectionPixmapItem* connectionItem) {
|
||||||
selected_connection_item = connectionItem;
|
selected_connection_item = connectionItem;
|
||||||
|
if (!selected_connection_item || !this->editingConnections)
|
||||||
|
return;
|
||||||
|
|
||||||
|
setConnectionHighlights(true);
|
||||||
setConnectionEditControlsEnabled(true);
|
setConnectionEditControlsEnabled(true);
|
||||||
setConnectionEditControlValues(selected_connection_item->connection);
|
setConnectionEditControlValues(selected_connection_item->connection);
|
||||||
ui->spinBox_ConnectionOffset->setMaximum(selected_connection_item->getMaxOffset());
|
ui->spinBox_ConnectionOffset->setMaximum(selected_connection_item->getMaxOffset());
|
||||||
|
@ -885,7 +893,7 @@ void Editor::onConnectionItemSelected(ConnectionPixmapItem* connectionItem) {
|
||||||
|
|
||||||
void Editor::setSelectedConnectionFromMap(QString mapName) {
|
void Editor::setSelectedConnectionFromMap(QString mapName) {
|
||||||
// Search for the first connection that connects to the given map map.
|
// Search for the first connection that connects to the given map map.
|
||||||
for (ConnectionPixmapItem* item : connection_edit_items) {
|
for (ConnectionPixmapItem* item : connection_items) {
|
||||||
if (item->connection->map_name == mapName) {
|
if (item->connection->map_name == mapName) {
|
||||||
onConnectionItemSelected(item);
|
onConnectionItemSelected(item);
|
||||||
break;
|
break;
|
||||||
|
@ -1077,13 +1085,6 @@ QString Editor::getMovementPermissionText(uint16_t collision, uint16_t elevation
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::setConnectionsVisibility(bool visible) {
|
|
||||||
for (QGraphicsPixmapItem* item : connection_items) {
|
|
||||||
item->setVisible(visible);
|
|
||||||
item->setActive(visible);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Editor::setMap(QString map_name) {
|
bool Editor::setMap(QString map_name) {
|
||||||
if (map_name.isEmpty()) {
|
if (map_name.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1528,22 +1529,14 @@ DraggablePixmapItem *Editor::addMapEvent(Event *event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::displayMapConnections() {
|
void Editor::displayMapConnections() {
|
||||||
for (QGraphicsPixmapItem* item : connection_items) {
|
for (ConnectionPixmapItem* item : connection_items) {
|
||||||
if (item->scene()) {
|
|
||||||
item->scene()->removeItem(item);
|
|
||||||
}
|
|
||||||
delete item;
|
|
||||||
}
|
|
||||||
connection_items.clear();
|
|
||||||
|
|
||||||
for (ConnectionPixmapItem* item : connection_edit_items) {
|
|
||||||
if (item->scene()) {
|
if (item->scene()) {
|
||||||
item->scene()->removeItem(item);
|
item->scene()->removeItem(item);
|
||||||
}
|
}
|
||||||
delete item;
|
delete item;
|
||||||
}
|
}
|
||||||
selected_connection_item = nullptr;
|
selected_connection_item = nullptr;
|
||||||
connection_edit_items.clear();
|
connection_items.clear();
|
||||||
|
|
||||||
for (MapConnection *connection : map->connections) {
|
for (MapConnection *connection : map->connections) {
|
||||||
if (connection->direction == "dive" || connection->direction == "emerge") {
|
if (connection->direction == "dive" || connection->direction == "emerge") {
|
||||||
|
@ -1552,8 +1545,8 @@ void Editor::displayMapConnections() {
|
||||||
createConnectionItem(connection, false);
|
createConnectionItem(connection, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!connection_edit_items.empty()) {
|
if (!connection_items.empty()) {
|
||||||
onConnectionItemSelected(connection_edit_items.first());
|
onConnectionItemSelected(connection_items.first());
|
||||||
}
|
}
|
||||||
|
|
||||||
maskNonVisibleConnectionTiles();
|
maskNonVisibleConnectionTiles();
|
||||||
|
@ -1582,26 +1575,16 @@ void Editor::createConnectionItem(MapConnection* connection, bool hide) {
|
||||||
y = offset * 16;
|
y = offset * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
|
ConnectionPixmapItem *item = new ConnectionPixmapItem(pixmap, connection, x, y, map->getWidth(), map->getHeight());
|
||||||
item->setZValue(-1);
|
|
||||||
item->setX(x);
|
item->setX(x);
|
||||||
item->setY(y);
|
item->setY(y);
|
||||||
|
item->setZValue(-1);
|
||||||
scene->addItem(item);
|
scene->addItem(item);
|
||||||
connection_items.append(item);
|
|
||||||
item->setVisible(!hide);
|
item->setVisible(!hide);
|
||||||
|
connect(item, &ConnectionPixmapItem::connectionMoved, this, &Editor::onConnectionMoved);
|
||||||
ConnectionPixmapItem *connection_edit_item = new ConnectionPixmapItem(pixmap, connection, x, y, map->getWidth(), map->getHeight());
|
connect(item, &ConnectionPixmapItem::connectionItemSelected, this, &Editor::onConnectionItemSelected);
|
||||||
connection_edit_item->setX(x);
|
connect(item, &ConnectionPixmapItem::connectionItemDoubleClicked, this, &Editor::onConnectionItemDoubleClicked);
|
||||||
connection_edit_item->setY(y);
|
connection_items.append(item);
|
||||||
connection_edit_item->setZValue(-1);
|
|
||||||
scene->addItem(connection_edit_item);
|
|
||||||
connect(connection_edit_item, &ConnectionPixmapItem::connectionMoved,
|
|
||||||
this, &Editor::onConnectionMoved);
|
|
||||||
connect(connection_edit_item, &ConnectionPixmapItem::connectionItemSelected,
|
|
||||||
this, &Editor::onConnectionItemSelected);
|
|
||||||
connect(connection_edit_item, &ConnectionPixmapItem::connectionItemDoubleClicked,
|
|
||||||
this, &Editor::onConnectionItemDoubleClicked);
|
|
||||||
connection_edit_items.append(connection_edit_item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hides connected map tiles that cannot be seen from the current map (beyond BORDER_DISTANCE).
|
// Hides connected map tiles that cannot be seen from the current map (beyond BORDER_DISTANCE).
|
||||||
|
@ -1662,18 +1645,14 @@ void Editor::updateMapBorder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::updateMapConnections() {
|
void Editor::updateMapConnections() {
|
||||||
if (connection_items.size() != connection_edit_items.size())
|
for (int i = 0; i < connection_items.size(); i++) {
|
||||||
return;
|
Map *connected_map = project->getMap(connection_items[i]->connection->map_name);
|
||||||
|
|
||||||
for (int i = 0; i < connection_items.size(); i++) {
|
|
||||||
Map *connected_map = project->getMap(connection_edit_items[i]->connection->map_name);
|
|
||||||
if (!connected_map)
|
if (!connected_map)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
QPixmap pixmap = connected_map->renderConnection(*(connection_edit_items[i]->connection), map->layout);
|
QPixmap pixmap = connected_map->renderConnection(*(connection_items[i]->connection), map->layout);
|
||||||
|
connection_items[i]->basePixmap = pixmap;
|
||||||
connection_items[i]->setPixmap(pixmap);
|
connection_items[i]->setPixmap(pixmap);
|
||||||
connection_edit_items[i]->basePixmap = pixmap;
|
|
||||||
connection_edit_items[i]->setPixmap(pixmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
maskNonVisibleConnectionTiles();
|
maskNonVisibleConnectionTiles();
|
||||||
|
@ -1794,7 +1773,7 @@ void Editor::addNewConnection() {
|
||||||
newConnection->map_name = defaultMapName;
|
newConnection->map_name = defaultMapName;
|
||||||
map->connections.append(newConnection);
|
map->connections.append(newConnection);
|
||||||
createConnectionItem(newConnection, true);
|
createConnectionItem(newConnection, true);
|
||||||
onConnectionItemSelected(connection_edit_items.last());
|
onConnectionItemSelected(connection_items.last());
|
||||||
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
||||||
|
|
||||||
updateMirroredConnection(newConnection, newConnection->direction, newConnection->map_name);
|
updateMirroredConnection(newConnection, newConnection->direction, newConnection->map_name);
|
||||||
|
@ -1866,7 +1845,7 @@ void Editor::removeCurrentConnection() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
map->connections.removeOne(selected_connection_item->connection);
|
map->connections.removeOne(selected_connection_item->connection);
|
||||||
connection_edit_items.removeOne(selected_connection_item);
|
connection_items.removeOne(selected_connection_item);
|
||||||
removeMirroredConnection(selected_connection_item->connection);
|
removeMirroredConnection(selected_connection_item->connection);
|
||||||
|
|
||||||
if (selected_connection_item && selected_connection_item->scene()) {
|
if (selected_connection_item && selected_connection_item->scene()) {
|
||||||
|
@ -1879,8 +1858,8 @@ void Editor::removeCurrentConnection() {
|
||||||
ui->spinBox_ConnectionOffset->setValue(0);
|
ui->spinBox_ConnectionOffset->setValue(0);
|
||||||
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
ui->label_NumConnections->setText(QString::number(map->connections.length()));
|
||||||
|
|
||||||
if (connection_edit_items.length() > 0) {
|
if (connection_items.length() > 0) {
|
||||||
onConnectionItemSelected(connection_edit_items.last());
|
onConnectionItemSelected(connection_items.last());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1951,7 +1930,7 @@ void Editor::updateSecondaryTileset(QString tilesetLabel, bool forceLoad)
|
||||||
void Editor::toggleBorderVisibility(bool visible, bool enableScriptCallback)
|
void Editor::toggleBorderVisibility(bool visible, bool enableScriptCallback)
|
||||||
{
|
{
|
||||||
this->setBorderItemsVisible(visible);
|
this->setBorderItemsVisible(visible);
|
||||||
this->setConnectionsVisibility(visible);
|
this->setConnectionItemsVisible(visible);
|
||||||
porymapConfig.setShowBorder(visible);
|
porymapConfig.setShowBorder(visible);
|
||||||
if (enableScriptCallback)
|
if (enableScriptCallback)
|
||||||
Scripting::cb_BorderVisibilityToggled(visible);
|
Scripting::cb_BorderVisibilityToggled(visible);
|
||||||
|
|
|
@ -392,7 +392,7 @@ QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) {
|
||||||
if (!this->mode) {
|
if (!this->mode) {
|
||||||
// if showing connections, draw on outside of image
|
// if showing connections, draw on outside of image
|
||||||
QPainter connectionPainter(&pixmap);
|
QPainter connectionPainter(&pixmap);
|
||||||
for (auto connectionItem : editor->connection_edit_items) {
|
for (auto connectionItem : editor->connection_items) {
|
||||||
QString direction = connectionItem->connection->direction;
|
QString direction = connectionItem->connection->direction;
|
||||||
if ((showUpConnections && direction == "up")
|
if ((showUpConnections && direction == "up")
|
||||||
|| (showDownConnections && direction == "down")
|
|| (showDownConnections && direction == "down")
|
||||||
|
|
Loading…
Reference in a new issue