| 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" |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
5 |
#include "shortcutmanager.h" |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
6 |
#include "thumbnailcache.h" |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
7 |
#include "exifreader.h" |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
8 |
#include "fsdirmodel.h" |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
9 |
#include "pathcompletermodel.h" |
| 1dcea855 |
Poul Sander |
2026-05-26 21:48 |
10 |
#include "thumbnaildelegate.h" |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
11 |
|
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
12 |
#include <QTreeView> |
| 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> |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
23 |
#include <QItemSelectionModel> |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
24 |
#include <QDockWidget> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
25 |
#include <QMenuBar> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
26 |
#include <QMenu> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
27 |
#include <QAction> |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
28 |
#include <QSettings> |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
29 |
#include <QTableWidget> |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
30 |
#include <QDesktopServices> |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
31 |
#include <QUrl> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
32 |
#include <QDialog> |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
33 |
#include <QHBoxLayout> |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
34 |
#include <QPlainTextEdit> |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
35 |
#include <QMessageBox> |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
36 |
#include <QLineEdit> |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
37 |
#include <QPushButton> |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
38 |
#include <QCompleter> |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
39 |
#include <QClipboard> |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
40 |
#include <QDialogButtonBox> |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
41 |
#include <QFile> |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
42 |
#include <QFileInfo> |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
43 |
#include <QGuiApplication> |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
44 |
#include <QVBoxLayout> |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
45 |
#include <iostream> |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
46 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
47 |
#include <fcntl.h> |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
48 |
#include <filesystem> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
49 |
#include <sys/stat.h> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
50 |
#include <unistd.h> |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
51 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
52 |
namespace |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
53 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
54 |
ThumbnailCache::Size thumbnailSizeFromString(const QString &s) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
55 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
56 |
return (s == "large") ? ThumbnailCache::Size::Large |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
57 |
: ThumbnailCache::Size::Normal; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
58 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
59 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
60 |
QString displayPath(const QByteArray &path) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
61 |
{ |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
62 |
return QString::fromLocal8Bit(path.constData(), path.size()); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
63 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
64 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
65 |
QString filenameFromPath(const QByteArray &path) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
66 |
{ |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
67 |
const std::filesystem::path fsPath(path.toStdString()); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
68 |
const std::string nativeName = fsPath.filename().native(); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
69 |
return QString::fromLocal8Bit(nativeName.data(), |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
70 |
static_cast<qsizetype>(nativeName.size())); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
71 |
} |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
72 |
} // namespace |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
73 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
74 |
MainWindow::MainWindow(QWidget *parent) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
75 |
: QMainWindow(parent) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
76 |
{ |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
77 |
setupUi(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
78 |
setupMenuBar(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
79 |
setupConnections(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
80 |
loadPreferences(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
81 |
} |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
82 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
83 |
void MainWindow::setupUi() |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
84 |
{ |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
85 |
// Folder model (left pane) — backed by std::filesystem so directories with |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
86 |
// non-UTF-8 filenames are listed correctly. |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
87 |
m_dirModel = new FsDirModel(this); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
88 |
m_dirModel->setRootPath(QDir::homePath()); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
89 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
90 |
// Root chooser list |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
91 |
m_rootList = new QListWidget; |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
92 |
m_rootList->setSelectionMode(QAbstractItemView::SingleSelection); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
93 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
94 |
auto addRootItem = [this](const QString &label, const QString &path) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
95 |
QListWidgetItem *item = new QListWidgetItem(label, m_rootList); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
96 |
item->setData(Qt::UserRole, path); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
97 |
}; |
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
98 |
addRootItem(tr("Home"), QDir::homePath()); |
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
99 |
addRootItem(tr("Pictures"), QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); |
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
100 |
addRootItem(tr("File System"), QDir::rootPath()); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
101 |
m_rootList->setCurrentRow(0); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
102 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
103 |
m_treeView = new QTreeView; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
104 |
m_treeView->setModel(m_dirModel); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
105 |
m_treeView->setRootIndex(m_dirModel->rootIndex()); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
106 |
m_treeView->header()->hide(); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
107 |
m_treeView->setColumnHidden(1, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
108 |
m_treeView->setColumnHidden(2, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
109 |
m_treeView->setColumnHidden(3, true); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
110 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
111 |
// Thumbnail model (center pane) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
112 |
m_imageModel = new ImageModel(this); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
113 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
114 |
m_listView = new QListView; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
115 |
m_listView->setModel(m_imageModel); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
116 |
m_listView->setViewMode(QListView::IconMode); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
117 |
m_listView->setIconSize(QSize(128, 128)); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
118 |
m_listView->setGridSize(QSize(148, 168)); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
119 |
m_listView->setResizeMode(QListView::Adjust); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
120 |
m_listView->setSelectionMode(QAbstractItemView::SingleSelection); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
121 |
m_listView->setSpacing(4); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
122 |
m_listView->setWordWrap(true); |
| b614a581 |
Poul Sander |
2026-02-19 21:18 |
123 |
m_listView->setTextElideMode(Qt::ElideRight); |
| 1dcea855 |
Poul Sander |
2026-05-26 21:48 |
124 |
m_listView->setItemDelegate(new ThumbnailDelegate(this)); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
125 |
m_listView->setContextMenuPolicy(Qt::CustomContextMenu); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
126 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
127 |
// Preview pane (right) |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
128 |
m_previewLabel = new QLabel; |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
129 |
m_previewLabel->setAlignment(Qt::AlignCenter); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
130 |
m_previewLabel->setMinimumWidth(200); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
131 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
132 |
// Single image view |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
133 |
m_imageView = new ImageViewWidget; |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
134 |
m_imageView->setContextMenuPolicy(Qt::CustomContextMenu); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
135 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
136 |
// Path bar: editable absolute path with ajax-style folder completion and a Go button |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
137 |
m_pathEdit = new QLineEdit; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
138 |
m_goButton = new QPushButton(tr("Go")); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
139 |
m_prevFolderButton = new QPushButton(tr("Prev")); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
140 |
m_nextFolderButton = new QPushButton(tr("Next")); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
141 |
m_pathCompleterModel = new PathCompleterModel(this); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
142 |
m_pathCompleter = new QCompleter(m_pathCompleterModel, this); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
143 |
m_pathCompleter->setCaseSensitivity(Qt::CaseSensitive); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
144 |
m_pathCompleter->setCompletionMode(QCompleter::PopupCompletion); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
145 |
m_pathCompleter->setFilterMode(Qt::MatchStartsWith); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
146 |
m_pathEdit->setCompleter(m_pathCompleter); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
147 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
148 |
auto *pathRow = new QHBoxLayout; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
149 |
pathRow->setContentsMargins(4, 4, 4, 0); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
150 |
pathRow->addWidget(m_pathEdit, 1); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
151 |
pathRow->addWidget(m_goButton); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
152 |
pathRow->addWidget(m_prevFolderButton); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
153 |
pathRow->addWidget(m_nextFolderButton); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
154 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
155 |
auto *browserPage = new QWidget; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
156 |
auto *vbox = new QVBoxLayout(browserPage); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
157 |
vbox->setContentsMargins(0, 0, 0, 0); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
158 |
vbox->setSpacing(0); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
159 |
vbox->addLayout(pathRow); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
160 |
vbox->addWidget(m_listView, 1); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
161 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
162 |
// Stack to switch between browser and single image |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
163 |
m_stack = new QStackedWidget; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
164 |
m_stack->addWidget(browserPage); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
165 |
m_stack->addWidget(m_imageView); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
166 |
m_browserPage = browserPage; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
167 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
168 |
setCentralWidget(m_stack); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
169 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
170 |
updatePathField(QFile::encodeName(QDir::homePath())); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
171 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
172 |
// Dock widgets — can be dragged, floated and stacked by the user |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
173 |
m_rootDock = new QDockWidget(tr("Roots"), this); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
174 |
m_rootDock->setObjectName("RootDock"); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
175 |
m_rootDock->setWidget(m_rootList); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
176 |
addDockWidget(Qt::LeftDockWidgetArea, m_rootDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
177 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
178 |
m_folderDock = new QDockWidget(tr("Folders"), this); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
179 |
m_folderDock->setObjectName("FolderDock"); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
180 |
m_folderDock->setWidget(m_treeView); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
181 |
addDockWidget(Qt::LeftDockWidgetArea, m_folderDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
182 |
splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
183 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
184 |
m_previewDock = new QDockWidget(tr("Preview"), this); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
185 |
m_previewDock->setObjectName("PreviewDock"); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
186 |
m_previewDock->setWidget(m_previewLabel); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
187 |
addDockWidget(Qt::RightDockWidgetArea, m_previewDock); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
188 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
189 |
// EXIF info dock — placed below the preview dock by default |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
190 |
m_exifTable = new QTableWidget(0, 2); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
191 |
m_exifTable->setHorizontalHeaderLabels({tr("Field"), tr("Value")}); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
192 |
m_exifTable->horizontalHeader()->setStretchLastSection(true); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
193 |
m_exifTable->verticalHeader()->hide(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
194 |
m_exifTable->setEditTriggers(QAbstractItemView::NoEditTriggers); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
195 |
m_exifTable->setSelectionMode(QAbstractItemView::NoSelection); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
196 |
m_exifTable->setShowGrid(false); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
197 |
m_exifTable->setAlternatingRowColors(true); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
198 |
m_exifTable->setMinimumWidth(200); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
199 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
200 |
m_exifDock = new QDockWidget(tr("EXIF Info"), this); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
201 |
m_exifDock->setObjectName("ExifDock"); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
202 |
m_exifDock->setWidget(m_exifTable); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
203 |
addDockWidget(Qt::RightDockWidgetArea, m_exifDock); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
204 |
splitDockWidget(m_previewDock, m_exifDock, Qt::Vertical); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
205 |
} |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
206 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
207 |
void MainWindow::setupMenuBar() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
208 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
209 |
m_menuBar = menuBar(); |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
210 |
m_menuBar->setStyleSheet( |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
211 |
"QMenuBar { padding: 1px 2px; }" |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
212 |
"QMenuBar::item { padding: 2px 6px; }" |
| 0df01dc1 |
Poul Sander |
2026-02-24 18:51 |
213 |
); |
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
214 |
QMenu *viewMenu = m_menuBar->addMenu(tr("&View")); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
215 |
viewMenu->addAction(m_rootDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
216 |
viewMenu->addAction(m_folderDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
217 |
viewMenu->addAction(m_previewDock->toggleViewAction()); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
218 |
viewMenu->addAction(m_exifDock->toggleViewAction()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
219 |
|
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
220 |
QMenu *editMenu = m_menuBar->addMenu(tr("&Edit")); |
| 4c41f5ff |
Poul Sander |
2026-05-31 00:01 |
221 |
QAction *preferencesAction = editMenu->addAction(tr("&Preferences")); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
222 |
connect(preferencesAction, &QAction::triggered, this, &MainWindow::onPreferencesTriggered); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
223 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
224 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
225 |
void MainWindow::navigateToFolder(const QString &path) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
226 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
227 |
navigateToFolder(QFile::encodeName(path)); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
228 |
} |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
229 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
230 |
QByteArray MainWindow::siblingFolder(int delta) const |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
231 |
{ |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
232 |
QByteArray currentDir = m_imageModel->currentDirectory(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
233 |
if (currentDir.isEmpty()) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
234 |
return {}; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
235 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
236 |
namespace fs = std::filesystem; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
237 |
fs::path current(currentDir.toStdString()); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
238 |
fs::path parent = current.parent_path(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
239 |
if (parent.empty() || parent == current) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
240 |
return {}; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
241 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
242 |
QByteArray parentPath = QByteArray::fromStdString(parent.native()); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
243 |
QModelIndex parentIdx = m_dirModel->indexForPath(parentPath); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
244 |
if (!parentIdx.isValid()) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
245 |
return {}; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
246 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
247 |
int count = m_dirModel->rowCount(parentIdx); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
248 |
int currentRow = -1; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
249 |
for (int i = 0; i < count; ++i) { |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
250 |
QModelIndex idx = m_dirModel->index(i, 0, parentIdx); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
251 |
if (m_dirModel->filePath(idx) == currentDir) { |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
252 |
currentRow = i; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
253 |
break; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
254 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
255 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
256 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
257 |
if (currentRow < 0) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
258 |
return {}; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
259 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
260 |
int targetRow = currentRow + delta; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
261 |
if (targetRow < 0 || targetRow >= count) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
262 |
return {}; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
263 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
264 |
QModelIndex targetIdx = m_dirModel->index(targetRow, 0, parentIdx); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
265 |
return m_dirModel->filePath(targetIdx); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
266 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
267 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
268 |
void MainWindow::navigateToPrevFolder() |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
269 |
{ |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
270 |
QByteArray path = siblingFolder(-1); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
271 |
if (!path.isEmpty()) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
272 |
navigateToFolder(path); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
273 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
274 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
275 |
void MainWindow::navigateToNextFolder() |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
276 |
{ |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
277 |
QByteArray path = siblingFolder(+1); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
278 |
if (!path.isEmpty()) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
279 |
navigateToFolder(path); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
280 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
281 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
282 |
void MainWindow::navigateToFolder(const QByteArray &path) |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
283 |
{ |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
284 |
m_previousFolderPath = m_imageModel->currentDirectory(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
285 |
m_imageModel->setDirectory(path); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
286 |
QModelIndex dirIdx = m_dirModel->indexForPath(path); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
287 |
if (dirIdx.isValid()) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
288 |
m_treeView->setCurrentIndex(dirIdx); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
289 |
updatePathField(path); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
290 |
QTimer::singleShot(0, this, [this]() { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
291 |
selectPreviousFolderIfExists(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
292 |
loadVisibleThumbnails(); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
293 |
}); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
294 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
295 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
296 |
void MainWindow::updatePathField(const QByteArray &path) |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
297 |
{ |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
298 |
if (!m_pathEdit) |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
299 |
return; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
300 |
const QString text = QFile::decodeName(path); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
301 |
if (m_pathEdit->text() != text) |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
302 |
m_pathEdit->setText(text); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
303 |
} |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
304 |
|
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
305 |
void MainWindow::onPathEntered() |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
306 |
{ |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
307 |
const QString text = m_pathEdit->text().trimmed(); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
308 |
if (text.isEmpty()) |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
309 |
return; |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
310 |
openPath(text); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
311 |
} |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
312 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
313 |
void MainWindow::openPath(const QString &path) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
314 |
{ |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
315 |
QFileInfo info(path); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
316 |
if (!info.exists()) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
317 |
return; |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
318 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
319 |
if (info.isDir()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
320 |
navigateToFolder(QFile::encodeName(info.absoluteFilePath())); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
321 |
} else if (info.isFile()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
322 |
navigateToFolder(QFile::encodeName(info.absolutePath())); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
323 |
|
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
324 |
// ImageModel::setDirectory is synchronous, so items are ready now. |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
325 |
// Find the file in the model and open it. |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
326 |
QByteArray target = QFile::encodeName(info.absoluteFilePath()); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
327 |
for (int i = 0; i < m_imageModel->rowCount(); ++i) { |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
328 |
QModelIndex idx = m_imageModel->index(i); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
329 |
if (m_imageModel->filePath(idx) == target) { |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
330 |
m_listView->setCurrentIndex(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
331 |
m_listView->scrollTo(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
332 |
showPreview(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
333 |
if (!m_imageModel->isFolder(idx)) |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
334 |
enterSingleImageMode(idx); |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
335 |
break; |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
336 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
337 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
338 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
339 |
} |
| 48607848 |
Poul Sander |
2026-05-19 19:20 |
340 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
341 |
void MainWindow::selectPreviousFolderIfExists() |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
342 |
{ |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
343 |
if (m_previousFolderPath.isEmpty()) |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
344 |
return; |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
345 |
|
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
346 |
// Find the previous folder in the current directory's contents |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
347 |
for (int i = 0; i < m_imageModel->rowCount(); ++i) { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
348 |
QModelIndex idx = m_imageModel->index(i); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
349 |
if (m_imageModel->isFolder(idx)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
350 |
QByteArray folderPath = m_imageModel->filePath(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
351 |
if (folderPath == m_previousFolderPath) { |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
352 |
m_listView->setCurrentIndex(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
353 |
m_listView->scrollTo(idx); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
354 |
return; |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
355 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
356 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
357 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
358 |
} |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
359 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
360 |
void MainWindow::setupConnections() |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
361 |
{ |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
362 |
connect(m_pathEdit, &QLineEdit::returnPressed, |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
363 |
this, &MainWindow::onPathEntered); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
364 |
connect(m_goButton, &QPushButton::clicked, |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
365 |
this, &MainWindow::onPathEntered); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
366 |
connect(m_prevFolderButton, &QPushButton::clicked, |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
367 |
this, &MainWindow::navigateToPrevFolder); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
368 |
connect(m_nextFolderButton, &QPushButton::clicked, |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
369 |
this, &MainWindow::navigateToNextFolder); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
370 |
connect(m_pathEdit, &QLineEdit::textEdited, |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
371 |
m_pathCompleterModel, &PathCompleterModel::setPrefix); |
| fd7f51cd |
Poul Sander |
2026-05-22 15:30 |
372 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
373 |
connect(m_rootList, &QListWidget::currentItemChanged, this, |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
374 |
[this](QListWidgetItem *current, QListWidgetItem *) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
375 |
if (current == nullptr) |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
376 |
return; |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
377 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
378 |
QString rootPath = current->data(Qt::UserRole).toString(); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
379 |
m_dirModel->setRootPath(rootPath); |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
380 |
m_treeView->setRootIndex(m_dirModel->rootIndex()); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
381 |
}); |
| fc5f2e27 |
Poul Sander |
2026-02-22 22:06 |
382 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
383 |
connect(m_treeView, &QTreeView::clicked, this, |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
384 |
[this](const QModelIndex &index) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
385 |
{ |
| 40efdfde |
Poul Sander |
2026-05-19 21:24 |
386 |
QByteArray path = m_dirModel->filePath(index); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
387 |
navigateToFolder(path); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
388 |
}); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
389 |
|
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
390 |
connect(m_listView, &QListView::clicked, this, |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
391 |
[this](const QModelIndex &index) { showPreview(index); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
392 |
|
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
393 |
connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged, |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
394 |
this, [this](const QModelIndex ¤t) { showPreview(current); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
395 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
396 |
connect(m_listView, &QListView::doubleClicked, this, |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
397 |
[this](const QModelIndex &index) { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
398 |
if (m_imageModel->isFolder(index)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
399 |
QByteArray path = m_imageModel->filePath(index); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
400 |
navigateToFolder(path); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
401 |
} else { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
402 |
enterSingleImageMode(index); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
403 |
} |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
404 |
}); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
405 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
406 |
connect(m_listView, &QListView::customContextMenuRequested, |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
407 |
this, &MainWindow::showImageContextMenu); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
408 |
|
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
409 |
connect(m_imageView, &ImageViewWidget::customContextMenuRequested, |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
410 |
this, &MainWindow::showImageViewContextMenu); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
411 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
412 |
connect(m_imageView, &ImageViewWidget::closeRequested, |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
413 |
this, &MainWindow::leaveSingleImageMode); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
414 |
connect(m_imageView, &ImageViewWidget::editCaptionRequested, |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
415 |
this, &MainWindow::onEditCaption); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
416 |
connect(m_imageView, &ImageViewWidget::nextRequested, this, [this]() { |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
417 |
QModelIndex cur = m_listView->currentIndex(); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
418 |
int next = cur.isValid() ? cur.row() + 1 : 0; |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
419 |
while (next < m_imageModel->rowCount() && m_imageModel->isFolder(m_imageModel->index(next))) |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
420 |
++next; |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
421 |
if (next < m_imageModel->rowCount()) |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
422 |
{ |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
423 |
QModelIndex idx = m_imageModel->index(next); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
424 |
m_listView->setCurrentIndex(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
425 |
enterSingleImageMode(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
426 |
} |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
427 |
}); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
428 |
|
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
429 |
connect(m_imageView, &ImageViewWidget::previousRequested, this, [this]() { |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
430 |
QModelIndex cur = m_listView->currentIndex(); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
431 |
int prev = cur.isValid() ? cur.row() - 1 : 0; |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
432 |
while (prev >= 0 && m_imageModel->isFolder(m_imageModel->index(prev))) |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
433 |
--prev; |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
434 |
if (prev >= 0) |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
435 |
{ |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
436 |
QModelIndex idx = m_imageModel->index(prev); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
437 |
m_listView->setCurrentIndex(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
438 |
enterSingleImageMode(idx); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
439 |
} |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
440 |
}); |
| 1ffc1962 |
Poul Sander |
2026-02-20 23:41 |
441 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
442 |
connect(m_listView->verticalScrollBar(), &QScrollBar::valueChanged, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
443 |
this, [this]() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
444 |
{ loadVisibleThumbnails(); }); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
445 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
446 |
// Also catch resize — visible range changes when the viewport is resized |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
447 |
m_listView->viewport()->installEventFilter(this); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
448 |
|
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
449 |
// The folder list and tree views consume Ctrl+Left/Ctrl+Right for their own |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
450 |
// item navigation, so those keys never reach MainWindow::keyPressEvent. |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
451 |
// Filter them here so PrevFolder/NextFolder shortcuts work while a view has focus. |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
452 |
m_listView->installEventFilter(this); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
453 |
m_treeView->installEventFilter(this); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
454 |
|
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
455 |
connect(m_exifTable, &QTableWidget::cellClicked, this, [this](int row, int column) { |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
456 |
if (column == 1) { |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
457 |
QTableWidgetItem *fieldItem = m_exifTable->item(row, 0); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
458 |
if (fieldItem && fieldItem->text() == "OpenStreetMap") { |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
459 |
QTableWidgetItem *valueItem = m_exifTable->item(row, 1); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
460 |
if (valueItem && !valueItem->text().isEmpty()) { |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
461 |
QDesktopServices::openUrl(QUrl(valueItem->text())); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
462 |
} |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
463 |
} |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
464 |
} |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
465 |
}); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
466 |
} |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
467 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
468 |
bool MainWindow::eventFilter(QObject *obj, QEvent *event) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
469 |
{ |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
470 |
if (obj == m_listView->viewport() && event->type() == QEvent::Resize) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
471 |
QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
472 |
|
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
473 |
if ((obj == m_listView || obj == m_treeView) |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
474 |
&& event->type() == QEvent::KeyPress |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
475 |
&& m_stack->currentWidget() == m_browserPage) |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
476 |
{ |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
477 |
const ShortcutManager &sc = ShortcutManager::instance(); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
478 |
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
479 |
|
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
480 |
if (sc.matches(keyEvent, ShortcutManager::PrevFolder)) { |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
481 |
navigateToPrevFolder(); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
482 |
return true; |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
483 |
} |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
484 |
if (sc.matches(keyEvent, ShortcutManager::NextFolder)) { |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
485 |
navigateToNextFolder(); |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
486 |
return true; |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
487 |
} |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
488 |
if (obj == m_listView |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
489 |
&& sc.matches(keyEvent, ShortcutManager::MoveToTrash)) { |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
490 |
moveCurrentImageToTrash(); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
491 |
return true; |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
492 |
} |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
493 |
} |
| ff6ac640 |
Poul Sander |
2026-06-02 16:53 |
494 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
495 |
return QMainWindow::eventFilter(obj, event); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
496 |
} |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
497 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
498 |
void MainWindow::loadVisibleThumbnails() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
499 |
{ |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
500 |
QModelIndex topLeft = m_listView->indexAt(QPoint(0, 0)); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
501 |
QModelIndex bottomRight = m_listView->indexAt( |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
502 |
QPoint(m_listView->viewport()->width() - 1, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
503 |
m_listView->viewport()->height() - 1)); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
504 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
505 |
int first = topLeft.isValid() ? topLeft.row() : 0; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
506 |
int last = bottomRight.isValid() ? bottomRight.row() |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
507 |
: m_imageModel->rowCount() - 1; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
508 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
509 |
if (last < 0) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
510 |
return; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
511 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
512 |
std::cout << "loadVisibleThumbnails: " << first << " - " << last << "\n"; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
513 |
m_imageModel->requestThumbnails(first, last); |
| 032aa1e1 |
Poul Sander |
2026-02-19 18:55 |
514 |
} |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
515 |
|
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
516 |
void MainWindow::showPreview(const QModelIndex &index) |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
517 |
{ |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
518 |
if (!index.isValid()) |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
519 |
return; |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
520 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
521 |
QByteArray path = m_imageModel->filePath(index); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
522 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
523 |
int fd = ::open(path.constData(), O_RDONLY | O_CLOEXEC); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
524 |
if (fd >= 0) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
525 |
QFile file; |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
526 |
if (file.open(fd, QIODevice::ReadOnly, QFileDevice::AutoCloseHandle)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
527 |
QImageReader reader(&file); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
528 |
reader.setAutoTransform(true); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
529 |
QSize fullSize = reader.size(); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
530 |
if (fullSize.isValid()) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
531 |
QSize target = fullSize.scaled(m_previewLabel->size(), Qt::KeepAspectRatio); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
532 |
reader.setScaledSize(target); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
533 |
} |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
534 |
QImage image = reader.read(); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
535 |
m_previewLabel->setPixmap( |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
536 |
QPixmap::fromImage(image).scaled( |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
537 |
m_previewLabel->size(), |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
538 |
Qt::KeepAspectRatio, |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
539 |
Qt::SmoothTransformation)); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
540 |
} |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
541 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
542 |
|
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
543 |
updateExifInfo(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
544 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
545 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
546 |
void MainWindow::updateExifInfo(const QByteArray &path) |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
547 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
548 |
// Check if this is a folder by attempting stat |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
549 |
struct ::stat st{}; |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
550 |
if (::stat(path.constData(), &st) != 0 || S_ISDIR(st.st_mode)) { |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
551 |
m_exifTable->setRowCount(0); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
552 |
return; |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
553 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
554 |
const ExifData data = ExifReader::read(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
555 |
const auto fields = data.toList(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
556 |
m_exifTable->setRowCount(fields.size()); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
557 |
for (int i = 0; i < fields.size(); ++i) { |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
558 |
m_exifTable->setItem(i, 0, new QTableWidgetItem(fields[i].first)); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
559 |
auto *item = new QTableWidgetItem(fields[i].second); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
560 |
if (fields[i].first == "OpenStreetMap") { |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
561 |
item->setForeground(Qt::blue); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
562 |
QFont font = item->font(); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
563 |
font.setUnderline(true); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
564 |
item->setFont(font); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
565 |
item->setToolTip(tr("Click to open in browser")); |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
566 |
} |
| cdae9502 |
Poul Sander |
2026-06-09 20:04 |
567 |
m_exifTable->setItem(i, 1, item); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
568 |
} |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
569 |
m_exifTable->resizeColumnToContents(0); |
| cfe4a67b |
Poul Sander |
2026-02-19 23:06 |
570 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
571 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
572 |
void MainWindow::enterSingleImageMode(const QModelIndex &index) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
573 |
{ |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
574 |
if (!index.isValid()) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
575 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
576 |
|
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
577 |
// Only save state and hide chrome when transitioning from browse mode |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
578 |
if (m_stack->currentWidget() != m_imageView) { |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
579 |
m_rootDockWasVisible = m_rootDock->isVisible(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
580 |
m_folderDockWasVisible = m_folderDock->isVisible(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
581 |
m_previewDockWasVisible = m_previewDock->isVisible(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
582 |
m_exifDockWasVisible = m_exifDock->isVisible(); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
583 |
m_rootDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
584 |
m_folderDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
585 |
m_previewDock->hide(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
586 |
m_exifDock->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
587 |
m_menuBar->hide(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
588 |
} |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
589 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
590 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
591 |
QByteArray path = m_imageModel->filePath(index); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
592 |
m_imageView->setNeighborPaths(computeNeighborPaths(index)); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
593 |
m_imageView->setImage(path); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
594 |
m_imageView->setExifData(ExifReader::read(path)); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
595 |
updateExifInfo(path); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
596 |
m_stack->setCurrentWidget(m_imageView); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
597 |
m_imageView->setFocus(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
598 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
599 |
if (m_imageViewWasFullScreen) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
600 |
setFullScreenMode(true); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
601 |
m_imageViewWasFullScreen = false; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
602 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
603 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
604 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
605 |
void MainWindow::onEditCaption() |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
606 |
{ |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
607 |
QByteArray path; |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
608 |
if (m_stack->currentWidget() == m_imageView) { |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
609 |
path = m_imageView->currentPath(); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
610 |
} else { |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
611 |
const QModelIndex index = m_listView->currentIndex(); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
612 |
if (index.isValid() && !m_imageModel->isFolder(index)) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
613 |
path = m_imageModel->filePath(index); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
614 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
615 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
616 |
if (path.isEmpty()) |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
617 |
return; |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
618 |
|
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
619 |
if (::access(path.constData(), W_OK) != 0) { |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
620 |
QMessageBox::warning(this, tr("Cannot Edit Caption"), |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
621 |
tr("The file is write-protected and cannot be edited.\n\n%1") |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
622 |
.arg(displayPath(path))); |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
623 |
return; |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
624 |
} |
| 835a6bea |
Poul Sander |
2026-05-19 22:03 |
625 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
626 |
ExifData data = ExifReader::read(path); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
627 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
628 |
QDialog dlg(this); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
629 |
dlg.setWindowTitle(tr("Edit Caption")); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
630 |
auto *layout = new QVBoxLayout(&dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
631 |
layout->addWidget(new QLabel(tr("Caption-Abstract:"), &dlg)); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
632 |
auto *edit = new QPlainTextEdit(&dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
633 |
edit->setPlainText(data.captionAbstract); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
634 |
edit->setMinimumWidth(400); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
635 |
layout->addWidget(edit); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
636 |
auto *buttons = new QDialogButtonBox( |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
637 |
QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dlg); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
638 |
layout->addWidget(buttons); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
639 |
connect(buttons, &QDialogButtonBox::accepted, &dlg, &QDialog::accept); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
640 |
connect(buttons, &QDialogButtonBox::rejected, &dlg, &QDialog::reject); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
641 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
642 |
if (dlg.exec() != QDialog::Accepted) |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
643 |
return; |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
644 |
|
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
645 |
const QString newCaption = edit->toPlainText(); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
646 |
if (ExifReader::saveCaption(path, newCaption, data)) { |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
647 |
ExifData updated = ExifReader::read(path); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
648 |
if (m_imageView->currentPath() == path) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
649 |
m_imageView->setExifData(updated); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
650 |
updateExifInfo(path); |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
651 |
} |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
652 |
} |
| beb4a823 |
Poul Sander |
2026-05-19 21:53 |
653 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
654 |
void MainWindow::showImageContextMenu(const QPoint &pos) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
655 |
{ |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
656 |
const QModelIndex index = m_listView->indexAt(pos); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
657 |
if (!index.isValid() || m_imageModel->isFolder(index)) |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
658 |
return; |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
659 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
660 |
m_listView->setCurrentIndex(index); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
661 |
showPreview(index); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
662 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
663 |
const QByteArray path = m_imageModel->filePath(index); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
664 |
executeContextMenu(m_listView->viewport()->mapToGlobal(pos), path, index); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
665 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
666 |
|
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
667 |
void MainWindow::showImageViewContextMenu(const QPoint &pos) |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
668 |
{ |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
669 |
const QByteArray path = m_imageView->currentPath(); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
670 |
if (path.isEmpty()) |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
671 |
return; |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
672 |
|
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
673 |
const QModelIndex index = m_listView->currentIndex(); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
674 |
executeContextMenu(m_imageView->mapToGlobal(pos), path, index); |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
675 |
} |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
676 |
|
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
677 |
void MainWindow::executeContextMenu(const QPoint &globalPos, const QByteArray &path, const QModelIndex &index) |
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
678 |
{ |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
679 |
QMenu menu(this); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
680 |
QAction *copyFilenameAction = menu.addAction(tr("Copy filename")); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
681 |
QAction *copyFullPathAction = menu.addAction(tr("Copy full path")); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
682 |
menu.addSeparator(); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
683 |
|
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
684 |
QFileInfo info(QFile::decodeName(path)); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
685 |
QString suffix = info.suffix().toLower(); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
686 |
bool isJpg = (suffix == "jpg" || suffix == "jpeg"); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
687 |
|
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
688 |
QAction *rotateLeftAction = nullptr; |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
689 |
QAction *rotateRightAction = nullptr; |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
690 |
if (isJpg) { |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
691 |
rotateLeftAction = menu.addAction(tr("Rotate Left")); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
692 |
rotateRightAction = menu.addAction(tr("Rotate Right")); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
693 |
menu.addSeparator(); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
694 |
} |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
695 |
|
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
696 |
QAction *editDescriptionAction = menu.addAction(tr("Edit description")); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
697 |
QAction *moveToTrashAction = menu.addAction(tr("Move to trash")); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
698 |
moveToTrashAction->setShortcut( |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
699 |
ShortcutManager::instance().shortcut(ShortcutManager::MoveToTrash)); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
700 |
|
| d93c1ab0 |
Poul Sander |
2026-06-08 21:44 |
701 |
QAction *chosen = menu.exec(globalPos); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
702 |
if (chosen == copyFilenameAction) { |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
703 |
QGuiApplication::clipboard()->setText(filenameFromPath(path)); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
704 |
} else if (chosen == copyFullPathAction) { |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
705 |
QGuiApplication::clipboard()->setText(displayPath(path)); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
706 |
} else if (rotateLeftAction && chosen == rotateLeftAction) { |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
707 |
rotateImage(index, false); |
| e2a71efb |
Poul Sander |
2026-06-09 21:42 |
708 |
} else if (rotateRightAction && chosen == rotateRightAction) { |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
709 |
rotateImage(index, true); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
710 |
} else if (chosen == editDescriptionAction) { |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
711 |
onEditCaption(); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
712 |
} else if (chosen == moveToTrashAction) { |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
713 |
moveImageToTrash(path); |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
714 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
715 |
} |
| 237d2c81 |
Poul Sander |
2026-06-06 14:53 |
716 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
717 |
void MainWindow::rotateImage(const QModelIndex &index, bool clockwise) |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
718 |
{ |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
719 |
if (!index.isValid() || m_imageModel->isFolder(index)) |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
720 |
return; |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
721 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
722 |
const QByteArray path = m_imageModel->filePath(index); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
723 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
724 |
if (::access(path.constData(), W_OK) != 0) { |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
725 |
QMessageBox::warning(this, tr("Cannot Rotate Image"), |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
726 |
tr("The file is write-protected and cannot be rotated.\n\n%1") |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
727 |
.arg(displayPath(path))); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
728 |
return; |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
729 |
} |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
730 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
731 |
if (!ExifReader::rotate(path, clockwise)) { |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
732 |
QMessageBox::warning(this, tr("Cannot Rotate Image"), |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
733 |
tr("The image orientation could not be changed. The format may not " |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
734 |
"support EXIF orientation.\n\n%1") |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
735 |
.arg(displayPath(path))); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
736 |
return; |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
737 |
} |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
738 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
739 |
m_imageModel->refreshThumbnail(index); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
740 |
showPreview(index); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
741 |
|
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
742 |
if (m_imageView->currentPath() == path) { |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
743 |
m_imageView->invalidateCache(path); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
744 |
m_imageView->setImage(path); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
745 |
m_imageView->setExifData(ExifReader::read(path)); |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
746 |
} |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
747 |
} |
| 48534775 |
Poul Sander |
2026-06-08 18:57 |
748 |
|
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
749 |
void MainWindow::moveImageToTrash(const QByteArray &path) |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
750 |
{ |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
751 |
if (path.isEmpty()) |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
752 |
return; |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
753 |
|
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
754 |
const QString fileName = filenameFromPath(path); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
755 |
const QMessageBox::StandardButton answer = QMessageBox::question( |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
756 |
this, |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
757 |
tr("Move to Trash"), |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
758 |
tr("Move \"%1\" to the trash?").arg(fileName), |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
759 |
QMessageBox::Yes | QMessageBox::Cancel, |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
760 |
QMessageBox::Cancel); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
761 |
if (answer != QMessageBox::Yes) |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
762 |
return; |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
763 |
|
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
764 |
if (!QFile::moveToTrash(displayPath(path))) { |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
765 |
QMessageBox::warning(this, tr("Cannot Move to Trash"), |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
766 |
tr("The file could not be moved to the trash.\n\n%1") |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
767 |
.arg(displayPath(path))); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
768 |
return; |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
769 |
} |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
770 |
|
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
771 |
const QByteArray currentDir = m_imageModel->currentDirectory(); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
772 |
m_previewLabel->clear(); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
773 |
m_exifTable->setRowCount(0); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
774 |
m_imageModel->setDirectory(currentDir); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
775 |
QTimer::singleShot(0, this, &MainWindow::loadVisibleThumbnails); |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
776 |
} |
| 700d6f2d |
Poul Sander |
2026-06-06 15:44 |
777 |
|
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
778 |
void MainWindow::moveCurrentImageToTrash() |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
779 |
{ |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
780 |
const QModelIndex index = m_listView->currentIndex(); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
781 |
if (!index.isValid() || m_imageModel->isFolder(index)) |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
782 |
return; |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
783 |
|
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
784 |
moveImageToTrash(m_imageModel->filePath(index)); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
785 |
} |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
786 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
787 |
void MainWindow::leaveSingleImageMode() |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
788 |
{ |
| 3968465e |
Poul Sander |
2026-02-23 19:13 |
789 |
if (isFullScreen()) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
790 |
m_imageViewWasFullScreen = true; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
791 |
setFullScreenMode(false); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
792 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
793 |
m_imageView->clearCache(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
794 |
m_stack->setCurrentWidget(m_browserPage); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
795 |
m_menuBar->show(); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
796 |
if (m_rootDockWasVisible) |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
797 |
m_rootDock->show(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
798 |
if (m_folderDockWasVisible) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
799 |
m_folderDock->show(); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
800 |
if (m_previewDockWasVisible) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
801 |
m_previewDock->show(); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
802 |
if (m_exifDockWasVisible) |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
803 |
m_exifDock->show(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
804 |
m_listView->setFocus(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
805 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
806 |
|
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
807 |
QList<QByteArray> MainWindow::computeNeighborPaths(const QModelIndex &index) const |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
808 |
{ |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
809 |
QList<QByteArray> paths; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
810 |
int row = index.row(); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
811 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
812 |
// Collect up to CacheKeepBehind non-folder images before current |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
813 |
int count = 0; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
814 |
for (int i = row - 1; i >= 0 && count < ImageViewWidget::CacheKeepBehind; --i) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
815 |
QModelIndex idx = m_imageModel->index(i); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
816 |
if (!m_imageModel->isFolder(idx)) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
817 |
paths.prepend(m_imageModel->filePath(idx)); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
818 |
++count; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
819 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
820 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
821 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
822 |
// Collect up to CacheReadAhead non-folder images after current |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
823 |
count = 0; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
824 |
for (int i = row + 1; i < m_imageModel->rowCount() && count < ImageViewWidget::CacheReadAhead; ++i) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
825 |
QModelIndex idx = m_imageModel->index(i); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
826 |
if (!m_imageModel->isFolder(idx)) { |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
827 |
paths.append(m_imageModel->filePath(idx)); |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
828 |
++count; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
829 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
830 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
831 |
|
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
832 |
return paths; |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
833 |
} |
| 58103277 |
Poul Sander |
2026-03-01 22:53 |
834 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
835 |
void MainWindow::setFullScreenMode(bool fullScreen) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
836 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
837 |
if (fullScreen == isFullScreen()) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
838 |
return; |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
839 |
|
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
840 |
if (fullScreen) { |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
841 |
m_wasMaximized = isMaximized(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
842 |
m_menuBar->hide(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
843 |
showFullScreen(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
844 |
} else { |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
845 |
// Only restore menu bar when returning to browse mode |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
846 |
if (m_stack->currentWidget() != m_imageView) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
847 |
m_menuBar->show(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
848 |
if (m_wasMaximized) |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
849 |
showMaximized(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
850 |
else |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
851 |
showNormal(); |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
852 |
} |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
853 |
} |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
854 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
855 |
void MainWindow::keyPressEvent(QKeyEvent *event) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
856 |
{ |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
857 |
// THREADING: No race condition with F11 fullscreen toggle. All cross-thread |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
858 |
// signal deliveries (thumbnailReady via explicit QueuedConnection, |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
859 |
// onImageLoaded via AutoConnection resolving to QueuedConnection) execute on |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
860 |
// the main thread's event loop. The event loop processes events one at a |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
861 |
// time, so this handler and any signal slot can never interleave. All widget |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
862 |
// state (m_wasMaximized, m_stack, fullscreen flag) is only accessed from the |
| 4d6b7476 |
Poul Sander |
2026-05-30 16:39 |
863 |
// main thread. |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
864 |
const ShortcutManager &sc = ShortcutManager::instance(); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
865 |
|
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
866 |
if (sc.matches(event, ShortcutManager::ToggleFullscreen) |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
867 |
&& m_stack->currentWidget() == m_imageView) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
868 |
{ |
| ccb726b8 |
Poul Sander |
2026-02-23 22:43 |
869 |
setFullScreenMode(!isFullScreen()); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
870 |
event->accept(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
871 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
872 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
873 |
|
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
874 |
if (sc.matches(event, ShortcutManager::ActivateEntry) |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
875 |
&& m_stack->currentWidget() == m_browserPage) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
876 |
{ |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
877 |
QModelIndex current = m_listView->currentIndex(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
878 |
if (current.isValid()) |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
879 |
{ |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
880 |
if (m_imageModel->isFolder(current)) { |
| 80a9926d |
Poul Sander |
2026-05-19 20:28 |
881 |
QByteArray path = m_imageModel->filePath(current); |
| 665ac308 |
Poul Sander |
2026-02-23 19:34 |
882 |
navigateToFolder(path); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
883 |
} else { |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
884 |
enterSingleImageMode(current); |
| 09130ab9 |
Poul Sander |
2026-02-22 22:19 |
885 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
886 |
event->accept(); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
887 |
return; |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
888 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
889 |
} |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
890 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
891 |
if (sc.matches(event, ShortcutManager::PrevFolder) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
892 |
&& m_stack->currentWidget() == m_browserPage) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
893 |
{ |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
894 |
navigateToPrevFolder(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
895 |
event->accept(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
896 |
return; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
897 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
898 |
|
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
899 |
if (sc.matches(event, ShortcutManager::NextFolder) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
900 |
&& m_stack->currentWidget() == m_browserPage) |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
901 |
{ |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
902 |
navigateToNextFolder(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
903 |
event->accept(); |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
904 |
return; |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
905 |
} |
| bf525669 |
Poul Sander |
2026-05-30 23:18 |
906 |
|
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
907 |
if (sc.matches(event, ShortcutManager::MoveToTrash) |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
908 |
&& m_stack->currentWidget() == m_browserPage) |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
909 |
{ |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
910 |
moveCurrentImageToTrash(); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
911 |
event->accept(); |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
912 |
return; |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
913 |
} |
| a686d839 |
Poul Sander |
2026-06-06 22:34 |
914 |
|
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
915 |
QMainWindow::keyPressEvent(event); |
| 61136b77 |
Poul Sander |
2026-02-20 22:45 |
916 |
} |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
917 |
|
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
918 |
void MainWindow::closeEvent(QCloseEvent *event) |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
919 |
{ |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
920 |
if (m_stack->currentWidget() == m_imageView) |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
921 |
{ |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
922 |
leaveSingleImageMode(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
923 |
event->ignore(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
924 |
return; |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
925 |
} |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
926 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
927 |
savePreferences(); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
928 |
QMainWindow::closeEvent(event); |
| c9e5684a |
Poul Sander |
2026-02-23 19:18 |
929 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
930 |
|
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
931 |
void MainWindow::applyDockLocking(bool lock) |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
932 |
{ |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
933 |
const QDockWidget::DockWidgetFeatures movableFeatures = |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
934 |
QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable; |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
935 |
const QDockWidget::DockWidgetFeatures baseFeatures = |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
936 |
QDockWidget::DockWidgetClosable; |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
937 |
|
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
938 |
QDockWidget::DockWidgetFeatures features = lock ? baseFeatures |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
939 |
: (baseFeatures | movableFeatures); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
940 |
m_rootDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
941 |
m_folderDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
942 |
m_previewDock->setFeatures(features); |
| 53fdab93 |
Poul Sander |
2026-05-18 18:45 |
943 |
m_exifDock->setFeatures(features); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
944 |
} |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
945 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
946 |
void MainWindow::loadPreferences() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
947 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
948 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
949 |
m_backgroundColorPreference = settings.value("backgroundColor", "black").toString(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
950 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
951 |
m_lockDockingPreference = settings.value("lockDocking", false).toBool(); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
952 |
applyDockLocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
953 |
m_folderCacheSizePreference = settings.value("folderCacheSize", 4).toInt(); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
954 |
m_imageModel->setCacheMaxSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
955 |
m_thumbnailCacheSizePreference = settings.value("thumbnailCacheSize", "normal").toString(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
956 |
m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference)); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
957 |
ShortcutManager::instance().load(settings); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
958 |
if (settings.contains("windowGeometry")) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
959 |
restoreGeometry(settings.value("windowGeometry").toByteArray()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
960 |
if (settings.contains("windowState")) |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
961 |
restoreState(settings.value("windowState").toByteArray()); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
962 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
963 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
964 |
void MainWindow::savePreferences() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
965 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
966 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
967 |
settings.setValue("backgroundColor", m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
968 |
settings.setValue("lockDocking", m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
969 |
settings.setValue("folderCacheSize", m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
970 |
settings.setValue("thumbnailCacheSize", m_thumbnailCacheSizePreference); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
971 |
ShortcutManager::instance().save(settings); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
972 |
settings.setValue("windowGeometry", saveGeometry()); |
| cbc7d22b |
Poul Sander |
2026-02-24 19:23 |
973 |
settings.setValue("windowState", saveState()); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
974 |
} |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
975 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
976 |
void MainWindow::onPreferencesTriggered() |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
977 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
978 |
PreferencesDialog dialog(this); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
979 |
dialog.setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
980 |
dialog.setLockDocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
981 |
dialog.setCacheSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
982 |
dialog.setThumbnailCacheSize(m_thumbnailCacheSizePreference); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
983 |
|
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
984 |
// Populate shortcuts tab from current bindings |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
985 |
{ |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
986 |
QMap<int, QKeySequence> scMap; |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
987 |
for (int i = 0; i < ShortcutManager::ActionCount; ++i) |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
988 |
scMap[i] = ShortcutManager::instance().shortcut( |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
989 |
static_cast<ShortcutManager::Action>(i)); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
990 |
dialog.setShortcuts(scMap); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
991 |
} |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
992 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
993 |
bool shouldResetLayout = false; |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
994 |
connect(&dialog, &PreferencesDialog::resetLayoutRequested, this, [&shouldResetLayout]() { |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
995 |
shouldResetLayout = true; |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
996 |
}); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
997 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
998 |
if (dialog.exec() == QDialog::Accepted) |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
999 |
{ |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
1000 |
m_backgroundColorPreference = dialog.getBackgroundColor(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
1001 |
m_imageView->setBackgroundColor(m_backgroundColorPreference); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
1002 |
m_lockDockingPreference = dialog.getLockDocking(); |
| 4ae57f60 |
Poul Sander |
2026-02-25 21:35 |
1003 |
applyDockLocking(m_lockDockingPreference); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
1004 |
m_folderCacheSizePreference = dialog.getCacheSize(); |
| 459bad0f |
Poul Sander |
2026-05-17 14:11 |
1005 |
m_imageModel->setCacheMaxSize(m_folderCacheSizePreference); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1006 |
QString newThumbSize = dialog.getThumbnailCacheSize(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1007 |
if (newThumbSize != m_thumbnailCacheSizePreference) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1008 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1009 |
m_thumbnailCacheSizePreference = newThumbSize; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1010 |
m_imageModel->setThumbnailSize(thumbnailSizeFromString(m_thumbnailCacheSizePreference)); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1011 |
loadVisibleThumbnails(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
1012 |
} |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1013 |
|
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1014 |
// Apply shortcut changes |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1015 |
QMap<int, QKeySequence> scMap = dialog.getShortcuts(); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1016 |
for (auto it = scMap.cbegin(); it != scMap.cend(); ++it) |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1017 |
ShortcutManager::instance().setShortcut( |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1018 |
static_cast<ShortcutManager::Action>(it.key()), it.value()); |
| 83f0e0bc |
Poul Sander |
2026-05-30 17:59 |
1019 |
|
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
1020 |
savePreferences(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
1021 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1022 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1023 |
// Apply layout reset immediately after dialog closes if requested |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1024 |
if (shouldResetLayout) { |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1025 |
resetLayoutToDefault(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1026 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1027 |
} |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1028 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1029 |
void MainWindow::resetLayoutToDefault() |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1030 |
{ |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1031 |
QSettings settings("SagoImageBrowser", "SagoImageBrowser"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1032 |
settings.remove("windowGeometry"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1033 |
settings.remove("windowState"); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1034 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1035 |
// Hide and detach docks completely |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1036 |
m_rootDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1037 |
m_folderDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1038 |
m_previewDock->hide(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1039 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1040 |
m_rootDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1041 |
m_folderDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1042 |
m_previewDock->setFloating(false); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1043 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1044 |
removeDockWidget(m_rootDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1045 |
removeDockWidget(m_folderDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1046 |
removeDockWidget(m_previewDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1047 |
|
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1048 |
// Re-add in default positions |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1049 |
addDockWidget(Qt::LeftDockWidgetArea, m_rootDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1050 |
addDockWidget(Qt::LeftDockWidgetArea, m_folderDock); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1051 |
addDockWidget(Qt::RightDockWidgetArea, m_previewDock); |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1052 |
splitDockWidget(m_rootDock, m_folderDock, Qt::Vertical); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1053 |
|
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1054 |
// Show all docks |
| 3bee3e3e |
Poul Sander |
2026-03-05 17:07 |
1055 |
m_rootDock->show(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1056 |
m_folderDock->show(); |
| 7370f1c0 |
Poul Sander |
2026-03-01 15:15 |
1057 |
m_previewDock->show(); |
| f61bf886 |
Poul Sander |
2026-02-23 19:27 |
1058 |
} |
|
|
1970-01-01 00:00 |
1059 |
|