mirror of
https://github.com/markdavidlong/AppleSAWS.git
synced 2024-06-17 22:29:32 +00:00
Updated catalogview with tooltips
This commit is contained in:
parent
c707b58f4a
commit
cbd6c53803
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
QT += core gui
|
QT += core gui
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ void ApplesoftFile::setData(QByteArray data)
|
||||||
quint8 addhi = m_data.at(1);
|
quint8 addhi = m_data.at(1);
|
||||||
m_length = addlo + (addhi * 256);
|
m_length = addlo + (addhi * 256);
|
||||||
m_data.remove(0,2);
|
m_data.remove(0,2);
|
||||||
|
m_data = m_data.left(m_length);
|
||||||
parse();
|
parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,8 +49,11 @@ void ApplesoftFile::parse(quint16 start_address)
|
||||||
|
|
||||||
m_data_end = idx;
|
m_data_end = idx;
|
||||||
|
|
||||||
if (idx < m_data.length()) {
|
// if (idx < m_data.length()) {
|
||||||
qDebug() << QString("%1 byte(s) unaccounted for.").arg(m_data.length() - idx);
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
|
|
||||||
QVector<ApplesoftLine> getLines() const { return m_lines; }
|
QVector<ApplesoftLine> getLines() const { return m_lines; }
|
||||||
|
|
||||||
|
quint16 length() const { return m_length; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parse(quint16 start_address = 0x0801);
|
void parse(quint16 start_address = 0x0801);
|
||||||
|
|
|
@ -7,16 +7,16 @@
|
||||||
QList<QStringList> Disassembler::disassemble(quint16 from, quint16 to) {
|
QList<QStringList> Disassembler::disassemble(quint16 from, quint16 to) {
|
||||||
QList<QStringList> retval;
|
QList<QStringList> retval;
|
||||||
|
|
||||||
// qDebug() << "From: " << from << " To: " << to;
|
|
||||||
|
|
||||||
quint16 next = 0;
|
quint16 next = 0;
|
||||||
for (int idx = from; idx <= to; )
|
for (int idx = from; idx <= to; )
|
||||||
{
|
{
|
||||||
QStringList line = disassembleOp(quint16(idx), &next);
|
QStringList line = disassembleOp(quint16(idx), &next);
|
||||||
retval.append(line);
|
retval.append(line);
|
||||||
// qDebug() << idx << line.join(" ");
|
|
||||||
idx = next ;
|
idx = next ;
|
||||||
if (idx > 0xffff || (next < from)) { qDebug() << "Breaking." ; break; }
|
if (idx > 0xffff || (next < from)) {
|
||||||
|
qDebug() << "Breaking.";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
#include "catalogwidget.h"
|
#include "catalogwidget.h"
|
||||||
#include "ui_catalogwidget.h"
|
#include "ui_catalogwidget.h"
|
||||||
#include "filedescriptiveentry.h"
|
#include "filedescriptiveentry.h"
|
||||||
|
#include "binaryfile.h"
|
||||||
|
#include "applesoftfile.h"
|
||||||
|
#include "genericfile.h"
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QAction>
|
||||||
|
|
||||||
CatalogWidget::CatalogWidget(QWidget *parent) :
|
CatalogWidget::CatalogWidget(QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
|
@ -13,6 +19,26 @@ CatalogWidget::CatalogWidget(QWidget *parent) :
|
||||||
connect(ui->catalog_list, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
|
connect(ui->catalog_list, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
|
||||||
SLOT(itemClicked(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()
|
CatalogWidget::~CatalogWidget()
|
||||||
|
@ -26,6 +52,43 @@ void CatalogWidget::prepForNewDisk(QString filename, DiskFile *disk)
|
||||||
m_diskname = filename;
|
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<BinaryFile*>(file)) {
|
||||||
|
BinaryFile *binfile = dynamic_cast<BinaryFile*>(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<ApplesoftFile*>(file)) {
|
||||||
|
ApplesoftFile *asfile = dynamic_cast<ApplesoftFile*>(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)
|
void CatalogWidget::processNewlyLoadedDisk(QString diskfilename, DiskFile *disk)
|
||||||
{
|
{
|
||||||
if (m_disk == 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 sizeStr = QString("%1").arg(size,5,10,QChar(' ')).toUpper();
|
||||||
QString text = QString("%1 %2 %3 %4").arg(locked?"*":" ").arg(sizeStr).arg(filetype).arg(filename);
|
QString text = QString("%1 %2 %3 %4").arg(locked?"*":" ").arg(sizeStr).arg(filetype).arg(filename);
|
||||||
QListWidgetItem *item = new QListWidgetItem(text);
|
QListWidgetItem *item = new QListWidgetItem(text);
|
||||||
|
item->setToolTip(createToolTip(fde));
|
||||||
item->setData(0x0100,idx);
|
item->setData(0x0100,idx);
|
||||||
ui->catalog_list->addItem(item);
|
ui->catalog_list->addItem(item);
|
||||||
QRect rect = fm->boundingRect(text);
|
QRect rect = fm->boundingRect(text);
|
||||||
|
@ -65,6 +129,8 @@ void CatalogWidget::unloadDisk(DiskFile *disk)
|
||||||
ui->volume_label->clear();
|
ui->volume_label->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CatalogWidget::itemClicked(QListWidgetItem *item)
|
void CatalogWidget::itemClicked(QListWidgetItem *item)
|
||||||
{
|
{
|
||||||
int idx = item->data(0x0100).toInt();
|
int idx = item->data(0x0100).toInt();
|
||||||
|
|
|
@ -25,10 +25,13 @@ public slots:
|
||||||
void processNewlyLoadedDisk(QString filename, DiskFile *disk);
|
void processNewlyLoadedDisk(QString filename, DiskFile *disk);
|
||||||
void unloadDisk(DiskFile *disk);
|
void unloadDisk(DiskFile *disk);
|
||||||
|
|
||||||
|
void showContextMenuForWidget(const QPoint &);
|
||||||
signals:
|
signals:
|
||||||
void newFileSelected(FileDescriptiveEntry *entry);
|
void newFileSelected(FileDescriptiveEntry *entry);
|
||||||
void itemSelected(DiskFile *disk, FileDescriptiveEntry fde);
|
void itemSelected(DiskFile *disk, FileDescriptiveEntry fde);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString createToolTip(FileDescriptiveEntry &fde);
|
||||||
private slots:
|
private slots:
|
||||||
void itemClicked(QListWidgetItem *item);
|
void itemClicked(QListWidgetItem *item);
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,14 @@ void MainWindow::openInHiresViewWidget(BinaryFile *file, QString filename) {
|
||||||
hvwma->setData(file->data());
|
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)
|
void MainWindow::handleDiskItemSelectedDefaultOpen(DiskFile *disk, FileDescriptiveEntry fde)
|
||||||
{
|
{
|
||||||
GenericFile *file = disk->getFile(fde);
|
GenericFile *file = disk->getFile(fde);
|
||||||
|
@ -104,19 +112,8 @@ void MainWindow::handleDiskItemSelectedDefaultOpen(DiskFile *disk, FileDescripti
|
||||||
}
|
}
|
||||||
else
|
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<ApplesoftFile *>(file))
|
else if (dynamic_cast<ApplesoftFile *>(file))
|
||||||
|
|
|
@ -36,6 +36,7 @@ signals:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void openInHiresViewWidget(BinaryFile *file, QString filename);
|
void openInHiresViewWidget(BinaryFile *file, QString filename);
|
||||||
|
void openInDisassemblerViewer(BinaryFile *file);
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ void DisassemblerViewer::setFile(BinaryFile *file) {
|
||||||
|
|
||||||
QByteArray joinedlines = qPrintable(formattedLines.join("\n"));
|
QByteArray joinedlines = qPrintable(formattedLines.join("\n"));
|
||||||
setData(joinedlines);
|
setData(joinedlines);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisassemblerViewer::setData(QByteArray data)
|
void DisassemblerViewer::setData(QByteArray data)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#include "hiresviewwidget.h"
|
#include "hiresviewwidget.h"
|
||||||
|
#include "binaryfile.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -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) {
|
void HiresViewWidget::setData(QByteArray data) {
|
||||||
qDebug() << "setData";
|
|
||||||
m_data = data;
|
m_data = data;
|
||||||
|
|
||||||
drawPixmap();
|
drawPixmap();
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef HIRESVIEWWIDGET_H
|
#ifndef HIRESVIEWWIDGET_H
|
||||||
#define HIRESVIEWWIDGET_H
|
#define HIRESVIEWWIDGET_H
|
||||||
|
|
||||||
|
#include "binaryfile.h"
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
@ -47,9 +49,11 @@ public:
|
||||||
|
|
||||||
static QBitArray byteToBits(quint8 byte);
|
static QBitArray byteToBits(quint8 byte);
|
||||||
void contextMenuEvent(QContextMenuEvent *);
|
void contextMenuEvent(QContextMenuEvent *);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
void setFile(BinaryFile *file);
|
||||||
void setData(QByteArray data);
|
void setData(QByteArray data);
|
||||||
void setMode(ViewMode);
|
void setMode(ViewMode);
|
||||||
|
|
||||||
|
@ -84,6 +88,8 @@ private:
|
||||||
bool m_showScanLines;
|
bool m_showScanLines;
|
||||||
|
|
||||||
void drawPixmap();
|
void drawPixmap();
|
||||||
|
|
||||||
|
BinaryFile *m_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user