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 */