| 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 ¤t) { 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 |
|