git repos / SagoImageBrowser

blame: 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"
032aa1e1 Poul Sander 2026-02-19 18:55 3
032aa1e1 Poul Sander 2026-02-19 18:55 4
#include <QFileSystemModel>
032aa1e1 Poul Sander 2026-02-19 18:55 5
#include <QTreeView>
032aa1e1 Poul Sander 2026-02-19 18:55 6
#include <QListView>
032aa1e1 Poul Sander 2026-02-19 18:55 7
#include <QLabel>
032aa1e1 Poul Sander 2026-02-19 18:55 8
#include <QSplitter>
032aa1e1 Poul Sander 2026-02-19 18:55 9
#include <QDir>
032aa1e1 Poul Sander 2026-02-19 18:55 10
#include <QImageReader>
032aa1e1 Poul Sander 2026-02-19 18:55 11
#include <QHeaderView>
6fcd6c90 Poul Sander 2026-02-19 21:12 12
#include <QScrollBar>
6fcd6c90 Poul Sander 2026-02-19 21:12 13
#include <QTimer>
6fcd6c90 Poul Sander 2026-02-19 21:12 14
#include <QEvent>
cfe4a67b Poul Sander 2026-02-19 23:06 15
#include <QItemSelectionModel>
6fcd6c90 Poul Sander 2026-02-19 21:12 16
#include <iostream>
032aa1e1 Poul Sander 2026-02-19 18:55 17
032aa1e1 Poul Sander 2026-02-19 18:55 18
MainWindow::MainWindow(QWidget *parent)
032aa1e1 Poul Sander 2026-02-19 18:55 19
    : QMainWindow(parent)
032aa1e1 Poul Sander 2026-02-19 18:55 20
{
032aa1e1 Poul Sander 2026-02-19 18:55 21
    setupUi();
032aa1e1 Poul Sander 2026-02-19 18:55 22
    setupConnections();
032aa1e1 Poul Sander 2026-02-19 18:55 23
}
032aa1e1 Poul Sander 2026-02-19 18:55 24
032aa1e1 Poul Sander 2026-02-19 18:55 25
void MainWindow::setupUi()
032aa1e1 Poul Sander 2026-02-19 18:55 26
{
032aa1e1 Poul Sander 2026-02-19 18:55 27
    // Folder model (left pane)
032aa1e1 Poul Sander 2026-02-19 18:55 28
    m_dirModel = new QFileSystemModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 29
    m_dirModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
032aa1e1 Poul Sander 2026-02-19 18:55 30
    m_dirModel->setRootPath(QDir::homePath());
032aa1e1 Poul Sander 2026-02-19 18:55 31
032aa1e1 Poul Sander 2026-02-19 18:55 32
    m_treeView = new QTreeView;
032aa1e1 Poul Sander 2026-02-19 18:55 33
    m_treeView->setModel(m_dirModel);
032aa1e1 Poul Sander 2026-02-19 18:55 34
    m_treeView->setRootIndex(m_dirModel->index(QDir::homePath()));
032aa1e1 Poul Sander 2026-02-19 18:55 35
    m_treeView->header()->hide();
032aa1e1 Poul Sander 2026-02-19 18:55 36
    m_treeView->setColumnHidden(1, true);
032aa1e1 Poul Sander 2026-02-19 18:55 37
    m_treeView->setColumnHidden(2, true);
032aa1e1 Poul Sander 2026-02-19 18:55 38
    m_treeView->setColumnHidden(3, true);
032aa1e1 Poul Sander 2026-02-19 18:55 39
032aa1e1 Poul Sander 2026-02-19 18:55 40
    // Thumbnail model (center pane)
032aa1e1 Poul Sander 2026-02-19 18:55 41
    m_imageModel = new ImageModel(this);
032aa1e1 Poul Sander 2026-02-19 18:55 42
032aa1e1 Poul Sander 2026-02-19 18:55 43
    m_listView = new QListView;
032aa1e1 Poul Sander 2026-02-19 18:55 44
    m_listView->setModel(m_imageModel);
032aa1e1 Poul Sander 2026-02-19 18:55 45
    m_listView->setViewMode(QListView::IconMode);
032aa1e1 Poul Sander 2026-02-19 18:55 46
    m_listView->setIconSize(QSize(128, 128));
b614a581 Poul Sander 2026-02-19 21:18 47
    m_listView->setGridSize(QSize(148, 168));
032aa1e1 Poul Sander 2026-02-19 18:55 48
    m_listView->setResizeMode(QListView::Adjust);
032aa1e1 Poul Sander 2026-02-19 18:55 49
    m_listView->setSelectionMode(QAbstractItemView::SingleSelection);
b614a581 Poul Sander 2026-02-19 21:18 50
    m_listView->setSpacing(4);
b614a581 Poul Sander 2026-02-19 21:18 51
    m_listView->setWordWrap(true);
b614a581 Poul Sander 2026-02-19 21:18 52
    m_listView->setTextElideMode(Qt::ElideRight);
032aa1e1 Poul Sander 2026-02-19 18:55 53
032aa1e1 Poul Sander 2026-02-19 18:55 54
    // Preview pane (right)
032aa1e1 Poul Sander 2026-02-19 18:55 55
    m_previewLabel = new QLabel;
032aa1e1 Poul Sander 2026-02-19 18:55 56
    m_previewLabel->setAlignment(Qt::AlignCenter);
032aa1e1 Poul Sander 2026-02-19 18:55 57
    m_previewLabel->setMinimumWidth(300);
032aa1e1 Poul Sander 2026-02-19 18:55 58
032aa1e1 Poul Sander 2026-02-19 18:55 59
    // Layout
032aa1e1 Poul Sander 2026-02-19 18:55 60
    QSplitter *rightSplitter = new QSplitter(Qt::Horizontal);
032aa1e1 Poul Sander 2026-02-19 18:55 61
    rightSplitter->addWidget(m_listView);
032aa1e1 Poul Sander 2026-02-19 18:55 62
    rightSplitter->addWidget(m_previewLabel);
032aa1e1 Poul Sander 2026-02-19 18:55 63
    rightSplitter->setStretchFactor(0, 3);
032aa1e1 Poul Sander 2026-02-19 18:55 64
    rightSplitter->setStretchFactor(1, 2);
032aa1e1 Poul Sander 2026-02-19 18:55 65
032aa1e1 Poul Sander 2026-02-19 18:55 66
    QSplitter *mainSplitter = new QSplitter(Qt::Horizontal);
032aa1e1 Poul Sander 2026-02-19 18:55 67
    mainSplitter->addWidget(m_treeView);
032aa1e1 Poul Sander 2026-02-19 18:55 68
    mainSplitter->addWidget(rightSplitter);
032aa1e1 Poul Sander 2026-02-19 18:55 69
    mainSplitter->setStretchFactor(1, 1);
032aa1e1 Poul Sander 2026-02-19 18:55 70
032aa1e1 Poul Sander 2026-02-19 18:55 71
    setCentralWidget(mainSplitter);
032aa1e1 Poul Sander 2026-02-19 18:55 72
}
032aa1e1 Poul Sander 2026-02-19 18:55 73
032aa1e1 Poul Sander 2026-02-19 18:55 74
void MainWindow::setupConnections()
032aa1e1 Poul Sander 2026-02-19 18:55 75
{
032aa1e1 Poul Sander 2026-02-19 18:55 76
    connect(m_treeView, &QTreeView::clicked, this,
032aa1e1 Poul Sander 2026-02-19 18:55 77
            [this](const QModelIndex &index)
6fcd6c90 Poul Sander 2026-02-19 21:12 78
            {
6fcd6c90 Poul Sander 2026-02-19 21:12 79
                QString path = m_dirModel->filePath(index);
6fcd6c90 Poul Sander 2026-02-19 21:12 80
                m_imageModel->setDirectory(path);
6fcd6c90 Poul Sander 2026-02-19 21:12 81
                // Defer thumbnail load so the view has time to lay out items
6fcd6c90 Poul Sander 2026-02-19 21:12 82
                QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails);
6fcd6c90 Poul Sander 2026-02-19 21:12 83
            });
032aa1e1 Poul Sander 2026-02-19 18:55 84
032aa1e1 Poul Sander 2026-02-19 18:55 85
    connect(m_listView, &QListView::clicked, this,
cfe4a67b Poul Sander 2026-02-19 23:06 86
            [this](const QModelIndex &index) { showPreview(index); });
6fcd6c90 Poul Sander 2026-02-19 21:12 87
cfe4a67b Poul Sander 2026-02-19 23:06 88
    connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged,
cfe4a67b Poul Sander 2026-02-19 23:06 89
            this, [this](const QModelIndex &current) { showPreview(current); });
6fcd6c90 Poul Sander 2026-02-19 21:12 90
6fcd6c90 Poul Sander 2026-02-19 21:12 91
    connect(m_listView->verticalScrollBar(), &QScrollBar::valueChanged,
6fcd6c90 Poul Sander 2026-02-19 21:12 92
            this, [this]()
6fcd6c90 Poul Sander 2026-02-19 21:12 93
            { loadVisibleThumbnails(); });
6fcd6c90 Poul Sander 2026-02-19 21:12 94
6fcd6c90 Poul Sander 2026-02-19 21:12 95
    // Also catch resize — visible range changes when the viewport is resized
6fcd6c90 Poul Sander 2026-02-19 21:12 96
    m_listView->viewport()->installEventFilter(this);
6fcd6c90 Poul Sander 2026-02-19 21:12 97
}
6fcd6c90 Poul Sander 2026-02-19 21:12 98
6fcd6c90 Poul Sander 2026-02-19 21:12 99
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
6fcd6c90 Poul Sander 2026-02-19 21:12 100
{
6fcd6c90 Poul Sander 2026-02-19 21:12 101
    if (obj == m_listView->viewport() && event->type() == QEvent::Resize)
6fcd6c90 Poul Sander 2026-02-19 21:12 102
        QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails);
6fcd6c90 Poul Sander 2026-02-19 21:12 103
6fcd6c90 Poul Sander 2026-02-19 21:12 104
    return QMainWindow::eventFilter(obj, event);
6fcd6c90 Poul Sander 2026-02-19 21:12 105
}
6fcd6c90 Poul Sander 2026-02-19 21:12 106
6fcd6c90 Poul Sander 2026-02-19 21:12 107
void MainWindow::loadVisibleThumbnails()
6fcd6c90 Poul Sander 2026-02-19 21:12 108
{
6fcd6c90 Poul Sander 2026-02-19 21:12 109
    QModelIndex topLeft = m_listView->indexAt(QPoint(0, 0));
6fcd6c90 Poul Sander 2026-02-19 21:12 110
    QModelIndex bottomRight = m_listView->indexAt(
6fcd6c90 Poul Sander 2026-02-19 21:12 111
        QPoint(m_listView->viewport()->width() - 1,
6fcd6c90 Poul Sander 2026-02-19 21:12 112
               m_listView->viewport()->height() - 1));
6fcd6c90 Poul Sander 2026-02-19 21:12 113
6fcd6c90 Poul Sander 2026-02-19 21:12 114
    int first = topLeft.isValid() ? topLeft.row() : 0;
6fcd6c90 Poul Sander 2026-02-19 21:12 115
    int last = bottomRight.isValid() ? bottomRight.row()
6fcd6c90 Poul Sander 2026-02-19 21:12 116
                                     : m_imageModel->rowCount() - 1;
6fcd6c90 Poul Sander 2026-02-19 21:12 117
6fcd6c90 Poul Sander 2026-02-19 21:12 118
    if (last < 0)
6fcd6c90 Poul Sander 2026-02-19 21:12 119
        return;
6fcd6c90 Poul Sander 2026-02-19 21:12 120
6fcd6c90 Poul Sander 2026-02-19 21:12 121
    std::cout << "loadVisibleThumbnails: " << first << " - " << last << "\n";
6fcd6c90 Poul Sander 2026-02-19 21:12 122
    m_imageModel->requestThumbnails(first, last);
032aa1e1 Poul Sander 2026-02-19 18:55 123
}
cfe4a67b Poul Sander 2026-02-19 23:06 124
cfe4a67b Poul Sander 2026-02-19 23:06 125
void MainWindow::showPreview(const QModelIndex &index)
cfe4a67b Poul Sander 2026-02-19 23:06 126
{
cfe4a67b Poul Sander 2026-02-19 23:06 127
    if (!index.isValid())
cfe4a67b Poul Sander 2026-02-19 23:06 128
        return;
cfe4a67b Poul Sander 2026-02-19 23:06 129
cfe4a67b Poul Sander 2026-02-19 23:06 130
    QString path = m_imageModel->filePath(index);
cfe4a67b Poul Sander 2026-02-19 23:06 131
cfe4a67b Poul Sander 2026-02-19 23:06 132
    QImageReader reader(path);
cfe4a67b Poul Sander 2026-02-19 23:06 133
    reader.setAutoTransform(true);
cfe4a67b Poul Sander 2026-02-19 23:06 134
    QImage image = reader.read();
cfe4a67b Poul Sander 2026-02-19 23:06 135
cfe4a67b Poul Sander 2026-02-19 23:06 136
    m_previewLabel->setPixmap(
cfe4a67b Poul Sander 2026-02-19 23:06 137
        QPixmap::fromImage(image).scaled(
cfe4a67b Poul Sander 2026-02-19 23:06 138
            m_previewLabel->size(),
cfe4a67b Poul Sander 2026-02-19 23:06 139
            Qt::KeepAspectRatio,
cfe4a67b Poul Sander 2026-02-19 23:06 140
            Qt::SmoothTransformation));
cfe4a67b Poul Sander 2026-02-19 23:06 141
}
1970-01-01 00:00 142