From 53605cd996338dafc507d4126a2a49b865b04db1 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Sun, 10 Feb 2019 20:41:14 +0100 Subject: Memory QTableView working for part of the memory range. Unfortunately, QModelIndex supports only integers for rows and columns. Even if only size to maxint is used then Qt engine crashes. Workaround for Qt limitations is material for followup patches. Signed-off-by: Pavel Pisa --- qtmips_gui/memorydock.cpp | 3 +++ qtmips_gui/memorydock.h | 1 - qtmips_gui/memorymodel.cpp | 29 ++++++++++++++++++++++++++--- qtmips_gui/memorymodel.h | 11 +++++++++++ qtmips_gui/memorytableview.cpp | 12 ++++++++++-- qtmips_gui/memorytableview.h | 4 ++++ 6 files changed, 54 insertions(+), 6 deletions(-) diff --git a/qtmips_gui/memorydock.cpp b/qtmips_gui/memorydock.cpp index 53cc2e0..856dfa2 100644 --- a/qtmips_gui/memorydock.cpp +++ b/qtmips_gui/memorydock.cpp @@ -41,6 +41,7 @@ #include #include #include "memorydock.h" +#include "memorymodel.h" #include "memorytableview.h" @@ -81,6 +82,8 @@ MemoryDock::MemoryDock(QWidget *parent, QSettings *settings) : QDockWidget(paren connect(this, &MemoryDock::machine_setup, memory_model, &MemoryModel::setup); connect(cell_size, QOverload::of(&QComboBox::currentIndexChanged), memory_model, &MemoryModel::set_cell_size); + connect(memory_model, SIGNAL(cell_size_changed()), + memory_content, SLOT(adap_to_cell_size())); } void MemoryDock::setup(machine::QtMipsMachine *machine) { diff --git a/qtmips_gui/memorydock.h b/qtmips_gui/memorydock.h index 2b34b8c..81797a7 100644 --- a/qtmips_gui/memorydock.h +++ b/qtmips_gui/memorydock.h @@ -39,7 +39,6 @@ #include #include #include -#include "memorymodel.h" #include "qtmipsmachine.h" class MemoryDock : public QDockWidget { diff --git a/qtmips_gui/memorymodel.cpp b/qtmips_gui/memorymodel.cpp index 65ee586..13ae1c7 100644 --- a/qtmips_gui/memorymodel.cpp +++ b/qtmips_gui/memorymodel.cpp @@ -42,10 +42,12 @@ MemoryModel::MemoryModel(QObject *parent) index0_offset = 0; data_font.setStyleHint(QFont::TypeWriter); machine = nullptr; + memory_change_counter = 0; + cache_data_change_counter = 0; } int MemoryModel::rowCount(const QModelIndex & /*parent*/) const { - std::uint64_t rows = (0x100 + cells_per_row - 1) / cells_per_row; + std::uint64_t rows = (0x2000 + cells_per_row - 1) / cells_per_row; return rows; } @@ -76,8 +78,7 @@ QVariant MemoryModel::data(const QModelIndex &index, int role) const { QString s, t; std::uint32_t address; std::uint32_t data; - address = index0_offset + (index.row() * cells_per_row * cellSizeBytes()); - if (address < index0_offset) + if (!get_row_address(address, index.row())) return QString(""); if (index.column() == 0) { t = QString::number(address, 16); @@ -124,6 +125,8 @@ QVariant MemoryModel::data(const QModelIndex &index, int role) const { void MemoryModel::setup(machine::QtMipsMachine *machine) { this->machine = machine; + if (machine != nullptr) + connect(machine, SIGNAL(post_tick()), this, SLOT(check_for_updates())); } void MemoryModel::setCellsPerRow(unsigned int cells) { @@ -135,5 +138,25 @@ void MemoryModel::setCellsPerRow(unsigned int cells) { void MemoryModel::set_cell_size(int index) { beginResetModel(); cell_size = (enum MemoryCellSize)index; + index0_offset -= index0_offset % cellSizeBytes(); endResetModel(); + emit cell_size_changed(); +} + +void MemoryModel::check_for_updates() { + bool need_update = false; + if (machine == nullptr) + return; + if (machine->memory() == nullptr) + return; + + if (memory_change_counter != machine->memory()->get_change_counter()) + need_update = true; + if (machine->cache_data() != nullptr) { + if (cache_data_change_counter != machine->cache_data()->get_change_counter()) + need_update = true; + } + if (!need_update) + return; + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); } diff --git a/qtmips_gui/memorymodel.h b/qtmips_gui/memorymodel.h index bbe51c5..e85d476 100644 --- a/qtmips_gui/memorymodel.h +++ b/qtmips_gui/memorymodel.h @@ -79,9 +79,18 @@ public: } return 0; } + inline bool get_row_address(std::uint32_t &address, int row) const { + address = index0_offset + (row * cells_per_row * cellSizeBytes()); + return address >= index0_offset; + } + public slots: void setup(machine::QtMipsMachine *machine); void set_cell_size(int index); + void check_for_updates(); + +signals: + void cell_size_changed(); private: enum MemoryCellSize cell_size; @@ -89,6 +98,8 @@ private: std::uint32_t index0_offset; QFont data_font; machine::QtMipsMachine *machine; + std::uint32_t memory_change_counter; + std::uint32_t cache_data_change_counter; }; diff --git a/qtmips_gui/memorytableview.cpp b/qtmips_gui/memorytableview.cpp index 8435e35..9b5cddf 100644 --- a/qtmips_gui/memorytableview.cpp +++ b/qtmips_gui/memorytableview.cpp @@ -42,8 +42,7 @@ MemoryTableView::MemoryTableView(QWidget *parent) : Super(parent) { } -void MemoryTableView::resizeEvent(QResizeEvent *event) { - Super::resizeEvent(event); +void MemoryTableView::adjustColumnCount() { MemoryModel *m = dynamic_cast(model()); if (horizontalHeader()->count() >= 2 && m != nullptr) { @@ -77,3 +76,12 @@ void MemoryTableView::resizeEvent(QResizeEvent *event) { } } } + +void MemoryTableView::adap_to_cell_size() { + adjustColumnCount(); +} + +void MemoryTableView::resizeEvent(QResizeEvent *event) { + Super::resizeEvent(event); + adjustColumnCount(); +} diff --git a/qtmips_gui/memorytableview.h b/qtmips_gui/memorytableview.h index 2017b78..73b1ea9 100644 --- a/qtmips_gui/memorytableview.h +++ b/qtmips_gui/memorytableview.h @@ -51,7 +51,11 @@ public: void resizeEvent(QResizeEvent *event) override; +public slots: + void adap_to_cell_size(); + private: + void adjustColumnCount(); }; -- cgit v1.2.3