aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/designer
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@digia.com>2012-10-15 12:31:40 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-15 14:28:48 +0200
commitf36c55cd4724a8023ff34036b74c96982714f63a (patch)
tree383326e81e1b3495af6213e910f6af4612bfef47 /src/quick/designer
parent21d4bd1c63053ec3f3e1f6733553de0d8c46e544 (diff)
Adding DesignerWindowManager for Qt Quick Designer
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>
Diffstat (limited to 'src/quick/designer')
-rw-r--r--src/quick/designer/designer.pri6
-rw-r--r--src/quick/designer/designersupport.cpp23
-rw-r--r--src/quick/designer/designersupport.h9
-rw-r--r--src/quick/designer/designerwindowmanager.cpp118
-rw-r--r--src/quick/designer/designerwindowmanager_p.h107
5 files changed, 260 insertions, 3 deletions
diff --git a/src/quick/designer/designer.pri b/src/quick/designer/designer.pri
index c523525977..9f3f7e8be6 100644
--- a/src/quick/designer/designer.pri
+++ b/src/quick/designer/designer.pri
@@ -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
diff --git a/src/quick/designer/designersupport.cpp b/src/quick/designer/designersupport.cpp
index c06e8f0579..78445d7179 100644
--- a/src/quick/designer/designersupport.cpp
+++ b/src/quick/designer/designersupport.cpp
@@ -46,9 +46,13 @@
#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
diff --git a/src/quick/designer/designersupport.h b/src/quick/designer/designersupport.h
index 54331fd008..e27cb3bcb3 100644
--- a/src/quick/designer/designersupport.h
+++ b/src/quick/designer/designersupport.h
@@ -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
index 0000000000..fca9f5339b
--- /dev/null
+++ b/src/quick/designer/designerwindowmanager.cpp
@@ -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
index 0000000000..222a93f90e
--- /dev/null
+++ b/src/quick/designer/designerwindowmanager_p.h
@@ -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