Skip to content

Commit

Permalink
feat: arbitrary view splitting and full view persistence for #100
Browse files Browse the repository at this point in the history
  • Loading branch information
hello-adam committed May 21, 2021
1 parent 070b11d commit 6e665a6
Show file tree
Hide file tree
Showing 8 changed files with 188 additions and 56 deletions.
47 changes: 16 additions & 31 deletions src/hobbits-gui/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ MainWindow::MainWindow(QString extraPluginPath, QString configFilePath, QWidget
m_bitContainerManager(QSharedPointer<BitContainerManagerUi>(new BitContainerManagerUi())),
m_pluginManager(QSharedPointer<HobbitsPluginManager>(new HobbitsPluginManager())),
m_pluginActionManager(new PluginActionManager(m_pluginManager)),
m_previewScroll(new PreviewScrollBar()),
m_splitViewMenu(new QMenu("Split View"))
m_previewScroll(new PreviewScrollBar())
{
m_pluginActionManager->setContainerManager(m_bitContainerManager);
ui->setupUi(this);
Expand All @@ -56,8 +55,6 @@ MainWindow::MainWindow(QString extraPluginPath, QString configFilePath, QWidget
ui->menu_View->addAction(ui->dock_bitContainerSelect->toggleViewAction());
ui->menu_View->addAction(ui->dock_operatorPlugins->toggleViewAction());
ui->menu_View->addAction(ui->dock_findBits->toggleViewAction());
ui->menu_View->addSeparator();
ui->menu_View->addMenu(m_splitViewMenu);

ui->dock_bitContainerSelect->setContentsMargins(0, 0, 0, 0);
ui->dock_operatorPlugins->setContentsMargins(0, 0, 0, 0);
Expand Down Expand Up @@ -215,6 +212,9 @@ MainWindow::MainWindow(QString extraPluginPath, QString configFilePath, QWidget

MainWindow::~MainWindow()
{
// release the offset controls from DisplayHandle before deleting UI
m_displayHandle->deactivate();

delete ui;
}

Expand All @@ -228,7 +228,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
SettingsManager::setPrivateSetting(BATCH_EDITOR_SIZE_KEY, m_batchEditor->size());
SettingsManager::setPrivateSetting(BATCH_EDITOR_POSITION_KEY, m_batchEditor->pos());

QByteArray splitDisplayConfig = m_rootDisplay->getConfig();
QByteArray splitDisplayConfig = m_rootDisplay->saveState();
SettingsManager::setPrivateSetting(SPLIT_DISPLAY_CONFIG_KEY, splitDisplayConfig);

event->accept();
Expand All @@ -243,34 +243,19 @@ void MainWindow::initializeDisplays()
// Add display splits if they were saved in the config
QVariant savedConfig = SettingsManager::getPrivateSetting(SPLIT_DISPLAY_CONFIG_KEY);
if (!savedConfig.isNull() && savedConfig.canConvert<QByteArray>()) {
m_rootDisplay->applyConfig(savedConfig.toByteArray());
m_rootDisplay->restoreState(savedConfig.toByteArray());
}

setupSplitViewMenu();
}

void MainWindow::setupSplitViewMenu()
{
m_splitViewMenu->clear();

// if (m_displayWidgets.size() < 5) {
// m_splitViewMenu->addAction(
// "Add split view",
// [this]() {
// this->addDisplayGroup();
// })->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_V));
// }

// for (int i = 1; i < m_displayWidgets.size(); i++) {
// QAction *remove = m_splitViewMenu->addAction(
// QString("Remove split view %1").arg(i + 1),
// [this, i]() {
// this->removeDisplayGroup(i);
// });
// if (i == m_displayWidgets.size() - 1) {
// remove->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_X));
// }
// }
ui->menu_View->addSeparator();
auto tabShowToggle = ui->menu_View->addAction("Display Tabs", [this](bool show) {
m_rootDisplay->setShowViewSelect(show);
}, QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_V));
tabShowToggle->setCheckable(true);
tabShowToggle->setChecked(true);

ui->menu_View->addAction("Collapse All Displays", [this]() {
m_rootDisplay->unSplit();
}, QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_X));
}

void MainWindow::initializeImporterExporters()
Expand Down
4 changes: 0 additions & 4 deletions src/hobbits-gui/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,6 @@ private slots:
QPair<QString, Parameters> removal = QPair<QString, Parameters>());
void populateRecentBatchesMenu(QString addition = QString(), QString removal = QString());

void setupSplitViewMenu();

void sendBitContainerPreview();
static void processBitPreview(QSharedPointer<BitContainerPreview> preview, AbstractParameterEditor* editor);

Expand Down Expand Up @@ -132,8 +130,6 @@ private slots:
PreviewScrollBar *m_previewScroll;

BatchEditor *m_batchEditor;

QMenu *m_splitViewMenu;
};

#endif // MAINWINDOW_H
6 changes: 6 additions & 0 deletions src/hobbits-widgets/displayhandle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,12 @@ Range DisplayHandle::renderedRange(DisplayInterface *display) const
return m_renderedRangeMap.value(display);
}

void DisplayHandle::deactivate()
{
m_bitOffsetControl = nullptr;
m_frameOffsetControl = nullptr;
}

qint64 DisplayHandle::bitOffsetHover() const
{
return m_bitOffsetHover;
Expand Down
2 changes: 2 additions & 0 deletions src/hobbits-widgets/displayhandle.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class HOBBITSWIDGETSSHARED_EXPORT DisplayHandle : public QObject

Range renderedRange(DisplayInterface* display) const;

void deactivate();

Q_SIGNALS:
void newBitOffset(qint64 bitOffset);
void newFrameOffset(qint64 frameOffset);
Expand Down
58 changes: 43 additions & 15 deletions src/hobbits-widgets/displaysplitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ QPair<DisplaySplitter*, DisplaySplitter*> DisplaySplitter::takeSplitWidgets()
m_vBox->takeAt(0);

QPair<DisplaySplitter*, DisplaySplitter*> pair;
pair.first = qobject_cast<DisplaySplitter*>(m_splitter->widget(0));
pair.second = qobject_cast<DisplaySplitter*>(m_splitter->widget(1));
pair.first = split1();
pair.second = split2();

m_splitter->hide();
pair.first->setParent(nullptr);
Expand Down Expand Up @@ -119,7 +119,7 @@ void DisplaySplitter::unSplit(bool keepSecond)
pair.second->deleteLater();
}

QByteArray DisplaySplitter::getConfig() const
QByteArray DisplaySplitter::saveState() const
{
QByteArray config;
QDataStream stream(&config, QIODevice::WriteOnly);
Expand All @@ -128,21 +128,21 @@ QByteArray DisplaySplitter::getConfig() const
QByteArray splitterState = m_splitter->saveState();
stream.writeBytes(splitterState.data(), splitterState.size());

QByteArray side1 = qobject_cast<DisplaySplitter*>(m_splitter->widget(0))->getConfig();
QByteArray side1 = split1()->saveState();
stream.writeBytes(side1.data(), side1.size());

QByteArray side2 = qobject_cast<DisplaySplitter*>(m_splitter->widget(1))->getConfig();
QByteArray side2 = split2()->saveState();
stream.writeBytes(side2.data(), side2.size());
}
else {
QByteArray name = m_nonSplitWidget->activeDisplay()->name().toLatin1();
stream.writeBytes(name.data(), name.size());
QByteArray displayState = m_nonSplitWidget->saveState();
stream.writeBytes(displayState.data(), displayState.size());
}

return config;
}

QByteArray readStreamBytes(QDataStream &stream) {
QByteArray DisplaySplitter::readStreamBytes(QDataStream &stream) {
char *readBuf;
uint len;
stream.readBytes(readBuf, len);
Expand All @@ -155,7 +155,23 @@ QByteArray readStreamBytes(QDataStream &stream) {
return bytes;
}

bool DisplaySplitter::applyConfig(QByteArray config)
DisplaySplitter* DisplaySplitter::split1() const
{
if (!isSplit()) {
return nullptr;
}
return qobject_cast<DisplaySplitter*>(m_splitter->widget(0));
}

DisplaySplitter* DisplaySplitter::split2() const
{
if (!isSplit()) {
return nullptr;
}
return qobject_cast<DisplaySplitter*>(m_splitter->widget(1));
}

bool DisplaySplitter::restoreState(QByteArray config)
{
QDataStream stream(config);
bool configSplit;
Expand All @@ -175,31 +191,43 @@ bool DisplaySplitter::applyConfig(QByteArray config)
if (side1.isEmpty()) {
return false;
}
if (!qobject_cast<DisplaySplitter*>(m_splitter->widget(0))->applyConfig(side1)) {
if (!split1()->restoreState(side1)) {
return false;
}

QByteArray side2 = readStreamBytes(stream);
if (side2.isEmpty()) {
return false;
}
if (!qobject_cast<DisplaySplitter*>(m_splitter->widget(1))->applyConfig(side2)) {
if (!split2()->restoreState(side2)) {
return false;
}
}
else {
unSplit();
QByteArray nameBytes = readStreamBytes(stream);
if (nameBytes.isEmpty()) {
QByteArray displayConfig = readStreamBytes(stream);
if (displayConfig.isEmpty()) {
return false;
}
if (!m_nonSplitWidget->restoreState(displayConfig)) {
return false;
}
QString name = QString::fromLatin1(nameBytes);
m_nonSplitWidget->setActiveDisplay(name);
}

return true;
}

void DisplaySplitter::setShowViewSelect(bool show)
{
if (isSplit()) {
split1()->setShowViewSelect(show);
split2()->setShowViewSelect(show);
}
else {
m_nonSplitWidget->setShowViewSelect(show);
}
}

void DisplaySplitter::leaveEvent(QEvent *event)
{
if (m_mousePressing) {
Expand Down
11 changes: 9 additions & 2 deletions src/hobbits-widgets/displaysplitter.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ class HOBBITSWIDGETSSHARED_EXPORT DisplaySplitter : public QWidget
void split(Qt::Orientation orientation);
void unSplit(bool keepSecond = false);

QByteArray getConfig() const;
bool applyConfig(QByteArray config);
QByteArray saveState() const;
bool restoreState(QByteArray config);

void setShowViewSelect(bool show);

private:
void leaveEvent(QEvent *event) override;
Expand All @@ -35,6 +37,11 @@ class HOBBITSWIDGETSSHARED_EXPORT DisplaySplitter : public QWidget
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;

static QByteArray readStreamBytes(QDataStream &stream);

DisplaySplitter* split1() const;
DisplaySplitter* split2() const;

bool m_mousePressing;

MultiDisplayWidget* takeNonSplitWidget();
Expand Down
Loading

0 comments on commit 6e665a6

Please sign in to comment.