git repos / SagoImageBrowser

commit cbc7d22b

Poul Sander · 2026-02-24 19:23
cbc7d22be685ffff427fb0ec02667933f955bd22 patch · browse files
parent 0df01dc10f20c945f3e255dee4920180cd92a82f

Make the windows dockable

Changed files

M src/mainwindow.cpp before
M src/mainwindow.h before
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 629d88f..20e578a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp
@@ -7,7 +7,6 @@
#include <QTreeView>
#include <QListView>
#include <QLabel>
-#include <QSplitter>
#include <QStackedWidget>
#include <QDir>
#include <QComboBox>
@@ -21,6 +20,7 @@
#include <QKeyEvent>
#include <QCloseEvent>
#include <QItemSelectionModel>
+#include <QDockWidget>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
@@ -81,31 +81,29 @@ void MainWindow::setupUi()
// Preview pane (right)
m_previewLabel = new QLabel;
m_previewLabel->setAlignment(Qt::AlignCenter);
- m_previewLabel->setMinimumWidth(300);
-
- // Layout
- QSplitter *rightSplitter = new QSplitter(Qt::Horizontal);
- rightSplitter->addWidget(m_listView);
- rightSplitter->addWidget(m_previewLabel);
- rightSplitter->setStretchFactor(0, 3);
- rightSplitter->setStretchFactor(1, 2);
-
- QSplitter *mainSplitter = new QSplitter(Qt::Horizontal);
- mainSplitter->addWidget(leftPane);
- mainSplitter->addWidget(rightSplitter);
- mainSplitter->setStretchFactor(1, 1);
-
- m_browserPage = mainSplitter;
+ m_previewLabel->setMinimumWidth(200);
// Single image view
m_imageView = new ImageViewWidget;
// Stack to switch between browser and single image
m_stack = new QStackedWidget;
- m_stack->addWidget(m_browserPage);
+ m_stack->addWidget(m_listView);
m_stack->addWidget(m_imageView);
+ m_browserPage = m_listView;
setCentralWidget(m_stack);
+
+ // Dock widgets — can be dragged, floated and stacked by the user
+ m_folderDock = new QDockWidget(tr("Folders"), this);
+ m_folderDock->setObjectName("FolderDock");
+ m_folderDock->setWidget(leftPane);
+ addDockWidget(Qt::LeftDockWidgetArea, m_folderDock);
+
+ m_previewDock = new QDockWidget(tr("Preview"), this);
+ m_previewDock->setObjectName("PreviewDock");
+ m_previewDock->setWidget(m_previewLabel);
+ addDockWidget(Qt::RightDockWidgetArea, m_previewDock);
}
void MainWindow::setupMenuBar()
@@ -115,6 +113,10 @@ void MainWindow::setupMenuBar()
"QMenuBar { padding: 1px 2px; }"
"QMenuBar::item { padding: 2px 6px; }"
);
+ QMenu *viewMenu = m_menuBar->addMenu("&View");
+ viewMenu->addAction(m_folderDock->toggleViewAction());
+ viewMenu->addAction(m_previewDock->toggleViewAction());
+
QMenu *editMenu = m_menuBar->addMenu("&Edit");
QAction *preferencesAction = editMenu->addAction("&Preferences");
connect(preferencesAction, &QAction::triggered, this, &MainWindow::onPreferencesTriggered);
@@ -270,6 +272,15 @@ void MainWindow::enterSingleImageMode(const QModelIndex &index)
if (!index.isValid())
return;
+ // Only save state and hide chrome when transitioning from browse mode
+ if (m_stack->currentWidget() != m_imageView) {
+ m_folderDockWasVisible = m_folderDock->isVisible();
+ m_previewDockWasVisible = m_previewDock->isVisible();
+ m_folderDock->hide();
+ m_previewDock->hide();
+ m_menuBar->hide();
+ }
+
m_imageView->setBackgroundColor(m_backgroundColorPreference);
QString path = m_imageModel->filePath(index);
m_imageView->setImage(path);
@@ -289,6 +300,11 @@ void MainWindow::leaveSingleImageMode()
setFullScreenMode(false);
}
m_stack->setCurrentWidget(m_browserPage);
+ m_menuBar->show();
+ if (m_folderDockWasVisible)
+ m_folderDock->show();
+ if (m_previewDockWasVisible)
+ m_previewDock->show();
m_listView->setFocus();
}
@@ -302,7 +318,9 @@ void MainWindow::setFullScreenMode(bool fullScreen)
m_menuBar->hide();
showFullScreen();
} else {
- m_menuBar->show();
+ // Only restore menu bar when returning to browse mode
+ if (m_stack->currentWidget() != m_imageView)
+ m_menuBar->show();
if (m_wasMaximized)
showMaximized();
else
@@ -356,12 +374,18 @@ void MainWindow::loadPreferences()
QSettings settings("SagoImageBrowser", "SagoImageBrowser");
m_backgroundColorPreference = settings.value("backgroundColor", "black").toString();
m_imageView->setBackgroundColor(m_backgroundColorPreference);
+ if (settings.contains("windowGeometry"))
+ restoreGeometry(settings.value("windowGeometry").toByteArray());
+ if (settings.contains("windowState"))
+ restoreState(settings.value("windowState").toByteArray());
}
void MainWindow::savePreferences()
{
QSettings settings("SagoImageBrowser", "SagoImageBrowser");
settings.setValue("backgroundColor", m_backgroundColorPreference);
+ settings.setValue("windowGeometry", saveGeometry());
+ settings.setValue("windowState", saveState());
}
void MainWindow::onPreferencesTriggered()
diff --git a/src/mainwindow.h b/src/mainwindow.h index eccee46..e910759 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h
@@ -7,6 +7,7 @@ class QListView;
class QLabel;
class QStackedWidget;
class QMenuBar;
+class QDockWidget;
class QFileSystemModel;
class QComboBox;
class ImageModel;
@@ -54,4 +55,9 @@ private:
bool m_wasMaximized = false;
bool m_imageViewWasFullScreen = false;
QString m_previousFolderPath;
- QMenuBar *m_menuBar = nullptr;};
\ No newline at end of file
+ QMenuBar *m_menuBar = nullptr;
+ QDockWidget *m_folderDock = nullptr;
+ QDockWidget *m_previewDock = nullptr;
+ bool m_folderDockWasVisible = true;
+ bool m_previewDockWasVisible = true;
+};
\ No newline at end of file