Loading...
Searching...
No Matches
ImportedUi.hpp
1#pragma once
2
3#include <score_plugin_js_export.h>
4
5#include <QMetaProperty>
6#include <QPointer>
7#include <QQuickItem>
8#include <QSizeF>
9#include <QStringList>
10#include <QUrl>
11#include <QVariantList>
12#include <QVariantMap>
13
14#include <memory>
15#include <vector>
16
17class QQmlComponent;
18class QQmlEngine;
19
20namespace JS
21{
22// Hosts trusted generated QML in an independent engine on this item's thread.
23class SCORE_PLUGIN_JS_EXPORT ImportedUi : public QQuickItem
24{
25 Q_OBJECT
26 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
27 Q_PROPERTY(
28 QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY
29 importPathsChanged)
30 Q_PROPERTY(QVariantList mapping READ mapping WRITE setMapping NOTIFY mappingChanged)
31 Q_PROPERTY(QVariantMap values READ values WRITE setValues NOTIFY valuesChanged)
32 Q_PROPERTY(QString status READ status NOTIFY statusChanged)
33 Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged)
34 Q_PROPERTY(QSizeF designSize READ designSize NOTIFY designSizeChanged)
35 Q_PROPERTY(QVariantList objects READ objects NOTIFY objectsChanged)
36
37public:
38 explicit ImportedUi(QQuickItem* parent = nullptr);
39 ~ImportedUi() override;
40
41 const QUrl& source() const noexcept { return m_source; }
42 const QStringList& importPaths() const noexcept { return m_importPaths; }
43 const QVariantList& mapping() const noexcept { return m_mapping; }
44 const QVariantMap& values() const noexcept { return m_values; }
45 const QString& status() const noexcept { return m_status; }
46 const QString& errorString() const noexcept { return m_error; }
47 QSizeF designSize() const noexcept { return m_designSize; }
48 const QVariantList& objects() const noexcept { return m_objects; }
49
50 void setSource(const QUrl& source);
51 void setImportPaths(const QStringList& paths);
52 // Unsupported JavaScript values report an error without replacing accepted data.
53 void setMapping(const QVariantList& mapping);
54 Q_INVOKABLE void reload();
55 void setValues(const QVariantMap& values);
56
57Q_SIGNALS:
58 void sourceChanged();
59 void importPathsChanged();
60 void mappingChanged();
61 void valuesChanged();
62 void statusChanged();
63 void errorStringChanged();
64 void designSizeChanged();
65 void objectsChanged();
66 void event(const QString& name, const QVariant& value);
67
68protected:
69 void componentComplete() override;
70 void geometryChange(const QRectF& newGeometry, const QRectF& oldGeometry) override;
71
72private Q_SLOTS:
73 void mappedSignal();
74
75private:
76 struct Binding
77 {
78 QString name;
79 QPointer<QObject> target;
80 QMetaProperty property;
81 int signalIndex{-1};
82 bool input{};
83 bool output{};
84 };
85
86 void scheduleUpdate(bool reload);
87 void reloadNow();
88 void finishLoading();
89 void clearLoaded();
90 void clearBindings();
91 void configureMappings();
92 QString applyValues();
93 void fit();
94 void setState(const QString& status, const QString& error = {});
95
96 QUrl m_source;
97 QStringList m_importPaths;
98 QVariantList m_mapping;
99 QVariantMap m_values;
100 QString m_status{QStringLiteral("empty")};
101 QString m_error;
102 QSizeF m_designSize;
103 QVariantList m_objects;
104 std::unique_ptr<QQmlEngine> m_engine;
105 std::unique_ptr<QQmlComponent> m_component;
106 QQuickItem* m_viewport{};
107 QPointer<QQuickItem> m_root;
108 std::vector<Binding> m_bindings;
109 std::vector<QMetaObject::Connection> m_connections;
110 bool m_complete{};
111 bool m_updatePending{};
112 bool m_reloadPending{};
113 bool m_mappingValid{};
114 bool m_applyingValues{};
115 bool m_dispatchingOutputs{};
116 bool m_valuesPending{};
117 bool m_destroying{};
118};
119}
Definition ImportedUi.hpp:24