1/****************************************************************************
2**
3** Copyright (C) 2018 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QML preview debug service.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QQMLPREVIEWHANDLER_H
41#define QQMLPREVIEWHANDLER_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include "qqmlpreviewposition.h"
55
56#include <QtCore/qobject.h>
57#include <QtCore/qvector.h>
58#include <QtCore/qrect.h>
59#include <QtCore/qpointer.h>
60#include <QtCore/qelapsedtimer.h>
61#include <QtQml/qqmlengine.h>
62
63QT_BEGIN_NAMESPACE
64
65class QQmlEngine;
66class QQuickItem;
67class QQmlPreviewUrlInterceptor;
68class QQuickWindow;
69class QTranslator;
70
71class QQmlPreviewHandler : public QObject
72{
73 Q_OBJECT
74public:
75 explicit QQmlPreviewHandler(QObject *parent = nullptr);
76 ~QQmlPreviewHandler();
77
78 void addEngine(QQmlEngine *engine);
79 void removeEngine(QQmlEngine *engine);
80
81 void loadUrl(const QUrl &url);
82 void rerun();
83 void zoom(qreal newFactor);
84#if QT_CONFIG(translation)
85 void language(const QUrl &context, const QLocale &locale);
86#endif
87
88 void clear();
89
90 struct FpsInfo {
91 quint16 numSyncs;
92 quint16 minSync;
93 quint16 maxSync;
94 quint16 totalSync;
95
96 quint16 numRenders;
97 quint16 minRender;
98 quint16 maxRender;
99 quint16 totalRender;
100 };
101
102signals:
103 void error(const QString &message);
104 void fps(const FpsInfo &info);
105
106protected:
107 bool eventFilter(QObject *obj, QEvent *event);
108private:
109 void doZoom();
110 void tryCreateObject();
111 void showObject(QObject *object);
112 void setCurrentWindow(QQuickWindow *window);
113
114 void beforeSynchronizing();
115 void afterSynchronizing();
116 void beforeRendering();
117 void frameSwapped();
118
119 void fpsTimerHit();
120#if QT_CONFIG(translation)
121 void removeTranslators();
122#endif
123
124 QScopedPointer<QQuickItem> m_dummyItem;
125 QList<QQmlEngine *> m_engines;
126 QVector<QPointer<QObject>> m_createdObjects;
127 QScopedPointer<QQmlComponent> m_component;
128 QPointer<QQuickWindow> m_currentWindow;
129 qreal m_zoomFactor = 1.0;
130 bool m_supportsMultipleWindows;
131 QQmlPreviewPosition m_lastPosition;
132
133 QTimer m_fpsTimer;
134
135 struct FrameTime {
136 void beginFrame();
137 void recordFrame();
138 void endFrame();
139 void reset();
140
141 QElapsedTimer timer;
142 qint64 elapsed = -1;
143 quint16 min = std::numeric_limits<quint16>::max();
144 quint16 max = 0;
145 quint16 total = 0;
146 quint16 number = 0;
147 };
148
149 FrameTime m_rendering;
150 FrameTime m_synchronizing;
151
152#if QT_CONFIG(translation)
153 QScopedPointer<QTranslator> m_qtTranslator;
154 QScopedPointer<QTranslator> m_qmlTranslator;
155#endif
156};
157
158QT_END_NAMESPACE
159
160Q_DECLARE_METATYPE(QQmlPreviewHandler::FpsInfo)
161
162#endif // QQMLPREVIEWHANDLER_H
163

source code of qtdeclarative/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.h