9 #ifndef hifi_qml_OffscreenSurface_h
10 #define hifi_qml_OffscreenSurface_h
17 #include <QtCore/QUrl>
18 #include <QtCore/QSize>
19 #include <QtCore/QPointF>
20 #include <QtCore/QTimer>
22 #include <QtQml/QJSValue>
31 class OffscreenQmlSharedObject;
32 class QQmlFileSelector;
34 namespace hifi {
namespace qml {
40 using QmlContextCallback = ::std::function<void(QQmlContext*)>;
41 using QmlContextObjectCallback = ::std::function<void(QQmlContext*, QQuickItem*)>;
42 using QmlUrlValidator = std::function<bool(
const QUrl&)>;
44 class OffscreenSurface :
public QObject {
48 static const QmlContextObjectCallback DEFAULT_CONTEXT_OBJECT_CALLBACK;
49 static const QmlContextCallback DEFAULT_CONTEXT_CALLBACK;
50 static QmlUrlValidator validator;
51 using TextureAndFence = std::pair<uint32_t, void*>;
52 using MouseTranslator = std::function<QPoint(
const QPointF&)>;
55 static const QmlUrlValidator& getUrlValidator() {
return validator; }
56 static void setUrlValidator(
const QmlUrlValidator& newValidator) { validator = newValidator; }
57 static void setSharedContext(QOpenGLContext* context);
60 virtual ~OffscreenSurface();
63 virtual void resize(
const QSize& size);
66 void setMaxFps(uint8_t maxFps);
68 void setProxyWindow(QWindow* window);
69 void setMouseTranslator(
const MouseTranslator& mouseTranslator) { _mouseTranslator = mouseTranslator; }
73 bool isPaused()
const;
75 QQuickItem* getRootItem();
76 QQuickWindow* getWindow();
77 QObject* getEventHandler();
78 QQmlContext* getSurfaceContext();
79 QQmlFileSelector* getFileSelector();
85 bool fetchTexture(TextureAndFence& textureAndFence);
87 static std::function<void(uint32_t,
void*)> getDiscardLambda();
88 static size_t getUsedTextureMemory();
89 QPointF mapToVirtualScreen(
const QPointF& originalPoint);
92 Q_INVOKABLE
void load(
const QUrl& qmlSource, QQuickItem* parent,
const QJSValue& callback);
95 Q_INVOKABLE
void load(
const QUrl& qmlSource,
const QmlContextObjectCallback& callback = DEFAULT_CONTEXT_OBJECT_CALLBACK);
96 Q_INVOKABLE
void load(
const QUrl& qmlSource,
97 bool createNewContext,
98 const QmlContextObjectCallback& callback = DEFAULT_CONTEXT_OBJECT_CALLBACK);
99 Q_INVOKABLE
void load(
const QString& qmlSourceFile,
100 const QmlContextObjectCallback& callback = DEFAULT_CONTEXT_OBJECT_CALLBACK);
101 Q_INVOKABLE
void loadInNewContext(
const QUrl& qmlSource,
102 const QmlContextObjectCallback& callback = DEFAULT_CONTEXT_OBJECT_CALLBACK,
103 const QmlContextCallback& contextCallback = DEFAULT_CONTEXT_CALLBACK);
106 virtual void onFocusObjectChanged(QObject* newFocus) {}
109 void rootContextCreated(QQmlContext* rootContext);
110 void rootItemCreated(QQuickItem* rootContext);
113 virtual void loadFromQml(
const QUrl& qmlSource, QQuickItem* parent,
const QJSValue& callback);
114 bool eventFilter(QObject* originalDestination, QEvent* event)
override;
115 bool filterEnabled(QObject* originalDestination, QEvent* event)
const;
117 virtual void initializeEngine(QQmlEngine* engine);
118 virtual void loadInternal(
const QUrl& qmlSource,
119 bool createNewContext,
121 const QmlContextObjectCallback& callback,
122 const QmlContextCallback& contextCallback = DEFAULT_CONTEXT_CALLBACK)
final;
123 virtual void finishQmlLoad(QQmlComponent* qmlComponent,
124 QQmlContext* qmlContext,
126 const QmlContextObjectCallback& onQmlLoadedCallback)
final;
128 virtual void onRootCreated() {}
129 virtual void onItemCreated(QQmlContext* context, QQuickItem* newItem) {}
130 virtual void onRootContextCreated(QQmlContext* qmlContext) {}
132 virtual QQmlContext* contextForUrl(
const QUrl& qmlSource, QQuickItem* parent,
bool forceNewContext);
135 MouseTranslator _mouseTranslator{ [](
const QPointF& p) {
return p.toPoint(); } };
136 friend class hifi::qml::impl::SharedObject;
137 impl::SharedObject*
const _sharedObject;