aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2019-02-10 20:41:14 +0100
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2019-02-10 20:41:14 +0100
commit53605cd996338dafc507d4126a2a49b865b04db1 (patch)
tree82b03aed3c3c022c34416343e0cbef4287d24c34
parent2fdc9e0e64c234832e13735a9e6972a699ed9bed (diff)
downloadqtmips-53605cd996338dafc507d4126a2a49b865b04db1.tar.gz
qtmips-53605cd996338dafc507d4126a2a49b865b04db1.tar.bz2
qtmips-53605cd996338dafc507d4126a2a49b865b04db1.zip
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 <pisa@cmp.felk.cvut.cz>
-rw-r--r--qtmips_gui/memorydock.cpp3
-rw-r--r--qtmips_gui/memorydock.h1
-rw-r--r--qtmips_gui/memorymodel.cpp29
-rw-r--r--qtmips_gui/memorymodel.h11
-rw-r--r--qtmips_gui/memorytableview.cpp12
-rw-r--r--qtmips_gui/memorytableview.h4
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 <QLineEdit>
#include <QHeaderView>
#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<int>::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 <QDockWidget>
#include <QLabel>
#include <QComboBox>
-#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<MemoryModel*>(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();
};