From abe2f08e79cf76a4c7c6942b4487fe13d15f194a Mon Sep 17 00:00:00 2001 From: Mark Long Date: Sat, 15 Oct 2016 10:13:53 -0500 Subject: [PATCH] Added dynamic option menus to viewer --- src/ui/catalogwidget.cxx | 26 +------------ src/ui/catalogwidget.h | 1 - src/ui/mainwindow.cxx | 2 - src/ui/viewers/applesoftfileviewer.cxx | 51 ++++++++++++++++++-------- src/ui/viewers/applesoftfileviewer.h | 7 +++- src/ui/viewers/applesoftfileviewer.ui | 31 +++++----------- src/ui/viewers/charsetviewer.h | 2 + src/ui/viewers/disassemblerviewer.h | 1 + src/ui/viewers/fileviewerinterface.h | 2 +- src/ui/viewers/hexdumpviewer.h | 2 +- src/ui/viewers/hiresviewwidget.h | 2 + src/ui/viewers/mazeviewer.h | 2 + src/ui/viewers/texthexdumpviewer.h | 2 + src/ui/viewers/viewerbase.cpp | 43 ++++++++++++++++++---- src/ui/viewers/viewerbase.h | 2 + 15 files changed, 102 insertions(+), 74 deletions(-) diff --git a/src/ui/catalogwidget.cxx b/src/ui/catalogwidget.cxx index 4e56b75..a88b227 100644 --- a/src/ui/catalogwidget.cxx +++ b/src/ui/catalogwidget.cxx @@ -18,22 +18,6 @@ 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); - - contextMenu.exec(mapToGlobal(point)); } CatalogWidget::~CatalogWidget() @@ -49,7 +33,7 @@ void CatalogWidget::prepForNewDisk(QString filename, DiskFile *disk) QString CatalogWidget::createToolTip(FileDescriptiveEntry &fde) { QString retval; -qDebug() << AppleString(fde.filename).printable().trimmed(); +//qDebug() << AppleString(fde.filename).printable().trimmed(); 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); @@ -111,7 +95,6 @@ void CatalogWidget::processNewlyLoadedDisk(QString diskfilename, DiskFile *disk) idx++; } ui->catalog_list->resize(maxrect.width(),ui->catalog_list->size().height()); - } } @@ -124,15 +107,10 @@ void CatalogWidget::unloadDisk(DiskFile *disk) ui->volume_label->clear(); } - - void CatalogWidget::itemClicked(QListWidgetItem *item) { int idx = item->data(0x0100).toInt(); FileDescriptiveEntry fde = m_disk->getAllFDEs()[idx]; - qDebug() << "Default File " << AppleString(fde.filename).printable().trimmed(); + // qDebug() << "Default File " << AppleString(fde.filename).printable().trimmed(); emit openWithDefaultViewer(m_disk,fde); } - - - diff --git a/src/ui/catalogwidget.h b/src/ui/catalogwidget.h index 9c5191e..764f63f 100644 --- a/src/ui/catalogwidget.h +++ b/src/ui/catalogwidget.h @@ -25,7 +25,6 @@ public slots: void processNewlyLoadedDisk(QString filename, DiskFile *disk); void unloadDisk(DiskFile *disk); - void showContextMenuForWidget(const QPoint &); signals: void newFileSelected(FileDescriptiveEntry *entry); void openWithDefaultViewer(DiskFile *disk, FileDescriptiveEntry fde); diff --git a/src/ui/mainwindow.cxx b/src/ui/mainwindow.cxx index 3c731fe..1fec234 100644 --- a/src/ui/mainwindow.cxx +++ b/src/ui/mainwindow.cxx @@ -35,8 +35,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->action_Unload_Disk_Image, SIGNAL(triggered()), SLOT(unloadDiskFile())); connect(ui->catalogWidget,SIGNAL(openWithDefaultViewer(DiskFile*,FileDescriptiveEntry)), SLOT(handleDiskItemSelectedDefaultOpen(DiskFile*,FileDescriptiveEntry))); - connect(ui->catalogWidget,SIGNAL(openWithHexViewer(DiskFile*,FileDescriptiveEntry)), - SLOT(handleDiskItemSelectedHexViewOpen(DiskFile*,FileDescriptiveEntry))); connect(this, SIGNAL(diskFileLoading(QString, DiskFile*)), diff --git a/src/ui/viewers/applesoftfileviewer.cxx b/src/ui/viewers/applesoftfileviewer.cxx index 8542e4f..e14323f 100644 --- a/src/ui/viewers/applesoftfileviewer.cxx +++ b/src/ui/viewers/applesoftfileviewer.cxx @@ -25,19 +25,6 @@ ApplesoftFileViewer::ApplesoftFileViewer(QWidget *parent) : ui->textArea->setUndoRedoEnabled(false); ui->textArea->setUndoRedoEnabled(true); - setIntsAsHex(settings.value("ASViewer.intsAsHex",false).toBool()); - ui->intHexCB->setChecked(settings.value("ASViewer.intsAsHex",false).toBool()); - setIndentCode(settings.value("ASViewer.indentCode",false).toBool()); - ui->indentCode->setChecked(settings.value("ASViewer.indentCode",false).toBool()); - - connect(ui->intHexCB, SIGNAL(toggled(bool)), SLOT(setIntsAsHex(bool))); - connect(ui->intHexCB, SIGNAL(toggled(bool)), ui->findText,SLOT(clear())); - - connect(ui->indentCode, SIGNAL(toggled(bool)), SLOT(setIndentCode(bool))); - connect(ui->indentCode, SIGNAL(toggled(bool)), ui->findText,SLOT(clear())); - - connect(ui->varBrowserButton, SIGNAL(clicked(bool)), SLOT(launchVarBrowser())); - } ApplesoftFileViewer::~ApplesoftFileViewer() @@ -45,9 +32,43 @@ ApplesoftFileViewer::~ApplesoftFileViewer() delete ui; } -QMenu *ApplesoftFileViewer::optionsMenuItems() const +bool ApplesoftFileViewer::makeMenuOptions(QMenu *menu) { - return Q_NULLPTR; + qDebug() << "makeMenuOptions()"; + + + QSettings settings; + + QAction *action = new QAction("Show &Ints as Hex",menu); + action->setCheckable(true); + action->setChecked(settings.value("ASViewer.intsAsHex",false).toBool()); + setIntsAsHex(settings.value("ASViewer.intsAsHex",false).toBool()); + connect(action, SIGNAL(toggled(bool)), ui->findText,SLOT(clear())); + connect(action, SIGNAL(toggled(bool)),SLOT(setIntsAsHex(bool))); + menu->addAction(action); + + action = new QAction("&Reindent code",menu); + action->setCheckable(true); + action->setChecked(settings.value("ASViewer.indentCode",false).toBool()); + setIndentCode(settings.value("ASViewer.indentCode",false).toBool()); + connect(action, SIGNAL(toggled(bool)), ui->findText,SLOT(clear())); + connect(action, SIGNAL(toggled(bool)),SLOT(setIndentCode(bool))); + menu->addAction(action); + + menu->addSeparator(); + + action = new QAction("Show &Variable Explorer...",menu); + action->setCheckable(false); + connect(action, SIGNAL(triggered(bool)), SLOT(launchVarBrowser())); + menu->addAction(action); + + return true; +} + +bool ApplesoftFileViewer::optionsMenuItems(QMenu *menu) +{ + qDebug() << "AFV::optionMenuItems()"; + return makeMenuOptions(menu); } void ApplesoftFileViewer::setIndentCode(bool enabled) diff --git a/src/ui/viewers/applesoftfileviewer.h b/src/ui/viewers/applesoftfileviewer.h index 0ac1d02..edd9e14 100644 --- a/src/ui/viewers/applesoftfileviewer.h +++ b/src/ui/viewers/applesoftfileviewer.h @@ -2,6 +2,9 @@ #define APPLESOFTFILEVIEWER_H #include +#include +#include + #include "applesoftfile.h" #include "applesoftformatter.h" #include "viewerbase.h" @@ -20,7 +23,7 @@ public: // void setFormatter(ApplesoftFormatter *formatter); - virtual QMenu* optionsMenuItems() const; + virtual bool optionsMenuItems(QMenu *menu); public slots: void setFile(GenericFile *file); @@ -38,6 +41,8 @@ protected slots: void reformatText(); private: + bool makeMenuOptions(QMenu *menu); + ApplesoftFile *m_file; ApplesoftFormatter *m_formatter; bool m_isFirstFind; diff --git a/src/ui/viewers/applesoftfileviewer.ui b/src/ui/viewers/applesoftfileviewer.ui index eff30f1..c589f10 100644 --- a/src/ui/viewers/applesoftfileviewer.ui +++ b/src/ui/viewers/applesoftfileviewer.ui @@ -21,7 +21,7 @@ - + @@ -47,27 +47,6 @@ - - - - Indent Code - - - - - - - Ints as Hex - - - - - - - Var Broswer - - - @@ -88,6 +67,14 @@ + + + FileViewerInterface + QWidget +
viewerbase.h
+ 1 +
+
diff --git a/src/ui/viewers/charsetviewer.h b/src/ui/viewers/charsetviewer.h index 4c98c56..394488d 100644 --- a/src/ui/viewers/charsetviewer.h +++ b/src/ui/viewers/charsetviewer.h @@ -16,6 +16,8 @@ public: void setFile(GenericFile *file); void setFile(BinaryFile *file); + virtual bool optionsMenuItems(QMenu *) { return false; } + signals: private: diff --git a/src/ui/viewers/disassemblerviewer.h b/src/ui/viewers/disassemblerviewer.h index 25d91d3..335dd32 100644 --- a/src/ui/viewers/disassemblerviewer.h +++ b/src/ui/viewers/disassemblerviewer.h @@ -26,6 +26,7 @@ public: void setText(QString text); QString getPotentialLabel(quint16 address); + virtual bool optionsMenuItems(QMenu *) { return false; } public slots: void setFile(GenericFile *file); diff --git a/src/ui/viewers/fileviewerinterface.h b/src/ui/viewers/fileviewerinterface.h index 04939f9..87c01cb 100644 --- a/src/ui/viewers/fileviewerinterface.h +++ b/src/ui/viewers/fileviewerinterface.h @@ -14,7 +14,7 @@ class FileViewerInterface : public QWidget public: FileViewerInterface(QWidget *parent = Q_NULLPTR) : QWidget(parent) { } - virtual QMenu *optionsMenuItems() const { return Q_NULLPTR; } + virtual bool optionsMenuItems(QMenu *) = 0; bool canPrint() const { return false; } diff --git a/src/ui/viewers/hexdumpviewer.h b/src/ui/viewers/hexdumpviewer.h index 2782f68..f5d5e6d 100644 --- a/src/ui/viewers/hexdumpviewer.h +++ b/src/ui/viewers/hexdumpviewer.h @@ -24,7 +24,7 @@ public: void setFile(GenericFile *file) { setFile(file,0); } void setFile(GenericFile *file, quint16 offset); - + virtual bool optionsMenuItems(QMenu *) { return false; } public slots: void showHexAndAsciiValues(); diff --git a/src/ui/viewers/hiresviewwidget.h b/src/ui/viewers/hiresviewwidget.h index 93e9940..b5a66d8 100644 --- a/src/ui/viewers/hiresviewwidget.h +++ b/src/ui/viewers/hiresviewwidget.h @@ -51,6 +51,8 @@ public: static QBitArray byteToBits(quint8 byte); void contextMenuEvent(QContextMenuEvent *); + virtual bool optionsMenuItems(QMenu *) { return false; } + signals: public slots: diff --git a/src/ui/viewers/mazeviewer.h b/src/ui/viewers/mazeviewer.h index 61be7cd..fba4c73 100644 --- a/src/ui/viewers/mazeviewer.h +++ b/src/ui/viewers/mazeviewer.h @@ -26,6 +26,8 @@ public: void setFile(BinaryFile *file); + virtual bool optionsMenuItems(QMenu *) { return false; } + private: QPixmap m_maze; BinaryFile *m_file; diff --git a/src/ui/viewers/texthexdumpviewer.h b/src/ui/viewers/texthexdumpviewer.h index ba50888..50221f2 100644 --- a/src/ui/viewers/texthexdumpviewer.h +++ b/src/ui/viewers/texthexdumpviewer.h @@ -26,6 +26,8 @@ public: void setData(QByteArray data); void setText(QString text); + virtual bool optionsMenuItems(QMenu *) { return false; } + protected: QString makeTextStr(QByteArray data); QString makeHexStr(QByteArray data); diff --git a/src/ui/viewers/viewerbase.cpp b/src/ui/viewers/viewerbase.cpp index 45a2c6f..2ae7def 100644 --- a/src/ui/viewers/viewerbase.cpp +++ b/src/ui/viewers/viewerbase.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "applesoftfileviewer.h" #include "hexdumpviewer.h" @@ -33,7 +34,10 @@ ViewerBase::ViewerBase(QWidget *parent) : m_viewercombo = new QComboBox(m_toolbar); m_toolbar->addWidget(m_viewercombo); - connect(m_viewercombo, SIGNAL(currentIndexChanged(QString)), SLOT(showViewer(QString))); + m_optionMenu = new QMenu("&Viewer"); + menuBar()->addMenu(m_optionMenu); + m_optionMenu->setEnabled(false); + } ViewerBase::~ViewerBase() @@ -52,14 +56,12 @@ void ViewerBase::setFile(GenericFile *file) descriptor = ("Hex Dump Viewer"); addViewer(descriptor,hdv); - if (dynamic_cast(file)) { ApplesoftFileViewer *afv = new ApplesoftFileViewer(0); afv->setFile(file); descriptor="Applesoft File Viewer"; addViewer(descriptor,afv); - m_stack->setCurrentWidget(afv); showViewer(descriptor); } else if (dynamic_cast(file)) @@ -96,6 +98,7 @@ void ViewerBase::setFile(GenericFile *file) thdv->setFile(bf); descriptor = QString("Text/Hex Dump Viewer"); addViewer(descriptor,thdv); + showViewer(descriptor); } else if (dynamic_cast(file)) @@ -104,11 +107,15 @@ void ViewerBase::setFile(GenericFile *file) dv->setFile(file); descriptor = "Relocatable Disassembler Viewer"; addViewer(descriptor,dv); + showViewer(descriptor); + } else { showViewer(descriptor); } + connect(m_viewercombo, SIGNAL(currentIndexChanged(QString)), SLOT(showViewer(QString))); + } void ViewerBase::closeEvent(QCloseEvent *event) @@ -120,16 +127,38 @@ void ViewerBase::addViewer(QString descriptor, FileViewerInterface *viewer) { if (!m_viewers.contains(descriptor)) { + m_stack->addWidget(viewer); m_viewers[descriptor] = viewer; m_viewercombo->addItem(descriptor); - m_stack->addWidget(viewer); } } void ViewerBase::showViewer(QString descriptor) { - m_viewercombo->setCurrentText(descriptor); + qDebug() << "showViewer"; FileViewerInterface *fvi = m_viewers[descriptor]; - m_stack->setCurrentWidget(fvi); - setWindowTitle(fvi->windowTitle()); + if (fvi) + { + 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; + } + } diff --git a/src/ui/viewers/viewerbase.h b/src/ui/viewers/viewerbase.h index c3f29b3..22c3065 100644 --- a/src/ui/viewers/viewerbase.h +++ b/src/ui/viewers/viewerbase.h @@ -25,6 +25,7 @@ public: public slots: void showViewer(QString descriptor); + protected: void closeEvent(QCloseEvent *event); void addViewer(QString descriptor, FileViewerInterface *viewer); @@ -37,6 +38,7 @@ private: QMap m_viewers; GenericFile *m_file; + QMenu *m_optionMenu; };