From 5301b299e2265bb7c43d5a5e2e697baf3d8e1ef7 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 10 Mar 2018 10:09:19 -0800 Subject: [PATCH] Support adding/removing connections via buttons --- editor.cpp | 126 +++++++++++++++++++++++++++++++++---------------- editor.h | 3 ++ mainwindow.cpp | 10 ++++ mainwindow.h | 4 ++ mainwindow.ui | 104 ++++++++++++++++++++++++++++++++++++++-- 5 files changed, 203 insertions(+), 44 deletions(-) diff --git a/editor.cpp b/editor.cpp index d4dcf0a0..62f82804 100755 --- a/editor.cpp +++ b/editor.cpp @@ -97,6 +97,7 @@ void Editor::setEditingConnections() { ui->comboBox_ConnectedMap->clear(); ui->comboBox_ConnectedMap->addItems(*project->mapNames); ui->comboBox_ConnectedMap->blockSignals(false); + ui->label_NumConnections->setText(QString::number(map->connections.length())); setConnectionsVisibility(false); if (current_connection_edit_item) { onConnectionOffsetChanged(current_connection_edit_item->connection->offset.toInt()); @@ -195,6 +196,9 @@ void Editor::setConnectionEditControlsEnabled(bool enabled) { } void Editor::onConnectionItemSelected(ConnectionPixmapItem* connectionItem) { + if (!connectionItem) + return; + for (ConnectionPixmapItem* item : connection_edit_items) { bool isSelectedItem = item == connectionItem; int zValue = isSelectedItem ? 0 : -1; @@ -372,39 +376,7 @@ void Editor::displayMapConnections() { if (connection->direction == "dive" || connection->direction == "emerge") { continue; } - 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; - } - - QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap); - item->setZValue(-1); - item->setX(x); - item->setY(y); - scene->addItem(item); - map->connection_items.append(item); - - ConnectionPixmapItem *connection_edit_item = new ConnectionPixmapItem(pixmap, connection, x, y); - connection_edit_item->setX(x); - connection_edit_item->setY(y); - connection_edit_item->setZValue(-1); - scene->addItem(connection_edit_item); - connect(connection_edit_item, SIGNAL(connectionMoved(int)), this, SLOT(onConnectionOffsetChanged(int))); - connect(connection_edit_item, SIGNAL(connectionItemSelected(ConnectionPixmapItem*)), this, SLOT(onConnectionItemSelected(ConnectionPixmapItem*))); - connection_edit_items.append(connection_edit_item); + createConnectionItem(connection, false); } if (!connection_edit_items.empty()) { @@ -412,6 +384,43 @@ void Editor::displayMapConnections() { } } +void Editor::createConnectionItem(Connection* connection, bool hide) { + 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; + } + + QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap); + item->setZValue(-1); + item->setX(x); + item->setY(y); + scene->addItem(item); + map->connection_items.append(item); + item->setVisible(!hide); + + ConnectionPixmapItem *connection_edit_item = new ConnectionPixmapItem(pixmap, connection, x, y); + connection_edit_item->setX(x); + connection_edit_item->setY(y); + connection_edit_item->setZValue(-1); + scene->addItem(connection_edit_item); + connect(connection_edit_item, SIGNAL(connectionMoved(int)), this, SLOT(onConnectionOffsetChanged(int))); + connect(connection_edit_item, SIGNAL(connectionItemSelected(ConnectionPixmapItem*)), this, SLOT(onConnectionItemSelected(ConnectionPixmapItem*))); + connection_edit_items.append(connection_edit_item); +} + void Editor::displayMapBorder() { QPixmap pixmap = map->renderBorder(); for (int y = -6; y < map->getHeight() + 6; y += 2) @@ -465,13 +474,7 @@ void Editor::updateConnectionMap(QString mapName, QString direction) { return; if (mapName.isEmpty()) { - map->connections.removeOne(current_connection_edit_item->connection); - connection_edit_items.removeOne(current_connection_edit_item); - scene->removeItem(current_connection_edit_item); - delete current_connection_edit_item; - current_connection_edit_item = NULL; - setConnectionEditControlsEnabled(false); - ui->spinBox_ConnectionOffset->setValue(0); + removeCurrentConnection(); return; } else { setConnectionEditControlsEnabled(true); @@ -481,6 +484,49 @@ void Editor::updateConnectionMap(QString mapName, QString direction) { setCurrentConnectionDirection(direction); } +void Editor::addNewConnection() { + // Find direction with least number of connections. + QMap directionCounts = QMap({{"up", 0}, {"right", 0}, {"down", 0}, {"left", 0}}); + for (Connection* connection : map->connections) { + directionCounts[connection->direction]++; + } + QString minDirection = "up"; + int minCount = INT_MAX; + for (QString direction : directionCounts.keys()) { + if (directionCounts[direction] < minCount) { + minDirection = direction; + minCount = directionCounts[direction]; + } + } + + Connection* newConnection = new Connection; + newConnection->direction = minDirection; + newConnection->offset = "0"; + newConnection->map_name = project->mapNames->first(); + map->connections.append(newConnection); + createConnectionItem(newConnection, true); + onConnectionItemSelected(connection_edit_items.last()); + ui->label_NumConnections->setText(QString::number(map->connections.length())); +} + +void Editor::removeCurrentConnection() { + if (!current_connection_edit_item) + return; + + map->connections.removeOne(current_connection_edit_item->connection); + connection_edit_items.removeOne(current_connection_edit_item); + scene->removeItem(current_connection_edit_item); + delete current_connection_edit_item; + current_connection_edit_item = NULL; + setConnectionEditControlsEnabled(false); + ui->spinBox_ConnectionOffset->setValue(0); + ui->label_NumConnections->setText(QString::number(map->connections.length())); + + if (connection_edit_items.length() > 0) { + onConnectionItemSelected(connection_edit_items.last()); + } +} + void MetatilesPixmapItem::paintTileChanged(Map *map) { draw(); } diff --git a/editor.h b/editor.h index 60a91d64..590d3bcf 100755 --- a/editor.h +++ b/editor.h @@ -51,6 +51,8 @@ public: void setConnectionsVisibility(bool visible); void updateConnectionOffset(int offset); void updateConnectionMap(QString mapName, QString direction); + void addNewConnection(); + void removeCurrentConnection(); DraggablePixmapItem *addMapObject(Event *event); void selectMapObject(DraggablePixmapItem *object); @@ -92,6 +94,7 @@ private: void setBorderItemsVisible(bool, qreal = 1); void setConnectionEditControlValues(Connection*); void setConnectionEditControlsEnabled(bool); + void createConnectionItem(Connection* connection, bool hide); private slots: void mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item); diff --git a/mainwindow.cpp b/mainwindow.cpp index 7ebc21d8..8bd0dd4b 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -780,3 +780,13 @@ void MainWindow::on_comboBox_ConnectedMap_currentTextChanged(const QString &mapN { editor->updateConnectionMap(mapName, ui->comboBox_ConnectionDirection->currentText().toLower()); } + +void MainWindow::on_pushButton_AddConnection_clicked() +{ + editor->addNewConnection(); +} + +void MainWindow::on_pushButton_RemoveConnection_clicked() +{ + editor->removeCurrentConnection(); +} diff --git a/mainwindow.h b/mainwindow.h index fd72b873..3f6c84d8 100755 --- a/mainwindow.h +++ b/mainwindow.h @@ -80,6 +80,10 @@ private slots: void on_comboBox_ConnectedMap_currentTextChanged(const QString &mapName); + void on_pushButton_AddConnection_clicked(); + + void on_pushButton_RemoveConnection_clicked(); + private: Ui::MainWindow *ui; QStandardItemModel *mapListModel; diff --git a/mainwindow.ui b/mainwindow.ui index ff6aef82..c2269b6b 100755 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -60,7 +60,7 @@ - 0 + 3 false @@ -1246,7 +1246,7 @@ 0 - + @@ -1369,7 +1369,7 @@ - + QFrame::StyledPanel @@ -1410,7 +1410,7 @@ 0 0 826 - 621 + 587 @@ -1486,6 +1486,102 @@ + + + + + 0 + 0 + + + + + 0 + 32 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 4 + + + 4 + + + 4 + + + 4 + + + 4 + + + + + + 0 + 0 + + + + + + + + :/icons/add.ico + + + + + + + + + + + + :/icons/delete.ico + + + + + + + + Number of Connections: + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + +