File indexing completed on 2024-05-19 04:28:52
0001 /* 0002 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef __KIS_ASYNC_ACTION_FEEDBACK_H 0008 #define __KIS_ASYNC_ACTION_FEEDBACK_H 0009 0010 #include <QScopedPointer> 0011 #include <functional> 0012 #include "KisImportExportFilter.h" 0013 0014 class QWidget; 0015 class QMutex; 0016 0017 class KisAsyncActionFeedback 0018 { 0019 public: 0020 KisAsyncActionFeedback(const QString &message, QWidget *parent); 0021 ~KisAsyncActionFeedback(); 0022 0023 KisImportExportErrorCode runAction(std::function<KisImportExportErrorCode()> func); 0024 void runVoidAction(std::function<void()> func); 0025 0026 template <typename Mutex> 0027 void waitForMutex(Mutex &mutex) { 0028 waitForMutexLikeImpl(std::make_unique<MutexLike<Mutex>>(mutex)); 0029 } 0030 0031 private: 0032 0033 /** 0034 * A simple base for type-erasure wrapper for mutex-like 0035 * objects. 0036 */ 0037 struct MutexLikeBase 0038 { 0039 virtual ~MutexLikeBase() = default; 0040 virtual void lock() = 0; 0041 virtual void unlock() = 0; 0042 virtual bool try_lock() = 0; 0043 }; 0044 0045 /** 0046 * A type-erasure wrapper for mutex-like objects 0047 */ 0048 template <typename T> 0049 struct MutexLike : MutexLikeBase 0050 { 0051 MutexLike(T& m) : mutex(m) {} 0052 0053 T &mutex; 0054 0055 void lock() override { 0056 mutex.lock(); 0057 } 0058 void unlock() override { 0059 mutex.unlock(); 0060 } 0061 bool try_lock() override { 0062 return mutex.try_lock(); 0063 } 0064 }; 0065 0066 void waitForMutexLikeImpl(std::unique_ptr<MutexLikeBase> &&mutex); 0067 0068 private: 0069 struct Private; 0070 const QScopedPointer<Private> m_d; 0071 }; 0072 0073 #endif /* __KIS_ASYNC_ACTION_FEEDBACK_H */