Added printing and export for most viewers

This commit is contained in:
Mark Long 2016-10-24 13:37:37 -05:00
parent ce2d9dfdd6
commit c4bc4e5127
16 changed files with 306 additions and 25 deletions

View File

@ -1,5 +1,5 @@
QT += core gui
QT += core gui printsupport
CONFIG += c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

View File

@ -4,7 +4,6 @@
#include <QWidget>
#include <QListWidgetItem>
#include "diskfile.h"
namespace Ui {

View File

@ -4,6 +4,9 @@
#include "applesoftfiledetailviewer.h"
#include <QDebug>
#include <QSettings>
#include <QPrinter>
#include <QPrintDialog>
ApplesoftFileViewer::ApplesoftFileViewer(QWidget *parent) :
FileViewerInterface(parent),
@ -14,7 +17,6 @@ ApplesoftFileViewer::ApplesoftFileViewer(QWidget *parent) :
QSettings settings;
QString title = QString("AppleSoft Viewer");
m_title = title;
emit setTitle(title);
setWindowTitle(title);
m_formatter = new ApplesoftFormatter(this);
@ -75,6 +77,7 @@ bool ApplesoftFileViewer::optionsMenuItems(QMenu *menu)
return makeMenuOptions(menu);
}
void ApplesoftFileViewer::toggleWordWrap(bool enabled)
{
if (enabled)
@ -138,7 +141,6 @@ void ApplesoftFileViewer::setFile(ApplesoftFile *file) {
QString title = QString("AppleSoft Viewer: %1").arg(m_file->filename());
m_title = title;
emit setTitle(title);
setWindowTitle(title);
ui->textArea->setText(m_formatter->formatText());
@ -164,6 +166,8 @@ void ApplesoftFileViewer::launchVarBrowser()
void ApplesoftFileViewer::findText()
{
//TODO: Make this much more robust
QString searchString = ui->findText->text();
QTextDocument *document = ui->textArea->document();
@ -203,3 +207,47 @@ void ApplesoftFileViewer::findText()
m_isFirstFind = false;
}
bool ApplesoftFileViewer::canPrint() const { return true; }
void ApplesoftFileViewer::doPrint()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print AppleSoft File"));
if (ui->textArea->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted) {
return;
}
ui->textArea->print(&printer);
}
bool ApplesoftFileViewer::canExport() const { return true; }
void ApplesoftFileViewer::doExport()
{
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir savename = QDir(defaultPath).filePath(m_file->filename()+".txt");
QString saveName = QFileDialog::getSaveFileName(this,
tr("Export AppleSoft"), savename.path(), tr("Text Files (*.txt)"));
if (saveName == "") return; // User cancelled
qDebug() << "Set filename: " << saveName;
QFile saveFile(saveName);
if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this,"Save Error","Could not save "+saveName);
return;
}
QTextStream out(&saveFile);
out << ui->textArea->document()->toPlainText();
saveFile.close();
}

View File

@ -25,13 +25,17 @@ public:
virtual bool optionsMenuItems(QMenu *menu);
virtual bool canPrint() const;
bool canExport() const;
public slots:
void setFile(GenericFile *file);
void setFile(GenericFile *file);
void setFile(ApplesoftFile *m_file);
void setData(QByteArray data);
void setText(QString text);
void findText();
void doPrint();
void doExport();
protected slots:
void toggleWordWrap(bool enabled);

View File

@ -9,6 +9,7 @@
#include <QAction>
#include <QDebug>
DisassemblerViewer::DisassemblerViewer(QWidget *parent) :
FileViewerInterface(parent),
ui(new Ui::DisassemblerViewer)
@ -1433,3 +1434,49 @@ void DisassemblerViewer::setText(QString text)
{
ui->textArea->setHtml(text);
}
bool DisassemblerViewer::canPrint() const { return true; }
void DisassemblerViewer::doPrint()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print Dissassembly"));
if (ui->textArea->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted) {
qDebug() << "Cancelled";
return;
}
ui->textArea->print(&printer);
}
bool DisassemblerViewer::canExport() const { return true; }
void DisassemblerViewer::doExport()
{
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir savename = QDir(defaultPath).filePath(m_file->filename()+".txt");
QString saveName = QFileDialog::getSaveFileName(this,
tr("Export Disassembly"), savename.path(), tr("Text Files (*.txt)"));
if (saveName == "") return; // User cancelled
qDebug() << "Set filename: " << saveName;
QFile saveFile(saveName);
if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this,"Save Error","Could not save "+saveName);
return;
}
QTextStream out(&saveFile);
out << ui->textArea->document()->toPlainText();
saveFile.close();
}

View File

@ -27,11 +27,15 @@ public:
QString getPotentialLabel(quint16 address);
virtual bool optionsMenuItems(QMenu *);
bool canPrint() const;
bool canExport() const;
public slots:
void setFile(GenericFile *file);
void toggleWordWrap(bool enabled);
void doPrint();
void doExport();
private:
Ui::DisassemblerViewer *ui;

View File

@ -3,6 +3,11 @@
#include <QWidget>
#include <QString>
#include <QPrinter>
#include <QPrintDialog>
#include <QFileDialog>
#include <QStandardPaths>
#include <QMessageBox>
class GenericFile;
class QMenu;
@ -16,16 +21,18 @@ public:
virtual bool optionsMenuItems(QMenu *) = 0;
bool canPrint() const { return false; }
virtual bool canPrint() const { return false; }
virtual bool canExport() const { return false; }
QString title() const { return m_title; }
public slots:
virtual void setFile(GenericFile *file) = 0;
void doPrint() { }
QString title() const { return m_title; }
virtual void doPrint() { }
virtual void doExport() { }
signals:
void setTitle(QString title);
protected:
QString m_title;

View File

@ -11,6 +11,7 @@ HexDumpViewer::HexDumpViewer(QWidget *parent) :
FileViewerInterface(parent),
ui(new Ui::HexDumpViewer)
{
m_file = Q_NULLPTR;
ui->setupUi(this);
m_offset = 0;
@ -120,6 +121,7 @@ QString HexDumpViewer::valToAppleAscii(quint8 val)
void HexDumpViewer::setFile(GenericFile *file, quint16 offset)
{
m_file = file;
QString title = QString("Hex Viewer: %1").arg(file->filename());
setWindowTitle(title);
@ -153,3 +155,47 @@ void HexDumpViewer::setText(QString text)
{
ui->textArea->setHtml(text);
}
bool HexDumpViewer::canPrint() const { return true; }
void HexDumpViewer::doPrint()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print Hex Dump"));
if (ui->textArea->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted) {
return;
}
ui->textArea->print(&printer);
}
bool HexDumpViewer::canExport() const { return true; }
void HexDumpViewer::doExport()
{
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir savename = QDir(defaultPath).filePath(m_file->filename()+".txt");
QString saveName = QFileDialog::getSaveFileName(this,
tr("Export Hex Dump"), savename.path(), tr("Text Files (*.txt)"));
if (saveName == "") return; // User cancelled
qDebug() << "Set filename: " << saveName;
QFile saveFile(saveName);
if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this,"Save Error","Could not save "+saveName);
return;
}
QTextStream out(&saveFile);
out << ui->textArea->document()->toPlainText();
saveFile.close();
}

View File

@ -26,9 +26,14 @@ public:
virtual bool optionsMenuItems(QMenu *menu);
bool canPrint() const;
bool canExport() const;
public slots:
void showHexAndAsciiValues();
void toggleWordWrap(bool enabled);
void doPrint();
void doExport();
private:
void setText(QString text);
@ -39,6 +44,8 @@ private:
quint16 m_offset;
QByteArray m_data;
GenericFile *m_file;
};
#endif // HEXDUMPVIEWER_H

View File

@ -51,4 +51,55 @@ void HiresViewWidget::setFile(GenericFile *file)
setFile(af);
}
}
bool HiresViewWidget::canPrint() const { return true; }
void HiresViewWidget::doPrint()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print HiRes Image"));
if (dialog.exec() != QDialog::Accepted) {
return;
}
QPainter painter(&printer);
QPixmap pm = hrsw->getPixmap();
if (!pm.isNull() && pm.width() != 0 && pm.height() != 0)
{
painter.drawPixmap(0,0,pm.width(),pm.height(),pm);
}
else
{
QMessageBox::warning(this,"Print Error","Could not print image");
}
}
bool HiresViewWidget::canExport() const { return true; }
void HiresViewWidget::doExport()
{
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir savename = QDir(defaultPath).filePath(m_file->filename()+".png");
QString saveName = QFileDialog::getSaveFileName(this,
tr("Export HiRes Image"), savename.path(), tr("Png Files (*.png)"));
if (saveName == "") return; // User cancelled
qDebug() << "Set filename: " << saveName;
QFile saveFile(saveName);
if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this,"Save Error","Could not save "+saveName);
return;
}
QPixmap pm = hrsw->getPixmap();
pm.save(savename.path());
}

View File

@ -24,10 +24,14 @@ public:
explicit HiresViewWidget(QWidget *parent = 0);
virtual bool optionsMenuItems(QMenu *);
bool canPrint() const;
bool canExport() const;
public slots:
void setFile(GenericFile *file);
void setFile(BinaryFile *file);
void doPrint();
void doExport();
private:
HiresScreenWidget *hrsw;

View File

@ -12,6 +12,7 @@ TextHexDumpViewer::TextHexDumpViewer(QWidget *parent) :
FileViewerInterface(parent),
ui(new Ui::TextHexDumpViewer)
{
m_file = Q_NULLPTR;
ui->setupUi(this);
m_offset = 0;
@ -72,6 +73,7 @@ QString TextHexDumpViewer::makeTextStr(QByteArray data)
void TextHexDumpViewer::setFile(GenericFile *file, quint16 offset)
{
m_file = file;
m_offset = offset;
QByteArray data = file->data();
@ -127,3 +129,48 @@ bool TextHexDumpViewer::optionsMenuItems(QMenu *menu)
return true;
}
bool TextHexDumpViewer::canPrint() const { return true; }
void TextHexDumpViewer::doPrint()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print Text File Hex Dump"));
if (ui->textArea->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted) {
return;
}
ui->textArea->print(&printer);
}
bool TextHexDumpViewer::canExport() const { return true; }
void TextHexDumpViewer::doExport()
{
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir savename = QDir(defaultPath).filePath(m_file->filename()+".txt");
QString saveName = QFileDialog::getSaveFileName(this,
tr("Export Text Hex Dump"), savename.path(), tr("Text Files (*.txt)"));
if (saveName == "") return; // User cancelled
qDebug() << "Set filename: " << saveName;
QFile saveFile(saveName);
if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this,"Save Error","Could not save "+saveName);
return;
}
QTextStream out(&saveFile);
out << ui->textArea->document()->toPlainText();
saveFile.close();
}

View File

@ -28,8 +28,14 @@ public:
virtual bool optionsMenuItems(QMenu *menu);
bool canPrint() const;
bool canExport() const;
public slots:
void toggleWordWrap(bool enabled);
void doPrint();
void doExport();
protected:
QString makeTextStr(QByteArray data);
QString makeHexStr(QByteArray data);
@ -37,6 +43,8 @@ private:
Ui::TextHexDumpViewer *ui;
quint16 m_offset;
GenericFile *m_file;
};
#endif // TEXTHEXDUMPVIEWER_H

View File

@ -21,8 +21,6 @@ ViewerBase::ViewerBase(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ViewerBase)
{
// setMinimumWidth(1024);
m_stack = new QStackedWidget(this);
ui->setupUi(this);
@ -31,6 +29,8 @@ ViewerBase::ViewerBase(QWidget *parent) :
// setCentralWidget(scroller);
// scroller->setWidget(m_stack);
setCentralWidget(m_stack);
m_toolbar = new QToolBar(this);
@ -57,13 +57,13 @@ void ViewerBase::setFile(GenericFile *file)
m_file = file;
QString descriptor;
QString defaultDescriptor;
QString defaultViewerDescriptor;
HexDumpViewer *hdv = new HexDumpViewer(0);
hdv->setFile(file);
descriptor = ("Hex Dump Viewer");
addViewer(descriptor,hdv);
defaultDescriptor = descriptor;
defaultViewerDescriptor = descriptor;
if (dynamic_cast<ApplesoftFile*>(file))
{
@ -71,8 +71,7 @@ void ViewerBase::setFile(GenericFile *file)
afv->setFile(file);
descriptor="Applesoft File Viewer";
addViewer(descriptor,afv);
defaultDescriptor = descriptor;
showViewer(descriptor);
defaultViewerDescriptor = descriptor;
}
else if (dynamic_cast<BinaryFile*>(file))
{
@ -97,20 +96,20 @@ void ViewerBase::setFile(GenericFile *file)
dv->setFile(bf);
descriptor = "Disassembler Viewer";
addViewer(descriptor,dv);
defaultDescriptor = descriptor;
defaultViewerDescriptor = descriptor;
if (bf->filename().toUpper().endsWith(".SET"))
{
defaultDescriptor ="HRCG Character Set Viewer";
defaultViewerDescriptor ="HRCG Character Set Viewer";
}
if (bf->filename().toUpper().startsWith("MAZE"))
{
defaultDescriptor = "MissingRing Maze Viewer";
defaultViewerDescriptor = "MissingRing Maze Viewer";
}
if ((bf->address() == 0x2000 || bf->address() == 0x4000)
&& bf->length() == 0x2000)
{
defaultDescriptor = "HiRes Image Viewer";
defaultViewerDescriptor = "HiRes Image Viewer";
}
}
@ -123,7 +122,7 @@ void ViewerBase::setFile(GenericFile *file)
descriptor = QString("Text/Hex Dump Viewer");
addViewer(descriptor,thdv);
defaultDescriptor = descriptor;
defaultViewerDescriptor = descriptor;
}
else if (dynamic_cast<RelocatableFile*>(file))
{
@ -131,12 +130,11 @@ void ViewerBase::setFile(GenericFile *file)
dv->setFile(file);
descriptor = "Relocatable Disassembler Viewer";
addViewer(descriptor,dv);
defaultDescriptor = descriptor;
defaultViewerDescriptor = descriptor;
}
connect(m_viewercombo, SIGNAL(currentIndexChanged(QString)), SLOT(showViewer(QString)));
showViewer(defaultDescriptor);
showViewer(defaultViewerDescriptor);
}
void ViewerBase::closeEvent(QCloseEvent *event)
@ -159,6 +157,14 @@ void ViewerBase::showViewer(QString descriptor)
FileViewerInterface *fvi = m_viewers[descriptor];
if (fvi)
{
ui->actionExport->disconnect(SIGNAL(triggered(bool)));
ui->actionExport->setEnabled(fvi->canExport());
connect(ui->actionExport, SIGNAL(triggered(bool)), fvi, SLOT(doExport()));
ui->action_Print->disconnect(SIGNAL(triggered(bool)));
ui->action_Print->setEnabled(fvi->canPrint());
connect(ui->action_Print, SIGNAL(triggered(bool)), fvi, SLOT(doPrint()));
m_optionMenu->clear();
m_viewercombo->setCurrentText(descriptor);
m_stack->setCurrentWidget(fvi);
@ -178,7 +184,7 @@ void ViewerBase::showViewer(QString descriptor)
}
else
{
qDebug() << "Could not find widget for descriptor " << descriptor;
qDebug() << "Could not find widget for descriptor" << descriptor;
}
}

View File

@ -103,6 +103,8 @@ public:
ColRow getColRowFromAppleAddress(quint16 address);
ColRow getColRowFromRawAddress(quint16 address);
QPixmap getPixmap() const { return m_pixmap; }
signals:
public slots:

View File

@ -21,6 +21,7 @@ public slots:
void calcFromNewHex(QString value);
void calcFromNewUint8(QString value);
void calcFromNewInt8(QString value);
protected slots:
private:
Ui::HexConverter *ui;