Sync changes between connection list and map

This commit is contained in:
GriffinR 2024-07-02 14:05:54 -04:00
parent 1f78fb9c4f
commit 367198f98f
6 changed files with 118 additions and 109 deletions

View file

@ -57,7 +57,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="2"> <item row="3" column="2">
<widget class="QToolButton" name="toolButton_Delete"> <widget class="QToolButton" name="button_Delete">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>

View file

@ -77,7 +77,7 @@ public:
void setConnectionsVisibility(bool visible); void setConnectionsVisibility(bool visible);
void updateConnectionOffset(int offset); void updateConnectionOffset(int offset);
void addNewConnection(); void addNewConnection();
void removeCurrentConnection(); void removeConnection(ConnectionPixmapItem* connectionItem);
void addNewWildMonGroup(QWidget *window); void addNewWildMonGroup(QWidget *window);
void deleteWildMonGroup(); void deleteWildMonGroup();
void updateDiveMap(QString mapName); void updateDiveMap(QString mapName);
@ -168,10 +168,11 @@ private:
void setConnectionItemsVisible(bool); void setConnectionItemsVisible(bool);
void setBorderItemsVisible(bool, qreal = 1); void setBorderItemsVisible(bool, qreal = 1);
void setConnectionsEditable(bool); void setConnectionsEditable(bool);
QPoint calculateConnectionPosition(const MapConnection *connection, const QPixmap &pixmap);
void redrawConnection(ConnectionPixmapItem* connectionItem); void redrawConnection(ConnectionPixmapItem* connectionItem);
void createConnectionItem(MapConnection* connection); void createConnectionItem(MapConnection* connection);
void populateConnectionsList(); void populateConnectionsList();
void addConnectionToList(const MapConnection * connection); void addConnectionToList(ConnectionPixmapItem* connection);
void updateDiveEmergeMap(QString mapName, QString direction); void updateDiveEmergeMap(QString mapName, QString direction);
void onConnectionOffsetChanged(int newOffset); void onConnectionOffsetChanged(int newOffset);
void removeMirroredConnection(MapConnection*); void removeMirroredConnection(MapConnection*);

View file

@ -8,9 +8,11 @@
class ConnectionPixmapItem : public QObject, public QGraphicsPixmapItem { class ConnectionPixmapItem : public QObject, public QGraphicsPixmapItem {
Q_OBJECT Q_OBJECT
public: public:
ConnectionPixmapItem(QPixmap pixmap, MapConnection* connection, int x, int y, int baseMapWidth, int baseMapHeight): QGraphicsPixmapItem(pixmap) { ConnectionPixmapItem(QPixmap pixmap, MapConnection* connection, int x, int y, int baseMapWidth, int baseMapHeight)
: QGraphicsPixmapItem(pixmap),
connection(connection)
{
this->basePixmap = pixmap; this->basePixmap = pixmap;
this->connection = connection;
setFlag(ItemIsMovable); setFlag(ItemIsMovable);
setFlag(ItemSendsGeometryChanges); setFlag(ItemSendsGeometryChanges);
this->initialX = x; this->initialX = x;
@ -20,7 +22,7 @@ public:
this->baseMapHeight = baseMapHeight; this->baseMapHeight = baseMapHeight;
} }
QPixmap basePixmap; QPixmap basePixmap;
MapConnection* connection; MapConnection* const connection;
int initialX; int initialX;
int initialY; int initialY;
int initialOffset; int initialOffset;

View file

@ -9,18 +9,27 @@ namespace Ui {
class ConnectionsListItem; class ConnectionsListItem;
} }
// We show the data for each map connection in the panel on the right side of the Connections tab.
// An instance of this class is used for each item in that list.
// It communicates with the ConnectionPixmapItem on the map through a shared MapConnection pointer,
// and the two classes should signal one another when they change this data.
class ConnectionsListItem : public QFrame class ConnectionsListItem : public QFrame
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ConnectionsListItem(QWidget *parent, const QStringList &mapNames); explicit ConnectionsListItem(QWidget *parent, MapConnection * connection, const QStringList &mapNames);
~ConnectionsListItem(); ~ConnectionsListItem();
void populate(const MapConnection * connection); void updateUI();
public: private:
Ui::ConnectionsListItem *ui; Ui::ConnectionsListItem *ui;
MapConnection * const connection;
signals:
void edited();
void deleted();
private slots: private slots:
void on_comboBox_Direction_currentTextChanged(const QString &direction); void on_comboBox_Direction_currentTextChanged(const QString &direction);

View file

@ -759,14 +759,49 @@ void Editor::populateConnectionsList() {
w->deleteLater(); w->deleteLater();
for (auto item :connection_items) for (auto item :connection_items)
addConnectionToList(item->connection); addConnectionToList(item);
} }
// TODO: Don't allow splitter resizing to shrink list items to the point where horizontal scroll is needed // TODO: Don't allow splitter resizing to shrink list items to the point where horizontal scroll is needed
void Editor::addConnectionToList(const MapConnection * connection) { void Editor::addConnectionToList(ConnectionPixmapItem * connectionItem) {
ConnectionsListItem *listItem = new ConnectionsListItem(ui->scrollAreaContents_ConnectionsList, project->mapNames); ConnectionsListItem *listItem = new ConnectionsListItem(ui->scrollAreaContents_ConnectionsList, connectionItem->connection, project->mapNames);
listItem->populate(connection);
ui->layout_ConnectionsList->insertWidget(ui->layout_ConnectionsList->count() - 1, listItem); // Insert above the vertical spacer ui->layout_ConnectionsList->insertWidget(ui->layout_ConnectionsList->count() - 1, listItem); // Insert above the vertical spacer
connect(connectionItem, &ConnectionPixmapItem::connectionMoved, listItem, &ConnectionsListItem::updateUI);
// TODO: This is probably slower than necessary (we don't need a full redraw if we're just moving it)
// TODO: Handle mirroring
connect(listItem, &ConnectionsListItem::edited, [this, connectionItem] {
redrawConnection(connectionItem);
emit editedMapData();
});
connect(listItem, &ConnectionsListItem::deleted, [this, connectionItem] {
removeConnection(connectionItem);
});
}
// TODO: Connect to Delete key for selected connection
void Editor::removeConnection(ConnectionPixmapItem* connectionItem) {
if (!connectionItem)
return;
map->connections.removeOne(connectionItem->connection);
connection_items.removeOne(connectionItem);
//removeMirroredConnection(connectionItem->connection); // TODO
if (connectionItem->scene())
connectionItem->scene()->removeItem(connectionItem);
if (connectionItem == selected_connection_item) {
selected_connection_item = nullptr;
if (!connection_items.isEmpty())
onConnectionItemSelected(connection_items.first());
}
delete connectionItem->connection;
delete connectionItem;
emit editedMapData();
} }
void Editor::setConnectionItemsVisible(bool visible) { void Editor::setConnectionItemsVisible(bool visible) {
@ -783,6 +818,25 @@ void Editor::setBorderItemsVisible(bool visible, qreal opacity) {
} }
} }
QPoint Editor::calculateConnectionPosition(const MapConnection *connection, const QPixmap &pixmap) {
int x = 0, y = 0;
const int mWidth = 16, mHeight = 16;
if (connection->direction == "up") {
x = connection->offset * mWidth;
y = -pixmap.height();
} else if (connection->direction == "down") {
x = connection->offset * mWidth;
y = map->getHeight() * mHeight;
} else if (connection->direction == "left") {
x = -pixmap.width();
y = connection->offset * mHeight;
} else if (connection->direction == "right") {
x = map->getWidth() * mWidth;
y = connection->offset * mHeight;
}
return QPoint(x, y);
}
void Editor::redrawConnection(ConnectionPixmapItem* connectionItem) { void Editor::redrawConnection(ConnectionPixmapItem* connectionItem) {
if (!connectionItem || !connectionItem->connection) if (!connectionItem || !connectionItem->connection)
return; return;
@ -802,25 +856,9 @@ void Editor::redrawConnection(ConnectionPixmapItem* connectionItem) {
return; return;
QPixmap pixmap = connectedMap->renderConnection(*connectionItem->connection, map->layout); QPixmap pixmap = connectedMap->renderConnection(*connectionItem->connection, map->layout);
connectionItem->initialOffset = connectionItem->connection->offset;
int offset = connectionItem->connection->offset;
connectionItem->initialOffset = offset;
int x = 0, y = 0;
if (connectionItem->connection->direction == "up") {
x = offset * 16;
y = -pixmap.height();
} else if (connectionItem->connection->direction == "down") {
x = offset * 16;
y = map->getHeight() * 16;
} else if (connectionItem->connection->direction == "left") {
x = -pixmap.width();
y = offset * 16;
} else if (connectionItem->connection->direction == "right") {
x = map->getWidth() * 16;
y = offset * 16;
}
connectionItem->basePixmap = pixmap; connectionItem->basePixmap = pixmap;
QPoint pos = calculateConnectionPosition(connectionItem->connection, pixmap);
if (connectionItem == selected_connection_item) { if (connectionItem == selected_connection_item) {
QPainter painter(&pixmap); QPainter painter(&pixmap);
@ -829,11 +867,11 @@ void Editor::redrawConnection(ConnectionPixmapItem* connectionItem) {
painter.end(); painter.end();
} }
connectionItem->setPixmap(pixmap); connectionItem->setPixmap(pixmap);
connectionItem->initialX = x; connectionItem->initialX = pos.x();
connectionItem->initialY = y; connectionItem->initialY = pos.y();
connectionItem->blockSignals(true); connectionItem->blockSignals(true);
connectionItem->setX(x); connectionItem->setX(pos.x());
connectionItem->setY(y); connectionItem->setY(pos.y());
connectionItem->setZValue(-1); connectionItem->setZValue(-1);
connectionItem->blockSignals(false); connectionItem->blockSignals(false);
@ -843,7 +881,7 @@ void Editor::redrawConnection(ConnectionPixmapItem* connectionItem) {
maskNonVisibleConnectionTiles(); maskNonVisibleConnectionTiles();
} }
// TODO: Generalize // TODO: Generalize, maybe use in addConnectionToList connection instead of full render
void Editor::updateConnectionOffset(int offset) { void Editor::updateConnectionOffset(int offset) {
if (!selected_connection_item) if (!selected_connection_item)
return; return;
@ -864,10 +902,9 @@ void Editor::onConnectionMoved(MapConnection* connection) {
// TODO: // TODO:
//updateMirroredConnectionOffset(connection); //updateMirroredConnectionOffset(connection);
// TODO: Sync change to correct offset spin box
// TODO: This is likely the source of the visual masking bug while dragging (this happens after the move) // TODO: This is likely the source of the visual masking bug while dragging (this happens after the move)
maskNonVisibleConnectionTiles(); maskNonVisibleConnectionTiles();
emit editedMapData();
} }
void Editor::setConnectionsEditable(bool editable) { void Editor::setConnectionsEditable(bool editable) {
@ -1559,30 +1596,18 @@ void Editor::createConnectionItem(MapConnection* connection) {
} }
QPixmap pixmap = connected_map->renderConnection(*connection, map->layout); QPixmap pixmap = connected_map->renderConnection(*connection, map->layout);
int offset = connection->offset; QPoint pos = calculateConnectionPosition(connection, pixmap);
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;
}
ConnectionPixmapItem *item = new ConnectionPixmapItem(pixmap, connection, x, y, map->getWidth(), map->getHeight()); ConnectionPixmapItem *item = new ConnectionPixmapItem(pixmap, connection, pos.x(), pos.y(), map->getWidth(), map->getHeight());
item->setX(x); item->setX(pos.x());
item->setY(y); item->setY(pos.y());
item->setZValue(-1); item->setZValue(-1);
scene->addItem(item); scene->addItem(item);
connect(item, &ConnectionPixmapItem::connectionMoved, this, &Editor::onConnectionMoved); connect(item, &ConnectionPixmapItem::connectionMoved, this, &Editor::onConnectionMoved);
connect(item, &ConnectionPixmapItem::connectionItemSelected, this, &Editor::onConnectionItemSelected); connect(item, &ConnectionPixmapItem::connectionItemSelected, this, &Editor::onConnectionItemSelected);
connect(item, &ConnectionPixmapItem::connectionItemDoubleClicked, this, &Editor::onConnectionItemDoubleClicked); connect(item, &ConnectionPixmapItem::connectionItemDoubleClicked, this, &Editor::onConnectionItemDoubleClicked);
connection_items.append(item); connection_items.append(item);
} }
@ -1728,7 +1753,7 @@ void Editor::addNewConnection() {
newConnection->map_name = defaultMapName; newConnection->map_name = defaultMapName;
map->connections.append(newConnection); map->connections.append(newConnection);
createConnectionItem(newConnection); createConnectionItem(newConnection);
addConnectionToList(newConnection); addConnectionToList(connection_items.last());
onConnectionItemSelected(connection_items.last()); onConnectionItemSelected(connection_items.last());
updateMirroredConnection(newConnection, newConnection->direction, newConnection->map_name); updateMirroredConnection(newConnection, newConnection->direction, newConnection->map_name);
@ -1795,27 +1820,6 @@ void Editor::updateMirroredConnection(MapConnection* connection, QString origina
mirrorConnection->offset = -connection->offset; mirrorConnection->offset = -connection->offset;
} }
void Editor::removeCurrentConnection() {
if (!selected_connection_item)
return;
map->connections.removeOne(selected_connection_item->connection);
connection_items.removeOne(selected_connection_item);
removeMirroredConnection(selected_connection_item->connection);
if (selected_connection_item && selected_connection_item->scene()) {
selected_connection_item->scene()->removeItem(selected_connection_item);
delete selected_connection_item;
}
selected_connection_item = nullptr;
//ui->spinBox_ConnectionOffset->setValue(0); // Connections TODO:
if (connection_items.length() > 0) {
onConnectionItemSelected(connection_items.last());
}
}
void Editor::updateDiveMap(QString mapName) { void Editor::updateDiveMap(QString mapName) {
updateDiveEmergeMap(mapName, "dive"); updateDiveEmergeMap(mapName, "dive");
} }

View file

@ -3,9 +3,10 @@
static const QStringList directions = {"up", "down", "left", "right"}; static const QStringList directions = {"up", "down", "left", "right"};
ConnectionsListItem::ConnectionsListItem(QWidget *parent, const QStringList &mapNames) : ConnectionsListItem::ConnectionsListItem(QWidget *parent, MapConnection * connection, const QStringList &mapNames) :
QFrame(parent), QFrame(parent),
ui(new Ui::ConnectionsListItem) ui(new Ui::ConnectionsListItem),
connection(connection)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -23,18 +24,7 @@ ConnectionsListItem::ConnectionsListItem(QWidget *parent, const QStringList &map
ui->spinBox_Offset->setMinimum(INT_MIN); ui->spinBox_Offset->setMinimum(INT_MIN);
ui->spinBox_Offset->setMaximum(INT_MAX); ui->spinBox_Offset->setMaximum(INT_MAX);
// TODO: this->updateUI();
//connect(ui->button_Delete, &QAbstractButton::clicked, [this](bool) { this->d;});
}
void ConnectionsListItem::populate(const MapConnection * connection) {
const QSignalBlocker blocker1(ui->comboBox_Direction);
const QSignalBlocker blocker2(ui->comboBox_Map);
const QSignalBlocker blocker3(ui->spinBox_Offset);
ui->comboBox_Direction->setTextItem(connection->direction);
ui->comboBox_Map->setTextItem(connection->map_name);
ui->spinBox_Offset->setValue(connection->offset);
} }
ConnectionsListItem::~ConnectionsListItem() ConnectionsListItem::~ConnectionsListItem()
@ -42,35 +32,38 @@ ConnectionsListItem::~ConnectionsListItem()
delete ui; delete ui;
} }
// TODO void ConnectionsListItem::updateUI() {
const QSignalBlocker blocker1(ui->comboBox_Direction);
const QSignalBlocker blocker2(ui->comboBox_Map);
const QSignalBlocker blocker3(ui->spinBox_Offset);
ui->comboBox_Direction->setTextItem(this->connection->direction);
ui->comboBox_Map->setTextItem(this->connection->map_name);
ui->spinBox_Offset->setValue(this->connection->offset);
}
void ConnectionsListItem::on_comboBox_Direction_currentTextChanged(const QString &direction) void ConnectionsListItem::on_comboBox_Direction_currentTextChanged(const QString &direction)
{ {
/*editor->updateCurrentConnectionDirection(direction); this->connection->direction = direction;
markMapEdited();*/ emit this->edited();
} }
// TODO
void ConnectionsListItem::on_comboBox_Map_currentTextChanged(const QString &mapName) void ConnectionsListItem::on_comboBox_Map_currentTextChanged(const QString &mapName)
{ {
/*if (mapName.isEmpty() || editor->project->mapNames.contains(mapName)) { if (ui->comboBox_Map->findText(mapName) >= 0) {
editor->setConnectionMap(mapName); this->connection->map_name = mapName;
markMapEdited(); emit this->edited();
}*/ }
} }
// TODO
void ConnectionsListItem::on_spinBox_Offset_valueChanged(int offset) void ConnectionsListItem::on_spinBox_Offset_valueChanged(int offset)
{ {
/*editor->updateConnectionOffset(offset); this->connection->offset = offset;
markMapEdited();*/ emit this->edited();
} }
// TODO
void ConnectionsListItem::on_button_Delete_clicked() void ConnectionsListItem::on_button_Delete_clicked()
{ {
/* this->deleteLater();
editor->removeCurrentConnection(); emit this->deleted();
markMapEdited();
*/
} }