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"
032aa1e1 Poul Sander 2026-02-19 18:55 5
032aa1e1 Poul Sander 2026-02-19 18:55 6
#include <QFileSystemModel>
032aa1e1 Poul Sander 2026-02-19 18:55 7
#include <QTreeView>
032aa1e1 Poul Sander 2026-02-19 18:55 8
#include <QListView>
032aa1e1 Poul Sander 2026-02-19 18:55 9
#include <QLabel>
032aa1e1 Poul Sander 2026-02-19 18:55 10
#include <QSplitter>
61136b77 Poul Sander 2026-02-20 22:45 11
#include <QStackedWidget>
032aa1e1 Poul Sander 2026-02-19 18:55 12
#include <QDir>
fc5f2e27 Poul Sander 2026-02-22 22:06 13
#include <QComboBox>
fc5f2e27 Poul Sander 2026-02-22 22:06 14
#include <QVBoxLayout>
fc5f2e27 Poul Sander 2026-02-22 22:06 15
#include <QStandardPaths>
032aa1e1 Poul Sander 2026-02-19 18:55 16
#include <QImageReader>
032aa1e1 Poul Sander 2026-02-19 18:55 17
#include <QHeaderView>
6fcd6c90 Poul Sander 2026-02-19 21:12 18
#include <QScrollBar>
6fcd6c90 Poul Sander 2026-02-19 21:12 19
#include <QTimer>
6fcd6c90 Poul Sander 2026-02-19 21:12 20
#include <QEvent>
61136b77 Poul Sander 2026-02-20 22:45 21
#include <QKeyEvent>
c9e5684a Poul Sander 2026-02-23 19:18 22
#include <QCloseEvent>
cfe4a67b Poul Sander 2026-02-19 23:06 23
#include <QItemSelectionModel>
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
032aa1e1 Poul Sander 2026-02-19 18:55 30
MainWindow::MainWindow(QWidget *parent)
032aa1e1 Poul Sander 2026-02-19 18:55 31
    : QMainWindow(parent)
032aa1e1 Poul Sander 2026-02-19 18:55 32
{
032aa1e1 Poul Sander 2026-02-19 18:55 33
    setupUi();
f61bf886 Poul Sander 2026-02-23 19:27 34
    setupMenuBar();
032aa1e1 Poul Sander 2026-02-19 18:55 35
    setupConnections();
f61bf886 Poul Sander 2026-02-23 19:27 36
    loadPreferences();
032aa1e1 Poul Sander 2026-02-19 18:55 37
}
032aa1e1 Poul Sander 2026-02-19 18:55 38
032aa1e1 Poul Sander 2026-02-19 18:55 39
void MainWindow::setupUi()
032aa1e1 Poul Sander 2026-02-19 18:55 40
{
032aa1e1 Poul Sander 2026-02-19 18:55 41
    // Folder model (left pane)
032aa1e1 Poul Sander 2026-02-19 18:55 42
    m_dirModel = new QFileSystemModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 43
    m_dirModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
032aa1e1 Poul Sander 2026-02-19 18:55 44
    m_dirModel->setRootPath(QDir::homePath());
032aa1e1 Poul Sander 2026-02-19 18:55 45
fc5f2e27 Poul Sander 2026-02-22 22:06 46
    // Root chooser combo box
fc5f2e27 Poul Sander 2026-02-22 22:06 47
    m_rootCombo = new QComboBox;
fc5f2e27 Poul Sander 2026-02-22 22:06 48
    m_rootCombo->addItem("Home",     QDir::homePath());
fc5f2e27 Poul Sander 2026-02-22 22:06 49
    m_rootCombo->addItem("Pictures", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
fc5f2e27 Poul Sander 2026-02-22 22:06 50
    m_rootCombo->addItem("File System", QDir::rootPath());
fc5f2e27 Poul Sander 2026-02-22 22:06 51
032aa1e1 Poul Sander 2026-02-19 18:55 52
    m_treeView = new QTreeView;
032aa1e1 Poul Sander 2026-02-19 18:55 53
    m_treeView->setModel(m_dirModel);
032aa1e1 Poul Sander 2026-02-19 18:55 54
    m_treeView->setRootIndex(m_dirModel->index(QDir::homePath()));
032aa1e1 Poul Sander 2026-02-19 18:55 55
    m_treeView->header()->hide();
032aa1e1 Poul Sander 2026-02-19 18:55 56
    m_treeView->setColumnHidden(1, true);
032aa1e1 Poul Sander 2026-02-19 18:55 57
    m_treeView->setColumnHidden(2, true);
032aa1e1 Poul Sander 2026-02-19 18:55 58
    m_treeView->setColumnHidden(3, true);
032aa1e1 Poul Sander 2026-02-19 18:55 59
fc5f2e27 Poul Sander 2026-02-22 22:06 60
    // Left pane: combo + tree inside a container widget
fc5f2e27 Poul Sander 2026-02-22 22:06 61
    QWidget *leftPane = new QWidget;
fc5f2e27 Poul Sander 2026-02-22 22:06 62
    QVBoxLayout *leftLayout = new QVBoxLayout(leftPane);
fc5f2e27 Poul Sander 2026-02-22 22:06 63
    leftLayout->setContentsMargins(0, 0, 0, 0);
fc5f2e27 Poul Sander 2026-02-22 22:06 64
    leftLayout->addWidget(m_rootCombo);
fc5f2e27 Poul Sander 2026-02-22 22:06 65
    leftLayout->addWidget(m_treeView);
fc5f2e27 Poul Sander 2026-02-22 22:06 66
032aa1e1 Poul Sander 2026-02-19 18:55 67
    // Thumbnail model (center pane)
032aa1e1 Poul Sander 2026-02-19 18:55 68
    m_imageModel = new ImageModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 69
032aa1e1 Poul Sander 2026-02-19 18:55 70
    m_listView = new QListView;
032aa1e1 Poul Sander 2026-02-19 18:55 71
    m_listView->setModel(m_imageModel);
032aa1e1 Poul Sander 2026-02-19 18:55 72
    m_listView->setViewMode(QListView::IconMode);
032aa1e1 Poul Sander 2026-02-19 18:55 73
    m_listView->setIconSize(QSize(128, 128));
b614a581 Poul Sander 2026-02-19 21:18 74
    m_listView->setGridSize(QSize(148, 168));
032aa1e1 Poul Sander 2026-02-19 18:55 75
    m_listView->setResizeMode(QListView::Adjust);
032aa1e1 Poul Sander 2026-02-19 18:55 76
    m_listView->setSelectionMode(QAbstractItemView::SingleSelection);
b614a581 Poul Sander 2026-02-19 21:18 77
    m_listView->setSpacing(4);
b614a581 Poul Sander 2026-02-19 21:18 78
    m_listView->setWordWrap(true);
b614a581 Poul Sander 2026-02-19 21:18 79
    m_listView->setTextElideMode(Qt::ElideRight);
032aa1e1 Poul Sander 2026-02-19 18:55 80
032aa1e1 Poul Sander 2026-02-19 18:55 81
    // Preview pane (right)
032aa1e1 Poul Sander 2026-02-19 18:55 82
    m_previewLabel = new QLabel;
032aa1e1 Poul Sander 2026-02-19 18:55 83
    m_previewLabel->setAlignment(Qt::AlignCenter);
032aa1e1 Poul Sander 2026-02-19 18:55 84
    m_previewLabel->setMinimumWidth(300);
032aa1e1 Poul Sander 2026-02-19 18:55 85
032aa1e1 Poul Sander 2026-02-19 18:55 86
    // Layout
032aa1e1 Poul Sander 2026-02-19 18:55 87
    QSplitter *rightSplitter = new QSplitter(Qt::Horizontal);
032aa1e1 Poul Sander 2026-02-19 18:55 88
    rightSplitter->addWidget(m_listView);
032aa1e1 Poul Sander 2026-02-19 18:55 89
    rightSplitter->addWidget(m_previewLabel);
032aa1e1 Poul Sander 2026-02-19 18:55 90
    rightSplitter->setStretchFactor(0, 3);
032aa1e1 Poul Sander 2026-02-19 18:55 91
    rightSplitter->setStretchFactor(1, 2);
032aa1e1 Poul Sander 2026-02-19 18:55 92
032aa1e1 Poul Sander 2026-02-19 18:55 93
    QSplitter *mainSplitter = new QSplitter(Qt::Horizontal);
fc5f2e27 Poul Sander 2026-02-22 22:06 94
    mainSplitter->addWidget(leftPane);
032aa1e1 Poul Sander 2026-02-19 18:55 95
    mainSplitter->addWidget(rightSplitter);
032aa1e1 Poul Sander 2026-02-19 18:55 96
    mainSplitter->setStretchFactor(1, 1);
032aa1e1 Poul Sander 2026-02-19 18:55 97
61136b77 Poul Sander 2026-02-20 22:45 98
    m_browserPage = mainSplitter;
61136b77 Poul Sander 2026-02-20 22:45 99
61136b77 Poul Sander 2026-02-20 22:45 100
    // Single image view
61136b77 Poul Sander 2026-02-20 22:45 101
    m_imageView = new ImageViewWidget;
61136b77 Poul Sander 2026-02-20 22:45 102
61136b77 Poul Sander 2026-02-20 22:45 103
    // Stack to switch between browser and single image
61136b77 Poul Sander 2026-02-20 22:45 104
    m_stack = new QStackedWidget;
61136b77 Poul Sander 2026-02-20 22:45 105
    m_stack->addWidget(m_browserPage);
61136b77 Poul Sander 2026-02-20 22:45 106
    m_stack->addWidget(m_imageView);
61136b77 Poul Sander 2026-02-20 22:45 107
61136b77 Poul Sander 2026-02-20 22:45 108
    setCentralWidget(m_stack);
032aa1e1 Poul Sander 2026-02-19 18:55 109
}
032aa1e1 Poul Sander 2026-02-19 18:55 110
f61bf886 Poul Sander 2026-02-23 19:27 111
void MainWindow::setupMenuBar()
f61bf886 Poul Sander 2026-02-23 19:27 112
{
ccb726b8 Poul Sander 2026-02-23 22:43 113
    m_menuBar = menuBar();
ccb726b8 Poul Sander 2026-02-23 22:43 114
    QMenu *editMenu = m_menuBar->addMenu("&Edit");
f61bf886 Poul Sander 2026-02-23 19:27 115
    QAction *preferencesAction = editMenu->addAction("&Preferences");
f61bf886 Poul Sander 2026-02-23 19:27 116
    connect(preferencesAction, &QAction::triggered, this, &MainWindow::onPreferencesTriggered);
f61bf886 Poul Sander 2026-02-23 19:27 117
}
f61bf886 Poul Sander 2026-02-23 19:27 118
665ac308 Poul Sander 2026-02-23 19:34 119
void MainWindow::navigateToFolder(const QString &path)
665ac308 Poul Sander 2026-02-23 19:34 120
{
665ac308 Poul Sander 2026-02-23 19:34 121
    m_previousFolderPath = m_imageModel->currentDirectory();
665ac308 Poul Sander 2026-02-23 19:34 122
    m_imageModel->setDirectory(path);
665ac308 Poul Sander 2026-02-23 19:34 123
    QModelIndex dirIdx = m_dirModel->index(path);
665ac308 Poul Sander 2026-02-23 19:34 124
    if (dirIdx.isValid())
665ac308 Poul Sander 2026-02-23 19:34 125
        m_treeView->setCurrentIndex(dirIdx);
665ac308 Poul Sander 2026-02-23 19:34 126
    QTimer::singleShot(0, this, [this]() {
665ac308 Poul Sander 2026-02-23 19:34 127
        selectPreviousFolderIfExists();
665ac308 Poul Sander 2026-02-23 19:34 128
        loadVisibleThumbnails();
665ac308 Poul Sander 2026-02-23 19:34 129
    });
665ac308 Poul Sander 2026-02-23 19:34 130
}
665ac308 Poul Sander 2026-02-23 19:34 131
665ac308 Poul Sander 2026-02-23 19:34 132
void MainWindow::selectPreviousFolderIfExists()
665ac308 Poul Sander 2026-02-23 19:34 133
{
665ac308 Poul Sander 2026-02-23 19:34 134
    if (m_previousFolderPath.isEmpty())
665ac308 Poul Sander 2026-02-23 19:34 135
        return;
665ac308 Poul Sander 2026-02-23 19:34 136
665ac308 Poul Sander 2026-02-23 19:34 137
    // Find the previous folder in the current directory's contents
665ac308 Poul Sander 2026-02-23 19:34 138
    for (int i = 0; i < m_imageModel->rowCount(); ++i) {
665ac308 Poul Sander 2026-02-23 19:34 139
        QModelIndex idx = m_imageModel->index(i);
665ac308 Poul Sander 2026-02-23 19:34 140
        if (m_imageModel->isFolder(idx)) {
665ac308 Poul Sander 2026-02-23 19:34 141
            QString folderPath = m_imageModel->filePath(idx);
665ac308 Poul Sander 2026-02-23 19:34 142
            if (folderPath == m_previousFolderPath) {
665ac308 Poul Sander 2026-02-23 19:34 143
                m_listView->setCurrentIndex(idx);
665ac308 Poul Sander 2026-02-23 19:34 144
                m_listView->scrollTo(idx);
665ac308 Poul Sander 2026-02-23 19:34 145
                return;
665ac308 Poul Sander 2026-02-23 19:34 146
            }
665ac308 Poul Sander 2026-02-23 19:34 147
        }
665ac308 Poul Sander 2026-02-23 19:34 148
    }
665ac308 Poul Sander 2026-02-23 19:34 149
}
665ac308 Poul Sander 2026-02-23 19:34 150
032aa1e1 Poul Sander 2026-02-19 18:55 151
void MainWindow::setupConnections()
032aa1e1 Poul Sander 2026-02-19 18:55 152
{
fc5f2e27 Poul Sander 2026-02-22 22:06 153
    connect(m_rootCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
fc5f2e27 Poul Sander 2026-02-22 22:06 154
            [this](int index) {
fc5f2e27 Poul Sander 2026-02-22 22:06 155
                QString rootPath = m_rootCombo->itemData(index).toString();
fc5f2e27 Poul Sander 2026-02-22 22:06 156
                m_dirModel->setRootPath(rootPath);
fc5f2e27 Poul Sander 2026-02-22 22:06 157
                m_treeView->setRootIndex(m_dirModel->index(rootPath));
fc5f2e27 Poul Sander 2026-02-22 22:06 158
            });
fc5f2e27 Poul Sander 2026-02-22 22:06 159
032aa1e1 Poul Sander 2026-02-19 18:55 160
    connect(m_treeView, &QTreeView::clicked, this,
032aa1e1 Poul Sander 2026-02-19 18:55 161
            [this](const QModelIndex &index)
6fcd6c90 Poul Sander 2026-02-19 21:12 162
            {
6fcd6c90 Poul Sander 2026-02-19 21:12 163
                QString path = m_dirModel->filePath(index);
665ac308 Poul Sander 2026-02-23 19:34 164
                navigateToFolder(path);
6fcd6c90 Poul Sander 2026-02-19 21:12 165
            });
032aa1e1 Poul Sander 2026-02-19 18:55 166
032aa1e1 Poul Sander 2026-02-19 18:55 167
    connect(m_listView, &QListView::clicked, this,
cfe4a67b Poul Sander 2026-02-19 23:06 168
            [this](const QModelIndex &index) { showPreview(index); });
6fcd6c90 Poul Sander 2026-02-19 21:12 169
cfe4a67b Poul Sander 2026-02-19 23:06 170
    connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged,
cfe4a67b Poul Sander 2026-02-19 23:06 171
            this, [this](const QModelIndex &current) { showPreview(current); });
6fcd6c90 Poul Sander 2026-02-19 21:12 172
61136b77 Poul Sander 2026-02-20 22:45 173
    connect(m_listView, &QListView::doubleClicked, this,
09130ab9 Poul Sander 2026-02-22 22:19 174
            [this](const QModelIndex &index) {
09130ab9 Poul Sander 2026-02-22 22:19 175
                if (m_imageModel->isFolder(index)) {
09130ab9 Poul Sander 2026-02-22 22:19 176
                    QString path = m_imageModel->filePath(index);
665ac308 Poul Sander 2026-02-23 19:34 177
                    navigateToFolder(path);
09130ab9 Poul Sander 2026-02-22 22:19 178
                } else {
09130ab9 Poul Sander 2026-02-22 22:19 179
                    enterSingleImageMode(index);
09130ab9 Poul Sander 2026-02-22 22:19 180
                }
09130ab9 Poul Sander 2026-02-22 22:19 181
            });
61136b77 Poul Sander 2026-02-20 22:45 182
61136b77 Poul Sander 2026-02-20 22:45 183
    connect(m_imageView, &ImageViewWidget::closeRequested,
61136b77 Poul Sander 2026-02-20 22:45 184
            this, &MainWindow::leaveSingleImageMode);
61136b77 Poul Sander 2026-02-20 22:45 185
1ffc1962 Poul Sander 2026-02-20 23:41 186
    connect(m_imageView, &ImageViewWidget::nextRequested, this, [this]() {
1ffc1962 Poul Sander 2026-02-20 23:41 187
        QModelIndex cur = m_listView->currentIndex();
1ffc1962 Poul Sander 2026-02-20 23:41 188
        int next = cur.isValid() ? cur.row() + 1 : 0;
09130ab9 Poul Sander 2026-02-22 22:19 189
        while (next < m_imageModel->rowCount() && m_imageModel->isFolder(m_imageModel->index(next)))
09130ab9 Poul Sander 2026-02-22 22:19 190
            ++next;
1ffc1962 Poul Sander 2026-02-20 23:41 191
        if (next < m_imageModel->rowCount())
1ffc1962 Poul Sander 2026-02-20 23:41 192
        {
1ffc1962 Poul Sander 2026-02-20 23:41 193
            QModelIndex idx = m_imageModel->index(next);
1ffc1962 Poul Sander 2026-02-20 23:41 194
            m_listView->setCurrentIndex(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 195
            enterSingleImageMode(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 196
        }
1ffc1962 Poul Sander 2026-02-20 23:41 197
    });
1ffc1962 Poul Sander 2026-02-20 23:41 198
1ffc1962 Poul Sander 2026-02-20 23:41 199
    connect(m_imageView, &ImageViewWidget::previousRequested, this, [this]() {
1ffc1962 Poul Sander 2026-02-20 23:41 200
        QModelIndex cur = m_listView->currentIndex();
1ffc1962 Poul Sander 2026-02-20 23:41 201
        int prev = cur.isValid() ? cur.row() - 1 : 0;
09130ab9 Poul Sander 2026-02-22 22:19 202
        while (prev >= 0 && m_imageModel->isFolder(m_imageModel->index(prev)))
09130ab9 Poul Sander 2026-02-22 22:19 203
            --prev;
1ffc1962 Poul Sander 2026-02-20 23:41 204
        if (prev >= 0)
1ffc1962 Poul Sander 2026-02-20 23:41 205
        {
1ffc1962 Poul Sander 2026-02-20 23:41 206
            QModelIndex idx = m_imageModel->index(prev);
1ffc1962 Poul Sander 2026-02-20 23:41 207
            m_listView->setCurrentIndex(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 208
            enterSingleImageMode(idx);
1ffc1962 Poul Sander 2026-02-20 23:41 209
        }
1ffc1962 Poul Sander 2026-02-20 23:41 210
    });
1ffc1962 Poul Sander 2026-02-20 23:41 211
6fcd6c90 Poul Sander 2026-02-19 21:12 212
    connect(m_listView->verticalScrollBar(), &QScrollBar::valueChanged,
6fcd6c90 Poul Sander 2026-02-19 21:12 213
            this, [this]()
6fcd6c90 Poul Sander 2026-02-19 21:12 214
            { loadVisibleThumbnails(); });
6fcd6c90 Poul Sander 2026-02-19 21:12 215
6fcd6c90 Poul Sander 2026-02-19 21:12 216
    // Also catch resize — visible range changes when the viewport is resized
6fcd6c90 Poul Sander 2026-02-19 21:12 217
    m_listView->viewport()->installEventFilter(this);
6fcd6c90 Poul Sander 2026-02-19 21:12 218
}
6fcd6c90 Poul Sander 2026-02-19 21:12 219
6fcd6c90 Poul Sander 2026-02-19 21:12 220
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
6fcd6c90 Poul Sander 2026-02-19 21:12 221
{
6fcd6c90 Poul Sander 2026-02-19 21:12 222
    if (obj == m_listView->viewport() && event->type() == QEvent::Resize)
6fcd6c90 Poul Sander 2026-02-19 21:12 223
        QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails);
6fcd6c90 Poul Sander 2026-02-19 21:12 224
6fcd6c90 Poul Sander 2026-02-19 21:12 225
    return QMainWindow::eventFilter(obj, event);
6fcd6c90 Poul Sander 2026-02-19 21:12 226
}
6fcd6c90 Poul Sander 2026-02-19 21:12 227
6fcd6c90 Poul Sander 2026-02-19 21:12 228
void MainWindow::loadVisibleThumbnails()
6fcd6c90 Poul Sander 2026-02-19 21:12 229
{
6fcd6c90 Poul Sander 2026-02-19 21:12 230
    QModelIndex topLeft = m_listView->indexAt(QPoint(0, 0));
6fcd6c90 Poul Sander 2026-02-19 21:12 231
    QModelIndex bottomRight = m_listView->indexAt(
6fcd6c90 Poul Sander 2026-02-19 21:12 232
        QPoint(m_listView->viewport()->width() - 1,
6fcd6c90 Poul Sander 2026-02-19 21:12 233
               m_listView->viewport()->height() - 1));
6fcd6c90 Poul Sander 2026-02-19 21:12 234
6fcd6c90 Poul Sander 2026-02-19 21:12 235
    int first = topLeft.isValid() ? topLeft.row() : 0;
6fcd6c90 Poul Sander 2026-02-19 21:12 236
    int last = bottomRight.isValid() ? bottomRight.row()
6fcd6c90 Poul Sander 2026-02-19 21:12 237
                                     : m_imageModel->rowCount() - 1;
6fcd6c90 Poul Sander 2026-02-19 21:12 238
6fcd6c90 Poul Sander 2026-02-19 21:12 239
    if (last < 0)
6fcd6c90 Poul Sander 2026-02-19 21:12 240
        return;
6fcd6c90 Poul Sander 2026-02-19 21:12 241
6fcd6c90 Poul Sander 2026-02-19 21:12 242
    std::cout << "loadVisibleThumbnails: " << first << " - " << last << "\n";
6fcd6c90 Poul Sander 2026-02-19 21:12 243
    m_imageModel->requestThumbnails(first, last);
032aa1e1 Poul Sander 2026-02-19 18:55 244
}
cfe4a67b Poul Sander 2026-02-19 23:06 245
cfe4a67b Poul Sander 2026-02-19 23:06 246
void MainWindow::showPreview(const QModelIndex &index)
cfe4a67b Poul Sander 2026-02-19 23:06 247
{
cfe4a67b Poul Sander 2026-02-19 23:06 248
    if (!index.isValid())
cfe4a67b Poul Sander 2026-02-19 23:06 249
        return;
cfe4a67b Poul Sander 2026-02-19 23:06 250
cfe4a67b Poul Sander 2026-02-19 23:06 251
    QString path = m_imageModel->filePath(index);
cfe4a67b Poul Sander 2026-02-19 23:06 252
cfe4a67b Poul Sander 2026-02-19 23:06 253
    QImageReader reader(path);
cfe4a67b Poul Sander 2026-02-19 23:06 254
    reader.setAutoTransform(true);
cfe4a67b Poul Sander 2026-02-19 23:06 255
    QImage image = reader.read();
cfe4a67b Poul Sander 2026-02-19 23:06 256
cfe4a67b Poul Sander 2026-02-19 23:06 257
    m_previewLabel->setPixmap(
cfe4a67b Poul Sander 2026-02-19 23:06 258
        QPixmap::fromImage(image).scaled(
cfe4a67b Poul Sander 2026-02-19 23:06 259
            m_previewLabel->size(),
cfe4a67b Poul Sander 2026-02-19 23:06 260
            Qt::KeepAspectRatio,
cfe4a67b Poul Sander 2026-02-19 23:06 261
            Qt::SmoothTransformation));
cfe4a67b Poul Sander 2026-02-19 23:06 262
}
61136b77 Poul Sander 2026-02-20 22:45 263
61136b77 Poul Sander 2026-02-20 22:45 264
void MainWindow::enterSingleImageMode(const QModelIndex &index)
61136b77 Poul Sander 2026-02-20 22:45 265
{
61136b77 Poul Sander 2026-02-20 22:45 266
    if (!index.isValid())
61136b77 Poul Sander 2026-02-20 22:45 267
        return;
61136b77 Poul Sander 2026-02-20 22:45 268
f61bf886 Poul Sander 2026-02-23 19:27 269
    m_imageView->setBackgroundColor(m_backgroundColorPreference);
61136b77 Poul Sander 2026-02-20 22:45 270
    QString path = m_imageModel->filePath(index);
61136b77 Poul Sander 2026-02-20 22:45 271
    m_imageView->setImage(path);
61136b77 Poul Sander 2026-02-20 22:45 272
    m_stack->setCurrentWidget(m_imageView);
61136b77 Poul Sander 2026-02-20 22:45 273
    m_imageView->setFocus();
ccb726b8 Poul Sander 2026-02-23 22:43 274
ccb726b8 Poul Sander 2026-02-23 22:43 275
    if (m_imageViewWasFullScreen) {
ccb726b8 Poul Sander 2026-02-23 22:43 276
        setFullScreenMode(true);
ccb726b8 Poul Sander 2026-02-23 22:43 277
        m_imageViewWasFullScreen = false;
ccb726b8 Poul Sander 2026-02-23 22:43 278
    }
61136b77 Poul Sander 2026-02-20 22:45 279
}
61136b77 Poul Sander 2026-02-20 22:45 280
61136b77 Poul Sander 2026-02-20 22:45 281
void MainWindow::leaveSingleImageMode()
61136b77 Poul Sander 2026-02-20 22:45 282
{
3968465e Poul Sander 2026-02-23 19:13 283
    if (isFullScreen()) {
ccb726b8 Poul Sander 2026-02-23 22:43 284
        m_imageViewWasFullScreen = true;
ccb726b8 Poul Sander 2026-02-23 22:43 285
        setFullScreenMode(false);
61136b77 Poul Sander 2026-02-20 22:45 286
    }
61136b77 Poul Sander 2026-02-20 22:45 287
    m_stack->setCurrentWidget(m_browserPage);
61136b77 Poul Sander 2026-02-20 22:45 288
    m_listView->setFocus();
61136b77 Poul Sander 2026-02-20 22:45 289
}
61136b77 Poul Sander 2026-02-20 22:45 290
ccb726b8 Poul Sander 2026-02-23 22:43 291
void MainWindow::setFullScreenMode(bool fullScreen)
ccb726b8 Poul Sander 2026-02-23 22:43 292
{
ccb726b8 Poul Sander 2026-02-23 22:43 293
    if (fullScreen == isFullScreen())
ccb726b8 Poul Sander 2026-02-23 22:43 294
        return;
ccb726b8 Poul Sander 2026-02-23 22:43 295
ccb726b8 Poul Sander 2026-02-23 22:43 296
    if (fullScreen) {
ccb726b8 Poul Sander 2026-02-23 22:43 297
        m_wasMaximized = isMaximized();
ccb726b8 Poul Sander 2026-02-23 22:43 298
        m_menuBar->hide();
ccb726b8 Poul Sander 2026-02-23 22:43 299
        showFullScreen();
ccb726b8 Poul Sander 2026-02-23 22:43 300
    } else {
ccb726b8 Poul Sander 2026-02-23 22:43 301
        m_menuBar->show();
ccb726b8 Poul Sander 2026-02-23 22:43 302
        if (m_wasMaximized)
ccb726b8 Poul Sander 2026-02-23 22:43 303
            showMaximized();
ccb726b8 Poul Sander 2026-02-23 22:43 304
        else
ccb726b8 Poul Sander 2026-02-23 22:43 305
            showNormal();
ccb726b8 Poul Sander 2026-02-23 22:43 306
    }
ccb726b8 Poul Sander 2026-02-23 22:43 307
}
ccb726b8 Poul Sander 2026-02-23 22:43 308
61136b77 Poul Sander 2026-02-20 22:45 309
void MainWindow::keyPressEvent(QKeyEvent *event)
61136b77 Poul Sander 2026-02-20 22:45 310
{
61136b77 Poul Sander 2026-02-20 22:45 311
    if (event->key() == Qt::Key_F11 && m_stack->currentWidget() == m_imageView)
61136b77 Poul Sander 2026-02-20 22:45 312
    {
ccb726b8 Poul Sander 2026-02-23 22:43 313
        setFullScreenMode(!isFullScreen());
61136b77 Poul Sander 2026-02-20 22:45 314
        event->accept();
61136b77 Poul Sander 2026-02-20 22:45 315
        return;
61136b77 Poul Sander 2026-02-20 22:45 316
    }
61136b77 Poul Sander 2026-02-20 22:45 317
61136b77 Poul Sander 2026-02-20 22:45 318
    if (event->key() == Qt::Key_Return && m_stack->currentWidget() == m_browserPage)
61136b77 Poul Sander 2026-02-20 22:45 319
    {
61136b77 Poul Sander 2026-02-20 22:45 320
        QModelIndex current = m_listView->currentIndex();
61136b77 Poul Sander 2026-02-20 22:45 321
        if (current.isValid())
61136b77 Poul Sander 2026-02-20 22:45 322
        {
09130ab9 Poul Sander 2026-02-22 22:19 323
            if (m_imageModel->isFolder(current)) {
09130ab9 Poul Sander 2026-02-22 22:19 324
                QString path = m_imageModel->filePath(current);
665ac308 Poul Sander 2026-02-23 19:34 325
                navigateToFolder(path);
09130ab9 Poul Sander 2026-02-22 22:19 326
            } else {
09130ab9 Poul Sander 2026-02-22 22:19 327
                enterSingleImageMode(current);
09130ab9 Poul Sander 2026-02-22 22:19 328
            }
61136b77 Poul Sander 2026-02-20 22:45 329
            event->accept();
61136b77 Poul Sander 2026-02-20 22:45 330
            return;
61136b77 Poul Sander 2026-02-20 22:45 331
        }
61136b77 Poul Sander 2026-02-20 22:45 332
    }
61136b77 Poul Sander 2026-02-20 22:45 333
61136b77 Poul Sander 2026-02-20 22:45 334
    QMainWindow::keyPressEvent(event);
61136b77 Poul Sander 2026-02-20 22:45 335
}
c9e5684a Poul Sander 2026-02-23 19:18 336
c9e5684a Poul Sander 2026-02-23 19:18 337
void MainWindow::closeEvent(QCloseEvent *event)
c9e5684a Poul Sander 2026-02-23 19:18 338
{
c9e5684a Poul Sander 2026-02-23 19:18 339
    if (m_stack->currentWidget() == m_imageView)
c9e5684a Poul Sander 2026-02-23 19:18 340
    {
c9e5684a Poul Sander 2026-02-23 19:18 341
        leaveSingleImageMode();
c9e5684a Poul Sander 2026-02-23 19:18 342
        event->ignore();
c9e5684a Poul Sander 2026-02-23 19:18 343
        return;
c9e5684a Poul Sander 2026-02-23 19:18 344
    }
c9e5684a Poul Sander 2026-02-23 19:18 345
f61bf886 Poul Sander 2026-02-23 19:27 346
    savePreferences();
c9e5684a Poul Sander 2026-02-23 19:18 347
    QMainWindow::closeEvent(event);
c9e5684a Poul Sander 2026-02-23 19:18 348
}
f61bf886 Poul Sander 2026-02-23 19:27 349
f61bf886 Poul Sander 2026-02-23 19:27 350
void MainWindow::loadPreferences()
f61bf886 Poul Sander 2026-02-23 19:27 351
{
f61bf886 Poul Sander 2026-02-23 19:27 352
    QSettings settings("SagoImageBrowser", "SagoImageBrowser");
f61bf886 Poul Sander 2026-02-23 19:27 353
    m_backgroundColorPreference = settings.value("backgroundColor", "black").toString();
f61bf886 Poul Sander 2026-02-23 19:27 354
    m_imageView->setBackgroundColor(m_backgroundColorPreference);
f61bf886 Poul Sander 2026-02-23 19:27 355
}
f61bf886 Poul Sander 2026-02-23 19:27 356
f61bf886 Poul Sander 2026-02-23 19:27 357
void MainWindow::savePreferences()
f61bf886 Poul Sander 2026-02-23 19:27 358
{
f61bf886 Poul Sander 2026-02-23 19:27 359
    QSettings settings("SagoImageBrowser", "SagoImageBrowser");
f61bf886 Poul Sander 2026-02-23 19:27 360
    settings.setValue("backgroundColor", m_backgroundColorPreference);
f61bf886 Poul Sander 2026-02-23 19:27 361
}
f61bf886 Poul Sander 2026-02-23 19:27 362
f61bf886 Poul Sander 2026-02-23 19:27 363
void MainWindow::onPreferencesTriggered()
f61bf886 Poul Sander 2026-02-23 19:27 364
{
f61bf886 Poul Sander 2026-02-23 19:27 365
    PreferencesDialog dialog(this);
f61bf886 Poul Sander 2026-02-23 19:27 366
    dialog.setBackgroundColor(m_backgroundColorPreference);
f61bf886 Poul Sander 2026-02-23 19:27 367
f61bf886 Poul Sander 2026-02-23 19:27 368
    if (dialog.exec() == QDialog::Accepted)
f61bf886 Poul Sander 2026-02-23 19:27 369
    {
f61bf886 Poul Sander 2026-02-23 19:27 370
        m_backgroundColorPreference = dialog.getBackgroundColor();
f61bf886 Poul Sander 2026-02-23 19:27 371
        m_imageView->setBackgroundColor(m_backgroundColorPreference);
f61bf886 Poul Sander 2026-02-23 19:27 372
        savePreferences();
f61bf886 Poul Sander 2026-02-23 19:27 373
    }
f61bf886 Poul Sander 2026-02-23 19:27 374
}
1970-01-01 00:00 375