From af36c115dcb8dc1601216fbe14bee58191ba47df Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Fri, 16 Aug 2024 18:26:43 +0200 Subject: [PATCH] client: fix TableModel Region - Use `uint32_t` as done in server representation - Use rowMin = 1 and rowMax = 0 to represent empty model This is because we cannot set negative values so setting to zero would make empty model and single row models indistinguishable. --- client/src/network/connection.cpp | 2 +- client/src/network/connection.hpp | 2 +- client/src/network/tablemodel.cpp | 2 +- client/src/network/tablemodel.hpp | 10 +++++----- client/src/widget/tablewidget.cpp | 22 +++++++++++++++++----- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/client/src/network/connection.cpp b/client/src/network/connection.cpp index 8ea5392a..6e29eb4d 100644 --- a/client/src/network/connection.cpp +++ b/client/src/network/connection.cpp @@ -425,7 +425,7 @@ void Connection::releaseTableModel(TableModel* tableModel) tableModel->m_handle = invalidHandle; } -void Connection::setTableModelRegion(TableModel* tableModel, int columnMin, int columnMax, int rowMin, int rowMax) +void Connection::setTableModelRegion(TableModel* tableModel, uint32_t columnMin, uint32_t columnMax, uint32_t rowMin, uint32_t rowMax) { auto event = Message::newEvent(Message::Command::TableModelSetRegion); event->write(tableModel->handle()); diff --git a/client/src/network/connection.hpp b/client/src/network/connection.hpp index be417df8..816c011d 100644 --- a/client/src/network/connection.hpp +++ b/client/src/network/connection.hpp @@ -152,7 +152,7 @@ class Connection : public QObject, public std::enable_shared_from_this)> callback); void releaseTableModel(TableModel* tableModel); - void setTableModelRegion(TableModel* tableModel, int columnMin, int columnMax, int rowMin, int rowMax); + void setTableModelRegion(TableModel* tableModel, uint32_t columnMin, uint32_t columnMax, uint32_t rowMin, uint32_t rowMax); [[nodiscard]] int getTileData(Board& object); diff --git a/client/src/network/tablemodel.cpp b/client/src/network/tablemodel.cpp index 250d06b7..1aa89664 100644 --- a/client/src/network/tablemodel.cpp +++ b/client/src/network/tablemodel.cpp @@ -72,7 +72,7 @@ QString TableModel::getValue(int column, int row) const return m_texts.value(ColumnRow(column, row)); } -void TableModel::setRegion(int columnMin, int columnMax, int rowMin, int rowMax) +void TableModel::setRegion(uint32_t columnMin, uint32_t columnMax, uint32_t rowMin, uint32_t rowMax) { if(m_region.columnMin != columnMin || m_region.columnMax != columnMax || diff --git a/client/src/network/tablemodel.hpp b/client/src/network/tablemodel.hpp index 807f60fd..641ad6cc 100644 --- a/client/src/network/tablemodel.hpp +++ b/client/src/network/tablemodel.hpp @@ -45,10 +45,10 @@ class TableModel final : public QAbstractTableModel int m_rowCount; struct Region { - int rowMin = 0; - int rowMax = -1; - int columnMin = 0; - int columnMax = -1; + uint32_t rowMin = 0; + uint32_t rowMax = -1; + uint32_t columnMin = 0; + uint32_t columnMax = -1; } m_region; QMap m_texts; @@ -71,7 +71,7 @@ class TableModel final : public QAbstractTableModel QString getRowObjectId(int row) const; QString getValue(int column, int row) const; - void setRegion(int columnMin, int columnMax, int rowMin, int rowMax); + void setRegion(uint32_t columnMin, uint32_t columnMax, uint32_t rowMin, uint32_t rowMax); }; #endif diff --git a/client/src/widget/tablewidget.cpp b/client/src/widget/tablewidget.cpp index b67da43b..f9d81d9a 100644 --- a/client/src/widget/tablewidget.cpp +++ b/client/src/widget/tablewidget.cpp @@ -93,27 +93,39 @@ void TableWidget::updateRegion() const int columnCount = m_model->columnCount(); const int rowCount = m_model->rowCount(); - if(columnCount == 0 || rowCount == 0) - return; - const QRect r = viewport()->rect(); const QModelIndex topLeft = indexAt(r.topLeft()); int rowMin = qMax(topLeft.row(), 0); int rowMax = indexAt(r.bottomLeft()).row(); - if(rowMax == -1) + + if(rowCount == 0) + { + // Invalid region to represent empty model + rowMin = 1; + rowMax = 0; + } + else if(rowMax == -1) rowMax = rowCount - 1; else rowMax = qMin(rowMax + 1, rowCount - 1); int columnMin = qMax(topLeft.column(), 0); int columnMax = indexAt(r.topRight()).column(); + + if(columnCount == 0) + { + // Invalid region to represent empty model + columnMin = 1; + columnMax = 0; + } if(columnMax == -1) columnMax = columnCount - 1; else columnMax = qMin(columnMax + 1, columnCount - 1); - m_model->setRegion(columnMin, columnMax, rowMin, rowMax); + m_model->setRegion(uint32_t(columnMin), uint32_t(columnMax), + uint32_t(rowMin), uint32_t(rowMax)); } void TableWidget::mouseMoveEvent(QMouseEvent* event)