#include "mainwindow.h" #include "ui_mainwindow.h" #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QAction *actionLoad = new QAction(tr("Load"), this); ui->menuLoad->addAction(actionLoad); connect(actionLoad, &QAction::triggered, this, &MainWindow::onLoadTriggered); connect(ui->runButton, &QPushButton::clicked, this, &MainWindow::on_runButton_clicked); // nastavi tabelo const int columns = 16; int memSize = machine.getMemSize(); // ali fiksno (npr. 1000000), če še ni naloženo int rows = (memSize + columns - 1) / columns; ui->tableWidget->setColumnCount(columns); ui->tableWidget->setRowCount(rows); // Nastavi naslove stolpcev QStringList headers; for (int c = 0; c < columns; ++c) { headers << QString("%1").arg(c, 2, 16, QChar('0')).toUpper(); } ui->tableWidget->setHorizontalHeaderLabels(headers); // Nastavi naslove vrstic v heks formatu QStringList verticalHeaders; for (int r = 0; r < rows; ++r) { verticalHeaders << QString("%1").arg(r * columns, 4, 16, QChar('0')).toUpper(); } ui->tableWidget->setVerticalHeaderLabels(verticalHeaders); // Nastavi fiksno širino stolpcev (ali prilagodi po potrebi) int columnWidth = 30; for (int c = 0; c < columns; ++c) { ui->tableWidget->setColumnWidth(c, columnWidth); } // Nastavi politiko velikosti ui->tableWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_readButton_clicked() { bool ok; unsigned int addr = ui->addressLineEdit->text().toUInt(&ok); if (!ok) { QMessageBox::warning(this, "Napaka", "Neveljaven naslov!"); return; } try { unsigned char val = machine.readByte(addr); ui->valueLabel->setText(QString::number(val)); } catch (const std::out_of_range &e) { QMessageBox::warning(this, "Napaka", "Naslov je izven meje pomnilnika!"); } } void MainWindow::on_runButton_clicked() { executor.start(); } void populateMemoryTable(QTableWidget* tableWidget, Machine& machine) { const int columns = 16; int memSize = machine.getMemSize(); for (int r = 0; r < tableWidget->rowCount(); ++r) { for (int c = 0; c < columns; ++c) { int addr = r * columns + c; if (addr < memSize) { unsigned char val = machine.readByte(addr); QString hexVal = QString("%1").arg(val, 2, 16, QChar('0')).toUpper(); // Posodobi ali ustvari nov element if (tableWidget->item(r, c)) { tableWidget->item(r, c)->setText(hexVal); } else { tableWidget->setItem(r, c, new QTableWidgetItem(hexVal)); } } } } } void MainWindow::onLoadTriggered() { QString filename = QFileDialog::getOpenFileName(this, tr("Open Object File"), "", tr("Object Files (*.obj)")); if (!filename.isEmpty()) { bool ok = loader.loadObj(machine, filename.toStdString()); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Failed to load file")); } } populateMemoryTable(ui->tableWidget, machine); ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); ui->tableWidget->horizontalHeader()->setDefaultSectionSize(30); }