AppleSAWS/src/ui/viewers/viewerbase.cpp

236 lines
7.8 KiB
C++

/*****************************************************************************
* AppleSAWS - The Apple Software Analysis WorkShop *
* Copyright (C) 2015-2021 Mark D. Long *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
*****************************************************************************/
#include "viewerbase.h"
#include "ui_viewerbase.h"
#include "applesoftfileviewer.h"
#include "hexdumpviewer.h"
#include "texthexdumpviewer.h"
#include "charsetviewer.h"
#include "intbasicfile.h"
#include "intbasicfileviewer.h"
#include "hiresviewwidget.h"
#include "disassemblerviewer.h"
#include "textfile.h"
#include "mazeviewer.h"
#include <QCloseEvent>
#include <QToolBar>
#include <QComboBox>
#include <QLabel>
#include <QDebug>
#include <QScrollArea>
ViewerBase::ViewerBase(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ViewerBase)
{
setAttribute(Qt::WA_DeleteOnClose);
m_stack = new QStackedWidget(this);
ui->setupUi(this);
setCentralWidget(m_stack);
m_toolbar = new QToolBar(this);
addToolBar(m_toolbar);
QLabel *label = new QLabel("View With: ");
m_toolbar->addWidget(label);
m_viewercombo = new QComboBox(m_toolbar);
m_toolbar->addWidget(m_viewercombo);
m_optionMenu = new QMenu("&Viewer");
menuBar()->addMenu(m_optionMenu);
m_optionMenu->setEnabled(false);
}
ViewerBase::~ViewerBase()
{
emit viewerClosing(this);
delete ui;
}
void ViewerBase::setFile(GenericFile *file)
{
m_file = file;
QString descriptor;
int defaultViewerDescriptor;
QString hexdumpviewerstring = "Hex Dump Viewer";
QString applesoftviewerstring = "Applesoft File Viewer";
QString intbasicfileviewerstring = "Integer Basic File Viewer";
QString hrcgcharsetviewerstring = "HRCG Character Set Viewer";
QString hiresviewerstring = "HiRes Image Viewer";
QString mrmazeviewerstring = "MissingRing Maze Viewer";
QString disassemblerviewerstring = "Diassembler Viewer";
QString texthexviewstring = "Text/Hex Dump Viewer";
QString relocatableviewerstring = "Relocatable Disassembler Viewer";
HexDumpViewer *hdv = new HexDumpViewer(0);
if (dynamic_cast<ApplesoftFile*>(file))
hdv->setFile(file,0x801); //TODO: Double check this offset.
else
hdv->setFile(file,m_file->address());
descriptor = (hexdumpviewerstring);
addViewer(descriptor,hdv);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
if (dynamic_cast<ApplesoftFile*>(file))
{
ApplesoftFileViewer *afv = new ApplesoftFileViewer(0);
afv->setFile(file);
descriptor=applesoftviewerstring;
addViewer(descriptor,afv);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
}
else if (dynamic_cast<IntBasicFile*>(file))
{
IntBasicFileViewer *ibf = new IntBasicFileViewer(0);
ibf->setFile(file);
descriptor=intbasicfileviewerstring;
addViewer(descriptor, ibf);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
}
else if (dynamic_cast<BinaryFile*>(file))
{
BinaryFile *bf = dynamic_cast<BinaryFile*>(file);
CharSetViewer *csv = new CharSetViewer();
csv->setFile(bf);
descriptor = hrcgcharsetviewerstring;
addViewer(descriptor,csv);
HiresViewWidget *hrvw = new HiresViewWidget();
hrvw->setFile(bf);
descriptor = hiresviewerstring;
addViewer(descriptor,hrvw);
MazeViewer *mv = new MazeViewer();
mv->setFile(file);
descriptor = mrmazeviewerstring;
addViewer(descriptor,mv);
DisassemblerViewer *dv = new DisassemblerViewer();
dv->setFile(bf);
descriptor = disassemblerviewerstring;
addViewer(descriptor,dv);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
if (bf->filename().toUpper().endsWith(".SET"))
{
defaultViewerDescriptor = m_viewercombo->findText(hrcgcharsetviewerstring);
}
if (bf->filename().toUpper().startsWith("MAZE"))
{
defaultViewerDescriptor = m_viewercombo->findText(mrmazeviewerstring);
}
if ((bf->address() == 0x2000 || bf->address() == 0x4000)
&& bf->length() == 0x2000)
{
defaultViewerDescriptor = m_viewercombo->findText(hiresviewerstring);
}
}
else if (dynamic_cast<TextFile*>(file))
{
TextFile *bf = dynamic_cast<TextFile*>(file);
TextHexDumpViewer *thdv = new TextHexDumpViewer();
thdv->setFile(bf);
descriptor = QString(texthexviewstring);
addViewer(descriptor,thdv);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
}
else if (dynamic_cast<RelocatableFile*>(file))
{
DisassemblerViewer *dv = new DisassemblerViewer();
dv->setFile(file);
descriptor = relocatableviewerstring;
addViewer(descriptor,dv);
defaultViewerDescriptor = m_viewercombo->findText(descriptor);
}
connect(m_viewercombo,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &ViewerBase::showViewer);
showViewer(defaultViewerDescriptor);
}
void ViewerBase::closeEvent(QCloseEvent *event)
{
event->accept();
}
void ViewerBase::addViewer(QString descriptor, FileViewerInterface *viewer)
{
if (!m_viewers.contains(descriptor))
{
m_stack->addWidget(viewer);
m_viewers[descriptor] = viewer;
m_viewercombo->addItem(descriptor);
}
}
void ViewerBase::showViewer(int index)
{
QString descriptor = m_viewercombo->itemText(index);
FileViewerInterface *fvi = m_viewers[descriptor];
if (fvi)
{
ui->actionExport->disconnect(SIGNAL(triggered(bool)));
ui->actionExport->setEnabled(fvi->canExport());
connect(ui->actionExport, &QAction::triggered,
fvi, &FileViewerInterface::doExport);
ui->action_Print->disconnect(SIGNAL(triggered(bool)));
ui->action_Print->setEnabled(fvi->canPrint());
connect(ui->action_Print, &QAction::triggered,
fvi, &FileViewerInterface::doPrint);
m_optionMenu->clear();
m_viewercombo->setCurrentText(descriptor);
m_stack->setCurrentWidget(fvi);
setWindowTitle(fvi->windowTitle());
if (m_optionMenu)
{
if (!fvi->optionsMenuItems(m_optionMenu))
{
m_optionMenu->setEnabled(false);
}
else
{
m_optionMenu->setEnabled(true);
}
}
}
else
{
qDebug() << "Could not find widget for descriptor" << descriptor;
}
}