Added new docking support and viewer widgets for DiskExplorer

This commit is contained in:
mlong 2021-02-21 13:05:55 -06:00
parent cd782f52a9
commit c4badd2137
18 changed files with 298 additions and 54 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "ads"]
path = ads
url = https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git

View File

@ -6,6 +6,7 @@ MOC_DIR = ./.build
UI_DIR = ./.build
OBJECTS_DIR = ./.build
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = AppleSAWS
@ -32,6 +33,7 @@ INCLUDEPATH += src/sequence
INCLUDEPATH += src/ui/central
include(./ads.pri)
DEFINES += WS_VIDEO

1
ads Submodule

@ -0,0 +1 @@
Subproject commit 13853573ea51f9f0e682f7d005ca4443398512ae

68
ads.pri Normal file
View File

@ -0,0 +1,68 @@
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += ADS_STATIC
INCLUDEPATH += ads/src/
windows {
# MinGW
*-g++* {
QMAKE_CXXFLAGS += -Wall -Wextra -pedantic
}
# MSVC
*-msvc* {
QMAKE_CXXFLAGS += /utf-8
}
}
RESOURCES += ads/src/ads.qrc
HEADERS += \
ads/src/ads_globals.h \
ads/src/DockAreaWidget.h \
ads/src/DockAreaTabBar.h \
ads/src/DockContainerWidget.h \
ads/src/DockManager.h \
ads/src/DockWidget.h \
ads/src/DockWidgetTab.h \
ads/src/DockingStateReader.h \
ads/src/FloatingDockContainer.h \
ads/src/FloatingDragPreview.h \
ads/src/DockOverlay.h \
ads/src/DockSplitter.h \
ads/src/DockAreaTitleBar_p.h \
ads/src/DockAreaTitleBar.h \
ads/src/ElidingLabel.h \
ads/src/IconProvider.h \
ads/src/DockComponentsFactory.h \
ads/src/DockFocusController.h
SOURCES += \
ads/src/ads_globals.cpp \
ads/src/DockAreaWidget.cpp \
ads/src/DockAreaTabBar.cpp \
ads/src/DockContainerWidget.cpp \
ads/src/DockManager.cpp \
ads/src/DockWidget.cpp \
ads/src/DockingStateReader.cpp \
ads/src/DockWidgetTab.cpp \
ads/src/FloatingDockContainer.cpp \
ads/src/FloatingDragPreview.cpp \
ads/src/DockOverlay.cpp \
ads/src/DockSplitter.cpp \
ads/src/DockAreaTitleBar.cpp \
ads/src/ElidingLabel.cpp \
ads/src/IconProvider.cpp \
ads/src/DockComponentsFactory.cpp \
ads/src/DockFocusController.cpp
unix:!macx {
HEADERS += ads/src/linux/FloatingWidgetTitleBar.h
SOURCES += ads/src/linux/FloatingWidgetTitleBar.cpp
QT += x11extras
LIBS += -lxcb
}

View File

@ -1560,7 +1560,6 @@ QTabBar::tab:top {
padding-right: 4px;
padding-top: 2px;
padding-bottom: 2px;
min-width: 5px;
border-bottom: 3px solid #32414B;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
@ -2189,3 +2188,7 @@ DEButton {
outline: none;
min-width: 10px;
}
ads--CElidingLabel {
min-width: 80px;
}

View File

@ -36,10 +36,10 @@
#include <QStatusBar>
#include <QStackedWidget>
#include <QScrollArea>
#include <QFile>
using namespace ads;
CentralAppWindow::CentralAppWindow(QWidget *parent) : QMainWindow(parent)
{
QFile f(":qdarkstyle/style.qss");
@ -50,25 +50,63 @@ CentralAppWindow::CentralAppWindow(QWidget *parent) : QMainWindow(parent)
else {
f.open(QFile::ReadOnly | QFile::Text);
QTextStream ts(&f);
this->setStyleSheet(ts.readAll());
// this->setStyleSheet(ts.readAll());
this->setStyleSheet("font-family: \"Pr Number 3\"; font-size: 16px");
}
initCentralWidget();
createActions();
initMenuBar();
initToolBars();
initDockWidgets();
initStatusBar();
initCentralWidget();
}
void CentralAppWindow::createActions()
{
m_quitAction = new QAction(QIcon(":/images/redblob.png"),tr("E&xit"));
m_quitAction = new QAction(QIcon(":/images/redblob.png"),tr("&Quit"));
connect(m_quitAction, &QAction::triggered,
qApp, &QApplication::quit);
m_reference_action = new QAction(QIcon(":/images/redblob.png"),tr("&References"));
m_reference_action->setCheckable(true);
// connect(m_reference_action, &QAction::triggered,
// qApp, &QApplication::xxxxxx);
m_utils_action = new QAction(QIcon(":/images/redblob.png"),tr("&Utils"));
m_utils_action->setCheckable(true);
// connect(m_reference_action, &QAction::triggered,
// qApp, &QApplication::xxxxxx);
m_image_lib_action = new QAction(QIcon(":/images/redblob.png"),tr("&Disk Image\nLibrary"));
m_image_lib_action->setCheckable(true);
// connect(m_reference_action, &QAction::triggered,
// qApp, &QApplication::xxxxxx);
m_disk_explorer_action= new QAction(QIcon(":/images/redblob.png"),tr("Disk Image\n&Explorer"));
m_disk_explorer_action->setCheckable(true);
// connect(m_reference_action, &QAction::triggered,
// qApp, &QApplication::xxxxxx);
m_projects_action = new QAction(QIcon(":/images/redblob.png"),tr("&Projects"));
m_projects_action->setCheckable(true);
// connect(m_reference_action, &QAction::triggered,
// qApp, &QApplication::xxxxxx);
m_tool_action_group = new QActionGroup(this);
m_tool_action_group->addAction(m_reference_action);
m_tool_action_group->addAction(m_utils_action);
m_tool_action_group->addAction(m_image_lib_action);
m_tool_action_group->addAction(m_disk_explorer_action);
m_tool_action_group->addAction(m_projects_action);
m_tool_action_group->setExclusive(true);
m_disk_explorer_action->toggle();
}
void CentralAppWindow::initMenuBar()
{
auto filemenu = menuBar()->addMenu(tr("&File"));
@ -87,34 +125,27 @@ void CentralAppWindow::initToolBars()
m_mainToolBar = new MainAppToolbar(this);
m_mainToolBar->setIconSize(QSize(64,64));
m_mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
m_mainToolBar->addAction(m_quitAction);
m_mainToolBar->setFont(QFont("Ariel",14));
// m_mainToolBar->addAction(m_quitAction);
m_mainToolBar->addAction(m_reference_action);
m_mainToolBar->addAction(m_utils_action);
m_mainToolBar->addAction(m_image_lib_action);
m_mainToolBar->addAction(m_disk_explorer_action);
m_mainToolBar->addAction(m_projects_action);
addToolBar(Qt::LeftToolBarArea, m_mainToolBar);
}
void CentralAppWindow::initDockWidgets()
{
QDockWidget *container = new QDockWidget(this);
container->setMinimumWidth(200);
container->setFeatures(QDockWidget::DockWidgetMovable);
m_project_area = new QWidget(container);
m_project_area->setMinimumSize(300,200);
m_directory_area = new Dos33DiskTreeView(container);
m_directory_area = new Dos33DiskTreeView();
m_directory_area->setFont(QFont("Pr Number 3", 12));
m_directory_area->setMinimumSize(300,200);
QSplitter *split = new QSplitter(container);
container->setWidget(split);
split->setOrientation(Qt::Vertical);
split->addWidget(m_directory_area);
split->addWidget(m_project_area);
split->setStretchFactor(0,1);
split->setStretchFactor(1,1);
split->setSizes(QList<int>({4000, 4000}));
Dos33DiskImage *img = new Dos33DiskImage("c:/develop/git/AppleSAWS/disk-images/ApplesoftToolkit.dsk");
@ -128,37 +159,73 @@ void CentralAppWindow::initDockWidgets()
model->addDiskImage(img);
m_directory_area->setModel(model);
addDockWidget(Qt::LeftDockWidgetArea,container);
auto DiskImageDockWidget = new CDockWidget("Disk Images");
DiskImageDockWidget->setWidget(m_directory_area);
DiskImageDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
DiskImageDockWidget->resize(250, 150);
DiskImageDockWidget->setMinimumSize(200,150);
auto DiskImageWidgetArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, DiskImageDockWidget);
//DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, TableArea);
// ui->menuView->addAction(TableDockWidget->toggleViewAction());
QDockWidget *stb = new QDockWidget(this);
stb->setMinimumWidth(200);
stb->setFeatures(QDockWidget::DockWidgetMovable);
// stb->setLayout(new QGridLayout());
m_toolbox = new SequenceToolBox(this);
auto SequenceDockWidget = new CDockWidget("Sequences");
SequenceDockWidget->setWidget(m_toolbox);
SequenceDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
SequenceDockWidget->resize(250, 150);
SequenceDockWidget->setMinimumSize(200,150);
auto SequenceWidgetArea = DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, SequenceDockWidget);
addDockWidget(Qt::RightDockWidgetArea,stb);
}
void CentralAppWindow::initCentralWidget()
{
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true);
CDockManager::setConfigFlag(CDockManager::TabCloseButtonIsToolButton, true);
DockManager = new CDockManager(this);
DockManager->setStyleSheet("");
m_central_stack = new QStackedWidget(this);
QScrollArea *sa = new QScrollArea(m_central_stack);
sa->setWidgetResizable(true);
m_central_stack->addWidget(sa);
setCentralWidget(m_central_stack);
CentralDockWidget = new CDockWidget("CentralWidget");
CentralDockWidget->setWidget(m_central_stack);
// CentralDockWidget->setFeature(CDockWidget::NoTab,true);
m_central_dock_area = DockManager->setCentralWidget(CentralDockWidget);
Dos33DiskImage *img = new Dos33DiskImage("c:/develop/git/AppleSAWS/disk-images/ApplesoftToolkit.dsk");
Dos33DiskImage *img = new Dos33DiskImage("c:/develop/git/AppleSAWS/disk-images/ApplesoftToolkit.dsk");
auto dew = new DiskExplorerMapWidget(img->tracks(),img->sectorsPerTrack());
dew->setDisk(img);
sa->setWidget(dew);
// m_central_stack->addWidget(dew);
//new SequenceViewer()
auto VWSDockWidget = new CDockWidget("Sector Contents");
VWSDockWidget->setWidget(dew->generateViewWidgetStack());
auto VWSWidgetArea = DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, VWSDockWidget);
auto KeyDockWidget = new CDockWidget("Key");
auto keywidget = dew->makeKeyWidget();
keywidget->setMaximumWidth(240);
KeyDockWidget->setWidget(keywidget);
KeyDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
// KeyDockWidget->resize(250, 150);
// KeyDockWidget->setMinimumSize(200,150);
auto DiskImageWidgetArea =
DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, KeyDockWidget, m_central_dock_area);
}

View File

@ -30,6 +30,12 @@ class QStatusBar;
class SequenceToolBox;
class QStackedWidget;
#include "DockAreaWidget.h"
#include "DockWidget.h"
#include "DockManager.h"
#include <QActionGroup>
class CentralAppWindow : public QMainWindow
{
Q_OBJECT
@ -47,6 +53,12 @@ private:
private:
QAction *m_quitAction;
QAction *m_reference_action;
QAction *m_utils_action;
QAction *m_image_lib_action;
QAction *m_disk_explorer_action;
QAction *m_projects_action;
QActionGroup *m_tool_action_group;
MainAppToolbar *m_mainToolBar;
QTreeView *m_directory_area;
@ -55,6 +67,10 @@ private:
SequenceToolBox *m_toolbox;
ads::CDockManager *DockManager;
ads::CDockWidget *CentralDockWidget;
ads::CDockAreaWidget *m_central_dock_area;
QStackedWidget *m_central_stack;
};

View File

@ -134,7 +134,7 @@ void DiskExplorer::initUi()
// m_hdv = new HexDumpViewer(this, 10);
// frameLayout->addWidget(m_hdv);
m_vws = new ViewWidgetStack(this);
m_vws = m_demw->generateViewWidgetStack(); // new ViewWidgetStack(this);
frameLayout->addWidget(m_vws);
m_gridLayout->setColumnStretch(0,4);
@ -155,8 +155,8 @@ void DiskExplorer::initUi()
connect(m_cw, &CatalogWidget::openWithDefaultViewer,
this, &DiskExplorer::handleDiskItemSelectedDefaultOpen);
connect(m_demw, &DiskExplorerMapWidget::showSectorData,
this, &DiskExplorer::handleShowSectorData);
// connect(m_demw, &DiskExplorerMapWidget::showSectorData,
// this, &DiskExplorer::handleShowSectorData);
QStatusBar *statusBar = new QStatusBar(this);
setStatusBar(statusBar);
@ -179,6 +179,8 @@ void DiskExplorer::unloadDiskFile()
}
}
void DiskExplorer::loadDiskFile(QString filename)
{
if (m_disk) {
@ -202,6 +204,7 @@ void DiskExplorer::loadDiskFile(QString filename)
void DiskExplorer::handleShowSectorData(QByteArray /*data*/, int track, int sector, QVariant metadata)
{
return;
ViewWidgetStack::PreferredViewer viewer =
ViewWidgetStack::PreferredViewer::DontCare;

View File

@ -65,6 +65,7 @@ private slots:
void setDiskToolsVisible(bool visible);
void handleViewerClosing(ViewerBase *viewer);
protected:
void initUi();

View File

@ -157,6 +157,8 @@ void DiskExplorerMapWidget::handleButtonCheck(int track, int sector, bool checke
Sector sec = m_disk->getSector(track,sector);
QByteArray *data = sec.rawData();
emit showSectorData(*data,track,sector,QVariant((int) m_roles[TSPair(track,sector)]));
emit showSector(&sec,track,sector,m_roles[TSPair(track,sector)]);
m_trackSectorLabel->setText(
QString("Track: %1 Sector: %2 (%3)")
.arg(track)
@ -165,6 +167,8 @@ void DiskExplorerMapWidget::handleButtonCheck(int track, int sector, bool checke
}
else{
emit showSectorData(QByteArray(),-1,-1,QVariant(-1));
emit showSector(nullptr, -1, -1, DiskSectorRole::Unknown);
m_trackSectorLabel->setText("No Track/Sector selected");
}
@ -249,7 +253,7 @@ QGroupBox *DiskExplorerMapWidget::makeKeyWidget()
{
int idx = 0;
QGroupBox *groupbox= new QGroupBox();
groupbox->setTitle("Key");
//groupbox->setTitle("Key");
QGridLayout *layout = new QGridLayout();
layout->setVerticalSpacing(0);
layout->setHorizontalSpacing(0);
@ -273,6 +277,15 @@ QGroupBox *DiskExplorerMapWidget::makeKeyWidget()
return groupbox;
}
ViewWidgetStack *DiskExplorerMapWidget::generateViewWidgetStack()
{
ViewWidgetStack *vws = new ViewWidgetStack();
vws->setSector(nullptr);
connect(this, &DiskExplorerMapWidget::showSector,
vws, &ViewWidgetStack::handleShowSectorData);
return vws;
}
DEButton *DiskExplorerMapWidget::buttonAt(int track, int sector)
{
//qDebug() << "Button At:" << track << "," << sector;

View File

@ -20,6 +20,7 @@
*****************************************************************************/
#include "dos33diskimage.h"
#include "viewwidgetstack.h"
#include <QWidget>
#include <QPair>
@ -30,6 +31,7 @@
#include <QLabel>
#include <QToolButton>
class DEButton : public QToolButton
{
Q_OBJECT
@ -112,7 +114,8 @@ private:
"} "
" "
"DEButton:checked { "
" font: bold italic 11px; "
// " font: bold italic 11px; "
" font: bold 11px; "
"}"
).arg(m_fgColor)
.arg(m_backgroundColor);
@ -168,9 +171,12 @@ public:
QGroupBox *makeKeyWidget();
QWidget *getStatusWidget() const { return m_statusWidget; }
ViewWidgetStack *generateViewWidgetStack();
signals:
void showSectorData(QByteArray data, int track, int sector, QVariant metadata);
void showSector(Sector *sec, int track, int sector, DiskSectorRole role);
public slots:
void handleButtonCheck(int track, int sector, bool checked);
@ -206,6 +212,8 @@ protected:
int &buttonNumber, int &tslCount);
DiskSectorRole getFileTypeFromID(QString id);
void checkForUsedButUnknown(TSPair vtoc = TSPair(17,0));
private:
QMap<int, QMap<int,DEButton*> > m_buttons;

View File

@ -21,6 +21,7 @@
#include "vtocview.h"
#include "catalogsectorview.h"
#include "tslistview.h"
#include "DiskExplorerMapWidget.h"
ViewWidgetStack::ViewWidgetStack(QWidget *parent) : QTabWidget(parent)
{
@ -77,3 +78,34 @@ void ViewWidgetStack::makeWidgets()
setCurrentWidget(m_hdv);
}
void ViewWidgetStack::handleShowSectorData(Sector *data, int track,
int sector, DiskSectorRole role)
{
ViewWidgetStack::PreferredViewer viewer =
ViewWidgetStack::PreferredViewer::DontCare;
bool USE_SPECIFIC_VIEWER = true; // Hook for later allowing the disuse of
if (USE_SPECIFIC_VIEWER) // default viewer switching
{
if (role == DiskSectorRole::VTOC)
{
viewer = ViewWidgetStack::PreferredViewer::VTOC;
}
else if (role == DiskSectorRole::CatalogSector)
{
viewer = ViewWidgetStack::PreferredViewer::CatalogSector;
}
else if (role == DiskSectorRole::TSList)
{
viewer = ViewWidgetStack::PreferredViewer::TSList;
}
else
{
viewer = ViewWidgetStack::PreferredViewer::HexDump;
}
}
setSector(data, viewer);
}

View File

@ -28,6 +28,7 @@ class HexDumpViewer;
class VTOCView;
class CatalogSectorView;
class TSListView;
enum class DiskSectorRole;
class ViewWidgetStack : public QTabWidget
{
@ -48,6 +49,10 @@ public:
public slots:
void setSector(Sector *sec, PreferredViewer viewer = PreferredViewer::DontCare);
void handleShowSectorData(Sector *data, int track, int sector, DiskSectorRole role);
private:
void makeWidgets();

View File

@ -52,7 +52,8 @@ void VTOCView::setSector(Sector *sec)
ui->m_lastAllocTrackLabel->setText(QString("%1").arg(v.lastTrackAllocated()));
ui->m_allocDirLabel->setText(QString("%1").arg(v.directionOfAllocation()));
ui->m_allocDirLabel->setText(QString("%1 %2").arg(v.directionOfAllocation())
.arg((v.directionOfAllocation()>0)?"==>":"<=="));
ui->m_tracksPerDiskLabel->setText(QString("%1").arg(v.tracksPerDisk()));
@ -90,7 +91,7 @@ void VTOCView::setSector(Sector *sec)
ui->m_usageTextBrowser->setText("");
ui->m_usageTextBrowser->setWordWrapMode(QTextOption::NoWrap);
auto format = ui->m_usageTextBrowser->currentCharFormat();
format.setFont(QFont("courier new",6));
// format.setFont(QFont("courier new"/*,6*/));
ui->m_usageTextBrowser->setCurrentCharFormat(format);
ui->m_usageTextBrowser->insertPlainText(usage);
@ -115,8 +116,3 @@ void VTOCView::setSector(Sector *sec)
}
QString VTOCView::makeUsage()
{
return QString();
}

View File

@ -39,8 +39,6 @@ public:
void setSector(Sector *sec);
protected:
QString makeUsage();
private:
Ui::VTOCView *ui;

View File

@ -19,7 +19,7 @@
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="">
<widget class="QWidget" name="layoutWidget">
<layout class="QFormLayout" name="formLayout">
<item row="1" column="0">
<widget class="QLabel" name="labelx">
@ -105,28 +105,28 @@
</property>
</widget>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Sectors/Track</string>
</property>
</widget>
</item>
<item row="8" column="1">
<item row="9" column="1">
<widget class="QLabel" name="m_sectorsPerTrackLabel">
<property name="text">
<string>--</string>
</property>
</widget>
</item>
<item row="9" column="0">
<item row="10" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Bytes/Sector</string>
</property>
</widget>
</item>
<item row="9" column="1">
<item row="10" column="1">
<widget class="QLabel" name="m_bytesPerSectorLabel">
<property name="text">
<string>--</string>
@ -160,9 +160,35 @@
</property>
</spacer>
</item>
<item row="8" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="11" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="">
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_16">

View File

@ -19,8 +19,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
*****************************************************************************/
#include "genericfile.h"
#include "fileviewerinterface.h"
@ -57,6 +55,7 @@ public slots:
protected:
void setTextFont(const QFont &font, int forcedFontSize = -1);
private:
void setText(QString text);
void setData(QByteArray data);

View File

@ -30,6 +30,9 @@
<pointsize>10</pointsize>
</font>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::NoWrap</enum>
</property>
</widget>
</item>
</layout>