diff --git a/AppleSAWS.pro b/AppleSAWS.pro index 33dc54b..128de8a 100644 --- a/AppleSAWS.pro +++ b/AppleSAWS.pro @@ -1,5 +1,6 @@ QT += core gui +CONFIG += c++11 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets diff --git a/src/applesoftfile/applesoftfile.cxx b/src/applesoftfile/applesoftfile.cxx index f1c1286..92fb210 100644 --- a/src/applesoftfile/applesoftfile.cxx +++ b/src/applesoftfile/applesoftfile.cxx @@ -17,6 +17,7 @@ void ApplesoftFile::setData(QByteArray data) quint8 addhi = m_data.at(1); m_length = addlo + (addhi * 256); m_data.remove(0,2); + m_data = m_data.left(m_length); parse(); } @@ -48,8 +49,11 @@ void ApplesoftFile::parse(quint16 start_address) m_data_end = idx; - if (idx < m_data.length()) { - qDebug() << QString("%1 byte(s) unaccounted for.").arg(m_data.length() - idx); +// if (idx < m_data.length()) { +// qDebug() << QString("%1 byte(s) unaccounted for.").arg(m_data.length() - idx); +// } + if (idx < m_length) { + qDebug() << QString("%1 byte(s) unaccounted for.").arg(m_length - idx); } } diff --git a/src/applesoftfile/applesoftfile.h b/src/applesoftfile/applesoftfile.h index 5f4480c..4c7f546 100644 --- a/src/applesoftfile/applesoftfile.h +++ b/src/applesoftfile/applesoftfile.h @@ -21,6 +21,7 @@ public: QVector getLines() const { return m_lines; } + quint16 length() const { return m_length; } private: void parse(quint16 start_address = 0x0801); diff --git a/src/binaryfile/disassembler.cxx b/src/binaryfile/disassembler.cxx index 7c7da87..f57e616 100644 --- a/src/binaryfile/disassembler.cxx +++ b/src/binaryfile/disassembler.cxx @@ -7,16 +7,16 @@ QList Disassembler::disassemble(quint16 from, quint16 to) { QList retval; - // qDebug() << "From: " << from << " To: " << to; - quint16 next = 0; for (int idx = from; idx <= to; ) { QStringList line = disassembleOp(quint16(idx), &next); retval.append(line); - // qDebug() << idx << line.join(" "); idx = next ; - if (idx > 0xffff || (next < from)) { qDebug() << "Breaking." ; break; } + if (idx > 0xffff || (next < from)) { + qDebug() << "Breaking."; + break; + } } return retval; diff --git a/src/ui/catalogwidget.cxx b/src/ui/catalogwidget.cxx index 00b4cda..565582a 100644 --- a/src/ui/catalogwidget.cxx +++ b/src/ui/catalogwidget.cxx @@ -1,7 +1,13 @@ #include "catalogwidget.h" #include "ui_catalogwidget.h" #include "filedescriptiveentry.h" +#include "binaryfile.h" +#include "applesoftfile.h" +#include "genericfile.h" #include +#include +#include +#include CatalogWidget::CatalogWidget(QWidget *parent) : QWidget(parent), @@ -13,6 +19,26 @@ CatalogWidget::CatalogWidget(QWidget *parent) : connect(ui->catalog_list, SIGNAL(itemDoubleClicked(QListWidgetItem*)), SLOT(itemClicked(QListWidgetItem*))); + ui->catalog_list->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->catalog_list, SIGNAL(customContextMenuRequested(const QPoint &)), + SLOT(showContextMenuForWidget(const QPoint &))); +} + +void CatalogWidget::showContextMenuForWidget(const QPoint &point) { + QListWidgetItem *selectedItem = ui->catalog_list->itemAt(point); + + QMenu contextMenu("Context menu",this); + QAction *viewAction = new QAction("View",this); + connect(viewAction, &QAction::triggered, + [=](){ this->itemClicked(selectedItem); viewAction->deleteLater();}); + contextMenu.addAction(viewAction); + + QAction *viewWithAction = new QAction("View With...",this); + connect(viewWithAction, &QAction::triggered, + [=](){ this->itemClicked(selectedItem); viewWithAction->deleteLater();}); + contextMenu.addAction(viewWithAction); + + contextMenu.exec(mapToGlobal(point)); } CatalogWidget::~CatalogWidget() @@ -26,6 +52,43 @@ void CatalogWidget::prepForNewDisk(QString filename, DiskFile *disk) m_diskname = filename; } +QString CatalogWidget::createToolTip(FileDescriptiveEntry &fde) { + QString retval; + + retval += AppleString(fde.filename).printable().trimmed() + "\n"; + retval += QString("Type: %1\n").arg(fde.fileType()); + retval += QString("Sectors: %1 (%2 bytes)\n").arg(fde.lengthInSectors).arg(fde.lengthInSectors*256); + retval += QString("%1\n").arg(fde.isLocked()?"Locked":"Unlocked"); + + GenericFile *file = m_disk->getFile(fde); + + if (dynamic_cast(file)) { + BinaryFile *binfile = dynamic_cast(file); + quint16 address = binfile->address(); + quint16 length = binfile->length(); + + retval += QString("Address: $%1 (%2)\n").arg((quint16) (address),4,16,QChar('0')) + .arg(address); + retval += QString("Length: $%1 (%2)\n").arg((quint16) (length),4,16,QChar('0')) + .arg(length); + } else if (dynamic_cast(file)) { + ApplesoftFile *asfile = dynamic_cast(file); + quint16 length = asfile->length(); + retval += QString("Length: $%1 (%2)\n").arg((quint16) (length),4,16,QChar('0')) + .arg(length); + quint16 uabytes = asfile->extraData().length(); + if (uabytes) { + retval += QString("Unaccounted Bytes: $%1 (%2)\n").arg((quint16) (uabytes),4,16,QChar('0')) + .arg(uabytes); + } + } else { + retval += QString("Data Length: $%1 (%2)\n").arg((quint16) (file->data().length()),4,16,QChar('0')) + .arg(file->data().length()); + } + + return retval; +} + void CatalogWidget::processNewlyLoadedDisk(QString diskfilename, DiskFile *disk) { if (m_disk == disk) { @@ -43,6 +106,7 @@ void CatalogWidget::processNewlyLoadedDisk(QString diskfilename, DiskFile *disk) QString sizeStr = QString("%1").arg(size,5,10,QChar(' ')).toUpper(); QString text = QString("%1 %2 %3 %4").arg(locked?"*":" ").arg(sizeStr).arg(filetype).arg(filename); QListWidgetItem *item = new QListWidgetItem(text); + item->setToolTip(createToolTip(fde)); item->setData(0x0100,idx); ui->catalog_list->addItem(item); QRect rect = fm->boundingRect(text); @@ -65,6 +129,8 @@ void CatalogWidget::unloadDisk(DiskFile *disk) ui->volume_label->clear(); } + + void CatalogWidget::itemClicked(QListWidgetItem *item) { int idx = item->data(0x0100).toInt(); diff --git a/src/ui/catalogwidget.h b/src/ui/catalogwidget.h index 22c6ea6..9eb1d42 100644 --- a/src/ui/catalogwidget.h +++ b/src/ui/catalogwidget.h @@ -25,10 +25,13 @@ public slots: void processNewlyLoadedDisk(QString filename, DiskFile *disk); void unloadDisk(DiskFile *disk); + void showContextMenuForWidget(const QPoint &); signals: void newFileSelected(FileDescriptiveEntry *entry); void itemSelected(DiskFile *disk, FileDescriptiveEntry fde); +protected: + QString createToolTip(FileDescriptiveEntry &fde); private slots: void itemClicked(QListWidgetItem *item); diff --git a/src/ui/mainwindow.cxx b/src/ui/mainwindow.cxx index 4183d82..5adda3b 100644 --- a/src/ui/mainwindow.cxx +++ b/src/ui/mainwindow.cxx @@ -90,6 +90,14 @@ void MainWindow::openInHiresViewWidget(BinaryFile *file, QString filename) { hvwma->setData(file->data()); } +void MainWindow::openInDisassemblerViewer(BinaryFile *file) { + DisassemblerViewer *hvwma = new DisassemblerViewer(0); + hvwma->show(); + hvwma->setFile(file); +} + + + void MainWindow::handleDiskItemSelectedDefaultOpen(DiskFile *disk, FileDescriptiveEntry fde) { GenericFile *file = disk->getFile(fde); @@ -104,19 +112,8 @@ void MainWindow::handleDiskItemSelectedDefaultOpen(DiskFile *disk, FileDescripti } else { - DisassemblerViewer *hvwma = new DisassemblerViewer(0); + openInDisassemblerViewer(binfile); - // QString title = QString("Image: %1").arg(AppleString(fde.filename).printable().trimmed()); - // hvwma->setWindowTitle(title); - - hvwma->show(); - hvwma->setFile(binfile); - -// quint16 address = binfile->address(); -// Memory mem; -// mem.addFile(binfile->data(), address); -// Disassembler dis(mem.values()); -// dis.disassemble(binfile->address(), binfile->address()+binfile->length()); } } else if (dynamic_cast(file)) diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index a478f0c..2b890e7 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -36,6 +36,7 @@ signals: protected: void openInHiresViewWidget(BinaryFile *file, QString filename); + void openInDisassemblerViewer(BinaryFile *file); private: Ui::MainWindow *ui; diff --git a/src/ui/viewers/disassemblerviewer.cpp b/src/ui/viewers/disassemblerviewer.cpp index 9e1d912..37a01d2 100644 --- a/src/ui/viewers/disassemblerviewer.cpp +++ b/src/ui/viewers/disassemblerviewer.cpp @@ -40,7 +40,6 @@ void DisassemblerViewer::setFile(BinaryFile *file) { QByteArray joinedlines = qPrintable(formattedLines.join("\n")); setData(joinedlines); - } void DisassemblerViewer::setData(QByteArray data) diff --git a/src/ui/viewers/hiresviewwidget.cxx b/src/ui/viewers/hiresviewwidget.cxx index f7746fe..caaf63f 100644 --- a/src/ui/viewers/hiresviewwidget.cxx +++ b/src/ui/viewers/hiresviewwidget.cxx @@ -1,4 +1,6 @@ #include "hiresviewwidget.h" +#include "binaryfile.h" + #include #include #include @@ -282,8 +284,17 @@ void HiresViewWidget::drawPixmap() { } } +void HiresViewWidget::setFile(BinaryFile *file) { + m_file = file; + + QString title = QString("Image: %1").arg(m_file->filename()); + setWindowTitle(title); + + setData(file->data()); + +} + void HiresViewWidget::setData(QByteArray data) { - qDebug() << "setData"; m_data = data; drawPixmap(); diff --git a/src/ui/viewers/hiresviewwidget.h b/src/ui/viewers/hiresviewwidget.h index f92ed4d..d1dcf00 100644 --- a/src/ui/viewers/hiresviewwidget.h +++ b/src/ui/viewers/hiresviewwidget.h @@ -1,6 +1,8 @@ #ifndef HIRESVIEWWIDGET_H #define HIRESVIEWWIDGET_H +#include "binaryfile.h" + #include #include #include @@ -47,9 +49,11 @@ public: static QBitArray byteToBits(quint8 byte); void contextMenuEvent(QContextMenuEvent *); + signals: public slots: + void setFile(BinaryFile *file); void setData(QByteArray data); void setMode(ViewMode); @@ -84,6 +88,8 @@ private: bool m_showScanLines; void drawPixmap(); + + BinaryFile *m_file; };