-HEADERS += designer/designersupport.h
-SOURCES += designer/designersupport.cpp
+HEADERS += designer/designersupport.h \
+ designer/designerwindowmanager_p.h
+SOURCES += designer/designersupport.cpp \
+ designer/designerwindowmanager.cpp
#include <QtQuick/private/qquickrectangle_p.h>
#include <private/qqmlengine_p.h>
#include <private/qquickview_p.h>
+#include <private/qquickwindowmanager_p.h>
#include <QtQuick/private/qquickstategroup_p.h>
#include <QtGui/QImage>
+#include "designerwindowmanager_p.h"
+
+
QT_BEGIN_NAMESPACE
DesignerSupport::DesignerSupport()
return QImage();
renderTexture->setRect(boundingRect);
renderTexture->setSize(imageSize);
+ renderTexture->markDirtyTexture();
renderTexture->updateTexture();
QImage renderImage = renderTexture->toImage();
return QQuickItemPrivate::get(referencedItem)->dirtyAttributes & dirtyType;
}
+void DesignerSupport::addDirty(QQuickItem *referencedItem, DesignerSupport::DirtyType dirtyType)
+{
+ if (referencedItem == 0)
+ return;
+
+ QQuickItemPrivate::get(referencedItem)->dirtyAttributes |= dirtyType;
+}
+
void DesignerSupport::resetDirty(QQuickItem *referencedItem)
{
if (referencedItem == 0)
QQuickWindowPrivate::get(item->window())->updateDirtyNode(item);
}
+void DesignerSupport::activateDesignerWindowManager()
+{
+ QQuickWindowManager::setInstance(new DesignerWindowManager);
+}
+
+void DesignerSupport::createOpenGLContext(QQuickWindow *window)
+{
+ DesignerWindowManager::createOpenGLContext(window);
+}
+
QT_END_NAMESPACE
class QQmlContext;
class QQuickView;
class QObject;
+class QQuickWindow;
class Q_QUICK_EXPORT DesignerSupport
{
TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Size | Window,
ComplexTransformUpdateMask = Transform | Window,
ContentUpdateMask = Size | Content | Smooth | Window,
- ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window
+ ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window,
+ AllMask = TransformUpdateMask | ContentUpdateMask | ChildrenUpdateMask
};
QImage renderImageForItem(QQuickItem *referencedItem, const QRectF &boundingRect, const QSize &imageSize);
static bool isDirty(QQuickItem *referencedItem, DirtyType dirtyType);
+ static void addDirty(QQuickItem *referencedItem, DirtyType dirtyType);
static void resetDirty(QQuickItem *referencedItem);
static QTransform windowTransform(QQuickItem *referencedItem);
static void updateDirtyNode(QQuickItem *item);
+ static void activateDesignerWindowManager();
+
+ static void createOpenGLContext(QQuickWindow *window);
+
private:
QHash<QQuickItem*, QQuickShaderEffectTexture*> m_itemTextureHash;
};
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtQml module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "designerwindowmanager_p.h"
+
+#include <QtGui/QOpenGLContext>
+
+#include <QtQuick/QQuickWindow>
+
+
+QT_BEGIN_NAMESPACE
+
+DesignerWindowManager::DesignerWindowManager()
+ : m_sgContext(QSGContext::createDefaultContext())
+{
+}
+
+void DesignerWindowManager::show(QQuickWindow *window)
+{
+ makeOpenGLContext(window);
+}
+
+void DesignerWindowManager::hide(QQuickWindow *)
+{
+}
+
+void DesignerWindowManager::windowDestroyed(QQuickWindow *)
+{
+}
+
+void DesignerWindowManager::makeOpenGLContext(QQuickWindow *window)
+{
+ if (!m_openGlContext) {
+ m_openGlContext.reset(new QOpenGLContext());
+ m_openGlContext->setFormat(window->requestedFormat());
+ m_openGlContext->create();
+ if (!m_openGlContext->makeCurrent(window))
+ qWarning("QQuickWindow: makeCurrent() failed...");
+ m_sgContext->initialize(m_openGlContext.data());
+ } else {
+ m_openGlContext->makeCurrent(window);
+ }
+}
+
+void DesignerWindowManager::exposureChanged(QQuickWindow *)
+{
+}
+
+QImage DesignerWindowManager::grab(QQuickWindow *)
+{
+ return QImage();
+}
+
+void DesignerWindowManager::resize(QQuickWindow *, const QSize &)
+{
+}
+
+void DesignerWindowManager::maybeUpdate(QQuickWindow *)
+{
+}
+
+QSGContext *DesignerWindowManager::sceneGraphContext() const
+{
+ return m_sgContext.data();
+}
+
+void DesignerWindowManager::createOpenGLContext(QQuickWindow *window)
+{
+ window->create();
+ window->update();
+}
+
+void DesignerWindowManager::update(QQuickWindow *window)
+{
+ makeOpenGLContext(window);
+}
+
+QT_END_NAMESPACE
+
+
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtQml module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DESIGNERWINDOWMANAGER_P_H
+#define DESIGNERWINDOWMANAGER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/QScopedPointer>
+
+#include <private/qquickwindowmanager_p.h>
+#include <private/qtquickglobal_p.h>
+#include <QtQuick/private/qsgcontext_p.h>
+
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QQuickWindow;
+class QSGContext;
+class QAnimationDriver;
+class QOpenGLContext;
+
+class DesignerWindowManager : public QObject, public QQuickWindowManager
+{
+ Q_OBJECT
+public:
+ DesignerWindowManager();
+
+ void show(QQuickWindow *window);
+ void hide(QQuickWindow *window);
+
+ void windowDestroyed(QQuickWindow *window);
+
+ void makeOpenGLContext(QQuickWindow *window);
+ void exposureChanged(QQuickWindow *window);
+ QImage grab(QQuickWindow *window);
+ void resize(QQuickWindow *window, const QSize &size);
+
+ void maybeUpdate(QQuickWindow *window);
+ void update(QQuickWindow *window); // identical for this implementation.
+
+ void releaseResources() { }
+
+ QAnimationDriver *animationDriver() const { return 0; }
+
+ QSGContext *sceneGraphContext() const;
+
+ static void createOpenGLContext(QQuickWindow *window);
+
+private:
+ QScopedPointer<QOpenGLContext> m_openGlContext;
+ QScopedPointer<QSGContext> m_sgContext;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+#endif // DESIGNERWINDOWMANAGER_P_H
DEFINE_BOOL_CONFIG_OPTION(qmlNoThreadedRenderer, QML_BAD_GUI_RENDER_LOOP);
DEFINE_BOOL_CONFIG_OPTION(qmlForceThreadedRenderer, QML_FORCE_THREADED_RENDERER); // Might trigger graphics driver threading bugs, use at own risk
+QQuickWindowManager *QQuickWindowManager::s_instance = 0;
+
QQuickWindowManager::~QQuickWindowManager()
{
}
QQuickWindowManager *QQuickWindowManager::instance()
{
- static QQuickWindowManager *theInstance;
-
- if (!theInstance) {
+ if (!s_instance) {
- theInstance = QSGContext::createWindowManager();
+ s_instance = QSGContext::createWindowManager();
bool bufferQueuing = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::BufferQueueingOpenGL);
bool fancy = bufferQueuing
if (fixedAnimationSteps)
QUnifiedTimer::instance(true)->setConsistentTiming(true);
- if (!theInstance) {
- theInstance = fancy
+ if (!s_instance) {
+ s_instance = fancy
? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager
: (QQuickWindowManager*) new QQuickTrivialWindowManager;
}
}
- return theInstance;
+ return s_instance;
+}
+
+void QQuickWindowManager::setInstance(QQuickWindowManager *instance)
+{
+ Q_ASSERT(!s_instance);
+ s_instance = instance;
}
QQuickTrivialWindowManager::QQuickTrivialWindowManager()
// ### make this less of a singleton
static QQuickWindowManager *instance();
+ static void setInstance(QQuickWindowManager *instance);
+
+private:
+ static QQuickWindowManager *s_instance;
};
QT_END_NAMESPACE