diff --git a/editor.cpp b/editor.cpp
index ddca2fdd..675a3811 100755
--- a/editor.cpp
+++ b/editor.cpp
@@ -40,6 +40,7 @@ void Editor::setEditingMap() {
map_item->draw();
map_item->setVisible(true);
map_item->setEnabled(true);
+ setConnectionsVisibility(true);
}
if (collision_item) {
collision_item->setVisible(false);
@@ -52,8 +53,8 @@ void Editor::setEditingMap() {
void Editor::setEditingCollision() {
current_view = collision_item;
if (collision_item) {
- collision_item->draw();
collision_item->setVisible(true);
+ setConnectionsVisibility(true);
}
if (map_item) {
map_item->setVisible(false);
@@ -71,12 +72,88 @@ void Editor::setEditingObjects() {
if (map_item) {
map_item->setVisible(true);
map_item->setEnabled(false);
+ setConnectionsVisibility(true);
}
if (collision_item) {
collision_item->setVisible(false);
}
}
+void Editor::setEditingConnections(QString direction) {
+ current_view = map_item;
+ if (map_item) {
+ map_item->draw();
+ map_item->setVisible(true);
+ map_item->setEnabled(true);
+ setConnectionsVisibility(false);
+ showCurrentConnectionMap(direction);
+ }
+ if (collision_item) {
+ collision_item->setVisible(false);
+ }
+ if (objects_group) {
+ objects_group->setVisible(false);
+ }
+}
+
+void Editor::showCurrentConnectionMap(QString curDirection) {
+ bool connectionExists = false;
+ for (Connection* connection : map->connections) {
+ if (connection->direction != curDirection) continue;
+ if (connection_item) {
+ scene->removeItem(connection_item);
+ delete connection_item;
+ connection_item = NULL;
+ }
+
+ connectionExists = true;
+ Map *connected_map = project->getMap(connection->map_name);
+ QPixmap pixmap = connected_map->renderConnection(*connection);
+ int offset = connection->offset.toInt(nullptr, 0);
+ int x = 0, y = 0;
+ if (connection->direction == "up") {
+ x = offset * 16;
+ y = -pixmap.height();
+ } else if (connection->direction == "down") {
+ x = offset * 16;
+ y = map->getHeight() * 16;
+ } else if (connection->direction == "left") {
+ x = -pixmap.width();
+ y = offset * 16;
+ } else if (connection->direction == "right") {
+ x = map->getWidth() * 16;
+ y = offset * 16;
+ }
+ connection_item = new ConnectionPixmapItem(pixmap, connection, x, y);
+ connection_item->setX(x);
+ connection_item->setY(y);
+ connection_item->setZValue(21);
+ scene->addItem(connection_item);
+ scene->setSceneRect(0, 0, pixmap.width() + map_item->pixmap().width(), pixmap.height() + map_item->pixmap().height());
+
+ connect(connection_item, SIGNAL(connectionMoved(int)), this, SLOT(onConnectionOffsetChanged(int)));
+ onConnectionOffsetChanged(connection->offset.toInt());
+ break;
+ }
+
+ if (!connectionExists && connection_item) {
+ scene->removeItem(connection_item);
+ delete connection_item;
+ connection_item = NULL;
+ }
+}
+
+void Editor::onConnectionOffsetChanged(int newOffset) {
+ emit connectionOffsetChanged(newOffset);
+}
+
+void Editor::setConnectionsVisibility(bool visible) {
+ for (QGraphicsPixmapItem* item : map->connection_items) {
+ item->setVisible(visible);
+ item->setActive(visible);
+ }
+}
+
void Editor::setMap(QString map_name) {
if (map_name.isNull()) {
return;
@@ -231,6 +308,7 @@ void Editor::displayMapConnections() {
item->setX(x);
item->setY(y);
scene->addItem(item);
+ map->connection_items.insert(connection->direction, item);
}
}
@@ -263,6 +341,17 @@ void Editor::displayMapGrid() {
}
}
+void Editor::updateConnectionOffset(int offset) {
+ connection_item->blockSignals(true);
+ connection_item->connection->offset = QString::number(offset);
+ if (connection_item->connection->direction == "up" || connection_item->connection->direction == "down") {
+ connection_item->setX(connection_item->initialX + (offset - connection_item->initialOffset) * 16);
+ } else {
+ connection_item->setY(connection_item->initialY + (offset - connection_item->initialOffset) * 16);
+ }
+ connection_item->blockSignals(false);
+}
+
void MetatilesPixmapItem::paintTileChanged(Map *map) {
draw();
}
@@ -345,6 +434,57 @@ void CollisionMetatilesPixmapItem::updateCurHoveredMetatile(QPointF pos) {
}
}
+QVariant ConnectionPixmapItem::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+ if (change == ItemPositionChange) {
+ QPointF newPos = value.toPointF();
+
+ qreal x, y;
+ int newOffset = initialOffset;
+ if (connection->direction == "up" || connection->direction == "down") {
+ x = round(newPos.x() / 16) * 16;
+ newOffset += (x - initialX) / 16;
+ }
+ else {
+ x = initialX;
+ }
+
+ if (connection->direction == "right" || connection->direction == "left") {
+ y = round(newPos.y() / 16) * 16;
+ newOffset += (y - initialY) / 16;
+ }
+ else {
+ y = initialY;
+ }
+
+ emit connectionMoved(newOffset);
+ connection->offset = QString::number(newOffset);
+ return QPointF(x, y);
+ }
+ else {
+ return QGraphicsItem::itemChange(change, value);
+ }
+}
+void ConnectionPixmapItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event) {
+ QPointF pos = event->pos();
+ qDebug() << "enter: " << pos.x() << ", " << pos.y();
+}
+void ConnectionPixmapItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event) {
+ QPointF pos = event->pos();
+ qDebug() << "drag: " << pos.x() << ", " << pos.y();
+}
+void ConnectionPixmapItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) {
+ QPointF pos = event->pos();
+ qDebug() << "leave: " << pos.x() << ", " << pos.y();
+}
+void ConnectionPixmapItem::dropEvent(QGraphicsSceneDragDropEvent *event) {
+ QPointF pos = event->pos();
+ qDebug() << "drop: " << pos.x() << ", " << pos.y();
+}
+void ConnectionPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent* event) {
+ QPointF pos = event->pos();
+}
+
void ElevationMetatilesPixmapItem::updateCurHoveredMetatile(QPointF pos) {
int x = ((int)pos.x()) / 16;
int y = ((int)pos.y()) / 16;
diff --git a/editor.h b/editor.h
index 954da138..0bc6a0cf 100755
--- a/editor.h
+++ b/editor.h
@@ -13,6 +13,7 @@
class DraggablePixmapItem;
class MapPixmapItem;
class CollisionPixmapItem;
+class ConnectionPixmapItem;
class MetatilesPixmapItem;
class CollisionMetatilesPixmapItem;
class ElevationMetatilesPixmapItem;
@@ -44,6 +45,10 @@ public:
void setEditingMap();
void setEditingCollision();
void setEditingObjects();
+ void setEditingConnections(QString direction);
+ void showCurrentConnectionMap(QString curDirection);
+ void setConnectionsVisibility(bool visible);
+ void updateConnectionOffset(int offset);
DraggablePixmapItem *addMapObject(Event *event);
void selectMapObject(DraggablePixmapItem *object);
@@ -58,6 +63,7 @@ public:
QGraphicsScene *scene = NULL;
QGraphicsPixmapItem *current_view = NULL;
MapPixmapItem *map_item = NULL;
+ ConnectionPixmapItem *connection_item = NULL;
CollisionPixmapItem *collision_item = NULL;
QGraphicsItemGroup *objects_group = NULL;
@@ -80,10 +86,12 @@ public:
private slots:
void mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item);
void mouseEvent_collision(QGraphicsSceneMouseEvent *event, CollisionPixmapItem *item);
+ void onConnectionOffsetChanged(int newOffset);
signals:
void objectsChanged();
void selectedObjectsChanged();
+ void connectionOffsetChanged(int newOffset);
};
@@ -240,6 +248,33 @@ protected:
void mouseReleaseEvent(QGraphicsSceneMouseEvent*);
};
+class ConnectionPixmapItem : public QObject, public QGraphicsPixmapItem {
+ Q_OBJECT
+public:
+ ConnectionPixmapItem(QPixmap pixmap, Connection* connection, int x, int y): QGraphicsPixmapItem(pixmap) {
+ this->connection = connection;
+ setFlag(ItemIsMovable);
+ setFlag(ItemIsSelectable);
+ setFlag(ItemSendsGeometryChanges);
+ this->initialX = x;
+ this->initialY = y;
+ this->initialOffset = connection->offset.toInt();
+ }
+ Connection* connection;
+ int initialX;
+ int initialY;
+ int initialOffset;
+protected:
+ QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+ void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override;
+ void dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override;
+ void dropEvent(QGraphicsSceneDragDropEvent *event) override;
+ void dragMoveEvent(QGraphicsSceneDragDropEvent *event) override;
+ void mousePressEvent(QGraphicsSceneMouseEvent*);
+signals:
+ void connectionMoved(int offset);
+};
+
class MetatilesPixmapItem : public QObject, public QGraphicsPixmapItem {
Q_OBJECT
public:
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 464d397d..517384ca 100755
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -30,6 +30,7 @@ MainWindow::MainWindow(QWidget *parent) :
editor->gridToggleCheckbox = ui->checkBox_ToggleGrid;
connect(editor, SIGNAL(objectsChanged()), this, SLOT(updateSelectedObjects()));
connect(editor, SIGNAL(selectedObjectsChanged()), this, SLOT(updateSelectedObjects()));
+ connect(editor, SIGNAL(connectionOffsetChanged(int)), this, SLOT(onConnectionOffsetChanged(int)));
on_toolButton_Paint_clicked();
@@ -143,15 +144,7 @@ void MainWindow::setMap(QString map_name) {
}
editor->setMap(map_name);
- if (ui->tabWidget->currentIndex() == 1) {
- editor->setEditingObjects();
- } else {
- if (ui->tabWidget_2->currentIndex() == 1) {
- editor->setEditingCollision();
- } else {
- editor->setEditingMap();
- }
- }
+ on_tabWidget_currentChanged(ui->tabWidget->currentIndex());
ui->graphicsView_Map->setScene(editor->scene);
ui->graphicsView_Map->setSceneRect(editor->scene->sceneRect());
@@ -162,6 +155,8 @@ void MainWindow::setMap(QString map_name) {
ui->graphicsView_Objects_Map->setFixedSize(editor->scene->width() + 2, editor->scene->height() + 2);
ui->graphicsView_Objects_Map->editor = editor;
+ ui->graphicsView_Connections->setScene(editor->scene);
+
ui->graphicsView_Metatiles->setScene(editor->scene_metatiles);
//ui->graphicsView_Metatiles->setSceneRect(editor->scene_metatiles->sceneRect());
ui->graphicsView_Metatiles->setFixedSize(editor->metatiles_item->pixmap().width() + 2, editor->metatiles_item->pixmap().height() + 2);
@@ -491,6 +486,8 @@ void MainWindow::on_tabWidget_currentChanged(int index)
on_tabWidget_2_currentChanged(ui->tabWidget_2->currentIndex());
} else if (index == 1) {
editor->setEditingObjects();
+ } else if (index == 3) {
+ editor->setEditingConnections(ui->comboBox_ConnectionDirection->currentText().toLower());
}
}
@@ -768,3 +765,20 @@ void MainWindow::on_action_Export_Map_Image_triggered()
editor->map_item->pixmap().save(filepath);
}
}
+
+void MainWindow::on_comboBox_ConnectionDirection_currentIndexChanged(const QString &direction)
+{
+ editor->showCurrentConnectionMap(direction.toLower());
+}
+
+void MainWindow::on_spinBox_ConnectionOffset_valueChanged(int offset)
+{
+ editor->updateConnectionOffset(offset);
+}
+
+void MainWindow::onConnectionOffsetChanged(int offset)
+{
+ ui->spinBox_ConnectionOffset->blockSignals(true);
+ ui->spinBox_ConnectionOffset->setValue(offset);
+ ui->spinBox_ConnectionOffset->blockSignals(false);
+}
diff --git a/mainwindow.h b/mainwindow.h
index e1b443a1..c87a8171 100755
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -74,6 +74,12 @@ private slots:
void on_action_Export_Map_Image_triggered();
+ void on_comboBox_ConnectionDirection_currentIndexChanged(const QString &arg1);
+
+ void on_spinBox_ConnectionOffset_valueChanged(int offset);
+
+ void onConnectionOffsetChanged(int offset);
+
private:
Ui::MainWindow *ui;
QStandardItemModel *mapListModel;
diff --git a/mainwindow.ui b/mainwindow.ui
index d1faa64a..9ffce740 100755
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -60,7 +60,7 @@
- 0
+ 3
false
@@ -1266,7 +1266,7 @@
QFrame::Raised
-
+
4
@@ -1286,22 +1286,22 @@
-
- North
+ Up
-
- East
+ Right
-
- South
+ Down
-
- West
+ Left
@@ -1336,6 +1336,20 @@
+ -
+
+
+ Offset
+
+
+
+ -
+
+
+ -99
+
+
+
-
@@ -1377,78 +1391,7 @@
0
-
-
-
- true
-
-
-
-
- 0
- 0
- 826
- 621
-
-
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
-
+
diff --git a/map.h b/map.h
index b05a60ea..12b62c01 100755
--- a/map.h
+++ b/map.h
@@ -8,6 +8,7 @@
#include
#include
#include
+#include
template
@@ -179,6 +180,7 @@ public:
QMap> events;
QList connections;
+ QMap connection_items;
QPixmap renderConnection(Connection);
QImage border_image;
diff --git a/project.cpp b/project.cpp
index fd54f6a9..068bd554 100755
--- a/project.cpp
+++ b/project.cpp
@@ -67,6 +67,7 @@ void Project::loadMapConnections(Map *map) {
}
map->connections.clear();
+ map->connection_items.clear();
if (!map->connections_label.isNull()) {
QString path = root + QString("/data/maps/%1/connections.inc").arg(map->name);
QString text = readTextFile(path);