Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
qfuture_qml_wrapper.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <QFutureWatcher>
7#include <QtQmlIntegration/qqmlintegration.h>
8
9namespace zrythm::gui::qquick
10{
15class QFutureQmlWrapper : public QObject
16{
17 Q_OBJECT
18 Q_PROPERTY (
19 int progressMinimum READ progressMinimum NOTIFY progressRangeChanged)
20 Q_PROPERTY (
21 int progressMaximum READ progressMaximum NOTIFY progressRangeChanged)
22 Q_PROPERTY (int progressValue READ progressValue NOTIFY progressValueChanged)
23 Q_PROPERTY (QString progressText READ progressText NOTIFY progressTextChanged)
24 QML_ELEMENT
25 QML_UNCREATABLE ("")
26
27public:
28 ~QFutureQmlWrapper () override = default;
29
30 virtual int progressMinimum () const = 0;
31 virtual int progressMaximum () const = 0;
32 virtual int progressValue () const = 0;
33 virtual QString progressText () const = 0;
34 Q_INVOKABLE virtual QVariant resultVar () const = 0;
35 Q_INVOKABLE virtual void cancel () = 0;
36 Q_INVOKABLE virtual bool isCanceled () const = 0;
37
38Q_SIGNALS:
39 void progressValueChanged (int value);
40 void progressRangeChanged (int minimum, int maximum);
41 void progressTextChanged (const QString &text);
42 void finished ();
43
44protected:
45 void setup (QFutureWatcherBase &watcher) const
46 {
47 QObject::connect (
48 &watcher, &QFutureWatcherBase::progressRangeChanged, this,
49 &QFutureQmlWrapper::progressRangeChanged);
50 QObject::connect (
51 &watcher, &QFutureWatcherBase::progressValueChanged, this,
52 &QFutureQmlWrapper::progressValueChanged);
53 QObject::connect (
54 &watcher, &QFutureWatcherBase::progressTextChanged, this,
55 &QFutureQmlWrapper::progressTextChanged);
56 QObject::connect (
57 &watcher, &QFutureWatcherBase::finished, this,
58 &QFutureQmlWrapper::finished);
59 }
60};
61
62template <typename T> class QFutureQmlWrapperT : public QFutureQmlWrapper
63{
64public:
65 QFutureQmlWrapperT (QFuture<T> future) : future_ (future)
66 {
67 watcher_.setFuture (future_);
68 setup (watcher_);
69 }
70
71 int progressMinimum () const override { return watcher_.progressMinimum (); }
72 int progressMaximum () const override { return watcher_.progressMaximum (); }
73 int progressValue () const override { return watcher_.progressValue (); }
74 QString progressText () const override { return watcher_.progressText (); }
75 QVariant resultVar () const override
76 {
77 if constexpr (std::is_same_v<T, void>)
78 {
79 return QVariant{};
80 }
81 else
82 {
83 assert (future_.isResultReadyAt (0));
84 return QVariant::fromValue (watcher_.result ());
85 }
86 }
87
88 void cancel () override { future_.cancel (); }
89 bool isCanceled () const override { return future_.isCanceled (); }
90
91private:
92 QFuture<T> future_;
93 QFutureWatcher<T> watcher_;
94};
95}
QML-exposed wrapper over a QFuture that provides properties for binding.