Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_async_action_feedback.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_ASYNC_ACTION_FEEDBACK_H
8#define __KIS_ASYNC_ACTION_FEEDBACK_H
9
10#include <QScopedPointer>
11#include <functional>
13
14class QWidget;
15class QMutex;
16
18{
19private:
21 QString operator()() const;
22 };
23
24public:
25 KisAsyncActionFeedback(const QString &message, QWidget *parent);
27
29 void runVoidAction(std::function<void()> func);
30
31 template <typename Mutex>
32 void waitForMutex(Mutex &mutex) {
34 }
35
36 template<typename Mutex, typename CallbackFunc = DefaultWaitingMessageCallback>
37 class MutexWrapper : public Mutex
38 {
39 public:
40 template<typename ...Args>
41 MutexWrapper(Args ...args)
42 : Mutex(args...)
43 {
44 }
45
46 void lock() {
47 if (!Mutex::try_lock()) {
48 KisAsyncActionFeedback f(CallbackFunc{}(), 0);
49 f.waitForMutex(static_cast<Mutex&>(*this));
50 Mutex::lock();
51 }
52 }
53 };
54
55private:
56
62 {
63 virtual ~MutexLikeBase() = default;
64 virtual void lock() = 0;
65 virtual void unlock() = 0;
66 virtual bool try_lock() = 0;
67 };
68
72 template <typename T>
74 {
75 MutexLike(T& m) : mutex(m) {}
76
78
79 void lock() override {
80 mutex.lock();
81 }
82 void unlock() override {
83 mutex.unlock();
84 }
85 bool try_lock() override {
86 return mutex.try_lock();
87 }
88 };
89
90 void waitForMutexLikeImpl(std::unique_ptr<MutexLikeBase> &&mutex);
91
92private:
93 struct Private;
94 const QScopedPointer<Private> m_d;
95};
96
97#endif /* __KIS_ASYNC_ACTION_FEEDBACK_H */
const QScopedPointer< Private > m_d
KisImportExportErrorCode runAction(std::function< KisImportExportErrorCode()> func)
KisAsyncActionFeedback(const QString &message, QWidget *parent)
void runVoidAction(std::function< void()> func)
void waitForMutexLikeImpl(std::unique_ptr< MutexLikeBase > &&mutex)
static QMutex mutex