digiKam
Loading...
Searching...
No Matches
loadsavethread.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2005-12-17
7 * Description : image file IO threaded interface.
8 *
9 * SPDX-FileCopyrightText: 2005-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2005-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// Qt includes
19
20#include <QThread>
21#include <QMutex>
22#include <QList>
23#include <QDateTime>
24#include <QWaitCondition>
25#include <QEvent>
26
27// Local includes
28
29#include "dimg.h"
30#include "digikam_export.h"
31#include "dynamicthread.h"
32#include "loadingdescription.h"
33
34namespace Digikam
35{
36
37class DMetadata;
38class LoadSaveTask;
39
40class DIGIKAM_EXPORT LoadSaveNotifier
41{
42public:
43
44 LoadSaveNotifier() = default;
45 virtual ~LoadSaveNotifier() = default;
46
47 virtual void imageStartedLoading(const LoadingDescription& loadingDescription) = 0;
48 virtual void loadingProgress(const LoadingDescription& loadingDescription, float progress) = 0;
49 virtual void imageLoaded(const LoadingDescription& loadingDescription, const DImg& img) = 0;
50 virtual void moreCompleteLoadingAvailable(const LoadingDescription& oldLoadingDescription,
51 const LoadingDescription& newLoadingDescription) = 0;
52 virtual void imageStartedSaving(const QString& filePath) = 0;
53 virtual void savingProgress(const QString& filePath, float progress) = 0;
54 virtual void imageSaved(const QString& filePath, bool success) = 0;
55 virtual void thumbnailLoaded(const LoadingDescription& loadingDescription, const QImage& img) = 0;
56
57private:
58
59 Q_DISABLE_COPY(LoadSaveNotifier)
60};
61
62// -------------------------------------------------------------------------------------------------------
63
64class DIGIKAM_EXPORT LoadSaveFileInfoProvider
65{
66public:
67
69 virtual ~LoadSaveFileInfoProvider() = default;
70
76 virtual int orientationHint(const QString& path) = 0;
77
82 virtual QSize dimensionsHint(const QString& path) = 0;
83
84private:
85
86 Q_DISABLE_COPY(LoadSaveFileInfoProvider)
87};
88
89// -------------------------------------------------------------------------------------------------------
90
91class DIGIKAM_EXPORT LoadSaveThread : public DynamicThread,
92 public LoadSaveNotifier
93{
94 Q_OBJECT
95
96public:
97
99 {
110 NotificationPolicyTimeLimited
111 };
112
117 {
125 AccessModeReadWrite
126 };
127
128public:
129
130 explicit LoadSaveThread(QObject* const parent = nullptr);
131
136 ~LoadSaveThread() override;
137
141 void load(const LoadingDescription& description);
142
146 void save(const DImg& image, const QString& filePath, const QString& format);
147
148 void setNotificationPolicy(NotificationPolicy notificationPolicy);
149
150public:
151
152 static void setInfoProvider(LoadSaveFileInfoProvider* const infoProvider);
153 static LoadSaveFileInfoProvider* infoProvider();
154
159 static int exifOrientation(const QString& filePath,
160 const DMetadata& metadata,
161 bool isRaw,
162 bool fromRawEmbeddedPreview);
163
164Q_SIGNALS:
165
175 void signalImageStartedLoading(const LoadingDescription& loadingDescription);
176
182 void signalLoadingProgress(const LoadingDescription& loadingDescription, float progress);
183
188 void signalImageLoaded(const LoadingDescription& loadingDescription, const DImg& img);
189
199 const LoadingDescription& newLoadingDescription);
200
201 void signalImageStartedSaving(const QString& filePath);
202 void signalSavingProgress(const QString& filePath, float progress);
203 void signalImageSaved(const QString& filePath, bool success);
204
205 void signalThumbnailLoaded(const LoadingDescription& loadingDescription, const QImage& img);
206
207public:
208
209 void imageStartedLoading(const LoadingDescription& loadingDescription) override;
210 void loadingProgress(const LoadingDescription& loadingDescription, float progress) override;
211 void imageLoaded(const LoadingDescription& loadingDescription, const DImg& img) override;
212 void moreCompleteLoadingAvailable(const LoadingDescription& oldLoadingDescription,
213 const LoadingDescription& newLoadingDescription) override;
214 void imageStartedSaving(const QString& filePath) override;
215 void savingProgress(const QString& filePath, float progress) override;
216 void imageSaved(const QString& filePath, bool success) override;
217 void thumbnailLoaded(const LoadingDescription& loadingDescription, const QImage& img) override;
218
219 virtual bool querySendNotifyEvent() const;
220 virtual void taskHasFinished();
221
222protected:
223
224 void run() override;
225
226 void notificationReceived();
227
228protected:
229
230 QMutex m_mutex;
231
232 QList<LoadSaveTask*> m_todo;
233
234 LoadSaveTask* m_currentTask = nullptr;
235
236 NotificationPolicy m_notificationPolicy = NotificationPolicyTimeLimited;
237
238private:
239
240 // Disable
241 LoadSaveThread(const LoadSaveThread&) = delete;
242 LoadSaveThread& operator=(const LoadSaveThread&) = delete;
243
244private:
245
246 class Private;
247 Private* const d = nullptr;
248};
249
250} // namespace Digikam
Definition dimg.h:52
Definition dmetadata.h:46
Definition dynamicthread.h:33
Definition loadsavethread.h:65
virtual ~LoadSaveFileInfoProvider()=default
virtual QSize dimensionsHint(const QString &path)=0
virtual int orientationHint(const QString &path)=0
Definition loadsavethread.h:41
virtual void savingProgress(const QString &filePath, float progress)=0
virtual void moreCompleteLoadingAvailable(const LoadingDescription &oldLoadingDescription, const LoadingDescription &newLoadingDescription)=0
virtual void imageSaved(const QString &filePath, bool success)=0
virtual void loadingProgress(const LoadingDescription &loadingDescription, float progress)=0
virtual ~LoadSaveNotifier()=default
virtual void imageStartedSaving(const QString &filePath)=0
virtual void imageLoaded(const LoadingDescription &loadingDescription, const DImg &img)=0
virtual void thumbnailLoaded(const LoadingDescription &loadingDescription, const QImage &img)=0
virtual void imageStartedLoading(const LoadingDescription &loadingDescription)=0
Definition loadsavetask.h:36
Definition loadsavethread.h:93
void signalSavingProgress(const QString &filePath, float progress)
AccessMode
Definition loadsavethread.h:117
@ AccessModeRead
Definition loadsavethread.h:121
NotificationPolicy
Definition loadsavethread.h:99
@ NotificationPolicyDirect
Definition loadsavethread.h:103
QList< LoadSaveTask * > m_todo
Definition loadsavethread.h:232
void signalImageStartedLoading(const LoadingDescription &loadingDescription)
void signalImageStartedSaving(const QString &filePath)
void signalImageLoaded(const LoadingDescription &loadingDescription, const DImg &img)
QMutex m_mutex
Definition loadsavethread.h:230
void signalThumbnailLoaded(const LoadingDescription &loadingDescription, const QImage &img)
void signalLoadingProgress(const LoadingDescription &loadingDescription, float progress)
void signalImageSaved(const QString &filePath, bool success)
void signalMoreCompleteLoadingAvailable(const LoadingDescription &oldLoadingDescription, const LoadingDescription &newLoadingDescription)
Definition loadingdescription.h:35
Definition datefolderview.cpp:34