diff options
author | Marco Bubke <[email protected]> | 2012-10-15 12:31:40 +0200 |
---|---|---|
committer | The Qt Project <[email protected]> | 2012-10-15 14:28:48 +0200 |
commit | f36c55cd4724a8023ff34036b74c96982714f63a (patch) | |
tree | 383326e81e1b3495af6213e910f6af4612bfef47 | |
parent | 21d4bd1c63053ec3f3e1f6733553de0d8c46e544 (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 <[email protected]>
-rw-r--r-- | src/quick/designer/designer.pri | 6 | ||||
-rw-r--r-- | src/quick/designer/designersupport.cpp | 23 | ||||
-rw-r--r-- | src/quick/designer/designersupport.h | 9 | ||||
-rw-r--r-- | src/quick/designer/designerwindowmanager.cpp | 118 | ||||
-rw-r--r-- | src/quick/designer/designerwindowmanager_p.h | 107 | ||||
-rw-r--r-- | src/quick/items/qquickwindowmanager.cpp | 20 | ||||
-rw-r--r-- | src/quick/items/qquickwindowmanager_p.h | 4 |
7 files changed, 277 insertions, 10 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 diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 6596343bc8..dd27182ffe 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -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() diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h index 7a6d26127a..ac46fd3d5f 100644 --- a/src/quick/items/qquickwindowmanager_p.h +++ b/src/quick/items/qquickwindowmanager_p.h @@ -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 |