| 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" |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
6 |
#include "exifreader.h" |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
7 |
#include "fsdirmodel.h" |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
8 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
9 |
#include <QFile> |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
10 |
#include <QTreeView> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
11 |
#include <QTreeView> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
12 |
#include <QListView> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
13 |
#include <QLabel> |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
14 |
#include <QStackedWidget> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
15 |
#include <QDir> |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
16 |
#include <QListWidget> |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
17 |
#include <QStandardPaths> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
18 |
#include <QImageReader> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
19 |
#include <QHeaderView> |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
20 |
#include <QScrollBar> |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
21 |
#include <QTimer> |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
22 |
#include <QEvent> |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
23 |
#include <QKeyEvent> |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
24 |
#include <QCloseEvent> |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
25 |
#include <QItemSelectionModel> |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
26 |
#include <QDockWidget> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
27 |
#include <QMenuBar> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
28 |
#include <QMenu> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
29 |
#include <QAction> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
30 |
#include <QSettings> |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
31 |
#include <QTableWidget> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
32 |
#include <QDialog> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
33 |
#include <QVBoxLayout> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
34 |
#include <QDialogButtonBox> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
35 |
#include <QPlainTextEdit> |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
36 |
#include <QMessageBox> |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
37 |
#include <iostream> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
38 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
39 |
#include <fcntl.h> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
40 |
#include <sys/stat.h> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
41 |
#include <unistd.h> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
42 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
43 |
namespace |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
44 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
45 |
ThumbnailCache::Size thumbnailSizeFromString(const QString &s) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
46 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
47 |
return (s == "large") ? ThumbnailCache::Size::Large |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
48 |
: ThumbnailCache::Size::Normal; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
49 |
} |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
50 |
} // namespace |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
51 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
52 |
MainWindow::MainWindow(QWidget *parent) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
53 |
: QMainWindow(parent) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
54 |
{ |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
55 |
setupUi(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
56 |
setupMenuBar(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
57 |
setupConnections(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
58 |
loadPreferences(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
59 |
} |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
60 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
61 |
void MainWindow::setupUi() |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
62 |
{ |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
63 |
// Folder model (left pane) — backed by std::filesystem so directories with |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
64 |
// non-UTF-8 filenames are listed correctly. |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
65 |
m_dirModel = new FsDirModel(this); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
66 |
m_dirModel->setRootPath(QDir::homePath()); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
67 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
68 |
// Root chooser list |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
69 |
m_rootList = new QListWidget; |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
70 |
m_rootList->setSelectionMode(QAbstractItemView::SingleSelection); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
71 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
72 |
auto addRootItem = [this](const QString &label, const QString &path) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
73 |
QListWidgetItem *item = new QListWidgetItem(label, m_rootList); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
74 |
item->setData(Qt::UserRole, path); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
75 |
}; |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
76 |
addRootItem("Home", QDir::homePath()); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
77 |
addRootItem("Pictures", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
78 |
addRootItem("File System", QDir::rootPath()); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
79 |
m_rootList->setCurrentRow(0); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
80 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
81 |
m_treeView = new QTreeView; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
82 |
m_treeView->setModel(m_dirModel); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
83 |
m_treeView->setRootIndex(m_dirModel->rootIndex()); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
84 |
m_treeView->header()->hide(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
85 |
m_treeView->setColumnHidden(1, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
86 |
m_treeView->setColumnHidden(2, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
87 |
m_treeView->setColumnHidden(3, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
88 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
89 |
// Thumbnail model (center pane) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
90 |
m_imageModel = new ImageModel(this); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
91 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
92 |
m_listView = new QListView; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
93 |
m_listView->setModel(m_imageModel); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
94 |
m_listView->setViewMode(QListView::IconMode); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
95 |
m_listView->setIconSize(QSize(128, 128)); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
96 |
m_listView->setGridSize(QSize(148, 168)); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
97 |
m_listView->setResizeMode(QListView::Adjust); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
98 |
m_listView->setSelectionMode(QAbstractItemView::SingleSelection); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
99 |
m_listView->setSpacing(4); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
100 |
m_listView->setWordWrap(true); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
101 |
m_listView->setTextElideMode(Qt::ElideRight); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
102 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
103 |
// Preview pane (right) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
104 |
m_previewLabel = new QLabel; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
105 |
m_previewLabel->setAlignment(Qt::AlignCenter); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
106 |
m_previewLabel->setMinimumWidth(200); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
107 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
108 |
// Single image view |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
109 |
m_imageView = new ImageViewWidget; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
110 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
111 |
// Stack to switch between browser and single image |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
112 |
m_stack = new QStackedWidget; |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
113 |
m_stack->addWidget(m_listView); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
114 |
m_stack->addWidget(m_imageView); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
115 |
m_browserPage = m_listView; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
116 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
117 |
setCentralWidget(m_stack); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
118 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
119 |
// Dock widgets — can be dragged, floated and stacked by the user |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
120 |
m_rootDock = new QDockWidget(tr("Roots"), this); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
121 |
m_rootDock->setObjectName("RootDock"); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
122 |
m_rootDock->setWidget(m_rootList); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
123 |
addDockWidget(Qt::LeftDockWidgetArea, m_rootDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
124 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
125 |
m_folderDock = new QDockWidget(tr("Folders"), this); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
126 |
m_folderDock->setObjectName("FolderDock"); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
127 |
m_folderDock->setWidget(m_treeView); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
128 |
addDockWidget(Qt::LeftDockWidgetArea, m_folderDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
129 |
splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
130 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
131 |
m_previewDock = new QDockWidget(tr("Preview"), this); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
132 |
m_previewDock->setObjectName("PreviewDock"); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
133 |
m_previewDock->setWidget(m_previewLabel); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
134 |
addDockWidget(Qt::RightDockWidgetArea, m_previewDock); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
135 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
136 |
// EXIF info dock — placed below the preview dock by default |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
137 |
m_exifTable = new QTableWidget(0, 2); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
138 |
m_exifTable->setHorizontalHeaderLabels({tr("Field"), tr("Value")}); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
139 |
m_exifTable->horizontalHeader()->setStretchLastSection(true); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
140 |
m_exifTable->verticalHeader()->hide(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
141 |
m_exifTable->setEditTriggers(QAbstractItemView::NoEditTriggers); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
142 |
m_exifTable->setSelectionMode(QAbstractItemView::NoSelection); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
143 |
m_exifTable->setShowGrid(false); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
144 |
m_exifTable->setAlternatingRowColors(true); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
145 |
m_exifTable->setMinimumWidth(200); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
146 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
147 |
m_exifDock = new QDockWidget(tr("EXIF Info"), this); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
148 |
m_exifDock->setObjectName("ExifDock"); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
149 |
m_exifDock->setWidget(m_exifTable); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
150 |
addDockWidget(Qt::RightDockWidgetArea, m_exifDock); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
151 |
splitDockWidget(m_previewDock, m_exifDock, Qt::Vertical); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
152 |
} |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
153 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
154 |
void MainWindow::setupMenuBar() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
155 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
156 |
m_menuBar = menuBar(); |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
157 |
m_menuBar->setStyleSheet( |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
158 |
"QMenuBar { padding: 1px 2px; }" |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
159 |
"QMenuBar::item { padding: 2px 6px; }" |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
160 |
); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
161 |
QMenu *viewMenu = m_menuBar->addMenu("&View"); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
162 |
viewMenu->addAction(m_rootDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
163 |
viewMenu->addAction(m_folderDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
164 |
viewMenu->addAction(m_previewDock->toggleViewAction()); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
165 |
viewMenu->addAction(m_exifDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
166 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
167 |
QMenu *editMenu = m_menuBar->addMenu("&Edit"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
168 |
QAction *preferencesAction = editMenu->addAction("&Preferences"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
169 |
connect(preferencesAction, &QAction::triggered, this, &MainWindow::onPreferencesTriggered); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
170 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
171 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
172 |
void MainWindow::navigateToFolder(const QString &path) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
173 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
174 |
navigateToFolder(QFile::encodeName(path)); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
175 |
} |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
176 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
177 |
void MainWindow::navigateToFolder(const QByteArray &path) |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
178 |
{ |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
179 |
m_previousFolderPath = m_imageModel->currentDirectory(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
180 |
m_imageModel->setDirectory(path); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
181 |
QModelIndex dirIdx = m_dirModel->indexForPath(path); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
182 |
if (dirIdx.isValid()) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
183 |
m_treeView->setCurrentIndex(dirIdx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
184 |
QTimer::singleShot(0, this, [this]() { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
185 |
selectPreviousFolderIfExists(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
186 |
loadVisibleThumbnails(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
187 |
}); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
188 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
189 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
190 |
void MainWindow::openPath(const QString &path) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
191 |
{ |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
192 |
QFileInfo info(path); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
193 |
if (!info.exists()) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
194 |
return; |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
195 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
196 |
if (info.isDir()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
197 |
navigateToFolder(QFile::encodeName(info.absoluteFilePath())); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
198 |
} else if (info.isFile()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
199 |
navigateToFolder(QFile::encodeName(info.absolutePath())); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
200 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
201 |
// ImageModel::setDirectory is synchronous, so items are ready now. |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
202 |
// Find the file in the model and open it. |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
203 |
QByteArray target = QFile::encodeName(info.absoluteFilePath()); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
204 |
for (int i = 0; i < m_imageModel->rowCount(); ++i) { |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
205 |
QModelIndex idx = m_imageModel->index(i); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
206 |
if (m_imageModel->filePath(idx) == target) { |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
207 |
m_listView->setCurrentIndex(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
208 |
m_listView->scrollTo(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
209 |
showPreview(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
210 |
if (!m_imageModel->isFolder(idx)) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
211 |
enterSingleImageMode(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
212 |
break; |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
213 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
214 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
215 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
216 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
217 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
218 |
void MainWindow::selectPreviousFolderIfExists() |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
219 |
{ |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
220 |
if (m_previousFolderPath.isEmpty()) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
221 |
return; |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
222 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
223 |
// Find the previous folder in the current directory's contents |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
224 |
for (int i = 0; i < m_imageModel->rowCount(); ++i) { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
225 |
QModelIndex idx = m_imageModel->index(i); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
226 |
if (m_imageModel->isFolder(idx)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
227 |
QByteArray folderPath = m_imageModel->filePath(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
228 |
if (folderPath == m_previousFolderPath) { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
229 |
m_listView->setCurrentIndex(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
230 |
m_listView->scrollTo(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
231 |
return; |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
232 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
233 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
234 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
235 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
236 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
237 |
void MainWindow::setupConnections() |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
238 |
{ |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
239 |
connect(m_rootList, &QListWidget::currentItemChanged, this, |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
240 |
[this](QListWidgetItem *current, QListWidgetItem *) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
241 |
if (current == nullptr) |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
242 |
return; |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
243 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
244 |
QString rootPath = current->data(Qt::UserRole).toString(); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
245 |
m_dirModel->setRootPath(rootPath); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
246 |
m_treeView->setRootIndex(m_dirModel->rootIndex()); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
247 |
}); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
248 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
249 |
connect(m_treeView, &QTreeView::clicked, this, |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
250 |
[this](const QModelIndex &index) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
251 |
{ |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
252 |
QByteArray path = m_dirModel->filePath(index); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
253 |
navigateToFolder(path); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
254 |
}); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
255 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
256 |
connect(m_listView, &QListView::clicked, this, |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
257 |
[this](const QModelIndex &index) { showPreview(index); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
258 |
|
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
259 |
connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged, |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
260 |
this, [this](const QModelIndex ¤t) { showPreview(current); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
261 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
262 |
connect(m_listView, &QListView::doubleClicked, this, |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
263 |
[this](const QModelIndex &index) { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
264 |
if (m_imageModel->isFolder(index)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
265 |
QByteArray path = m_imageModel->filePath(index); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
266 |
navigateToFolder(path); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
267 |
} else { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
268 |
enterSingleImageMode(index); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
269 |
} |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
270 |
}); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
271 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
272 |
connect(m_imageView, &ImageViewWidget::closeRequested, |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
273 |
this, &MainWindow::leaveSingleImageMode); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
274 |
connect(m_imageView, &ImageViewWidget::editCaptionRequested, |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
275 |
this, &MainWindow::onEditCaption); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
276 |
connect(m_imageView, &ImageViewWidget::nextRequested, this, [this]() { |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
277 |
QModelIndex cur = m_listView->currentIndex(); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
278 |
int next = cur.isValid() ? cur.row() + 1 : 0; |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
279 |
while (next < m_imageModel->rowCount() && m_imageModel->isFolder(m_imageModel->index(next))) |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
280 |
++next; |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
281 |
if (next < m_imageModel->rowCount()) |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
282 |
{ |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
283 |
QModelIndex idx = m_imageModel->index(next); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
284 |
m_listView->setCurrentIndex(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
285 |
enterSingleImageMode(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
286 |
} |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
287 |
}); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
288 |
|
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
289 |
connect(m_imageView, &ImageViewWidget::previousRequested, this, [this]() { |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
290 |
QModelIndex cur = m_listView->currentIndex(); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
291 |
int prev = cur.isValid() ? cur.row() - 1 : 0; |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
292 |
while (prev >= 0 && m_imageModel->isFolder(m_imageModel->index(prev))) |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
293 |
--prev; |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
294 |
if (prev >= 0) |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
295 |
{ |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
296 |
QModelIndex idx = m_imageModel->index(prev); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
297 |
m_listView->setCurrentIndex(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
298 |
enterSingleImageMode(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
299 |
} |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
300 |
}); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
301 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
302 |
connect(m_listView->verticalScrollBar(), &QScrollBar::valueChanged, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
303 |
this, [this]() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
304 |
{ loadVisibleThumbnails(); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
305 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
306 |
// Also catch resize — visible range changes when the viewport is resized |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
307 |
m_listView->viewport()->installEventFilter(this); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
308 |
} |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
309 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
310 |
bool MainWindow::eventFilter(QObject *obj, QEvent *event) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
311 |
{ |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
312 |
if (obj == m_listView->viewport() && event->type() == QEvent::Resize) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
313 |
QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
314 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
315 |
return QMainWindow::eventFilter(obj, event); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
316 |
} |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
317 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
318 |
void MainWindow::loadVisibleThumbnails() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
319 |
{ |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
320 |
QModelIndex topLeft = m_listView->indexAt(QPoint(0, 0)); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
321 |
QModelIndex bottomRight = m_listView->indexAt( |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
322 |
QPoint(m_listView->viewport()->width() - 1, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
323 |
m_listView->viewport()->height() - 1)); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
324 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
325 |
int first = topLeft.isValid() ? topLeft.row() : 0; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
326 |
int last = bottomRight.isValid() ? bottomRight.row() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
327 |
: m_imageModel->rowCount() - 1; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
328 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
329 |
if (last < 0) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
330 |
return; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
331 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
332 |
std::cout << "loadVisibleThumbnails: " << first << " - " << last << "\n"; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
333 |
m_imageModel->requestThumbnails(first, last); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
334 |
} |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
335 |
|
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
336 |
void MainWindow::showPreview(const QModelIndex &index) |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
337 |
{ |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
338 |
if (!index.isValid()) |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
339 |
return; |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
340 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
341 |
QByteArray path = m_imageModel->filePath(index); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
342 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
343 |
int fd = ::open(path.constData(), O_RDONLY | O_CLOEXEC); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
344 |
if (fd >= 0) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
345 |
QFile file; |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
346 |
if (file.open(fd, QIODevice::ReadOnly, QFileDevice::AutoCloseHandle)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
347 |
QImageReader reader(&file); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
348 |
reader.setAutoTransform(true); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
349 |
QSize fullSize = reader.size(); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
350 |
if (fullSize.isValid()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
351 |
QSize target = fullSize.scaled(m_previewLabel->size(), Qt::KeepAspectRatio); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
352 |
reader.setScaledSize(target); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
353 |
} |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
354 |
QImage image = reader.read(); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
355 |
m_previewLabel->setPixmap( |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
356 |
QPixmap::fromImage(image).scaled( |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
357 |
m_previewLabel->size(), |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
358 |
Qt::KeepAspectRatio, |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
359 |
Qt::SmoothTransformation)); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
360 |
} |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
361 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
362 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
363 |
updateExifInfo(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
364 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
365 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
366 |
void MainWindow::updateExifInfo(const QByteArray &path) |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
367 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
368 |
// Check if this is a folder by attempting stat |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
369 |
struct ::stat st{}; |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
370 |
if (::stat(path.constData(), &st) != 0 || S_ISDIR(st.st_mode)) { |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
371 |
m_exifTable->setRowCount(0); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
372 |
return; |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
373 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
374 |
const ExifData data = ExifReader::read(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
375 |
const auto fields = data.toList(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
376 |
m_exifTable->setRowCount(fields.size()); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
377 |
for (int i = 0; i < fields.size(); ++i) { |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
378 |
m_exifTable->setItem(i, 0, new QTableWidgetItem(fields[i].first)); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
379 |
m_exifTable->setItem(i, 1, new QTableWidgetItem(fields[i].second)); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
380 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
381 |
m_exifTable->resizeColumnToContents(0); |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
382 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
383 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
384 |
void MainWindow::enterSingleImageMode(const QModelIndex &index) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
385 |
{ |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
386 |
if (!index.isValid()) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
387 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
388 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
389 |
// Only save state and hide chrome when transitioning from browse mode |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
390 |
if (m_stack->currentWidget() != m_imageView) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
391 |
m_rootDockWasVisible = m_rootDock->isVisible(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
392 |
m_folderDockWasVisible = m_folderDock->isVisible(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
393 |
m_previewDockWasVisible = m_previewDock->isVisible(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
394 |
m_exifDockWasVisible = m_exifDock->isVisible(); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
395 |
m_rootDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
396 |
m_folderDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
397 |
m_previewDock->hide(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
398 |
m_exifDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
399 |
m_menuBar->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
400 |
} |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
401 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
402 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
403 |
QByteArray path = m_imageModel->filePath(index); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
404 |
m_imageView->setNeighborPaths(computeNeighborPaths(index)); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
405 |
m_imageView->setImage(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
406 |
m_imageView->setExifData(ExifReader::read(path)); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
407 |
updateExifInfo(path); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
408 |
m_stack->setCurrentWidget(m_imageView); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
409 |
m_imageView->setFocus(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
410 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
411 |
if (m_imageViewWasFullScreen) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
412 |
setFullScreenMode(true); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
413 |
m_imageViewWasFullScreen = false; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
414 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
415 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
416 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
417 |
void MainWindow::onEditCaption() |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
418 |
{ |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
419 |
const QByteArray path = m_imageView->currentPath(); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
420 |
if (path.isEmpty()) |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
421 |
return; |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
422 |
|
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
423 |
if (::access(path.constData(), W_OK) != 0) { |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
424 |
QMessageBox::warning(this, tr("Cannot Edit Caption"), |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
425 |
tr("The file is write-protected and cannot be edited.\n\n%1") |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
426 |
.arg(QString::fromLocal8Bit(path))); |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
427 |
return; |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
428 |
} |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
429 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
430 |
ExifData data = ExifReader::read(path); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
431 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
432 |
QDialog dlg(this); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
433 |
dlg.setWindowTitle(tr("Edit Caption")); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
434 |
auto *layout = new QVBoxLayout(&dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
435 |
layout->addWidget(new QLabel(tr("Caption-Abstract:"), &dlg)); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
436 |
auto *edit = new QPlainTextEdit(&dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
437 |
edit->setPlainText(data.captionAbstract); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
438 |
edit->setMinimumWidth(400); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
439 |
layout->addWidget(edit); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
440 |
auto *buttons = new QDialogButtonBox( |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
441 |
QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
442 |
layout->addWidget(buttons); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
443 |
connect(buttons, &QDialogButtonBox::accepted, &dlg, &QDialog::accept); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
444 |
connect(buttons, &QDialogButtonBox::rejected, &dlg, &QDialog::reject); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
445 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
446 |
if (dlg.exec() != QDialog::Accepted) |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
447 |
return; |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
448 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
449 |
const QString newCaption = edit->toPlainText(); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
450 |
if (ExifReader::saveCaption(path, newCaption, data)) { |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
451 |
ExifData updated = ExifReader::read(path); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
452 |
m_imageView->setExifData(updated); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
453 |
updateExifInfo(path); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
454 |
} |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
455 |
} |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
456 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
457 |
void MainWindow::leaveSingleImageMode() |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
458 |
{ |
| 3968465e |
Poul Sander |
2026-02-23 19:13 |
459 |
if (isFullScreen()) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
460 |
m_imageViewWasFullScreen = true; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
461 |
setFullScreenMode(false); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
462 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
463 |
m_imageView->clearCache(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
464 |
m_stack->setCurrentWidget(m_browserPage); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
465 |
m_menuBar->show(); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
466 |
if (m_rootDockWasVisible) |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
467 |
m_rootDock->show(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
468 |
if (m_folderDockWasVisible) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
469 |
m_folderDock->show(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
470 |
if (m_previewDockWasVisible) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
471 |
m_previewDock->show(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
472 |
if (m_exifDockWasVisible) |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
473 |
m_exifDock->show(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
474 |
m_listView->setFocus(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
475 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
476 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
477 |
QList<QByteArray> MainWindow::computeNeighborPaths(const QModelIndex &index) const |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
478 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
479 |
QList<QByteArray> paths; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
480 |
int row = index.row(); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
481 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
482 |
// Collect up to CacheKeepBehind non-folder images before current |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
483 |
int count = 0; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
484 |
for (int i = row - 1; i >= 0 && count < ImageViewWidget::CacheKeepBehind; --i) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
485 |
QModelIndex idx = m_imageModel->index(i); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
486 |
if (!m_imageModel->isFolder(idx)) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
487 |
paths.prepend(m_imageModel->filePath(idx)); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
488 |
++count; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
489 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
490 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
491 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
492 |
// Collect up to CacheReadAhead non-folder images after current |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
493 |
count = 0; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
494 |
for (int i = row + 1; i < m_imageModel->rowCount() && count < ImageViewWidget::CacheReadAhead; ++i) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
495 |
QModelIndex idx = m_imageModel->index(i); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
496 |
if (!m_imageModel->isFolder(idx)) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
497 |
paths.append(m_imageModel->filePath(idx)); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
498 |
++count; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
499 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
500 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
501 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
502 |
return paths; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
503 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
504 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
505 |
void MainWindow::setFullScreenMode(bool fullScreen) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
506 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
507 |
if (fullScreen == isFullScreen()) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
508 |
return; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
509 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
510 |
if (fullScreen) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
511 |
m_wasMaximized = isMaximized(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
512 |
m_menuBar->hide(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
513 |
showFullScreen(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
514 |
} else { |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
515 |
// Only restore menu bar when returning to browse mode |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
516 |
if (m_stack->currentWidget() != m_imageView) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
517 |
m_menuBar->show(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
518 |
if (m_wasMaximized) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
519 |
showMaximized(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
520 |
else |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
521 |
showNormal(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
522 |
} |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
523 |
} |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
524 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
525 |
void MainWindow::keyPressEvent(QKeyEvent *event) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
526 |
{ |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
527 |
if (event->key() == Qt::Key_F11 && m_stack->currentWidget() == m_imageView) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
528 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
529 |
setFullScreenMode(!isFullScreen()); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
530 |
event->accept(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
531 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
532 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
533 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
534 |
if (event->key() == Qt::Key_Return && m_stack->currentWidget() == m_browserPage) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
535 |
{ |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
536 |
QModelIndex current = m_listView->currentIndex(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
537 |
if (current.isValid()) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
538 |
{ |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
539 |
if (m_imageModel->isFolder(current)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
540 |
QByteArray path = m_imageModel->filePath(current); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
541 |
navigateToFolder(path); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
542 |
} else { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
543 |
enterSingleImageMode(current); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
544 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
545 |
event->accept(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
546 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
547 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
548 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
549 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
550 |
QMainWindow::keyPressEvent(event); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
551 |
} |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
552 |
|
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
553 |
void MainWindow::closeEvent(QCloseEvent *event) |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
554 |
{ |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
555 |
if (m_stack->currentWidget() == m_imageView) |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
556 |
{ |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
557 |
leaveSingleImageMode(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
558 |
event->ignore(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
559 |
return; |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
560 |
} |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
561 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
562 |
savePreferences(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
563 |
QMainWindow::closeEvent(event); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
564 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
565 |
|
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
566 |
void MainWindow::applyDockLocking(bool lock) |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
567 |
{ |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
568 |
const QDockWidget::DockWidgetFeatures movableFeatures = |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
569 |
QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable; |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
570 |
const QDockWidget::DockWidgetFeatures baseFeatures = |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
571 |
QDockWidget::DockWidgetClosable; |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
572 |
|
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
573 |
QDockWidget::DockWidgetFeatures features = lock ? baseFeatures |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
574 |
: (baseFeatures | movableFeatures); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
575 |
m_rootDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
576 |
m_folderDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
577 |
m_previewDock->setFeatures(features); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
578 |
m_exifDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
579 |
} |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
580 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
581 |
void MainWindow::loadPreferences() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
582 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
583 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
584 |
m_backgroundColorPreference = settings.value("backgroundColor", "black").toString(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
585 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
586 |
m_lockDockingPreference = settings.value("lockDocking", false).toBool(); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
587 |
applyDockLocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
588 |
m_folderCacheSizePreference = settings.value("folderCacheSize", 4).toInt(); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
589 |
m_imageModel->setCacheMaxSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
590 |
m_thumbnailCacheSizePreference = settings.value("thumbnailCacheSize", "normal").toString(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
591 |
m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference)); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
592 |
if (settings.contains("windowGeometry")) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
593 |
restoreGeometry(settings.value("windowGeometry").toByteArray()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
594 |
if (settings.contains("windowState")) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
595 |
restoreState(settings.value("windowState").toByteArray()); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
596 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
597 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
598 |
void MainWindow::savePreferences() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
599 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
600 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
601 |
settings.setValue("backgroundColor", m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
602 |
settings.setValue("lockDocking", m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
603 |
settings.setValue("folderCacheSize", m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
604 |
settings.setValue("thumbnailCacheSize", m_thumbnailCacheSizePreference); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
605 |
settings.setValue("windowGeometry", saveGeometry()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
606 |
settings.setValue("windowState", saveState()); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
607 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
608 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
609 |
void MainWindow::onPreferencesTriggered() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
610 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
611 |
PreferencesDialog dialog(this); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
612 |
dialog.setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
613 |
dialog.setLockDocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
614 |
dialog.setCacheSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
615 |
dialog.setThumbnailCacheSize(m_thumbnailCacheSizePreference); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
616 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
617 |
bool shouldResetLayout = false; |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
618 |
connect(&dialog, &PreferencesDialog::resetLayoutRequested, this, [&shouldResetLayout]() { |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
619 |
shouldResetLayout = true; |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
620 |
}); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
621 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
622 |
if (dialog.exec() == QDialog::Accepted) |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
623 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
624 |
m_backgroundColorPreference = dialog.getBackgroundColor(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
625 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
626 |
m_lockDockingPreference = dialog.getLockDocking(); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
627 |
applyDockLocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
628 |
m_folderCacheSizePreference = dialog.getCacheSize(); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
629 |
m_imageModel->setCacheMaxSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
630 |
QString newThumbSize = dialog.getThumbnailCacheSize(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
631 |
if (newThumbSize != m_thumbnailCacheSizePreference) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
632 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
633 |
m_thumbnailCacheSizePreference = newThumbSize; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
634 |
m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference)); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
635 |
loadVisibleThumbnails(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
636 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
637 |
savePreferences(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
638 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
639 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
640 |
// Apply layout reset immediately after dialog closes if requested |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
641 |
if (shouldResetLayout) { |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
642 |
resetLayoutToDefault(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
643 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
644 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
645 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
646 |
void MainWindow::resetLayoutToDefault() |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
647 |
{ |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
648 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
649 |
settings.remove("windowGeometry"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
650 |
settings.remove("windowState"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
651 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
652 |
// Hide and detach docks completely |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
653 |
m_rootDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
654 |
m_folderDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
655 |
m_previewDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
656 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
657 |
m_rootDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
658 |
m_folderDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
659 |
m_previewDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
660 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
661 |
removeDockWidget(m_rootDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
662 |
removeDockWidget(m_folderDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
663 |
removeDockWidget(m_previewDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
664 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
665 |
// Re-add in default positions |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
666 |
addDockWidget(Qt::LeftDockWidgetArea, m_rootDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
667 |
addDockWidget(Qt::LeftDockWidgetArea, m_folderDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
668 |
addDockWidget(Qt::RightDockWidgetArea, m_previewDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
669 |
splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
670 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
671 |
// Show all docks |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
672 |
m_rootDock->show(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
673 |
m_folderDock->show(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
674 |
m_previewDock->show(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
675 |
} |
|
|
1970-01-01 00:00 |
676 |
|