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