git repos / SagoImageBrowser

blame: src/mainwindow.cpp

normal view · raw

032aa1e1 Poul Sander 2026-02-19 18:55 1
#include "mainwindow.h"
032aa1e1 Poul Sander 2026-02-19 18:55 2
#include "imagemodel.h"
61136b77 Poul Sander 2026-02-20 22:45 3
#include "imageviewwidget.h"
f61bf886 Poul Sander 2026-02-23 19:27 4
#include "preferencesdialog.h"
ac476ca8 Poul Sander 2026-05-18 16:47 5
#include "thumbnailcache.h"
032aa1e1 Poul Sander 2026-02-19 18:55 6
032aa1e1 Poul Sander 2026-02-19 18:55 7
#include <QFileSystemModel>
032aa1e1 Poul Sander 2026-02-19 18:55 8
#include <QTreeView>
032aa1e1 Poul Sander 2026-02-19 18:55 9
#include <QListView>
032aa1e1 Poul Sander 2026-02-19 18:55 10
#include <QLabel>
61136b77 Poul Sander 2026-02-20 22:45 11
#include <QStackedWidget>
032aa1e1 Poul Sander 2026-02-19 18:55 12
#include <QDir>
3bee3e3e Poul Sander 2026-03-05 17:07 13
#include <QListWidget>
fc5f2e27 Poul Sander 2026-02-22 22:06 14
#include <QStandardPaths>
032aa1e1 Poul Sander 2026-02-19 18:55 15
#include <QImageReader>
032aa1e1 Poul Sander 2026-02-19 18:55 16
#include <QHeaderView>
6fcd6c90 Poul Sander 2026-02-19 21:12 17
#include <QScrollBar>
6fcd6c90 Poul Sander 2026-02-19 21:12 18
#include <QTimer>
6fcd6c90 Poul Sander 2026-02-19 21:12 19
#include <QEvent>
61136b77 Poul Sander 2026-02-20 22:45 20
#include <QKeyEvent>
c9e5684a Poul Sander 2026-02-23 19:18 21
#include <QCloseEvent>
cfe4a67b Poul Sander 2026-02-19 23:06 22
#include <QItemSelectionModel>
cbc7d22b Poul Sander 2026-02-24 19:23 23
#include <QDockWidget>
f61bf886 Poul Sander 2026-02-23 19:27 24
#include <QMenuBar>
f61bf886 Poul Sander 2026-02-23 19:27 25
#include <QMenu>
f61bf886 Poul Sander 2026-02-23 19:27 26
#include <QAction>
f61bf886 Poul Sander 2026-02-23 19:27 27
#include <QSettings>
6fcd6c90 Poul Sander 2026-02-19 21:12 28
#include <iostream>
032aa1e1 Poul Sander 2026-02-19 18:55 29
ac476ca8 Poul Sander 2026-05-18 16:47 30
namespace
ac476ca8 Poul Sander 2026-05-18 16:47 31
{
ac476ca8 Poul Sander 2026-05-18 16:47 32
ThumbnailCache::Size thumbnailSizeFromString(const QString &s)
ac476ca8 Poul Sander 2026-05-18 16:47 33
{
ac476ca8 Poul Sander 2026-05-18 16:47 34
    return (s == "large") ? ThumbnailCache::Size::Large
ac476ca8 Poul Sander 2026-05-18 16:47 35
                          : ThumbnailCache::Size::Normal;
ac476ca8 Poul Sander 2026-05-18 16:47 36
}
ac476ca8 Poul Sander 2026-05-18 16:47 37
} // namespace
ac476ca8 Poul Sander 2026-05-18 16:47 38
032aa1e1 Poul Sander 2026-02-19 18:55 39
MainWindow::MainWindow(QWidget *parent)
032aa1e1 Poul Sander 2026-02-19 18:55 40
    : QMainWindow(parent)
032aa1e1 Poul Sander 2026-02-19 18:55 41
{
032aa1e1 Poul Sander 2026-02-19 18:55 42
    setupUi();
f61bf886 Poul Sander 2026-02-23 19:27 43
    setupMenuBar();
032aa1e1 Poul Sander 2026-02-19 18:55 44
    setupConnections();
f61bf886 Poul Sander 2026-02-23 19:27 45
    loadPreferences();
032aa1e1 Poul Sander 2026-02-19 18:55 46
}
032aa1e1 Poul Sander 2026-02-19 18:55 47
032aa1e1 Poul Sander 2026-02-19 18:55 48
void MainWindow::setupUi()
032aa1e1 Poul Sander 2026-02-19 18:55 49
{
032aa1e1 Poul Sander 2026-02-19 18:55 50
    // Folder model (left pane)
032aa1e1 Poul Sander 2026-02-19 18:55 51
    m_dirModel = new QFileSystemModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 52
    m_dirModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
032aa1e1 Poul Sander 2026-02-19 18:55 53
    m_dirModel->setRootPath(QDir::homePath());
032aa1e1 Poul Sander 2026-02-19 18:55 54
3bee3e3e Poul Sander 2026-03-05 17:07 55
    // Root chooser list
3bee3e3e Poul Sander 2026-03-05 17:07 56
    m_rootList = new QListWidget;
3bee3e3e Poul Sander 2026-03-05 17:07 57
    m_rootList->setSelectionMode(QAbstractItemView::SingleSelection);
3bee3e3e Poul Sander 2026-03-05 17:07 58
3bee3e3e Poul Sander 2026-03-05 17:07 59
    auto addRootItem = [this](const QString &label, const QString &path) {
3bee3e3e Poul Sander 2026-03-05 17:07 60
        QListWidgetItem *item = new QListWidgetItem(label, m_rootList);
3bee3e3e Poul Sander 2026-03-05 17:07 61
        item->setData(Qt::UserRole, path);
3bee3e3e Poul Sander 2026-03-05 17:07 62
    };
3bee3e3e Poul Sander 2026-03-05 17:07 63
    addRootItem("Home", QDir::homePath());
3bee3e3e Poul Sander 2026-03-05 17:07 64
    addRootItem("Pictures", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
3bee3e3e Poul Sander 2026-03-05 17:07 65
    addRootItem("File System", QDir::rootPath());
3bee3e3e Poul Sander 2026-03-05 17:07 66
    m_rootList->setCurrentRow(0);
fc5f2e27 Poul Sander 2026-02-22 22:06 67
032aa1e1 Poul Sander 2026-02-19 18:55 68
    m_treeView = new QTreeView;
032aa1e1 Poul Sander 2026-02-19 18:55 69
    m_treeView->setModel(m_dirModel);
032aa1e1 Poul Sander 2026-02-19 18:55 70
    m_treeView->setRootIndex(m_dirModel->index(QDir::homePath()));
032aa1e1 Poul Sander 2026-02-19 18:55 71
    m_treeView->header()->hide();
032aa1e1 Poul Sander 2026-02-19 18:55 72
    m_treeView->setColumnHidden(1, true);
032aa1e1 Poul Sander 2026-02-19 18:55 73
    m_treeView->setColumnHidden(2, true);
032aa1e1 Poul Sander 2026-02-19 18:55 74
    m_treeView->setColumnHidden(3, true);
032aa1e1 Poul Sander 2026-02-19 18:55 75
032aa1e1 Poul Sander 2026-02-19 18:55 76
    // Thumbnail model (center pane)
032aa1e1 Poul Sander 2026-02-19 18:55 77
    m_imageModel = new ImageModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 78
032aa1e1 Poul Sander 2026-02-19 18:55 79
    m_listView = new QListView;
032aa1e1 Poul Sander 2026-02-19 18:55 80
    m_listView->setModel(m_imageModel);
032aa1e1 Poul Sander 2026-02-19 18:55 81
    m_listView->setViewMode(QListView::IconMode);
032aa1e1 Poul Sander 2026-02-19 18:55 82
    m_listView->setIconSize(QSize(128, 128));
b614a581 Poul Sander 2026-02-19 21:18 83
    m_listView->setGridSize(QSize(148, 168));
032aa1e1 Poul Sander 2026-02-19 18:55 84
    m_listView->setResizeMode(QListView::Adjust);
032aa1e1 Poul Sander 2026-02-19 18:55 85
    m_listView->setSelectionMode(QAbstractItemView::SingleSelection);
b614a581 Poul Sander 2026-02-19 21:18 86
    m_listView->setSpacing(4);
b614a581 Poul Sander 2026-02-19 21:18 87
    m_listView->setWordWrap(true);
b614a581 Poul Sander 2026-02-19 21:18 88
    m_listView->setTextElideMode(Qt::ElideRight);
032aa1e1 Poul Sander 2026-02-19 18:55 89
032aa1e1 Poul Sander 2026-02-19 18:55 90
    // Preview pane (right)
032aa1e1 Poul Sander 2026-02-19 18:55 91
    m_previewLabel = new QLabel;
032aa1e1 Poul Sander 2026-02-19 18:55 92
    m_previewLabel->setAlignment(Qt::AlignCenter);
cbc7d22b Poul Sander 2026-02-24 19:23 93
    m_previewLabel->setMinimumWidth(200);
61136b77 Poul Sander 2026-02-20 22:45 94
61136b77 Poul Sander 2026-02-20 22:45 95
    // Single image view
61136b77 Poul Sander 2026-02-20 22:45 96
    m_imageView = new ImageViewWidget;
61136b77 Poul Sander 2026-02-20 22:45 97
61136b77 Poul Sander 2026-02-20 22:45 98
    // Stack to switch between browser and single image
61136b77 Poul Sander 2026-02-20 22:45 99
    m_stack = new QStackedWidget;
cbc7d22b Poul Sander 2026-02-24 19:23 100
    m_stack->addWidget(m_listView);
61136b77 Poul Sander 2026-02-20 22:45 101
    m_stack->addWidget(m_imageView);
cbc7d22b Poul Sander 2026-02-24 19:23 102
    m_browserPage = m_listView;
61136b77 Poul Sander 2026-02-20 22:45 103
61136b77 Poul Sander 2026-02-20 22:45 104
    setCentralWidget(m_stack);
cbc7d22b Poul Sander 2026-02-24 19:23 105
cbc7d22b Poul Sander 2026-02-24 19:23 106
    // Dock widgets — can be dragged, floated and stacked by the user
3bee3e3e Poul Sander 2026-03-05 17:07 107
    m_rootDock = new QDockWidget(tr("Roots"), this);
3bee3e3e Poul Sander 2026-03-05 17:07 108
    m_rootDock->setObjectName("RootDock");
3bee3e3e Poul Sander 2026-03-05 17:07 109
    m_rootDock->setWidget(m_rootList);
3bee3e3e Poul Sander 2026-03-05 17:07 110
    addDockWidget(Qt::LeftDockWidgetArea, m_rootDock);
3bee3e3e Poul Sander 2026-03-05 17:07 111
cbc7d22b Poul Sander 2026-02-24 19:23 112
    m_folderDock = new QDockWidget(tr("Folders"), this);
cbc7d22b Poul Sander 2026-02-24 19:23 113
    m_folderDock->setObjectName("FolderDock");
3bee3e3e Poul Sander 2026-03-05 17:07 114
    m_folderDock->setWidget(m_treeView);
cbc7d22b Poul Sander 2026-02-24 19:23 115
    addDockWidget(Qt::LeftDockWidgetArea, m_folderDock);
3bee3e3e Poul Sander 2026-03-05 17:07 116
    splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical);
cbc7d22b Poul Sander 2026-02-24 19:23 117
cbc7d22b Poul Sander 2026-02-24 19:23 118
    m_previewDock = new QDockWidget(tr("Preview"), this);
cbc7d22b Poul Sander 2026-02-24 19:23 119
    m_previewDock->setObjectName("PreviewDock");
cbc7d22b Poul Sander 2026-02-24 19:23 120
    m_previewDock->setWidget(m_previewLabel);
cbc7d22b Poul Sander 2026-02-24 19:23 121
    addDockWidget(Qt::RightDockWidgetArea, m_previewDock);
032aa1e1 Poul Sander 2026-02-19 18:55 122
}
032aa1e1 Poul Sander 2026-02-19 18:55 123
f61bf886 Poul Sander 2026-02-23 19:27 124
void MainWindow::setupMenuBar()
f61bf886 Poul Sander 2026-02-23 19:27 125
{
ccb726b8 Poul Sander 2026-02-23 22:43 126
    m_menuBar = menuBar();
0df01dc1 Poul Sander 2026-02-24 18:51 127
    m_menuBar->setStyleSheet(
0df01dc1 Poul Sander 2026-02-24 18:51 128
        "QMenuBar { padding: 1px 2px; }"
0df01dc1 Poul Sander 2026-02-24 18:51 129
        "QMenuBar::item { padding: 2px 6px; }"
0df01dc1 Poul Sander 2026-02-24 18:51 130
    );
cbc7d22b Poul Sander 2026-02-24 19:23 131
    QMenu *viewMenu = m_menuBar->addMenu("&View");
3bee3e3e Poul Sander 2026-03-05 17:07 132
    viewMenu->addAction(m_rootDock->toggleViewAction());
cbc7d22b Poul Sander 2026-02-24 19:23 133
    viewMenu->addAction(m_folderDock->toggleViewAction());
cbc7d22b Poul Sander 2026-02-24 19:23 134
    viewMenu->addAction(m_previewDock->toggleViewAction());
cbc7d22b Poul Sander 2026-02-24 19:23 135
ccb726b8 Poul Sander 2026-02-23 22:43 136
    QMenu *editMenu = m_menuBar->addMenu("&Edit");
f61bf886 Poul Sander 2026-02-23 19:27 137
    QAction *preferencesAction = editMenu->addAction("&Preferences");
f61bf886 Poul Sander 2026-02-23 19:27 138
    connect(preferencesAction, &QAction::triggered, this, &MainWindow::onPreferencesTriggered);
f61bf886 Poul Sander 2026-02-23 19:27 139
}
f61bf886 Poul Sander 2026-02-23 19:27 140
665ac308 Poul Sander 2026-02-23 19:34 141
void MainWindow::navigateToFolder(const QString &path)
665ac308 Poul Sander 2026-02-23 19:34 142
{
665ac308 Poul Sander 2026-02-23 19:34 143
    m_previousFolderPath = m_imageModel->currentDirectory();
665ac308 Poul Sander 2026-02-23 19:34 144
    m_imageModel->setDirectory(path);
665ac308 Poul Sander 2026-02-23 19:34 145
    QModelIndex dirIdx = m_dirModel->index(path);
665ac308 Poul Sander 2026-02-23 19:34 146
    if (dirIdx.isValid())
665ac308 Poul Sander 2026-02-23 19:34 147
        m_treeView->setCurrentIndex(dirIdx);
665ac308 Poul Sander 2026-02-23 19:34 148
    QTimer::singleShot(0, this, [this]() {
665ac308 Poul Sander 2026-02-23 19:34 149
        selectPreviousFolderIfExists();
665ac308 Poul Sander 2026-02-23 19:34 150
        loadVisibleThumbnails();
665ac308 Poul Sander 2026-02-23 19:34 151
    });
665ac308 Poul Sander 2026-02-23 19:34 152
}
665ac308 Poul Sander 2026-02-23 19:34 153
665ac308 Poul Sander 2026-02-23 19:34 154
void MainWindow::selectPreviousFolderIfExists()
665ac308 Poul Sander 2026-02-23 19:34 155
{
665ac308 Poul Sander 2026-02-23 19:34 156
    if (m_previousFolderPath.isEmpty())
665ac308 Poul Sander 2026-02-23 19:34 157
        return;
665ac308 Poul Sander 2026-02-23 19:34 158
665ac308 Poul Sander 2026-02-23 19:34 159
    // Find the previous folder in the current directory's contents
665ac308 Poul Sander 2026-02-23 19:34 160
    for (int i = 0; i < m_imageModel->rowCount(); ++i) {
665ac308 Poul Sander 2026-02-23 19:34 161
        QModelIndex idx = m_imageModel->index(i);
665ac308 Poul Sander 2026-02-23 19:34 162
        if (m_imageModel->isFolder(idx)) {
665ac308 Poul Sander 2026-02-23 19:34 163
            QString folderPath = m_imageModel->filePath(idx);
665ac308 Poul Sander 2026-02-23 19:34 164
            if (folderPath == m_previousFolderPath) {
665ac308 Poul Sander 2026-02-23 19:34 165
                m_listView->setCurrentIndex(idx);
665ac308 Poul Sander 2026-02-23 19:34 166
                m_listView->scrollTo(idx);
665ac308 Poul Sander 2026-02-23 19:34 167
                return;
665ac308 Poul Sander 2026-02-23 19:34 168
            }
665ac308 Poul Sander 2026-02-23 19:34 169
        }
665ac308 Poul Sander 2026-02-23 19:34 170
    }
665ac308 Poul Sander 2026-02-23 19:34 171
}
665ac308 Poul Sander 2026-02-23 19:34 172
032aa1e1 Poul Sander 2026-02-19 18:55 173
void MainWindow::setupConnections()
032aa1e1 Poul Sander 2026-02-19 18:55 174
{
3bee3e3e Poul Sander 2026-03-05 17:07 175
    connect(m_rootList, &QListWidget::currentItemChanged, this,
3bee3e3e Poul Sander 2026-03-05 17:07 176
            [this](QListWidgetItem *current, QListWidgetItem *) {
3bee3e3e Poul Sander 2026-03-05 17:07 177
                if (current == nullptr)
3bee3e3e Poul Sander 2026-03-05 17:07 178
                    return;
3bee3e3e Poul Sander 2026-03-05 17:07 179
3bee3e3e Poul Sander 2026-03-05 17:07 180
                QString rootPath = current->data(Qt::UserRole).toString();
fc5f2e27 Poul Sander 2026-02-22 22:06 181
                m_dirModel->setRootPath(rootPath);
fc5f2e27 Poul Sander 2026-02-22 22:06 182
                m_treeView->setRootIndex(m_dirModel->index(rootPath));
fc5f2e27 Poul Sander 2026-02-22 22:06 183
            });
fc5f2e27 Poul Sander 2026-02-22 22:06 184
032aa1e1 Poul Sander 2026-02-19 18:55 185
    connect(m_treeView, &QTreeView::clicked, this,
032aa1e1 Poul Sander 2026-02-19 18:55 186
            [this](const QModelIndex &index)
6fcd6c90 Poul Sander 2026-02-19 21:12 187
            {
6fcd6c90 Poul Sander 2026-02-19 21:12 188
                QString path = m_dirModel->filePath(index);
665ac308 Poul Sander 2026-02-23 19:34 189
                navigateToFolder(path);
6fcd6c90 Poul Sander 2026-02-19 21:12 190
            });
032aa1e1 Poul Sander 2026-02-19 18:55 191
032aa1e1 Poul Sander 2026-02-19 18:55 192
    connect(m_listView, &QListView::clicked, this,
cfe4a67b Poul Sander 2026-02-19 23:06 193
            [this](const QModelIndex &index) { showPreview(index); });
6fcd6c90 Poul Sander 2026-02-19 21:12 194
cfe4a67b Poul Sander 2026-02-19 23:06 195
    connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged,
cfe4a67b Poul Sander 2026-02-19 23:06 196
            this, [this](const QModelIndex &current) { showPreview(current); });
6fcd6c90 Poul Sander 2026-02-19 21:12 197
61136b77 Poul Sander 2026-02-20 22:45 198
    connect(m_listView, &QListView::doubleClicked, this,
09130ab9 Poul Sander 2026-02-22 22:19 199
            [this](const QModelIndex &index) {
09130ab9 Poul Sander 2026-02-22 22:19 200
                if (m_imageModel->isFolder(index)) {
09130ab9 Poul Sander 2026-02-22 22:19 201
                    QString path = m_imageModel->filePath(index);
665ac308 Poul Sander 2026-02-23 19:34 202
                    navigateToFolder(path);
09130ab9 Poul Sander 2026-02-22 22:19 203
                } else {
09130ab9 Poul Sander 2026-02-22 22:19 204
                    enterSingleImageMode(index);
09130ab9 Poul Sander 2026-02-22 22:19 205
                }
09130ab9 Poul Sander 2026-02-22 22:19 206
            });
61136b77 Poul Sander 2026-02-20 22:45 207
61136b77 Poul Sander 2026-02-20 22:45 208
    connect(m_imageView, &ImageViewWidget::closeRequested,
61136b77 Poul Sander 2026-02-20 22:45 209
            this, &MainWindow::leaveSingleImageMode);
61136b77 Poul Sander 2026-02-20 22:45 210
1ffc1962 Poul Sander 2026-02-20 23:41 211
    connect(m_imageView, &ImageViewWidget::nextRequested, this, [this]() {
1ffc1962 Poul Sander 2026-02-20 23:41 212
        QModelIndex cur = m_listView->currentIndex();
1ffc1962 Poul Sander 2026-02-20 23:41 213
        int next = cur.isValid() ? cur.row() + 1 : 0;
09130ab9 Poul Sander 2026-02-22 22:19 214
        while (next < m_imageModel->rowCount() && m_imageModel->isFolder(m_imageModel->index(next)))
09130ab9 Poul Sander 2026-02-22 22:19 215
            ++next;
1ffc1962 Poul Sander 2026-02-20 23:41 216
        if (next < m_imageModel->rowCount())
1ffc1962 Poul Sander 2026-02-20 23:41 217
        {
1ffc1962 Poul Sander 2026-02-20 23:41 218
            QModelIndex idx = m_imageModel->index(next);
1ffc1962 Poul Sander 2026-02-20 23:41 219
            m_listView->setCurrentIndex(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 220
            enterSingleImageMode(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 221
        }
1ffc1962 Poul Sander 2026-02-20 23:41 222
    });
1ffc1962 Poul Sander 2026-02-20 23:41 223
1ffc1962 Poul Sander 2026-02-20 23:41 224
    connect(m_imageView, &ImageViewWidget::previousRequested, this, [this]() {
1ffc1962 Poul Sander 2026-02-20 23:41 225
        QModelIndex cur = m_listView->currentIndex();
1ffc1962 Poul Sander 2026-02-20 23:41 226
        int prev = cur.isValid() ? cur.row() - 1 : 0;
09130ab9 Poul Sander 2026-02-22 22:19 227
        while (prev >= 0 && m_imageModel->isFolder(m_imageModel->index(prev)))
09130ab9 Poul Sander 2026-02-22 22:19 228
            --prev;
1ffc1962 Poul Sander 2026-02-20 23:41 229
        if (prev >= 0)
1ffc1962 Poul Sander 2026-02-20 23:41 230
        {
1ffc1962 Poul Sander 2026-02-20 23:41 231
            QModelIndex idx = m_imageModel->index(prev);
1ffc1962 Poul Sander 2026-02-20 23:41 232
            m_listView->setCurrentIndex(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 233
            enterSingleImageMode(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 234
        }
1ffc1962 Poul Sander 2026-02-20 23:41 235
    });
1ffc1962 Poul Sander 2026-02-20 23:41 236
6fcd6c90 Poul Sander 2026-02-19 21:12 237
    connect(m_listView->verticalScrollBar(), &QScrollBar::valueChanged,
6fcd6c90 Poul Sander 2026-02-19 21:12 238
            this, [this]()
6fcd6c90 Poul Sander 2026-02-19 21:12 239
            { loadVisibleThumbnails(); });
6fcd6c90 Poul Sander 2026-02-19 21:12 240
6fcd6c90 Poul Sander 2026-02-19 21:12 241
    // Also catch resize — visible range changes when the viewport is resized
6fcd6c90 Poul Sander 2026-02-19 21:12 242
    m_listView->viewport()->installEventFilter(this);
6fcd6c90 Poul Sander 2026-02-19 21:12 243
}
6fcd6c90 Poul Sander 2026-02-19 21:12 244
6fcd6c90 Poul Sander 2026-02-19 21:12 245
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
6fcd6c90 Poul Sander 2026-02-19 21:12 246
{
6fcd6c90 Poul Sander 2026-02-19 21:12 247
    if (obj == m_listView->viewport() && event->type() == QEvent::Resize)
6fcd6c90 Poul Sander 2026-02-19 21:12 248
        QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails);
6fcd6c90 Poul Sander 2026-02-19 21:12 249
6fcd6c90 Poul Sander 2026-02-19 21:12 250
    return QMainWindow::eventFilter(obj, event);
6fcd6c90 Poul Sander 2026-02-19 21:12 251
}
6fcd6c90 Poul Sander 2026-02-19 21:12 252
6fcd6c90 Poul Sander 2026-02-19 21:12 253
void MainWindow::loadVisibleThumbnails()
6fcd6c90 Poul Sander 2026-02-19 21:12 254
{
6fcd6c90 Poul Sander 2026-02-19 21:12 255
    QModelIndex topLeft = m_listView->indexAt(QPoint(0, 0));
6fcd6c90 Poul Sander 2026-02-19 21:12 256
    QModelIndex bottomRight = m_listView->indexAt(
6fcd6c90 Poul Sander 2026-02-19 21:12 257
        QPoint(m_listView->viewport()->width() - 1,
6fcd6c90 Poul Sander 2026-02-19 21:12 258
               m_listView->viewport()->height() - 1));
6fcd6c90 Poul Sander 2026-02-19 21:12 259
6fcd6c90 Poul Sander 2026-02-19 21:12 260
    int first = topLeft.isValid() ? topLeft.row() : 0;
6fcd6c90 Poul Sander 2026-02-19 21:12 261
    int last = bottomRight.isValid() ? bottomRight.row()
6fcd6c90 Poul Sander 2026-02-19 21:12 262
                                     : m_imageModel->rowCount() - 1;
6fcd6c90 Poul Sander 2026-02-19 21:12 263
6fcd6c90 Poul Sander 2026-02-19 21:12 264
    if (last < 0)
6fcd6c90 Poul Sander 2026-02-19 21:12 265
        return;
6fcd6c90 Poul Sander 2026-02-19 21:12 266
6fcd6c90 Poul Sander 2026-02-19 21:12 267
    std::cout << "loadVisibleThumbnails: " << first << " - " << last << "\n";
6fcd6c90 Poul Sander 2026-02-19 21:12 268
    m_imageModel->requestThumbnails(first, last);
032aa1e1 Poul Sander 2026-02-19 18:55 269
}
cfe4a67b Poul Sander 2026-02-19 23:06 270
cfe4a67b Poul Sander 2026-02-19 23:06 271
void MainWindow::showPreview(const QModelIndex &index)
cfe4a67b Poul Sander 2026-02-19 23:06 272
{
cfe4a67b Poul Sander 2026-02-19 23:06 273
    if (!index.isValid())
cfe4a67b Poul Sander 2026-02-19 23:06 274
        return;
cfe4a67b Poul Sander 2026-02-19 23:06 275
cfe4a67b Poul Sander 2026-02-19 23:06 276
    QString path = m_imageModel->filePath(index);
cfe4a67b Poul Sander 2026-02-19 23:06 277
cfe4a67b Poul Sander 2026-02-19 23:06 278
    QImageReader reader(path);
cfe4a67b Poul Sander 2026-02-19 23:06 279
    reader.setAutoTransform(true);
7889168c Poul Sander 2026-02-26 18:27 280
    // Scale during decoding for the preview to avoid the 128 MB allocation limit
7889168c Poul Sander 2026-02-26 18:27 281
    QSize fullSize = reader.size();
7889168c Poul Sander 2026-02-26 18:27 282
    if (fullSize.isValid()) {
7889168c Poul Sander 2026-02-26 18:27 283
        QSize target = fullSize.scaled(m_previewLabel->size(), Qt::KeepAspectRatio);
7889168c Poul Sander 2026-02-26 18:27 284
        reader.setScaledSize(target);
7889168c Poul Sander 2026-02-26 18:27 285
    }
cfe4a67b Poul Sander 2026-02-19 23:06 286
    QImage image = reader.read();
cfe4a67b Poul Sander 2026-02-19 23:06 287
cfe4a67b Poul Sander 2026-02-19 23:06 288
    m_previewLabel->setPixmap(
cfe4a67b Poul Sander 2026-02-19 23:06 289
        QPixmap::fromImage(image).scaled(
cfe4a67b Poul Sander 2026-02-19 23:06 290
            m_previewLabel->size(),
cfe4a67b Poul Sander 2026-02-19 23:06 291
            Qt::KeepAspectRatio,
cfe4a67b Poul Sander 2026-02-19 23:06 292
            Qt::SmoothTransformation));
cfe4a67b Poul Sander 2026-02-19 23:06 293
}
61136b77 Poul Sander 2026-02-20 22:45 294
61136b77 Poul Sander 2026-02-20 22:45 295
void MainWindow::enterSingleImageMode(const QModelIndex &index)
61136b77 Poul Sander 2026-02-20 22:45 296
{
61136b77 Poul Sander 2026-02-20 22:45 297
    if (!index.isValid())
61136b77 Poul Sander 2026-02-20 22:45 298
        return;
61136b77 Poul Sander 2026-02-20 22:45 299
cbc7d22b Poul Sander 2026-02-24 19:23 300
    // Only save state and hide chrome when transitioning from browse mode
cbc7d22b Poul Sander 2026-02-24 19:23 301
    if (m_stack->currentWidget() != m_imageView) {
3bee3e3e Poul Sander 2026-03-05 17:07 302
        m_rootDockWasVisible = m_rootDock->isVisible();
cbc7d22b Poul Sander 2026-02-24 19:23 303
        m_folderDockWasVisible = m_folderDock->isVisible();
cbc7d22b Poul Sander 2026-02-24 19:23 304
        m_previewDockWasVisible = m_previewDock->isVisible();
3bee3e3e Poul Sander 2026-03-05 17:07 305
        m_rootDock->hide();
cbc7d22b Poul Sander 2026-02-24 19:23 306
        m_folderDock->hide();
cbc7d22b Poul Sander 2026-02-24 19:23 307
        m_previewDock->hide();
cbc7d22b Poul Sander 2026-02-24 19:23 308
        m_menuBar->hide();
cbc7d22b Poul Sander 2026-02-24 19:23 309
    }
cbc7d22b Poul Sander 2026-02-24 19:23 310
f61bf886 Poul Sander 2026-02-23 19:27 311
    m_imageView->setBackgroundColor(m_backgroundColorPreference);
61136b77 Poul Sander 2026-02-20 22:45 312
    QString path = m_imageModel->filePath(index);
58103277 Poul Sander 2026-03-01 22:53 313
    m_imageView->setNeighborPaths(computeNeighborPaths(index));
61136b77 Poul Sander 2026-02-20 22:45 314
    m_imageView->setImage(path);
61136b77 Poul Sander 2026-02-20 22:45 315
    m_stack->setCurrentWidget(m_imageView);
61136b77 Poul Sander 2026-02-20 22:45 316
    m_imageView->setFocus();
ccb726b8 Poul Sander 2026-02-23 22:43 317
ccb726b8 Poul Sander 2026-02-23 22:43 318
    if (m_imageViewWasFullScreen) {
ccb726b8 Poul Sander 2026-02-23 22:43 319
        setFullScreenMode(true);
ccb726b8 Poul Sander 2026-02-23 22:43 320
        m_imageViewWasFullScreen = false;
ccb726b8 Poul Sander 2026-02-23 22:43 321
    }
61136b77 Poul Sander 2026-02-20 22:45 322
}
61136b77 Poul Sander 2026-02-20 22:45 323
61136b77 Poul Sander 2026-02-20 22:45 324
void MainWindow::leaveSingleImageMode()
61136b77 Poul Sander 2026-02-20 22:45 325
{
3968465e Poul Sander 2026-02-23 19:13 326
    if (isFullScreen()) {
ccb726b8 Poul Sander 2026-02-23 22:43 327
        m_imageViewWasFullScreen = true;
ccb726b8 Poul Sander 2026-02-23 22:43 328
        setFullScreenMode(false);
61136b77 Poul Sander 2026-02-20 22:45 329
    }
58103277 Poul Sander 2026-03-01 22:53 330
    m_imageView->clearCache();
61136b77 Poul Sander 2026-02-20 22:45 331
    m_stack->setCurrentWidget(m_browserPage);
cbc7d22b Poul Sander 2026-02-24 19:23 332
    m_menuBar->show();
3bee3e3e Poul Sander 2026-03-05 17:07 333
    if (m_rootDockWasVisible)
3bee3e3e Poul Sander 2026-03-05 17:07 334
        m_rootDock->show();
cbc7d22b Poul Sander 2026-02-24 19:23 335
    if (m_folderDockWasVisible)
cbc7d22b Poul Sander 2026-02-24 19:23 336
        m_folderDock->show();
cbc7d22b Poul Sander 2026-02-24 19:23 337
    if (m_previewDockWasVisible)
cbc7d22b Poul Sander 2026-02-24 19:23 338
        m_previewDock->show();
61136b77 Poul Sander 2026-02-20 22:45 339
    m_listView->setFocus();
61136b77 Poul Sander 2026-02-20 22:45 340
}
61136b77 Poul Sander 2026-02-20 22:45 341
58103277 Poul Sander 2026-03-01 22:53 342
QStringList MainWindow::computeNeighborPaths(const QModelIndex &index) const
58103277 Poul Sander 2026-03-01 22:53 343
{
58103277 Poul Sander 2026-03-01 22:53 344
    QStringList paths;
58103277 Poul Sander 2026-03-01 22:53 345
    int row = index.row();
58103277 Poul Sander 2026-03-01 22:53 346
58103277 Poul Sander 2026-03-01 22:53 347
    // Collect up to CacheKeepBehind non-folder images before current
58103277 Poul Sander 2026-03-01 22:53 348
    int count = 0;
58103277 Poul Sander 2026-03-01 22:53 349
    for (int i = row - 1; i >= 0 && count < ImageViewWidget::CacheKeepBehind; --i) {
58103277 Poul Sander 2026-03-01 22:53 350
        QModelIndex idx = m_imageModel->index(i);
58103277 Poul Sander 2026-03-01 22:53 351
        if (!m_imageModel->isFolder(idx)) {
58103277 Poul Sander 2026-03-01 22:53 352
            paths.prepend(m_imageModel->filePath(idx));
58103277 Poul Sander 2026-03-01 22:53 353
            ++count;
58103277 Poul Sander 2026-03-01 22:53 354
        }
58103277 Poul Sander 2026-03-01 22:53 355
    }
58103277 Poul Sander 2026-03-01 22:53 356
58103277 Poul Sander 2026-03-01 22:53 357
    // Collect up to CacheReadAhead non-folder images after current
58103277 Poul Sander 2026-03-01 22:53 358
    count = 0;
58103277 Poul Sander 2026-03-01 22:53 359
    for (int i = row + 1; i < m_imageModel->rowCount() && count < ImageViewWidget::CacheReadAhead; ++i) {
58103277 Poul Sander 2026-03-01 22:53 360
        QModelIndex idx = m_imageModel->index(i);
58103277 Poul Sander 2026-03-01 22:53 361
        if (!m_imageModel->isFolder(idx)) {
58103277 Poul Sander 2026-03-01 22:53 362
            paths.append(m_imageModel->filePath(idx));
58103277 Poul Sander 2026-03-01 22:53 363
            ++count;
58103277 Poul Sander 2026-03-01 22:53 364
        }
58103277 Poul Sander 2026-03-01 22:53 365
    }
58103277 Poul Sander 2026-03-01 22:53 366
58103277 Poul Sander 2026-03-01 22:53 367
    return paths;
58103277 Poul Sander 2026-03-01 22:53 368
}
58103277 Poul Sander 2026-03-01 22:53 369
ccb726b8 Poul Sander 2026-02-23 22:43 370
void MainWindow::setFullScreenMode(bool fullScreen)
ccb726b8 Poul Sander 2026-02-23 22:43 371
{
ccb726b8 Poul Sander 2026-02-23 22:43 372
    if (fullScreen == isFullScreen())
ccb726b8 Poul Sander 2026-02-23 22:43 373
        return;
ccb726b8 Poul Sander 2026-02-23 22:43 374
ccb726b8 Poul Sander 2026-02-23 22:43 375
    if (fullScreen) {
ccb726b8 Poul Sander 2026-02-23 22:43 376
        m_wasMaximized = isMaximized();
ccb726b8 Poul Sander 2026-02-23 22:43 377
        m_menuBar->hide();
ccb726b8 Poul Sander 2026-02-23 22:43 378
        showFullScreen();
ccb726b8 Poul Sander 2026-02-23 22:43 379
    } else {
cbc7d22b Poul Sander 2026-02-24 19:23 380
        // Only restore menu bar when returning to browse mode
cbc7d22b Poul Sander 2026-02-24 19:23 381
        if (m_stack->currentWidget() != m_imageView)
cbc7d22b Poul Sander 2026-02-24 19:23 382
            m_menuBar->show();
ccb726b8 Poul Sander 2026-02-23 22:43 383
        if (m_wasMaximized)
ccb726b8 Poul Sander 2026-02-23 22:43 384
            showMaximized();
ccb726b8 Poul Sander 2026-02-23 22:43 385
        else
ccb726b8 Poul Sander 2026-02-23 22:43 386
            showNormal();
ccb726b8 Poul Sander 2026-02-23 22:43 387
    }
ccb726b8 Poul Sander 2026-02-23 22:43 388
}
ccb726b8 Poul Sander 2026-02-23 22:43 389
61136b77 Poul Sander 2026-02-20 22:45 390
void MainWindow::keyPressEvent(QKeyEvent *event)
61136b77 Poul Sander 2026-02-20 22:45 391
{
61136b77 Poul Sander 2026-02-20 22:45 392
    if (event->key() == Qt::Key_F11 && m_stack->currentWidget() == m_imageView)
61136b77 Poul Sander 2026-02-20 22:45 393
    {
ccb726b8 Poul Sander 2026-02-23 22:43 394
        setFullScreenMode(!isFullScreen());
61136b77 Poul Sander 2026-02-20 22:45 395
        event->accept();
61136b77 Poul Sander 2026-02-20 22:45 396
        return;
61136b77 Poul Sander 2026-02-20 22:45 397
    }
61136b77 Poul Sander 2026-02-20 22:45 398
61136b77 Poul Sander 2026-02-20 22:45 399
    if (event->key() == Qt::Key_Return && m_stack->currentWidget() == m_browserPage)
61136b77 Poul Sander 2026-02-20 22:45 400
    {
61136b77 Poul Sander 2026-02-20 22:45 401
        QModelIndex current = m_listView->currentIndex();
61136b77 Poul Sander 2026-02-20 22:45 402
        if (current.isValid())
61136b77 Poul Sander 2026-02-20 22:45 403
        {
09130ab9 Poul Sander 2026-02-22 22:19 404
            if (m_imageModel->isFolder(current)) {
09130ab9 Poul Sander 2026-02-22 22:19 405
                QString path = m_imageModel->filePath(current);
665ac308 Poul Sander 2026-02-23 19:34 406
                navigateToFolder(path);
09130ab9 Poul Sander 2026-02-22 22:19 407
            } else {
09130ab9 Poul Sander 2026-02-22 22:19 408
                enterSingleImageMode(current);
09130ab9 Poul Sander 2026-02-22 22:19 409
            }
61136b77 Poul Sander 2026-02-20 22:45 410
            event->accept();
61136b77 Poul Sander 2026-02-20 22:45 411
            return;
61136b77 Poul Sander 2026-02-20 22:45 412
        }
61136b77 Poul Sander 2026-02-20 22:45 413
    }
61136b77 Poul Sander 2026-02-20 22:45 414
61136b77 Poul Sander 2026-02-20 22:45 415
    QMainWindow::keyPressEvent(event);
61136b77 Poul Sander 2026-02-20 22:45 416
}
c9e5684a Poul Sander 2026-02-23 19:18 417
c9e5684a Poul Sander 2026-02-23 19:18 418
void MainWindow::closeEvent(QCloseEvent *event)
c9e5684a Poul Sander 2026-02-23 19:18 419
{
c9e5684a Poul Sander 2026-02-23 19:18 420
    if (m_stack->currentWidget() == m_imageView)
c9e5684a Poul Sander 2026-02-23 19:18 421
    {
c9e5684a Poul Sander 2026-02-23 19:18 422
        leaveSingleImageMode();
c9e5684a Poul Sander 2026-02-23 19:18 423
        event->ignore();
c9e5684a Poul Sander 2026-02-23 19:18 424
        return;
c9e5684a Poul Sander 2026-02-23 19:18 425
    }
c9e5684a Poul Sander 2026-02-23 19:18 426
f61bf886 Poul Sander 2026-02-23 19:27 427
    savePreferences();
c9e5684a Poul Sander 2026-02-23 19:18 428
    QMainWindow::closeEvent(event);
c9e5684a Poul Sander 2026-02-23 19:18 429
}
f61bf886 Poul Sander 2026-02-23 19:27 430
4ae57f60 Poul Sander 2026-02-25 21:35 431
void MainWindow::applyDockLocking(bool lock)
4ae57f60 Poul Sander 2026-02-25 21:35 432
{
4ae57f60 Poul Sander 2026-02-25 21:35 433
    const QDockWidget::DockWidgetFeatures movableFeatures =
4ae57f60 Poul Sander 2026-02-25 21:35 434
        QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable;
4ae57f60 Poul Sander 2026-02-25 21:35 435
    const QDockWidget::DockWidgetFeatures baseFeatures =
4ae57f60 Poul Sander 2026-02-25 21:35 436
        QDockWidget::DockWidgetClosable;
4ae57f60 Poul Sander 2026-02-25 21:35 437
4ae57f60 Poul Sander 2026-02-25 21:35 438
    QDockWidget::DockWidgetFeatures features = lock ? baseFeatures
4ae57f60 Poul Sander 2026-02-25 21:35 439
                                                    : (baseFeatures | movableFeatures);
3bee3e3e Poul Sander 2026-03-05 17:07 440
    m_rootDock->setFeatures(features);
4ae57f60 Poul Sander 2026-02-25 21:35 441
    m_folderDock->setFeatures(features);
4ae57f60 Poul Sander 2026-02-25 21:35 442
    m_previewDock->setFeatures(features);
4ae57f60 Poul Sander 2026-02-25 21:35 443
}
4ae57f60 Poul Sander 2026-02-25 21:35 444
f61bf886 Poul Sander 2026-02-23 19:27 445
void MainWindow::loadPreferences()
f61bf886 Poul Sander 2026-02-23 19:27 446
{
f61bf886 Poul Sander 2026-02-23 19:27 447
    QSettings settings("SagoImageBrowser", "SagoImageBrowser");
f61bf886 Poul Sander 2026-02-23 19:27 448
    m_backgroundColorPreference = settings.value("backgroundColor", "black").toString();
f61bf886 Poul Sander 2026-02-23 19:27 449
    m_imageView->setBackgroundColor(m_backgroundColorPreference);
4ae57f60 Poul Sander 2026-02-25 21:35 450
    m_lockDockingPreference = settings.value("lockDocking", false).toBool();
4ae57f60 Poul Sander 2026-02-25 21:35 451
    applyDockLocking(m_lockDockingPreference);
459bad0f Poul Sander 2026-05-17 14:11 452
    m_folderCacheSizePreference = settings.value("folderCacheSize", 4).toInt();
459bad0f Poul Sander 2026-05-17 14:11 453
    m_imageModel->setCacheMaxSize(m_folderCacheSizePreference);
ac476ca8 Poul Sander 2026-05-18 16:47 454
    m_thumbnailCacheSizePreference = settings.value("thumbnailCacheSize", "normal").toString();
ac476ca8 Poul Sander 2026-05-18 16:47 455
    m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference));
cbc7d22b Poul Sander 2026-02-24 19:23 456
    if (settings.contains("windowGeometry"))
cbc7d22b Poul Sander 2026-02-24 19:23 457
        restoreGeometry(settings.value("windowGeometry").toByteArray());
cbc7d22b Poul Sander 2026-02-24 19:23 458
    if (settings.contains("windowState"))
cbc7d22b Poul Sander 2026-02-24 19:23 459
        restoreState(settings.value("windowState").toByteArray());
f61bf886 Poul Sander 2026-02-23 19:27 460
}
f61bf886 Poul Sander 2026-02-23 19:27 461
f61bf886 Poul Sander 2026-02-23 19:27 462
void MainWindow::savePreferences()
f61bf886 Poul Sander 2026-02-23 19:27 463
{
f61bf886 Poul Sander 2026-02-23 19:27 464
    QSettings settings("SagoImageBrowser", "SagoImageBrowser");
f61bf886 Poul Sander 2026-02-23 19:27 465
    settings.setValue("backgroundColor", m_backgroundColorPreference);
4ae57f60 Poul Sander 2026-02-25 21:35 466
    settings.setValue("lockDocking", m_lockDockingPreference);
459bad0f Poul Sander 2026-05-17 14:11 467
    settings.setValue("folderCacheSize", m_folderCacheSizePreference);
ac476ca8 Poul Sander 2026-05-18 16:47 468
    settings.setValue("thumbnailCacheSize", m_thumbnailCacheSizePreference);
cbc7d22b Poul Sander 2026-02-24 19:23 469
    settings.setValue("windowGeometry", saveGeometry());
cbc7d22b Poul Sander 2026-02-24 19:23 470
    settings.setValue("windowState", saveState());
f61bf886 Poul Sander 2026-02-23 19:27 471
}
f61bf886 Poul Sander 2026-02-23 19:27 472
f61bf886 Poul Sander 2026-02-23 19:27 473
void MainWindow::onPreferencesTriggered()
f61bf886 Poul Sander 2026-02-23 19:27 474
{
f61bf886 Poul Sander 2026-02-23 19:27 475
    PreferencesDialog dialog(this);
f61bf886 Poul Sander 2026-02-23 19:27 476
    dialog.setBackgroundColor(m_backgroundColorPreference);
4ae57f60 Poul Sander 2026-02-25 21:35 477
    dialog.setLockDocking(m_lockDockingPreference);
459bad0f Poul Sander 2026-05-17 14:11 478
    dialog.setCacheSize(m_folderCacheSizePreference);
ac476ca8 Poul Sander 2026-05-18 16:47 479
    dialog.setThumbnailCacheSize(m_thumbnailCacheSizePreference);
f61bf886 Poul Sander 2026-02-23 19:27 480
7370f1c0 Poul Sander 2026-03-01 15:15 481
    bool shouldResetLayout = false;
7370f1c0 Poul Sander 2026-03-01 15:15 482
    connect(&dialog, &PreferencesDialog::resetLayoutRequested, this, [&shouldResetLayout]() {
7370f1c0 Poul Sander 2026-03-01 15:15 483
        shouldResetLayout = true;
7370f1c0 Poul Sander 2026-03-01 15:15 484
    });
7370f1c0 Poul Sander 2026-03-01 15:15 485
f61bf886 Poul Sander 2026-02-23 19:27 486
    if (dialog.exec() == QDialog::Accepted)
f61bf886 Poul Sander 2026-02-23 19:27 487
    {
f61bf886 Poul Sander 2026-02-23 19:27 488
        m_backgroundColorPreference = dialog.getBackgroundColor();
f61bf886 Poul Sander 2026-02-23 19:27 489
        m_imageView->setBackgroundColor(m_backgroundColorPreference);
4ae57f60 Poul Sander 2026-02-25 21:35 490
        m_lockDockingPreference = dialog.getLockDocking();
4ae57f60 Poul Sander 2026-02-25 21:35 491
        applyDockLocking(m_lockDockingPreference);
459bad0f Poul Sander 2026-05-17 14:11 492
        m_folderCacheSizePreference = dialog.getCacheSize();
459bad0f Poul Sander 2026-05-17 14:11 493
        m_imageModel->setCacheMaxSize(m_folderCacheSizePreference);
ac476ca8 Poul Sander 2026-05-18 16:47 494
        QString newThumbSize = dialog.getThumbnailCacheSize();
ac476ca8 Poul Sander 2026-05-18 16:47 495
        if (newThumbSize != m_thumbnailCacheSizePreference)
ac476ca8 Poul Sander 2026-05-18 16:47 496
        {
ac476ca8 Poul Sander 2026-05-18 16:47 497
            m_thumbnailCacheSizePreference = newThumbSize;
ac476ca8 Poul Sander 2026-05-18 16:47 498
            m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference));
ac476ca8 Poul Sander 2026-05-18 16:47 499
            loadVisibleThumbnails();
ac476ca8 Poul Sander 2026-05-18 16:47 500
        }
f61bf886 Poul Sander 2026-02-23 19:27 501
        savePreferences();
f61bf886 Poul Sander 2026-02-23 19:27 502
    }
7370f1c0 Poul Sander 2026-03-01 15:15 503
    
7370f1c0 Poul Sander 2026-03-01 15:15 504
    // Apply layout reset immediately after dialog closes if requested
7370f1c0 Poul Sander 2026-03-01 15:15 505
    if (shouldResetLayout) {
7370f1c0 Poul Sander 2026-03-01 15:15 506
        resetLayoutToDefault();
7370f1c0 Poul Sander 2026-03-01 15:15 507
    }
7370f1c0 Poul Sander 2026-03-01 15:15 508
}
7370f1c0 Poul Sander 2026-03-01 15:15 509
7370f1c0 Poul Sander 2026-03-01 15:15 510
void MainWindow::resetLayoutToDefault()
7370f1c0 Poul Sander 2026-03-01 15:15 511
{
7370f1c0 Poul Sander 2026-03-01 15:15 512
    QSettings settings("SagoImageBrowser", "SagoImageBrowser");
7370f1c0 Poul Sander 2026-03-01 15:15 513
    settings.remove("windowGeometry");
7370f1c0 Poul Sander 2026-03-01 15:15 514
    settings.remove("windowState");
7370f1c0 Poul Sander 2026-03-01 15:15 515
    
7370f1c0 Poul Sander 2026-03-01 15:15 516
    // Hide and detach docks completely
3bee3e3e Poul Sander 2026-03-05 17:07 517
    m_rootDock->hide();
7370f1c0 Poul Sander 2026-03-01 15:15 518
    m_folderDock->hide();
7370f1c0 Poul Sander 2026-03-01 15:15 519
    m_previewDock->hide();
7370f1c0 Poul Sander 2026-03-01 15:15 520
    
3bee3e3e Poul Sander 2026-03-05 17:07 521
    m_rootDock->setFloating(false);
7370f1c0 Poul Sander 2026-03-01 15:15 522
    m_folderDock->setFloating(false);
7370f1c0 Poul Sander 2026-03-01 15:15 523
    m_previewDock->setFloating(false);
7370f1c0 Poul Sander 2026-03-01 15:15 524
    
3bee3e3e Poul Sander 2026-03-05 17:07 525
    removeDockWidget(m_rootDock);
7370f1c0 Poul Sander 2026-03-01 15:15 526
    removeDockWidget(m_folderDock);
7370f1c0 Poul Sander 2026-03-01 15:15 527
    removeDockWidget(m_previewDock);
7370f1c0 Poul Sander 2026-03-01 15:15 528
    
7370f1c0 Poul Sander 2026-03-01 15:15 529
    // Re-add in default positions
3bee3e3e Poul Sander 2026-03-05 17:07 530
    addDockWidget(Qt::LeftDockWidgetArea, m_rootDock);
7370f1c0 Poul Sander 2026-03-01 15:15 531
    addDockWidget(Qt::LeftDockWidgetArea, m_folderDock);
7370f1c0 Poul Sander 2026-03-01 15:15 532
    addDockWidget(Qt::RightDockWidgetArea, m_previewDock);
3bee3e3e Poul Sander 2026-03-05 17:07 533
    splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical);
7370f1c0 Poul Sander 2026-03-01 15:15 534
    
3bee3e3e Poul Sander 2026-03-05 17:07 535
    // Show all docks
3bee3e3e Poul Sander 2026-03-05 17:07 536
    m_rootDock->show();
7370f1c0 Poul Sander 2026-03-01 15:15 537
    m_folderDock->show();
7370f1c0 Poul Sander 2026-03-01 15:15 538
    m_previewDock->show();
f61bf886 Poul Sander 2026-02-23 19:27 539
}
1970-01-01 00:00 540