Adding DesignerWindowManager for Qt Quick Designer
authorMarco Bubke <marco.bubke@digia.com>
Mon, 15 Oct 2012 10:31:40 +0000 (12:31 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 15 Oct 2012 12:28:48 +0000 (14:28 +0200)
DesignerWindowManager implements a render path just for
Qt Quick Designer, which is single threaded and does not
open visible windows.

Change-Id: I02b0d1b819a7a5391b9bb14ee6efa1a32e0c8ad7
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
src/quick/designer/designer.pri
src/quick/designer/designersupport.cpp
src/quick/designer/designersupport.h
src/quick/designer/designerwindowmanager.cpp [new file with mode: 0644]
src/quick/designer/designerwindowmanager_p.h [new file with mode: 0644]
src/quick/items/qquickwindowmanager.cpp
src/quick/items/qquickwindowmanager_p.h

index c523525..9f3f7e8 100644 (file)
@@ -1,2 +1,4 @@
-HEADERS +=  designer/designersupport.h
-SOURCES +=  designer/designersupport.cpp
+HEADERS +=  designer/designersupport.h \
+    designer/designerwindowmanager_p.h
+SOURCES +=  designer/designersupport.cpp \
+    designer/designerwindowmanager.cpp
index c06e8f0..78445d7 100644 (file)
 #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()
@@ -119,6 +123,7 @@ QImage DesignerSupport::renderImageForItem(QQuickItem *referencedItem, const QRe
          return QImage();
     renderTexture->setRect(boundingRect);
     renderTexture->setSize(imageSize);
+    renderTexture->markDirtyTexture();
     renderTexture->updateTexture();
 
     QImage renderImage = renderTexture->toImage();
@@ -138,6 +143,14 @@ bool DesignerSupport::isDirty(QQuickItem *referencedItem, DirtyType dirtyType)
     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)
@@ -410,4 +423,14 @@ void DesignerSupport::updateDirtyNode(QQuickItem *item)
     QQuickWindowPrivate::get(item->window())->updateDirtyNode(item);
 }
 
+void DesignerSupport::activateDesignerWindowManager()
+{
+    QQuickWindowManager::setInstance(new DesignerWindowManager);
+}
+
+void DesignerSupport::createOpenGLContext(QQuickWindow *window)
+{
+    DesignerWindowManager::createOpenGLContext(window);
+}
+
 QT_END_NAMESPACE
index 54331fd..e27cb3b 100644 (file)
@@ -70,6 +70,7 @@ class QTransform;
 class QQmlContext;
 class QQuickView;
 class QObject;
+class QQuickWindow;
 
 class Q_QUICK_EXPORT DesignerSupport
 {
@@ -99,7 +100,8 @@ public:
         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
     };
 
 
@@ -112,6 +114,7 @@ public:
     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);
@@ -141,6 +144,10 @@ public:
 
     static void updateDirtyNode(QQuickItem *item);
 
+    static void activateDesignerWindowManager();
+
+    static void createOpenGLContext(QQuickWindow *window);
+
 private:
     QHash<QQuickItem*, QQuickShaderEffectTexture*> m_itemTextureHash;
 };
diff --git a/src/quick/designer/designerwindowmanager.cpp b/src/quick/designer/designerwindowmanager.cpp
new file mode 100644 (file)
index 0000000..fca9f53
--- /dev/null
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** 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
+
+
diff --git a/src/quick/designer/designerwindowmanager_p.h b/src/quick/designer/designerwindowmanager_p.h
new file mode 100644 (file)
index 0000000..222a93f
--- /dev/null
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** 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
index 6596343..dd27182 100644 (file)
@@ -74,6 +74,8 @@ extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_
 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()
 {
 }
@@ -124,11 +126,9 @@ public:
 
 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
@@ -148,13 +148,19 @@ QQuickWindowManager *QQuickWindowManager::instance()
         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()
index 7a6d261..ac46fd3 100644 (file)
@@ -76,6 +76,10 @@ public:
 
     // ### make this less of a singleton
     static QQuickWindowManager *instance();
+    static void setInstance(QQuickWindowManager *instance);
+
+private:
+    static QQuickWindowManager *s_instance;
 };
 
 QT_END_NAMESPACE