diff options
Diffstat (limited to 'src/declarative/fx')
61 files changed, 943 insertions, 3308 deletions
diff --git a/src/declarative/fx/fx.pri b/src/declarative/fx/fx.pri index 50bdc98..413b8db 100644 --- a/src/declarative/fx/fx.pri +++ b/src/declarative/fx/fx.pri @@ -1,23 +1,20 @@ HEADERS += \ fx/qfxanchors.h \ fx/qfxanchors_p.h \ - fx/qfxblurfilter.h \ fx/qfxcomponentinstance.h \ fx/qfxcomponentinstance_p.h \ fx/qfxevents_p.h \ fx/qfxflickable.h \ fx/qfxflickable_p.h \ fx/qfxflipable.h \ - fx/qfxfocuspanel.h \ - fx/qfxfocusrealm.h \ fx/qfxgridview.h \ - fx/qfxhighlightfilter.h \ fx/qfximage.h \ fx/qfxpainteditem.h \ fx/qfxpainteditem_p.h \ fx/qfximage_p.h \ fx/qfxitem.h \ fx/qfxitem_p.h \ + fx/qfxfocusrealm.h \ fx/qfxkeyactions.h \ fx/qfxkeyproxy.h \ fx/qfxlayouts.h \ @@ -30,11 +27,9 @@ HEADERS += \ fx/qfxpathview_p.h \ fx/qfxrect.h \ fx/qfxrect_p.h \ - fx/qfxreflectionfilter.h \ fx/qfxrepeater.h \ fx/qfxrepeater_p.h \ fx/qfxscalegrid.h \ - fx/qfxshadowfilter.h \ fx/qfxlineedit.h \ fx/qfxlineedit_p.h \ fx/qfxtextedit.h \ @@ -49,18 +44,15 @@ HEADERS += \ SOURCES += \ fx/qfxanchors.cpp \ - fx/qfxblurfilter.cpp \ fx/qfxcomponentinstance.cpp \ fx/qfxevents.cpp \ fx/qfxflickable.cpp \ fx/qfxflipable.cpp \ - fx/qfxfocuspanel.cpp \ - fx/qfxfocusrealm.cpp \ fx/qfxgridview.cpp \ - fx/qfxhighlightfilter.cpp \ fx/qfximage.cpp \ fx/qfxpainteditem.cpp \ fx/qfxitem.cpp \ + fx/qfxfocusrealm.cpp \ fx/qfxkeyactions.cpp \ fx/qfxkeyproxy.cpp \ fx/qfxlayouts.cpp \ @@ -68,10 +60,8 @@ SOURCES += \ fx/qfxpath.cpp \ fx/qfxpathview.cpp \ fx/qfxrect.cpp \ - fx/qfxreflectionfilter.cpp \ fx/qfxrepeater.cpp \ fx/qfxscalegrid.cpp \ - fx/qfxshadowfilter.cpp \ fx/qfxlineedit.cpp \ fx/qfxtext.cpp \ fx/qfxtextedit.cpp \ diff --git a/src/declarative/fx/qfxanchors.cpp b/src/declarative/fx/qfxanchors.cpp index 9a5c516..e1b450d 100644 --- a/src/declarative/fx/qfxanchors.cpp +++ b/src/declarative/fx/qfxanchors.cpp @@ -222,7 +222,7 @@ void QFxAnchorsPrivate::addDepend(QFxItem *item) if (!item) return; QFxItemPrivate *p = - static_cast<QFxItemPrivate *>(QObjectPrivate::get(item)); + static_cast<QFxItemPrivate *>(QGraphicsItemPrivate::get(item)); p->dependantAnchors.append(q); } @@ -232,7 +232,7 @@ void QFxAnchorsPrivate::remDepend(QFxItem *item) if (!item) return; QFxItemPrivate *p = - static_cast<QFxItemPrivate *>(QObjectPrivate::get(item)); + static_cast<QFxItemPrivate *>(QGraphicsItemPrivate::get(item)); p->dependantAnchors.removeAll(q); } @@ -324,6 +324,11 @@ QFxItem *QFxAnchors::fill() const void QFxAnchors::setFill(QFxItem *f) { Q_D(QFxAnchors); + if (!f) { + d->remDepend(d->fill); + d->fill = f; + return; + } if (f != d->item->itemParent() && f->itemParent() != d->item->itemParent()){ qmlInfo(d->item) << "Can't anchor to an item that isn't a parent or sibling."; return; @@ -351,8 +356,9 @@ QFxItem *QFxAnchors::centeredIn() const void QFxAnchors::setCenteredIn(QFxItem* c) { Q_D(QFxAnchors); - if (!c){ - qmlInfo(d->item) << "Cannot center in null item."; + if (!c) { + d->remDepend(d->centeredIn); + d->centeredIn = c; return; } if (c != d->item->itemParent() && c->itemParent() != d->item->itemParent()){ diff --git a/src/declarative/fx/qfxblurfilter.cpp b/src/declarative/fx/qfxblurfilter.cpp deleted file mode 100644 index 84799ec..0000000 --- a/src/declarative/fx/qfxblurfilter.cpp +++ /dev/null @@ -1,467 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfxblurfilter.h" -#include <private/qsimplecanvasitem_p.h> - -#if defined(QFX_RENDER_OPENGL2) -#include <glsave.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <glbasicshaders.h> -#endif - -QT_BEGIN_NAMESPACE -class QFxBlurFilterPrivate -{ -public: - QFxBlurFilterPrivate() - : radius(0) - { - } - qreal radius; -}; - -/*! - \qmlclass Blur - \brief The Blur filter blurs an item and its contents. - \inherits Filter - - Blurring reduces the clarity of a visual item. The following example - shows an icon at a blur radius of 0, 5 and 10. - - \table - \row - \o - \qml -HorizontalLayout { - Image { - source: "icon.png" - filter: Blur { radius: 0 } - } - Image { - source: "icon.png" - filter: Blur { radius: 5 } - } - Image { - source: "icon.png" - filter: Blur { radius: 10 } - } -} - \endqml - \row - \o \image blur_example.png - \endtable - - Bluring is only supported when Qt Declarative is compiled for OpenGL ES 2.0. - Otherwise the Blur filter has no effect. - */ -/*! - \internal - \class QFxBlurFilter - \ingroup group_effects - \brief The QFxBlurFilter class allows you to blur an item. -*/ - -QFxBlurFilter::QFxBlurFilter(QObject *parent) -: QSimpleCanvasFilter(parent), d(new QFxBlurFilterPrivate) -{ -} - -QFxBlurFilter::~QFxBlurFilter() -{ - delete d; d = 0; -} - -/*! - \qmlproperty real Blur::radius - - Sets the blur kernel radius. - The larger the radius the more blurry the item will appear. - A radius of 0 (or less) is equivalent to no blur. - */ - -/*! - \property QFxBlurFilter::radius - \brief the radius of the blur. -*/ -qreal QFxBlurFilter::radius() const -{ - return d->radius; -} - -void QFxBlurFilter::setRadius(qreal radius) -{ - if (d->radius == radius) return; - d->radius = radius; - emit radiusChanged(radius); - update(); -} - -QRectF QFxBlurFilter::itemBoundingRect(const QRectF &r) const -{ - QRectF rv = r; - if (d->radius > 0) - rv.adjust(-d->radius, -d->radius, d->radius, d->radius); - return rv; -} - -#include <math.h> -void QFxBlurFilter::filterGL(QSimpleCanvasItem::GLPainter &p) -{ -#if defined(QFX_RENDER_OPENGL2) -#if 1 - if (d->radius <= 0) { - renderToScreen(); - return; - } - float radius = d->radius; - QSimpleCanvasItem *item = this->item(); - - QRect r = item->itemBoundingRect(); - float blurScale = 1.0; - QRect tr = QRect(QPoint(0, 0), r.size() * blurScale); - radius *= blurScale; - - QGLFramebufferObject *fbo = renderToFBO(blurScale); - if (!fbo) - return; - - float height = r.height(); - float width = r.width(); - - float texWidth = float(tr.width()) / float(fbo->width()); - float texHeight = float(tr.height()) / float(fbo->height()); - - int steps = int(::ceil(radius)); - int dispSteps = int(::ceil(d->radius)); - float xstep = texWidth * radius / float(steps * fbo->width()); - float xinc = steps / float(fbo->width()); - - glDisable(GL_BLEND); - - // Render x pass - QSize xSize(tr.width() + 2 * steps, tr.height()); - QGLFramebufferObject *xBlur = acquireFBO(xSize); - float xWidth = float(xSize.width()) / float(xBlur->width()); - float xHeight = float(xSize.height()) / float(xBlur->height()); - { - xBlur->bind(); - - GLSaveViewport sv; GLSaveScissor ss; - glClearColor(0,0,0,0); - glDisable(GL_SCISSOR_TEST); - glViewport(0, 0, xBlur->width(), xBlur->height()); - glClear(GL_COLOR_BUFFER_BIT); - - float vert[] = { 0, xHeight, - xWidth, xHeight, - 0, 0, - xWidth, 0 }; - float texVert[] = { -xinc, 0, - texWidth + xinc, 0, - -xinc, texHeight, - texWidth + xinc, texHeight }; - - QMatrix4x4 trans; - trans.translate(-1, -1); - trans.scale(2, 2); - BlurTextureShader *shader = item->basicShaders()->blurTexture(); - shader->enable(); - shader->setTransform(trans); - if (steps > 1) { - shader->setStep(xstep * 2); - shader->setSteps(steps / 2); - } else { - shader->setStep(xstep); - shader->setSteps(steps); - } - shader->setMode(BlurTextureShader::Horizontal); - - glBindTexture(GL_TEXTURE_2D, fbo->texture()); - - shader->setAttributeArray(BlurTextureShader::Vertices, vert, 2); - shader->setAttributeArray(BlurTextureShader::TextureCoords, texVert, 2); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(BlurTextureShader::Vertices); - shader->disableAttributeArray(BlurTextureShader::TextureCoords); - xBlur->release(); - } - - // Render y pass - QSize ySize(xSize.width(), tr.height() + 2 * steps); - QGLFramebufferObject *yBlur = acquireFBO(ySize); - - float yWidth = float(ySize.width()) / float(yBlur->width()); - float yHeight = float(ySize.height()) / float(yBlur->height()); - float ystep = radius / float(steps * xBlur->height()); - float yinc = steps / float(xBlur->height()); - { - yBlur->bind(); - - GLSaveViewport sv; GLSaveScissor ss; - glClearColor(0,0,0,0); - glDisable(GL_SCISSOR_TEST); - glViewport(0, 0, yBlur->width(), yBlur->height()); - glClear(GL_COLOR_BUFFER_BIT); - - float vert[] = { 0, yHeight, - yWidth, yHeight, - 0, 0, - yWidth, 0 }; - float texVert[] = { 0, -yinc, - xWidth, -yinc, - 0, xHeight + yinc, - xWidth, xHeight + yinc }; - - QMatrix4x4 trans; - trans.translate(-1, -1); - trans.scale(2, 2); - BlurTextureShader *shader = item->basicShaders()->blurTexture(); - shader->enable(); - shader->setTransform(trans); - if (steps > 1) { - shader->setStep(ystep * 2); - shader->setSteps(steps / 2); - } else { - shader->setStep(ystep); - shader->setSteps(steps); - } - shader->setMode(BlurTextureShader::Vertical); - - glBindTexture(GL_TEXTURE_2D, xBlur->texture()); - - shader->setAttributeArray(BlurTextureShader::Vertices, vert, 2); - shader->setAttributeArray(BlurTextureShader::TextureCoords, texVert, 2); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(BlurTextureShader::Vertices); - shader->disableAttributeArray(BlurTextureShader::TextureCoords); - yBlur->release(); - } - - glEnable(GL_BLEND); - - // Render display pass - { - glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - float vert[] = { -dispSteps, height + dispSteps, - width + dispSteps, height + dispSteps, - -dispSteps, -dispSteps, - width + dispSteps, -dispSteps }; - float texVert[] = { 0, 0, - yWidth, 0, - 0, yHeight, - yWidth, yHeight }; - SingleTextureShader *shader = item->basicShaders()->singleTexture(); - shader->enable(); - shader->setTransform(p.activeTransform); - - glBindTexture(GL_TEXTURE_2D, yBlur->texture()); - - shader->setAttributeArray(SingleTextureShader::Vertices, vert, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, texVert, 2); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(SingleTextureShader::Vertices); - shader->disableAttributeArray(SingleTextureShader::TextureCoords); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - } - - releaseFBO(yBlur); - releaseFBO(xBlur); - releaseFBO(fbo); -#else -#if 0 - if (d->radius <= 0) { - renderToScreen(); - return; - } - QSimpleCanvasItem *item = this->item(); - - QRect r = item->itemBoundingRect(); - - float scale = 0.5; - float scalePercent = scale / d->radius; - QGLFramebufferObject *fbo = renderToFBO(scalePercent); - if (!fbo) - return; - - QGLFramebufferObject *xfbo = acquireFBO(QSize(scale * r.width(), fbo->height())); - QGLFramebufferObject *yfbo = acquireFBO(QSize(scale * r.width(), scale * r.height())); - - - BlurTextureShader *shader = item->basicShaders()->blurTexture(); - shader->enable(); - shader->setTransform(QMatrix4x4()); - - // Render up - x - { - shader->setMode(BlurTextureShader::Horizontal); - shader->setStep(1. / float(xfbo->width())); - - GLSaveViewport vp; - xfbo->bind(); - glClearColor(0,0,0,0); - glViewport(0, 0, xfbo->width(), xfbo->height()); - glClear(GL_COLOR_BUFFER_BIT); - - float oWidth = -1. + 2. * float(r.width()) * scale / float(xfbo->width()); - float oHeight = -1. + 2. * float(r.height()) * scalePercent / float(xfbo->height()); - float vert[] = { - -1, -1, - oWidth, -1, - -1, oHeight, - - -1, oHeight, - oWidth, oHeight, - oWidth, -1 - }; - - float tWidth = r.width() * scalePercent / fbo->width(); - float tHeight = r.height() * scalePercent / fbo->height(); - float texVert[] = { - 0, 0, - tWidth, 0, - 0, tHeight, - - 0, tHeight, - tWidth, tHeight, - tWidth, 0 - }; - - glBindTexture(GL_TEXTURE_2D, fbo->texture()); - shader->setAttributeArray(BlurTextureShader::Vertices, vert, 2); - shader->setAttributeArray(BlurTextureShader::TextureCoords, texVert, 2); - - glDrawArrays(GL_TRIANGLES, 0, 6); - - xfbo->release(); - } - - // Render up - y - { - shader->setMode(BlurTextureShader::Vertical); - shader->setStep(1. / float(yfbo->height())); - - GLSaveViewport vp; - yfbo->bind(); - glClearColor(0,0,0,0); - glViewport(0, 0, yfbo->width(), yfbo->height()); - glClear(GL_COLOR_BUFFER_BIT); - - float oWidth = -1. + 2. * r.width() * scale / yfbo->width(); - float oHeight = -1. + 2. * r.height() * scale / yfbo->height(); - float vert[] = { - -1, -1, - oWidth, -1, - -1, oHeight, - - -1, oHeight, - oWidth, oHeight, - oWidth, -1 - }; - - float tWidth = r.width() * scale / xfbo->width(); - float tHeight = r.height() * scalePercent / xfbo->height(); - float texVert[] = { - 0, 0, - tWidth, 0, - 0, tHeight, - - 0, tHeight, - tWidth, tHeight, - tWidth, 0 - }; - - glBindTexture(GL_TEXTURE_2D, xfbo->texture()); - shader->setAttributeArray(BlurTextureShader::Vertices, vert, 2); - shader->setAttributeArray(BlurTextureShader::TextureCoords, texVert, 2); - - glDrawArrays(GL_TRIANGLES, 0, 6); - - yfbo->release(); - } - - shader->disableAttributeArray(BlurTextureShader::Vertices); - shader->disableAttributeArray(BlurTextureShader::TextureCoords); - - float width = r.width(); - float height = r.height(); - //paint to screen - { - float texWidth = r.width() * scale / float(yfbo->width()); - float texHeight = r.height() * scale / float(yfbo->height()); - - GLfloat vertices[] = { 0, height, - width, height, - 0, 0, - width, 0 }; - GLfloat texVertices[] = { 0, 0, - texWidth, 0, - 0, texHeight, - texWidth, texHeight }; - - glBindTexture(GL_TEXTURE_2D, yfbo->texture()); - - SingleTextureOpacityShader *shader = - item->basicShaders()->singleTextureOpacity(); - shader->enable(); - shader->setTransform(p.activeTransform); - shader->setOpacity(p.activeOpacity); - shader->setAttributeArray(SingleTextureVertexOpacityShader::Vertices, vertices, 2); - shader->setAttributeArray(SingleTextureVertexOpacityShader::TextureCoords, texVertices, 2); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::Vertices); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::TextureCoords); - } - - - releaseFBO(fbo); - releaseFBO(xfbo); - releaseFBO(yfbo); -#endif -#endif -#else - Q_UNUSED(p); -#endif - -} - -QML_DEFINE_TYPE(QFxBlurFilter,Blur) -QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxblurfilter.h b/src/declarative/fx/qfxblurfilter.h deleted file mode 100644 index 830663f..0000000 --- a/src/declarative/fx/qfxblurfilter.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFXBLURFILTER_H -#define QFXBLURFILTER_H - -#include <QtDeclarative/qsimplecanvasfilter.h> -#include <QtDeclarative/qml.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QFxBlurFilterPrivate; -class Q_DECLARATIVE_EXPORT QFxBlurFilter : public QSimpleCanvasFilter -{ - Q_OBJECT - Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) -public: - QFxBlurFilter(QObject *parent=0); - virtual ~QFxBlurFilter(); - - qreal radius() const; - void setRadius(qreal); - -Q_SIGNALS: - void radiusChanged(qreal); - -protected: - virtual QRectF itemBoundingRect(const QRectF &) const; - virtual void filterGL(QSimpleCanvasItem::GLPainter &p); - -private: - QFxBlurFilterPrivate *d; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QFxBlurFilter) - -QT_END_HEADER - -#endif // QFXBLURFILTER_H diff --git a/src/declarative/fx/qfxcomponentinstance.h b/src/declarative/fx/qfxcomponentinstance.h index f3bf6b3..940fb6d 100644 --- a/src/declarative/fx/qfxcomponentinstance.h +++ b/src/declarative/fx/qfxcomponentinstance.h @@ -78,7 +78,7 @@ protected: QFxComponentInstance(QFxComponentInstancePrivate &dd, QFxItem *parent); private: - Q_DECLARE_PRIVATE(QFxComponentInstance) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxComponentInstance) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp index a82385a..24f6d72 100644 --- a/src/declarative/fx/qfxflickable.cpp +++ b/src/declarative/fx/qfxflickable.cpp @@ -111,7 +111,7 @@ void QFxFlickablePrivate::init() QObject::connect(&_tl, SIGNAL(updated()), q, SLOT(ticked())); QObject::connect(&_tl, SIGNAL(completed()), q, SLOT(movementEnding())); q->setAcceptedMouseButtons(Qt::LeftButton); - q->setOptions(QSimpleCanvasItem::ChildMouseFilter | QSimpleCanvasItem::MouseEvents); + q->setOptions(QFxItem::ChildMouseFilter | QFxItem::MouseEvents); QObject::connect(_flick, SIGNAL(xChanged()), q, SIGNAL(positionChanged())); QObject::connect(_flick, SIGNAL(yChanged()), q, SIGNAL(positionChanged())); QObject::connect(&elasticX, SIGNAL(updated()), q, SLOT(ticked())); @@ -740,6 +740,7 @@ void QFxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) Q_D(QFxFlickable); d->handleMouseReleaseEvent(event); event->accept(); + ungrabMouse(); } qreal QFxFlickable::minYExtent() const @@ -1047,7 +1048,7 @@ bool QFxFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event) break; } grabber = static_cast<QFxItem*>(mouseGrabberItem()); - if (grabber && d->stealMouse && !grabber->keepMouseGrab()) + if (grabber && d->stealMouse && !grabber->keepMouseGrab() && grabber != this) grabMouse(); return d->stealMouse; diff --git a/src/declarative/fx/qfxflickable.h b/src/declarative/fx/qfxflickable.h index da38df8..a6c2a6c 100644 --- a/src/declarative/fx/qfxflickable.h +++ b/src/declarative/fx/qfxflickable.h @@ -184,7 +184,7 @@ protected: private: Q_DISABLE_COPY(QFxFlickable) - Q_DECLARE_PRIVATE(QFxFlickable) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxFlickable) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxflipable.cpp b/src/declarative/fx/qfxflipable.cpp index 7672858..6089d0a 100644 --- a/src/declarative/fx/qfxflipable.cpp +++ b/src/declarative/fx/qfxflipable.cpp @@ -221,22 +221,13 @@ void QFxFlipablePrivate::setBackTransform() p3 = axisRotation.transform().map(p3); axisRotation.setAngle(rotation); - QSimpleCanvas::Matrix mat; -#ifdef QFX_RENDER_OPENGL - mat.translate(back->width()/2,back->height()/2, 0); - if (back->width() && p1.x() >= p2.x()) - mat.rotate(180, 0, 1, 0); - if (back->height() && p2.y() >= p3.y()) - mat.rotate(180, 1, 0, 0); - mat.translate(-back->width()/2,-back->height()/2, 0); -#else + QTransform mat; mat.translate(back->width()/2,back->height()/2); if (back->width() && p1.x() >= p2.x()) mat.rotate(180, Qt::YAxis); if (back->height() && p2.y() >= p3.y()) mat.rotate(180, Qt::XAxis); mat.translate(-back->width()/2,-back->height()/2); -#endif back->setTransform(mat); } @@ -295,7 +286,7 @@ QFxFlipable::Side QFxFlipable::side() const //in some cases the user may want to specify a more complex transformation. //in that case, we still allow the generic use of transform. //(the logic here should be kept in sync with setBackTransform and setRotation) -void QFxFlipable::transformChanged(const QSimpleCanvas::Matrix &trans) +void QFxFlipable::transformChanged(const QTransform &trans) { Q_D(QFxFlipable); QPointF p1(0, 0); @@ -319,22 +310,13 @@ void QFxFlipable::transformChanged(const QSimpleCanvas::Matrix &trans) if (newSide != d->current) { d->current = newSide; if (d->current==Back) { - QSimpleCanvas::Matrix mat; -#ifdef QFX_RENDER_OPENGL - mat.translate(d->back->width()/2,d->back->height()/2, 0); - if (d->back->width() && p1.x() >= p2.x()) - mat.rotate(180, 0, 1, 0); - if (d->back->height() && p2.y() >= p3.y()) - mat.rotate(180, 1, 0, 0); - mat.translate(-d->back->width()/2,-d->back->height()/2, 0); -#else + QTransform mat; mat.translate(d->back->width()/2,d->back->height()/2); if (d->back->width() && p1.x() >= p2.x()) mat.rotate(180, Qt::YAxis); if (d->back->height() && p2.y() >= p3.y()) mat.rotate(180, Qt::XAxis); mat.translate(-d->back->width()/2,-d->back->height()/2); -#endif d->back->setTransform(mat); } if (d->front) diff --git a/src/declarative/fx/qfxflipable.h b/src/declarative/fx/qfxflipable.h index 06f8b93..5aa038d 100644 --- a/src/declarative/fx/qfxflipable.h +++ b/src/declarative/fx/qfxflipable.h @@ -44,9 +44,6 @@ #include <QtCore/QObject> #include <QtGui/QTransform> -#if defined(QFX_RENDER_OPENGL) -#include <QtGui/qmatrix4x4.h> -#endif #include <QtDeclarative/qfxitem.h> QT_BEGIN_HEADER @@ -87,7 +84,7 @@ public: Side side() const; protected: - virtual void transformChanged(const QSimpleCanvas::Matrix &); + virtual void transformChanged(const QTransform &); Q_SIGNALS: void sideChanged(); @@ -95,7 +92,7 @@ Q_SIGNALS: private: Q_PRIVATE_SLOT(d_func(), void _q_updateAxis()) Q_DISABLE_COPY(QFxFlipable) - Q_DECLARE_PRIVATE(QFxFlipable) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxFlipable) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxfocuspanel.cpp b/src/declarative/fx/qfxfocuspanel.cpp deleted file mode 100644 index 6da8564..0000000 --- a/src/declarative/fx/qfxfocuspanel.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfxfocuspanel.h" - - -QT_BEGIN_NAMESPACE -QML_DEFINE_TYPE(QFxFocusPanel,FocusPanel) - -/*! - \qmlclass FocusPanel - \brief The FocusPanel object explicitly creates a focus panel. - \inherits Item - - Focus panels assist in keyboard focus handling when building QML - applications. All the details are covered in the - \l {qmlfocus}{keyboard focus documentation}. -*/ - -/*! - \internal - \class QFxFocusPanel -*/ - -QFxFocusPanel::QFxFocusPanel(QFxItem *parent) : - QFxItem(parent) -{ - setOptions(IsFocusPanel); -} - -QFxFocusPanel::~QFxFocusPanel() -{ -} - -/*! - \qmlproperty bool FocusPanel::active - - Sets whether the object is the active focus panel. -*/ - -bool QFxFocusPanel::isActive() const -{ - QSimpleCanvas *canvas = QSimpleCanvasItem::canvas(); - if (canvas) - return canvas->activeFocusPanel() == this; - else - return false; -} - -void QFxFocusPanel::setActive(bool a) -{ - setActiveFocusPanel(a); -} - -void QFxFocusPanel::activePanelInEvent() -{ - QFxItem::activePanelInEvent(); - emit activeChanged(); -} - -void QFxFocusPanel::activePanelOutEvent() -{ - QFxItem::activePanelOutEvent(); - emit activeChanged(); -} -QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxfocuspanel.h b/src/declarative/fx/qfxfocuspanel.h deleted file mode 100644 index 623c9fb..0000000 --- a/src/declarative/fx/qfxfocuspanel.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFXFOCUSPANEL_H -#define QFXFOCUSPANEL_H - -#include <QtDeclarative/qfxitem.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QFxFocusPanel : public QFxItem -{ - Q_OBJECT - Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) -public: - QFxFocusPanel(QFxItem *parent=0); - virtual ~QFxFocusPanel(); - - bool isActive() const; - void setActive(bool); - -Q_SIGNALS: - void activeChanged(); - -protected: - virtual void activePanelInEvent(); - virtual void activePanelOutEvent(); - -private: - Q_DISABLE_COPY(QFxFocusPanel) -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QFxFocusPanel) - -QT_END_HEADER - -#endif // QFXFOCUSPANEL_H diff --git a/src/declarative/fx/qfxgridview.h b/src/declarative/fx/qfxgridview.h index b6d585e..8f443e1 100644 --- a/src/declarative/fx/qfxgridview.h +++ b/src/declarative/fx/qfxgridview.h @@ -54,7 +54,7 @@ class QFxGridViewPrivate; class Q_DECLARATIVE_EXPORT QFxGridView : public QFxFlickable { Q_OBJECT - Q_DECLARE_PRIVATE(QFxGridView) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxGridView) Q_PROPERTY(QVariant model READ model WRITE setModel) Q_CLASSINFO("DefaultProperty", "delegate") diff --git a/src/declarative/fx/qfxhighlightfilter.cpp b/src/declarative/fx/qfxhighlightfilter.cpp deleted file mode 100644 index 78a91af..0000000 --- a/src/declarative/fx/qfxhighlightfilter.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfxhighlightfilter.h" -#include <qfxpixmap.h> -#include <qmlcontext.h> - -#if defined(QFX_RENDER_OPENGL2) -#include <gltexture.h> -#include <glbasicshaders.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <glsave.h> -#endif - -QT_BEGIN_NAMESPACE - -class QFxHighlightFilterPrivate -{ -public: - QFxHighlightFilterPrivate() - : xOffset(0), yOffset(0), tiled(false) {} - - QUrl url; - int xOffset; - int yOffset; - bool tiled; -#if defined(QFX_RENDER_OPENGL2) - GLTexture tex; -#endif -}; - -/*! - \qmlclass Highlight - \brief The Highlight filter adds a highlight to an item. - \inherits Filter - - \qml -Text { - id: highlighttext - color: "red" - font.size: 32 - text: "Highlight" - filter: Highlight { - source: "pics/highlight.png" - xOffset: NumberAnimation { - running: true - repeat: true - from: 320 - to: -320 - duration: 2000 - } - } -} - \endqml - \image highlight.gif - - Highlighting is only supported when Qt Declarative is compiled for OpenGL ES 2.0. - Otherwise the Highlight filter has no effect. -*/ - -/*! - \internal - \class QFxHighlightFilter - \ingroup group_effects - \brief The QFxHightlightFilter class allows you to add a highlight to an item. -*/ - -QFxHighlightFilter::QFxHighlightFilter(QObject *parent) -: QSimpleCanvasFilter(parent), d(new QFxHighlightFilterPrivate) -{ -#if defined(QFX_RENDER_OPENGL2) - d->tex.setHorizontalWrap(GLTexture::ClampToEdge); - d->tex.setVerticalWrap(GLTexture::ClampToEdge); -#endif -} - -QFxHighlightFilter::~QFxHighlightFilter() -{ - if (!d->url.isEmpty()) - QFxPixmap::cancelGet(d->url, this); - delete d; - d = 0; -} - -/*! - \qmlproperty string Highlight::source - This property holds the URL of the image to be used as the highlight. -*/ - -/*! - \property QFxHighlightFilter::source - \brief the URL of the image to be used as the highlight. -*/ -QUrl QFxHighlightFilter::source() const -{ - return d->url; -} - -void QFxHighlightFilter::imageLoaded() -{ - QPixmap img = QFxPixmap(d->url); -#if defined(QFX_RENDER_OPENGL2) - if (!img.isNull()) - d->tex.setImage(img.toImage()); -#endif - emit sourceChanged(d->url); - update(); -} - -void QFxHighlightFilter::setSource(const QUrl &f) -{ - if (d->url == f) - return; - if (!d->url.isEmpty()) - QFxPixmap::cancelGet(d->url, this); - Q_ASSERT(!f.isRelative()); - d->url = f; -#if defined(QFX_RENDER_OPENGL2) - d->tex.clear(); -#endif - if (!f.isEmpty()) - QFxPixmap::get(qmlEngine(this), d->url, this, SLOT(imageLoaded())); - else - emit sourceChanged(d->url); -} - -/*! - \qmlproperty bool Highlight::tiled - This property holds whether or not the highlight should be tiled. -*/ - -/*! - \property QFxHighlightFilter::tiled - \brief whether or not the highlight should be tiled. -*/ -bool QFxHighlightFilter::tiled() const -{ - return d->tiled; -} - -void QFxHighlightFilter::setTiled(bool t) -{ - if (t == d->tiled) - return; - - d->tiled = t; - -#if defined(QFX_RENDER_OPENGL2) - if (d->tiled) { - d->tex.setHorizontalWrap(GLTexture::ClampToEdge); - d->tex.setVerticalWrap(GLTexture::ClampToEdge); - } else { - d->tex.setHorizontalWrap(GLTexture::Repeat); - d->tex.setVerticalWrap(GLTexture::Repeat); - } -#endif - - emit tiledChanged(d->tiled); -} - -/*! - \qmlproperty int Highlight::xOffset - \qmlproperty int Highlight::yOffset - These properties hold the position of the highlight, relative to the item. -*/ - -/*! - \property QFxHighlightFilter::xOffset - \brief the x position of the highlight, relative to the item. -*/ -int QFxHighlightFilter::xOffset() const -{ - return d->xOffset; -} - -void QFxHighlightFilter::setXOffset(int x) -{ - if (x == d->xOffset) - return; - - d->xOffset = x; - emit offsetChanged(d->xOffset, d->yOffset); -#if defined(QFX_RENDER_OPENGL2) - update(); -#endif -} - -/*! - \property QFxHighlightFilter::yOffset - \brief the y position of the highlight, relative to the item. -*/ -int QFxHighlightFilter::yOffset() const -{ - return d->yOffset; -} - -void QFxHighlightFilter::setYOffset(int y) -{ - if (y == d->yOffset) - return; - - d->yOffset = y; - emit offsetChanged(d->xOffset, d->yOffset); -#if defined(QFX_RENDER_OPENGL2) - update(); -#endif -} - -void QFxHighlightFilter::filterGL(QSimpleCanvasItem::GLPainter &p) -{ -#if defined(QFX_RENDER_OPENGL2) - if (d->tex.isNull()) { - renderToScreen(); - } else { - QSimpleCanvasItem *item = this->item(); - - QRect r = item->itemBoundingRect(); - - QGLFramebufferObject *fbo = renderToFBO(); - - float width = r.width(); - float height = r.height(); - - float texWidth = width / float(fbo->width()); - float texHeight = height / float(fbo->height()); - - GLfloat vert[] = { 0, height, - width, height, - 0, 0, - width, 0 }; - GLfloat texVert[] = { 0, 0, - texWidth, 0, - 0, texHeight, - texWidth, texHeight }; - float texXOffset = 0; - float texYOffset = 0; - - if (xOffset()) - texXOffset = float(xOffset()) / float(d->tex.width()); - if (yOffset()) - texYOffset = float(yOffset()) / float(d->tex.height()); - - GLfloat addTexVert[] = { texXOffset, texYOffset, - 1 + texXOffset, texYOffset, - texXOffset, 1 + texYOffset, - 1 + texXOffset, 1 + texYOffset }; - - glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, fbo->texture()); - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, d->tex.texture()); - - DualTextureAddShader *shader = item->basicShaders()->dualTextureAdd(); - shader->enable(); - shader->setTransform(p.activeTransform); - shader->setOpacity(p.activeOpacity); - - shader->setAttributeArray(DualTextureAddShader::Vertices, vert, 2); - shader->setAttributeArray(DualTextureAddShader::TextureCoords, texVert, 2); - shader->setAttributeArray(DualTextureAddShader::AddTextureCoords, addTexVert, 2); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - shader->disableAttributeArray(DualTextureAddShader::Vertices); - shader->disableAttributeArray(DualTextureAddShader::TextureCoords); - shader->disableAttributeArray(DualTextureAddShader::AddTextureCoords); - - glActiveTexture(GL_TEXTURE0); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - releaseFBO(fbo); - } -#else - Q_UNUSED(p); -#endif -} - -QML_DEFINE_TYPE(QFxHighlightFilter,Highlight) - -QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxhighlightfilter.h b/src/declarative/fx/qfxhighlightfilter.h deleted file mode 100644 index 56509a3..0000000 --- a/src/declarative/fx/qfxhighlightfilter.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFXHIGHLIGHTFILTER_H -#define QFXHIGHLIGHTFILTER_H - -#include <QtDeclarative/qsimplecanvasfilter.h> -#include <QtDeclarative/qml.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QFxHighlightFilterPrivate; -class Q_DECLARATIVE_EXPORT QFxHighlightFilter : public QSimpleCanvasFilter -{ - Q_OBJECT - - Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) - Q_PROPERTY(bool tiled READ tiled WRITE setTiled NOTIFY tiledChanged) - Q_PROPERTY(int xOffset READ xOffset WRITE setXOffset NOTIFY offsetChanged) - Q_PROPERTY(int yOffset READ yOffset WRITE setYOffset NOTIFY offsetChanged) -public: - QFxHighlightFilter(QObject *parent=0); - virtual ~QFxHighlightFilter(); - - QUrl source() const; - void setSource(const QUrl &); - - bool tiled() const; - void setTiled(bool); - - int xOffset() const; - void setXOffset(int); - int yOffset() const; - void setYOffset(int); - -Q_SIGNALS: - void sourceChanged(const QUrl &); - void offsetChanged(int x, int y); - void tiledChanged(bool); - -private Q_SLOTS: - void imageLoaded(); - -protected: - virtual void filterGL(QSimpleCanvasItem::GLPainter &p); - -private: - QFxHighlightFilterPrivate *d; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QFxHighlightFilter) - -QT_END_HEADER - -#endif // QFXHIGHLIGHTFILTER_H diff --git a/src/declarative/fx/qfximage.cpp b/src/declarative/fx/qfximage.cpp index 539ad02..148c269 100644 --- a/src/declarative/fx/qfximage.cpp +++ b/src/declarative/fx/qfximage.cpp @@ -42,9 +42,6 @@ #include "qfximage.h" #include "qfximage_p.h" #include <private/qfxperf_p.h> -#if defined(QFX_RENDER_OPENGL) -#include <glsave.h> -#endif #include <QNetworkRequest> #include <QNetworkReply> #include <QFile> @@ -131,12 +128,6 @@ QFxImage::~QFxImage() QFxPixmap::cancelGet(d->url, this); if (!d->sciurl.isEmpty()) QFxPixmap::cancelGet(d->sciurl, this); -#if defined(QFX_RENDER_OPENGL) - if (d->tex) { - d->tex->release(); - d->tex = 0; - } -#endif } /*! @@ -164,13 +155,6 @@ void QFxImage::setPixmap(const QPixmap &pix) setImplicitWidth(d->pix.width()); setImplicitHeight(d->pix.height()); -#if defined(QFX_RENDER_OPENGL) - d->texDirty = true; - if (d->tex) { - d->tex->release(); - d->tex = 0; - } -#endif update(); } @@ -321,15 +305,6 @@ void QFxImage::setSmoothTransform(bool s) update(); } -void QFxImage::dump(int depth) -{ - Q_D(QFxImage); - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << "URL:" << d->url; - QFxItem::dump(depth); -} - -#if defined(QFX_RENDER_QPAINTER) void QFxImage::paintContents(QPainter &p) { Q_D(QFxImage); @@ -434,333 +409,6 @@ void QFxImage::paintContents(QPainter &p) p.setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth); } } -#elif defined(QFX_RENDER_OPENGL) -uint QFxImage::glSimpleItemData(float *vertices, float *texVertices, - GLTexture **texture, uint count) -{ - Q_D(QFxImage); - - if (d->pix.isNull() || (d->scaleGrid && !d->scaleGrid->isNull())) - return 0; - - if (count < 8) - return 8; - - d->checkDirty(); - - float widthV = width(); - float heightV = height(); - - vertices[0] = 0; vertices[1] = heightV; - vertices[2] = widthV; vertices[3] = heightV; - vertices[4] = 0; vertices[5] = 0; - vertices[6] = widthV; vertices[7] = 0; - - *texture = d->tex; - - if (d->tiled) { - float tileWidth = widthV / d->pix.width(); - float tileHeight = heightV / d->pix.height(); - texVertices[0] = 0; texVertices[1] = 0; - texVertices[2] = tileWidth; texVertices[3] = 0; - texVertices[4] = 0; texVertices[5] = tileHeight; - texVertices[6] = tileWidth; texVertices[7] = tileHeight; - } else { - texVertices[0] = 0; texVertices[1] = 0; - texVertices[2] = d->tex->glWidth(); texVertices[3] = 0; - texVertices[4] = 0; texVertices[5] = d->tex->glHeight(); - texVertices[6] = d->tex->glWidth(); texVertices[7] = d->tex->glHeight(); - } - - return 8; -} - -void QFxImagePrivate::checkDirty() -{ - Q_Q(QFxImage); - if (texDirty && !pix.isNull()) - tex = q->cachedTexture(url.toString(), pix); - texDirty = false; -} - -#if defined(QFX_RENDER_OPENGL2) -void QFxImage::paintGLContents(GLPainter &p) -{ - Q_D(QFxImage); - if (d->pix.isNull()) - return; - - QGLShaderProgram *shader = p.useTextureShader(); - - bool restoreBlend = false; - if (p.blendEnabled && isOpaque() && p.activeOpacity == 1) { - glDisable(GL_BLEND); - restoreBlend = true; - } - - d->checkDirty(); - - if (d->tiled || (!d->scaleGrid || d->scaleGrid->isNull())) { - - if (!d->tiled) { - - float widthV = width(); - float heightV = height(); - float glWidth = d->tex->glWidth(); - float glHeight = d->tex->glHeight(); - - float deltaX = 0.5 / qreal(d->tex->glSize().width()); - float deltaY = 0.5 / qreal(d->tex->glSize().height()); - glWidth -= deltaX; - glHeight -= deltaY; - - - float vert[] = { - 0, heightV, - widthV, heightV, - 0, 0, - - widthV, heightV, - 0, 0, - widthV, 0 }; - - float tex[] = { - deltaX, deltaY, - glWidth, deltaY, - deltaX, glHeight, - - glWidth, deltaY, - deltaX, glHeight, - glWidth, glHeight - }; - - shader->setAttributeArray(SingleTextureShader::Vertices, vert, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, tex, 2); - glBindTexture(GL_TEXTURE_2D, d->tex->texture()); - glDrawArrays(GL_TRIANGLES, 0, 6); - - } else { - - GLfloat vertices[8]; - GLfloat texVertices[8]; - GLTexture *tex = 0; - - QFxImage::glSimpleItemData(vertices, texVertices, &tex, 8); - - shader->setAttributeArray(SingleTextureShader::Vertices, vertices, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, texVertices, 2); - - glBindTexture(GL_TEXTURE_2D, tex->texture()); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - - } else { - - float imgWidth = d->pix.width(); - float imgHeight = d->pix.height(); - if (!imgWidth || !imgHeight) { - if (restoreBlend) - glEnable(GL_BLEND); - return; - } - - float widthV = width(); - float heightV = height(); - float glWidth = d->tex->glWidth(); - float glHeight = d->tex->glHeight(); - float deltaX = 0.5 / qreal(d->tex->glSize().width()); - float deltaY = 0.5 / qreal(d->tex->glSize().height()); - glHeight -= deltaY; - glWidth -= deltaX; - - float texleft = deltaX; - float texright = glWidth; - float textop = glHeight; - float texbottom = deltaY; - float imgleft = 0; - float imgright = widthV; - float imgtop = 0; - float imgbottom = heightV; - - const int sgl = d->scaleGrid->left(); - const int sgr = d->scaleGrid->right(); - const int sgt = d->scaleGrid->top(); - const int sgb = d->scaleGrid->bottom(); - - if (sgl) { - texleft = deltaX + d->tex->glWidth() * float(sgl) / imgWidth; - imgleft = sgl; - } - if (sgr) { - texright = d->tex->glWidth() - float(sgr) / imgWidth - deltaX; - imgright = widthV - sgr; - } - if (sgt) { - textop = d->tex->glHeight() - float(sgb) / imgHeight - deltaY; - imgtop = sgt; - } - if (sgb) { - texbottom = deltaY + d->tex->glHeight() * float(sgt) / imgHeight; - imgbottom = heightV - sgb; - } - - float vert1[] = { 0, 0, - 0, imgtop, - imgleft, 0, - - 0, imgtop, - imgleft, 0, - imgleft, imgtop, - - imgleft, 0, - imgleft, imgtop, - imgright, 0, - - imgleft, imgtop, - imgright, 0, - imgright, imgtop, - - imgright, 0, - imgright, imgtop, - widthV, 0, - - imgright, imgtop, - widthV, 0, - widthV, imgtop, - - 0, imgtop, - 0, imgbottom, - imgleft, imgtop, - - 0, imgbottom, - imgleft, imgtop, - imgleft, imgbottom, - - imgleft, imgtop, - imgleft, imgbottom, - imgright, imgtop, - - imgleft, imgbottom, - imgright, imgtop, - imgright, imgbottom, - - imgright, imgtop, - imgright, imgbottom, - widthV, imgtop, - - imgright, imgbottom, - widthV, imgtop, - widthV, imgbottom, - - 0, imgbottom, - 0, heightV, - imgleft, imgbottom, - - 0, heightV, - imgleft, imgbottom, - imgleft, heightV, - - imgleft, imgbottom, - imgleft, heightV, - imgright, imgbottom, - - imgleft, heightV, - imgright, imgbottom, - imgright, heightV, - - imgright, imgbottom, - imgright, heightV, - widthV, imgbottom, - - imgright, heightV, - widthV, imgbottom, - widthV, heightV }; - - float tex1[] = { deltaX, glHeight, - deltaX, textop, - texleft, glHeight, - - deltaX, textop, - texleft, glHeight, - texleft, textop, - - texleft, glHeight, - texleft, textop, - texright, glHeight, - - texleft, textop, - texright, glHeight, - texright, textop, - - texright, glHeight, - texright, textop, - glWidth, glHeight, - - texright, textop, - glWidth, glHeight, - glWidth, textop, - - deltaX, textop, - deltaX, texbottom, - texleft, textop, - - deltaX, texbottom, - texleft, textop, - texleft, texbottom, - - texleft, textop, - texleft, texbottom, - texright, textop, - - texleft, texbottom, - texright, textop, - texright, texbottom, - - texright, textop, - texright, texbottom, - glWidth, textop, - - texright, texbottom, - glWidth, textop, - glWidth, texbottom, - - deltaX, texbottom, - deltaX, deltaY, - texleft, texbottom, - - deltaX, deltaY, - texleft, texbottom, - texleft, deltaY, - - texleft, texbottom, - texleft, deltaY, - texright, texbottom, - - texleft, deltaY, - texright, texbottom, - texright, deltaY, - - texright, texbottom, - texright, deltaY, - glWidth, texbottom, - - texright, deltaY, - glWidth, texbottom, - glWidth, deltaY }; - - glBindTexture(GL_TEXTURE_2D, d->tex->texture()); - - shader->setAttributeArray(SingleTextureShader::Vertices, vert1, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, tex1, 2); - glDrawArrays(GL_TRIANGLES, 0, 54); - } - - if (restoreBlend) - glEnable(GL_BLEND); -} -#endif - -#endif QString QFxImage::propertyInfo() const { @@ -870,13 +518,6 @@ void QFxImage::setSource(const QUrl &url) d->progress = 1.0; setImplicitWidth(0); setImplicitHeight(0); -#if defined(QFX_RENDER_OPENGL) - d->texDirty = true; - if (d->tex) { - d->tex->release(); - d->tex = 0; - } -#endif emit statusChanged(d->status); emit sourceChanged(d->url); emit progressChanged(1.0); @@ -934,13 +575,6 @@ void QFxImage::requestFinished() if (d->status == Loading) d->status = Idle; d->progress = 1.0; -#if defined(QFX_RENDER_OPENGL) - d->texDirty = true; - if (d->tex) { - d->tex->release(); - d->tex = 0; - } -#endif emit statusChanged(d->status); emit sourceChanged(d->url); emit progressChanged(1.0); diff --git a/src/declarative/fx/qfximage.h b/src/declarative/fx/qfximage.h index 3071a9e..925a520 100644 --- a/src/declarative/fx/qfximage.h +++ b/src/declarative/fx/qfximage.h @@ -91,15 +91,8 @@ public: QUrl source() const; virtual void setSource(const QUrl &url); - virtual void dump(int depth); virtual QString propertyInfo() const; -#if defined(QFX_RENDER_QPAINTER) void paintContents(QPainter &painter); -#elif defined(QFX_RENDER_OPENGL) - void paintGLContents(GLPainter &); - uint glSimpleItemData(float *vertices, float *texVertices, - GLTexture **texture, uint count); -#endif Q_SIGNALS: void sourceChanged(const QUrl &); @@ -117,7 +110,7 @@ private Q_SLOTS: private: Q_DISABLE_COPY(QFxImage) - Q_DECLARE_PRIVATE(QFxImage) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxImage) void setGridScaledImage(const QFxGridScaledImage& sci); }; diff --git a/src/declarative/fx/qfximage_p.h b/src/declarative/fx/qfximage_p.h index 1785abb..e4a3a90 100644 --- a/src/declarative/fx/qfximage_p.h +++ b/src/declarative/fx/qfximage_p.h @@ -55,10 +55,6 @@ #include "qfxitem_p.h" -#if defined(QFX_RENDER_OPENGL) -#include "gltexture.h" -#endif - QT_BEGIN_NAMESPACE class QSvgRenderer; @@ -73,9 +69,6 @@ class QFxImagePrivate : public QFxItemPrivate public: QFxImagePrivate() : scaleGrid(0), tiled(false), smooth(false), opaque(false), -#if defined(QFX_RENDER_OPENGL) - texDirty(true), tex(0), -#endif status(QFxImage::Idle), sciReply(0), progress(0.0) { } @@ -99,11 +92,6 @@ public: bool tiled : 1; bool smooth : 1; bool opaque : 1; -#if defined(QFX_RENDER_OPENGL) - bool texDirty : 1; - void checkDirty(); - QSimpleCanvasItem::CachedTexture *tex; -#endif QFxImage::Status status; QUrl url; diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index bd4def4..3386faf 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -62,7 +62,6 @@ #include "qfxitem_p.h" #include "qfxitem.h" #include "qfxevents_p.h" -#include <qsimplecanvasfilter.h> #include <qmlcomponent.h> QT_BEGIN_NAMESPACE @@ -73,7 +72,6 @@ QT_BEGIN_NAMESPACE QML_DEFINE_NOCREATE_TYPE(QFxContents) QML_DEFINE_TYPE(QFxItem,Item) -QML_DEFINE_NOCREATE_TYPE(QSimpleCanvasFilter) /*! \group group_animation @@ -162,9 +160,9 @@ void QFxContents::calcHeight() qreal top = FLT_MAX; qreal bottom = 0; - const QList<QSimpleCanvasItem *> &children = m_item->QSimpleCanvasItem::children(); + QList<QGraphicsItem *> children = m_item->childItems(); for (int i = 0; i < children.count(); ++i) { - const QSimpleCanvasItem *child = children.at(i); + QFxItem *child = qobject_cast<QFxItem *>(children.at(i)); qreal y = child->y(); if (y + child->height() > bottom) bottom = y + child->height(); @@ -185,10 +183,10 @@ void QFxContents::calcWidth() qreal left = FLT_MAX; qreal right = 0; - const QList<QSimpleCanvasItem *> &children = m_item->QSimpleCanvasItem::children(); + QList<QGraphicsItem *> children = m_item->childItems(); for (int i = 0; i < children.count(); ++i) { - const QSimpleCanvasItem *child = children.at(i); - qreal x = int(child->x()); + QFxItem *child = qobject_cast<QFxItem *>(children.at(i)); + qreal x = child->x(); if (x + child->width() > right) right = x + child->width(); if (x < left) @@ -204,9 +202,9 @@ void QFxContents::setItem(QFxItem *item) { m_item = item; - const QList<QSimpleCanvasItem *> &children = m_item->QSimpleCanvasItem::children(); + QList<QGraphicsItem *> children = m_item->childItems(); for (int i = 0; i < children.count(); ++i) { - const QSimpleCanvasItem *child = children.at(i); + QFxItem *child = qobject_cast<QFxItem *>(children.at(i)); connect(child, SIGNAL(heightChanged()), this, SLOT(calcHeight())); connect(child, SIGNAL(yChanged()), this, SLOT(calcHeight())); connect(child, SIGNAL(widthChanged()), this, SLOT(calcWidth())); @@ -260,11 +258,6 @@ void QFxContents::setItem(QFxItem *item) */ /*! - \property QFxItem::activeFocus - This property indicates whether the item has the active focus. - */ - -/*! \fn void QFxItem::activeFocusChanged() This signal is emitted when this item gains active focus. @@ -384,7 +377,7 @@ void QFxContents::setItem(QFxItem *item) This signal is emitted when the item's focus state changes. - \sa QSimpleCanvasItem::setFocus() + \sa QFxItem::setFocus() */ /*! @@ -393,7 +386,7 @@ void QFxContents::setItem(QFxItem *item) Constructs a QFxItem with the given \a parent. */ QFxItem::QFxItem(QFxItem* parent) - : QSimpleCanvasItem(*(new QFxItemPrivate), parent) + : QGraphicsObject(*(new QFxItemPrivate), parent, 0) { Q_D(QFxItem); d->init(parent); @@ -402,7 +395,7 @@ QFxItem::QFxItem(QFxItem* parent) /*! \internal */ QFxItem::QFxItem(QFxItemPrivate &dd, QFxItem *parent) - : QSimpleCanvasItem(dd, parent) + : QGraphicsObject(dd, parent, 0) { Q_D(QFxItem); d->init(parent); @@ -535,7 +528,12 @@ void QFxItem::moveToParent(QFxItem *parent) */ QFxItem *QFxItem::itemParent() const { - return qobject_cast<QFxItem *>(QObject::parent()); + return qobject_cast<QFxItem *>(QGraphicsItem::parentItem()); +} + +QFxItem *QFxItem::parentItem() const +{ + return itemParent(); } /*! @@ -699,7 +697,7 @@ int QFxItemPrivate::children_count() const void QFxItemPrivate::children_append(QFxItem *i) { Q_Q(QFxItem); - i->setParent(q); + i->setParentItem(q); } void QFxItemPrivate::children_insert(int, QFxItem *) @@ -787,6 +785,16 @@ QFxContents *QFxItem::contents() return d->_contents; } +bool QFxItem::clip() const +{ + return flags() & ItemClipsChildrenToShape; +} + +void QFxItem::setClip(bool c) +{ + setFlag(ItemClipsChildrenToShape, c); +} + /*! \internal \property QFxItem::qmlItem @@ -1091,52 +1099,6 @@ void QFxItem::geometryChanged(const QRectF &newGeometry, } } -/*! - \qmlproperty bool Item::flipVertically - \qmlproperty bool Item::flipHorizontally - - When set, the item will be displayed flipped horizontally or vertically - about its center. - */ - -/*! - \property QFxItem::flipVertically - - When set, the item will be displayed flipped horizontally or vertically - about its center. - */ -bool QFxItem::flipVertically() const -{ - return flip() & VerticalFlip; -} - -void QFxItem::setFlipVertically(bool v) -{ - if (v) - setFlip((QSimpleCanvasItem::Flip)(flip() | VerticalFlip)); - else - setFlip((QSimpleCanvasItem::Flip)(flip() & ~VerticalFlip)); -} - -/*! - \property QFxItem::flipHorizontally - - When set, the item will be displayed flipped horizontally or vertically - about its center. - */ -bool QFxItem::flipHorizontally() const -{ - return flip() & HorizontalFlip; -} - -void QFxItem::setFlipHorizontally(bool v) -{ - if (v) - setFlip((QSimpleCanvasItem::Flip)(flip() | HorizontalFlip)); - else - setFlip((QSimpleCanvasItem::Flip)(flip() & ~HorizontalFlip)); -} - /*! \fn void QFxItem::keyPress(QFxKeyEvent *event) This signal is emitted by keyPressEvent() for the \a event. */ @@ -1503,19 +1465,7 @@ void QFxItem::setRotation(qreal rotation) if (d->_rotation == rotation) return; d->_rotation = rotation; -#if defined(QFX_RENDER_OPENGL) - QMatrix4x4 trans; - QPointF to = transformOriginPoint(); - trans.translate(to.x(), to.y()); - trans.rotate(d->_rotation, 0, 0, 1); - trans.translate(-to.x(), -to.y()); -#else - QPointF to = d->transformOrigin(); - QTransform trans = QTransform::fromTranslate(to.x(), to.y()); - trans.rotate(d->_rotation); - trans.translate(-to.x(), -to.y()); -#endif - setTransform(trans); + setTransform(d->transform); emit rotationChanged(); } @@ -1569,18 +1519,6 @@ void QFxItem::setRotation(qreal rotation) Scaling is from the item's transformOrigin. */ -qreal QFxItem::scale() const -{ - return QSimpleCanvasItem::scale(); -} - -void QFxItem::setScale(qreal s) -{ - if (QSimpleCanvasItem::scale() == s) return; - QSimpleCanvasItem::setScale(s); - emit scaleChanged(); - update(); -} /*! \qmlproperty real Item::opacity @@ -1638,19 +1576,12 @@ void QFxItem::setScale(qreal s) also applied individually to child items. */ -qreal QFxItem::opacity() const -{ - return QSimpleCanvasItem::visible(); -} - void QFxItem::setOpacity(qreal v) { - if (v == QSimpleCanvasItem::visible()) + if (v == opacity()) return; - if (v < 0) v = 0; - else if (v > 1) v = 1; - QSimpleCanvasItem::setVisible(v); + QGraphicsItem::setOpacity(v); emit opacityChanged(); } @@ -1909,16 +1840,6 @@ QList<QFxTransform *> *QFxItem::transform() } /*! - \property QFxItem::focus - This property holds the item's focus state. -*/ - -/*! - \property QFxItem::focusable - This property holds whether the item has focus state. -*/ - -/*! Returns true if the item is visible; otherwise returns false. An item is considered visible if its opacity is not 0. @@ -1958,14 +1879,6 @@ void QFxItem::setVisible(bool visible) /*! \internal */ -void QFxItem::dump(int depth) -{ - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << metaObject()->className() << "(" << (void *)static_cast<QFxItem*>(this) << ", " << (void *)static_cast<QSimpleCanvasItem*>(this) << "):" << x() << y() << width() << height() << (void *) itemParent(); -} - -/*! \internal -*/ QString QFxItem::propertyInfo() const { return QString(); @@ -2045,27 +1958,13 @@ void QFxItem::componentComplete() updateTransform(); } -/*! \internal -*/ -void QFxItem::parentChanged(QSimpleCanvasItem *, QSimpleCanvasItem *) -{ - emit parentChanged(); -} - -/*! \internal -*/ -void QFxItem::reparentItems() -{ - qFatal("EEK"); -} - /*! \internal */ void QFxItem::updateTransform() { Q_D(QFxItem); - QSimpleCanvas::Matrix trans; + QTransform trans; for (int ii = d->_transform.count() - 1; ii >= 0; --ii) { QFxTransform *a = d->_transform.at(ii); if (!a->isIdentity()) @@ -2079,7 +1978,7 @@ void QFxItem::updateTransform() /*! \internal */ -void QFxItem::transformChanged(const QSimpleCanvas::Matrix &) +void QFxItem::transformChanged(const QTransform &) { } @@ -2115,4 +2014,546 @@ QFxItemPrivate::AnchorLines::AnchorLines(QFxItem *q) baseline.anchorLine = QFxAnchorLine::Baseline; } +QPointF QFxItemPrivate::transformOrigin() const +{ + Q_Q(const QFxItem); + + QRectF br = q->boundingRect(); + + switch(origin) { + default: + case QFxItem::TopLeft: + return QPointF(0, 0); + case QFxItem::TopCenter: + return QPointF(br.width() / 2., 0); + case QFxItem::TopRight: + return QPointF(br.width(), 0); + case QFxItem::MiddleLeft: + return QPointF(0, br.height() / 2.); + case QFxItem::Center: + return QPointF(br.width() / 2., br.height() / 2.); + case QFxItem::MiddleRight: + return QPointF(br.width(), br.height() / 2.); + case QFxItem::BottomLeft: + return QPointF(0, br.height()); + case QFxItem::BottomCenter: + return QPointF(br.width() / 2., br.height()); + case QFxItem::BottomRight: + return QPointF(br.width(), br.height()); + } +} + +QFxItem::Options QFxItem::options() const +{ + Q_D(const QFxItem); + return (QFxItem::Options)d->options; +} + +bool QFxItem::mouseFilter(QGraphicsSceneMouseEvent *) +{ + return false; +} + +bool QFxItem::sceneEvent(QEvent *event) +{ + bool rv = QGraphicsItem::sceneEvent(event); + if (event->type() == QEvent::UngrabMouse) + mouseUngrabEvent(); + return rv; +} + +QVariant QFxItem::itemChange(GraphicsItemChange change, + const QVariant &value) +{ + Q_D(QFxItem); + if (change == ItemSceneHasChanged) { + if (options() & QFxItem::MouseFilter) + d->gvRemoveMouseFilter(); + + d->canvas = qvariant_cast<QGraphicsScene *>(value); + + if (options() & QFxItem::MouseFilter) + d->gvAddMouseFilter(); + + if (d->canvas && d->isFocusItemForArea) + d->canvas->setFocusItem(this); + } else if (change == ItemChildAddedChange || + change == ItemChildRemovedChange) { + childrenChanged(); + } + + return QGraphicsItem::itemChange(change, value); +} + + +void QFxItem::mouseUngrabEvent() +{ +} + +void QFxItem::childrenChanged() +{ +} + +void QFxItem::setPaintMargin(qreal margin) +{ + Q_D(QFxItem); + if (margin < d->paintmargin) + update(); // schedule repaint of old boundingRect + d->paintmargin = margin; +} + +QRectF QFxItem::boundingRect() const +{ + Q_D(const QFxItem); + return QRectF(-d->paintmargin, -d->paintmargin, d->width+d->paintmargin*2, d->height+d->paintmargin*2); +} + +void QFxItem::paintContents(QPainter &) +{ +} + +void QFxItem::parentChanged(QFxItem *, QFxItem *) +{ + emit parentChanged(); +} + +/*! + Returns the item's (0, 0) point relative to its parent. + */ +QPointF QFxItem::pos() const +{ + return QPointF(x(),y()); +} + +/*! + Returns the item's (0, 0) point mapped to scene coordinates. + */ +QPointF QFxItem::scenePos() const +{ + return mapToScene(QPointF(0, 0)); +} + +/*! + \enum QFxItem::TransformOrigin + + Controls the point about which simple transforms like scale apply. + + \value TopLeft The top-left corner of the item. + \value TopCenter The center point of the top of the item. + \value TopRight The top-right corner of the item. + \value MiddleLeft The left most point of the vertical middle. + \value Center The center of the item. + \value MiddleRight The right most point of the vertical middle. + \value BottomLeft The bottom-left corner of the item. + \value BottomCenter The center point of the bottom of the item. + \value BottomRight The bottom-right corner of the item. +*/ + +/*! + Returns the current transform origin. +*/ +QFxItem::TransformOrigin QFxItem::transformOrigin() const +{ + Q_D(const QFxItem); + return d->origin; +} + +/*! + Set the transform \a origin. +*/ +void QFxItem::setTransformOrigin(TransformOrigin origin) +{ + Q_D(QFxItem); + if (origin != d->origin) { + d->origin = origin; + update(); + } +} + +QPointF QFxItem::transformOriginPoint() const +{ + Q_D(const QFxItem); + return d->transformOrigin(); +} + +qreal QFxItem::z() const +{ + return zValue(); +} + +void QFxItem::setX(qreal x) +{ + if (x == this->x()) + return; + + qreal oldX = this->x(); + + QGraphicsItem::setPos(x, y()); + + geometryChanged(QRectF(this->x(), y(), width(), height()), + QRectF(oldX, y(), width(), height())); +} + +void QFxItem::setY(qreal y) +{ + if (y == this->y()) + return; + + qreal oldY = this->y(); + + QGraphicsItem::setPos(x(), y); + + geometryChanged(QRectF(x(), this->y(), width(), height()), + QRectF(x(), oldY, width(), height())); +} + +void QFxItem::setZ(qreal z) +{ + if (z == this->z()) + return; + + if (z < 0) + setFlag(QGraphicsItem::ItemStacksBehindParent, true); + else + setFlag(QGraphicsItem::ItemStacksBehindParent, false); + + setZValue(z); +} + +qreal QFxItem::width() const +{ + Q_D(const QFxItem); + return d->width; +} + +void QFxItem::setWidth(qreal w) +{ + Q_D(QFxItem); + d->widthValid = true; + if (d->width == w) + return; + + qreal oldWidth = d->width; + + d->width = w; + update(); + + geometryChanged(QRectF(x(), y(), width(), height()), + QRectF(x(), y(), oldWidth, height())); +} + +void QFxItem::setImplicitWidth(qreal w) +{ + Q_D(QFxItem); + if (d->width == w || widthValid()) + return; + + qreal oldWidth = d->width; + + d->width = w; + update(); + + geometryChanged(QRectF(x(), y(), width(), height()), + QRectF(x(), y(), oldWidth, height())); +} + +bool QFxItem::widthValid() const +{ + Q_D(const QFxItem); + return d->widthValid; +} + +qreal QFxItem::height() const +{ + Q_D(const QFxItem); + return d->height; +} + +void QFxItem::setHeight(qreal h) +{ + Q_D(QFxItem); + d->heightValid = true; + if (d->height == h) + return; + + qreal oldHeight = d->height; + + d->height = h; + update(); + + geometryChanged(QRectF(x(), y(), width(), height()), + QRectF(x(), y(), width(), oldHeight)); +} + +void QFxItem::setImplicitHeight(qreal h) +{ + Q_D(QFxItem); + if (d->height == h || heightValid()) + return; + + qreal oldHeight = d->height; + + d->height = h; + update(); + + geometryChanged(QRectF(x(), y(), width(), height()), + QRectF(x(), y(), width(), oldHeight)); +} + +bool QFxItem::heightValid() const +{ + Q_D(const QFxItem); + return d->heightValid; +} + +void QFxItem::setPos(const QPointF &point) +{ + qreal oldX = x(); + qreal oldY = y(); + + QGraphicsItem::setPos(point); + + geometryChanged(QRectF(x(), y(), width(), height()), + QRectF(oldX, oldY, width(), height())); +} + +qreal QFxItem::scale() const +{ + Q_D(const QFxItem); + return d->scale; +} + +void QFxItem::setScale(qreal s) +{ + Q_D(QFxItem); + if (d->scale == s) + return; + + d->scale = s; + setTransform(d->transform); + + emit scaleChanged(); +} + +QRect QFxItem::itemBoundingRect() +{ + return boundingRect().toAlignedRect(); +} + +QPointF QFxItem::mapFromScene(const QPointF &p) const +{ + return QGraphicsItem::mapFromScene(p); +} + +QRectF QFxItem::mapFromScene(const QRectF &r) const +{ + return QGraphicsItem::mapFromScene(r).boundingRect(); +} + +QPointF QFxItem::mapToScene(const QPointF &p) const +{ + return QGraphicsItem::mapToScene(p); +} + +QRectF QFxItem::mapToScene(const QRectF &r) const +{ + return QGraphicsItem::mapToScene(r).boundingRect(); +} + +QTransform QFxItem::transform() const +{ + Q_D(const QFxItem); + return d->transform; +} + +//### optimize (perhaps cache scale and rot transforms, and have dirty flags) +//### we rely on there not being an "if (d->transform == m) return;" check +void QFxItem::setTransform(const QTransform &m) +{ + Q_D(QFxItem); + d->transform = m; + QTransform scaleTransform, rotTransform; + if (d->scale != 1) { + QPointF to = transformOriginPoint(); + if (to.x() != 0. || to.y() != 0.) + scaleTransform.translate(to.x(), to.y()); + scaleTransform.scale(d->scale, d->scale); + if (to.x() != 0. || to.y() != 0.) + scaleTransform.translate(-to.x(), -to.y()); + } + if (d->_rotation != 0) { + QPointF to = d->transformOrigin(); + if (to.x() != 0. || to.y() != 0.) + rotTransform.translate(to.x(), to.y()); + rotTransform.rotate(d->_rotation); + if (to.x() != 0. || to.y() != 0.) + rotTransform.translate(-to.x(), -to.y()); + } + QGraphicsItem::setTransform(scaleTransform * rotTransform * d->transform); +} + +QFxItem *QFxItem::mouseGrabberItem() const +{ + QGraphicsScene *s = scene(); + if (s) { + QGraphicsItem *item = s->mouseGrabberItem(); + return static_cast<QFxItem*>(item); // ### + } + return 0; +} + +/*! + \qmlproperty bool Item::focus + This property indicates whether the item has has an active focus request. Set this + property to true to request active focus. +*/ + +bool QFxItem::hasFocus() const +{ + Q_D(const QFxItem); + return d->isFocusItemForArea; +} + +void QFxItem::setFocus(bool focus) +{ + Q_D(QFxItem); + QGraphicsScene *s = scene(); + if (s) { + if (d->hasActiveFocus) + s->setFocusItem(focus ? this : 0); + else if (focus) + s->setFocusItem(this); + else { + d->isFocusItemForArea = false; + focusChanged(false); + } + + } else { + d->isFocusItemForArea = focus; + focusChanged(focus); + } +} + +/*! + \qmlproperty bool Item::activeFocus + This property indicates whether the item has the active focus. +*/ + +bool QFxItem::hasActiveFocus() const +{ + Q_D(const QFxItem); + return d->hasActiveFocus; +} + +bool QFxItem::activeFocusPanel() const +{ + return false; +} + +void QFxItem::setActiveFocusPanel(bool b) +{ + Q_UNUSED(b) +} + +bool QFxItem::sceneEventFilter(QGraphicsItem *w, QEvent *e) +{ + switch(e->type()) { + case QEvent::GraphicsSceneMouseDoubleClick: + case QEvent::GraphicsSceneMouseMove: + case QEvent::GraphicsSceneMousePress: + case QEvent::GraphicsSceneMouseRelease: + if (mouseFilter(static_cast<QGraphicsSceneMouseEvent *>(e))) + return true; + break; + default: + break; + } + + return QGraphicsItem::sceneEventFilter(w, e); +} + +void QFxItem::setOptions(Options options, bool set) +{ + Q_D(QFxItem); + Options old = (Options)d->options; + + if (options & IsFocusRealm) { + if (!set) { + qWarning("QFxItem::setOptions: Cannot unset IsFocusRealm"); + return; + } + } + + if (set) + d->options |= options; + else + d->options &= ~options; + + if ((d->options & IsFocusPanel) && (d->options & IsFocusRealm)) { + qWarning("QFxItem::setOptions: Cannot set both IsFocusPanel and IsFocusRealm. IsFocusRealm will be unset."); + d->options &= ~IsFocusRealm; + } + + setFlag(QGraphicsItem::ItemHasNoContents, !(d->options & HasContents)); + setFiltersChildEvents(d->options & ChildMouseFilter); + setFlag(QGraphicsItem::ItemAcceptsInputMethod, (d->options & AcceptsInputMethods)); + setAcceptHoverEvents(d->options & HoverEvents); + d->isFocusRealm = static_cast<bool>(d->options & IsFocusRealm); + + if ((old & MouseFilter) != (d->options & MouseFilter)) { + if (d->options & MouseFilter) + d->gvAddMouseFilter(); + else + d->gvRemoveMouseFilter(); + } +} + +/*! + \fn void QFxItem::setParent(QFxItem *parent) + + Sets the parent of the item to \a parent. + */ +void QFxItem::setParent(QFxItem *p) +{ + if (p == parent() || !p) return; + + QObject::setParent(p); + + QFxItem *oldParent = itemParent(); + setParentItem(p); + parentChanged(p, oldParent); +} + +void QFxItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *) +{ + paintContents(*p); +} + +void QFxItemPrivate::gvRemoveMouseFilter() +{ + Q_Q(QFxItem); + if (q->scene()) + q->removeSceneEventFilter(q); +} + +void QFxItemPrivate::gvAddMouseFilter() +{ + Q_Q(QFxItem); + if (q->scene()) + q->installSceneEventFilter(q); +} + +QPixmap QFxItem::string(const QString &str, const QColor &c, const QFont &f) +{ + QFontMetrics fm(f); + QSize size(fm.width(str), fm.height()*(str.count(QLatin1Char('\n'))+1)); //fm.boundingRect(str).size(); + QPixmap img(size); + img.fill(Qt::transparent); + QPainter p(&img); + p.setPen(c); + p.setFont(f); + p.drawText(img.rect(), Qt::AlignVCenter, str); + return img; +} + QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxitem.h b/src/declarative/fx/qfxitem.h index a674df9..bfe8521 100644 --- a/src/declarative/fx/qfxitem.h +++ b/src/declarative/fx/qfxitem.h @@ -49,9 +49,10 @@ #include <QtDeclarative/qfxglobal.h> #include <QtDeclarative/qml.h> #include <QtDeclarative/qfxscalegrid.h> -#include <QtDeclarative/qsimplecanvasitem.h> #include <QtDeclarative/qmlcomponent.h> #include <QtDeclarative/qmlstate.h> +#include <QtGui/qgraphicsitem.h> +#include <QtGui/qfont.h> QT_BEGIN_HEADER @@ -93,7 +94,7 @@ class QmlTransition; class QFxTransform; class QFxKeyEvent; class QFxItemPrivate; -class Q_DECLARATIVE_EXPORT QFxItem : public QSimpleCanvasItem, public QmlParserStatus +class Q_DECLARATIVE_EXPORT QFxItem : public QGraphicsObject, public QmlParserStatus { Q_OBJECT Q_INTERFACES(QmlParserStatus) @@ -124,27 +125,45 @@ class Q_DECLARATIVE_EXPORT QFxItem : public QSimpleCanvasItem, public QmlParserS Q_PROPERTY(QFxAnchorLine verticalCenter READ verticalCenter CONSTANT FINAL) Q_PROPERTY(QFxAnchorLine baseline READ baseline CONSTANT FINAL) Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged) - Q_PROPERTY(bool flipVertically READ flipVertically WRITE setFlipVertically) - Q_PROPERTY(bool flipHorizontally READ flipHorizontally WRITE setFlipHorizontally) Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged) - Q_PROPERTY(QSimpleCanvasFilter *filter READ filter WRITE setFilter) Q_PROPERTY(bool clip READ clip WRITE setClip) - Q_PROPERTY(bool focusable READ isFocusable WRITE setFocusable FINAL) Q_PROPERTY(bool focus READ hasFocus WRITE setFocus NOTIFY focusChanged FINAL) Q_PROPERTY(bool activeFocus READ hasActiveFocus NOTIFY activeFocusChanged FINAL) Q_PROPERTY(QList<QFxTransform *>* transform READ transform) - Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(TransformOrigin transformOrigin READ transformOrigin WRITE setTransformOrigin) + Q_ENUMS(TransformOrigin) Q_CLASSINFO("DefaultProperty", "data") typedef QHash<QString, QFxItem *> QmlChildren; public: + enum Option { NoOption = 0x00000000, + MouseFilter = 0x00000001, + ChildMouseFilter = 0x00000002, + HoverEvents = 0x00000004, + MouseEvents = 0x00000008, + HasContents = 0x00000010, + SimpleItem = 0x00000020, + IsFocusPanel = 0x00000040, + IsFocusRealm = 0x00000080, + AcceptsInputMethods = 0x00000100, + IsOpaque = 0x00000200 }; + Q_DECLARE_FLAGS(Options, Option) + + enum TransformOrigin { + TopLeft, TopCenter, TopRight, + MiddleLeft, Center, MiddleRight, + BottomLeft, BottomCenter, BottomRight + }; + QFxItem(QFxItem *parent = 0); virtual ~QFxItem(); QFxItem *itemParent() const; + QFxItem *parentItem() const; void setItemParent(QFxItem *parent); void moveToParent(QFxItem *parent); @@ -160,6 +179,9 @@ public: QFxContents *contents(); + bool clip() const; + void setClip(bool); + QmlList<QmlState *>* states(); QmlState *findState(const QString &name) const; @@ -172,11 +194,6 @@ public: QUrl qml() const; void setQml(const QUrl &); - bool flipVertically() const; - void setFlipVertically(bool); - bool flipHorizontally() const; - void setFlipHorizontally(bool); - qreal baselineOffset() const; void setBaselineOffset(qreal); @@ -186,15 +203,13 @@ public: qreal scale() const; void setScale(qreal); - qreal opacity() const; - virtual void setOpacity(qreal); + void setOpacity(qreal); QList<QFxTransform *> *transform(); bool isVisible() const; void setVisible(bool); - virtual void dump(int depth = 0); virtual QString propertyInfo() const; bool isClassComplete() const; @@ -207,6 +222,58 @@ public: bool keepMouseGrab() const; void setKeepMouseGrab(bool); + Options options() const; + void setOptions(Options, bool set = true); + + qreal z() const; + QPointF pos() const; + void setX(qreal); + void setY(qreal); + virtual void setZ(qreal); + void setPos(const QPointF &); + + qreal width() const; + void setWidth(qreal); + void setImplicitWidth(qreal); + bool widthValid() const; + qreal height() const; + void setHeight(qreal); + void setImplicitHeight(qreal); + bool heightValid() const; + + QPointF scenePos() const; + + TransformOrigin transformOrigin() const; + void setTransformOrigin(TransformOrigin); + QPointF transformOriginPoint() const; + + void setParent(QFxItem *); + + QRect itemBoundingRect(); + + void setPaintMargin(qreal margin); + QRectF boundingRect() const; + virtual void paintContents(QPainter &); + + QPointF mapFromScene(const QPointF &) const; + QRectF mapFromScene(const QRectF &) const; + QPointF mapToScene(const QPointF &) const; + QRectF mapToScene(const QRectF &) const; + + QTransform transform() const; + void setTransform(const QTransform &); + + QFxItem *mouseGrabberItem() const; + + virtual bool hasFocus() const; + void setFocus(bool); + bool activeFocusPanel() const; + void setActiveFocusPanel(bool); + + bool hasActiveFocus() const; + + static QPixmap string(const QString &, const QColor & = Qt::black, const QFont & = QFont()); + public Q_SLOTS: void newChild(const QString &url); @@ -230,16 +297,23 @@ Q_SIGNALS: void newChildCreated(const QString &url, QScriptValue); protected: - virtual void transformChanged(const QSimpleCanvas::Matrix &); + virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); + virtual void childrenChanged(); + virtual bool sceneEventFilter(QGraphicsItem *, QEvent *); + virtual bool sceneEvent(QEvent *); + virtual QVariant itemChange(GraphicsItemChange, const QVariant &); + virtual bool mouseFilter(QGraphicsSceneMouseEvent *); + virtual void mouseUngrabEvent(); + + virtual void transformChanged(const QTransform &); virtual void classBegin(); virtual void classComplete(); virtual void componentComplete(); - virtual void parentChanged(QSimpleCanvasItem *, QSimpleCanvasItem *); - virtual void reparentItems(); + virtual void parentChanged(QFxItem *, QFxItem *); virtual void focusChanged(bool); virtual void activeFocusChanged(bool); - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *event); + virtual void keyPressEvent(QKeyEvent *event); + virtual void keyReleaseEvent(QKeyEvent *event); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); @@ -263,14 +337,23 @@ private: friend class QmlStatePrivate; friend class QFxAnchors; Q_DISABLE_COPY(QFxItem) - Q_DECLARE_PRIVATE(QFxItem) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxItem) }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QFxItem::Options) + +template<typename T> +T qobject_cast(QGraphicsItem *item) +{ + if (!item) return 0; + QObject *o = item->toGraphicsObject(); + return qobject_cast<T>(o); +} + QT_END_NAMESPACE QML_DECLARE_TYPE(QFxContents) QML_DECLARE_TYPE(QFxItem) -QML_DECLARE_TYPE(QSimpleCanvasFilter) QT_END_HEADER diff --git a/src/declarative/fx/qfxitem_p.h b/src/declarative/fx/qfxitem_p.h index 32e8aef..eddeb9b 100644 --- a/src/declarative/fx/qfxitem_p.h +++ b/src/declarative/fx/qfxitem_p.h @@ -54,17 +54,18 @@ // #include <QtDeclarative/qfxitem.h> -#include <private/qsimplecanvasitem_p.h> #include <private/qmlnullablevalue_p.h> #include <QtDeclarative/qml.h> #include <QtDeclarative/qmlcontext.h> #include <QtCore/qlist.h> +#include <private/qgraphicsitem_p.h> +#include <QtCore/qdebug.h> QT_BEGIN_NAMESPACE class QNetworkReply; -class QFxItemPrivate : public QSimpleCanvasItemPrivate +class QFxItemPrivate : public QGraphicsItemPrivate { Q_DECLARE_PUBLIC(QFxItem) @@ -75,8 +76,11 @@ public: : _anchors(0), _contents(0), qmlItem(0), _qmlcomp(0), _baselineOffset(0), _rotation(0.), _classComplete(true), _componentComplete(true), _keepMouse(false), - visible(true), _anchorLines(0), visibleOp(1), reparentedChildren(0), - _stateGroup(0) + visible(true), _anchorLines(0), visibleOp(1), + _stateGroup(0), canvas(0), origin(QFxItem::TopLeft), + options(QFxItem::NoOption), + widthValid(false), heightValid(false), width(0), height(0), + paintmargin(0), scale(1) {} ~QFxItemPrivate() { delete _anchors; } @@ -89,6 +93,9 @@ public: q->setItemParent(parent); _baselineOffset.invalidate(); q->setAcceptedMouseButtons(Qt::NoButton); + q->setFlag(QGraphicsItem::ItemHasNoContents, true); + q->setFlag(QGraphicsItem::ItemIsFocusable, true); + mouseSetsFocus = false; } QString _id; @@ -168,10 +175,39 @@ public: float visibleOp; - int reparentedChildren; - QmlStateGroup *states(); QmlStateGroup *_stateGroup; + + + QGraphicsScene *canvas; + + QFxItem::TransformOrigin origin:4; + int options:10; + bool widthValid:1; + bool heightValid:1; + + qreal width; + qreal height; + qreal paintmargin; + qreal scale; + + QPointF transformOrigin() const; + QTransform transform; + + void gvRemoveMouseFilter(); + void gvAddMouseFilter(); + + virtual void setActiveFocus(bool b) { + Q_Q(QFxItem); + QGraphicsItemPrivate::setActiveFocus(b); + q->activeFocusChanged(b); + } + + virtual void setFocusItemForArea(bool b) { + Q_Q(QFxItem); + QGraphicsItemPrivate::setFocusItemForArea(b); + q->focusChanged(b); + } }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxkeyactions.cpp b/src/declarative/fx/qfxkeyactions.cpp index 4aae74f..2c662a6 100644 --- a/src/declarative/fx/qfxkeyactions.cpp +++ b/src/declarative/fx/qfxkeyactions.cpp @@ -41,7 +41,7 @@ #include "qfxkeyactions.h" #include <qmlexpression.h> - +#include <QKeyEvent> QT_BEGIN_NAMESPACE QML_DEFINE_TYPE(QFxKeyActions,KeyActions) diff --git a/src/declarative/fx/qfxkeyproxy.cpp b/src/declarative/fx/qfxkeyproxy.cpp index e80f2c7..f234a0f 100644 --- a/src/declarative/fx/qfxkeyproxy.cpp +++ b/src/declarative/fx/qfxkeyproxy.cpp @@ -40,34 +40,61 @@ ****************************************************************************/ #include "qfxkeyproxy.h" - +#include <QGraphicsScene> +#include <QKeyEvent> QT_BEGIN_NAMESPACE + QML_DEFINE_TYPE(QFxKeyProxy,KeyProxy) /*! \qmlclass KeyProxy - \brief The KeyProxy item proxies key presses to a number of other items. + \brief The KeyProxy item proxies key events to a number of other items. \inherits Item + KeyProxy provides a way to forward key presses, key releases, and keyboard input + coming from input methods to other items. This can be useful when you want + one item to handle some keys (e.g. the up and down arrow keys), and another item to + handle other keys (e.g. the left and right arrow keys). + + To receive key events, the KeyProxy item must be in the current focus chain, + just like any other item. + + KeyProxy is an invisible item: it is never painted. + + A simple KeyProxy that forward key events to two lists: + \qml + ListView { id: List1 ... } + ListView { id: List2 ... } + KeyProxy { + focus: true + targets: [List1, List2] + } + \endqml */ /*! \internal \class QFxKeyProxy - \brief The QFxKeyProxy class proxies key presses to a number of other items. - \ingroup group_utility + \brief The QFxKeyProxy class proxies key events to a number of other items. */ class QFxKeyProxyPrivate { public: + QFxKeyProxyPrivate() : inPress(false), inRelease(false), inIM(false) {} QList<QFxItem *> targets; + + //loop detection + bool inPress:1; + bool inRelease:1; + bool inIM:1; }; QFxKeyProxy::QFxKeyProxy(QFxItem *parent) : QFxItem(parent), d(new QFxKeyProxyPrivate) { + setOptions(AcceptsInputMethods); } QFxKeyProxy::~QFxKeyProxy() @@ -78,12 +105,10 @@ QFxKeyProxy::~QFxKeyProxy() /*! \qmlproperty list<Item> KeyProxy::targets - The proxy targets. -*/ + An ordered list of the items that will be forwarded key events. -/*! - \property QFxKeyProxy::targets - \brief the proxy targets. + The events will be forwarded to the targets in turn until one of them + accepts the event. */ QList<QFxItem *> *QFxKeyProxy::targets() const @@ -93,23 +118,58 @@ QList<QFxItem *> *QFxKeyProxy::targets() const void QFxKeyProxy::keyPressEvent(QKeyEvent *e) { - for (int ii = 0; ii < d->targets.count(); ++ii) { - QSimpleCanvasItem *i = canvas()->focusItem(d->targets.at(ii)); - if (i) - i->keyPressEvent(e); - if (e->isAccepted()) - return; + if (!scene()) + return; + if (!d->inPress) { + d->inPress = true; + for (int ii = 0; ii < d->targets.count(); ++ii) { + QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii))); + if (i) + scene()->sendEvent(i, e); + if (e->isAccepted()) { + d->inPress = false; + return; + } + } + d->inPress = false; } } void QFxKeyProxy::keyReleaseEvent(QKeyEvent *e) { - for (int ii = 0; ii < d->targets.count(); ++ii) { - QSimpleCanvasItem *i = canvas()->focusItem(d->targets.at(ii)); - if (i) - i->keyReleaseEvent(e); - if (e->isAccepted()) - return; + if (!scene()) + return; + if (!d->inRelease) { + d->inRelease = true; + for (int ii = 0; ii < d->targets.count(); ++ii) { + QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii))); + if (i) + scene()->sendEvent(i, e); + if (e->isAccepted()) { + d->inRelease = false; + return; + } + } + d->inRelease = false; + } +} + +void QFxKeyProxy::inputMethodEvent(QInputMethodEvent *e) +{ + if (!scene()) + return; + if (!d->inIM) { + d->inIM = true; + for (int ii = 0; ii < d->targets.count(); ++ii) { + QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii))); + if (i) + scene()->sendEvent(i, e); + if (e->isAccepted()) { + d->inIM = false; + return; + } + } + d->inIM = false; } } diff --git a/src/declarative/fx/qfxkeyproxy.h b/src/declarative/fx/qfxkeyproxy.h index d075295..8bcdc26 100644 --- a/src/declarative/fx/qfxkeyproxy.h +++ b/src/declarative/fx/qfxkeyproxy.h @@ -64,6 +64,7 @@ public: protected: virtual void keyPressEvent(QKeyEvent *); virtual void keyReleaseEvent(QKeyEvent *); + virtual void inputMethodEvent(QInputMethodEvent *); private: Q_DISABLE_COPY(QFxKeyProxy) diff --git a/src/declarative/fx/qfxlayouts.cpp b/src/declarative/fx/qfxlayouts.cpp index 20e7c7c..f71b35a 100644 --- a/src/declarative/fx/qfxlayouts.cpp +++ b/src/declarative/fx/qfxlayouts.cpp @@ -311,8 +311,9 @@ void QFxBaseLayout::preLayout() QCoreApplication::postEvent(this, new QEvent(QEvent::User)); } QSet<QFxItem *> allItems; - for (int ii = 0; ii < this->QSimpleCanvasItem::children().count(); ++ii) { - QFxItem *child = qobject_cast<QFxItem *>(this->QSimpleCanvasItem::children().at(ii)); + QList<QGraphicsItem *> children = childItems(); + for (int ii = 0; ii < children.count(); ++ii) { + QFxItem *child = qobject_cast<QFxItem *>(children.at(ii)); if (!child) continue; if (!d->_items.contains(child)){ @@ -618,8 +619,10 @@ void QFxVerticalLayout::doLayout() applyRemove(changes, item); } } - for (int ii = 0; ii < this->QSimpleCanvasItem::children().count(); ++ii) { - QFxItem *child = qobject_cast<QFxItem *>(this->QSimpleCanvasItem::children().at(ii)); + + QList<QGraphicsItem *> children = childItems(); + for (int ii = 0; ii < children.count(); ++ii) { + QFxItem *child = qobject_cast<QFxItem *>(children.at(ii)); if (!child || !child->isVisible()) continue; @@ -784,8 +787,9 @@ void QFxHorizontalLayout::doLayout() applyRemove(changes, item); } } - for (int ii = 0; ii < this->QSimpleCanvasItem::children().count(); ++ii) { - QFxItem *child = qobject_cast<QFxItem *>(this->QSimpleCanvasItem::children().at(ii)); + QList<QGraphicsItem *> children = childItems(); + for (int ii = 0; ii < children.count(); ++ii) { + QFxItem *child = qobject_cast<QFxItem *>(children.at(ii)); if (!child || !child->isVisible()) continue; @@ -1013,15 +1017,17 @@ void QFxGridLayout::doLayout() QList<int> maxColWidth; QList<int> maxRowHeight; int childIndex =0; + QList<QGraphicsItem *> children = childItems(); for (int i=0; i<r; i++){ for (int j=0; j<c; j++){ if (j==0) maxRowHeight << 0; if (i==0) maxColWidth << 0; - if (childIndex == this->QSimpleCanvasItem::children().count()) + + if (childIndex == children.count()) continue; - QFxItem *child = qobject_cast<QFxItem *>(this->QSimpleCanvasItem::children().at(childIndex++)); + QFxItem *child = qobject_cast<QFxItem *>(children.at(childIndex++)); if (!child || !child->isVisible()) continue; if (child->width() > maxColWidth[j]) @@ -1041,7 +1047,7 @@ void QFxGridLayout::doLayout() applyRemove(changes, item); } } - foreach(QSimpleCanvasItem* schild, this->QSimpleCanvasItem::children()){ + foreach(QGraphicsItem* schild, children){ QFxItem *child = qobject_cast<QFxItem *>(schild); if (!child || !child->isVisible()) continue; diff --git a/src/declarative/fx/qfxlayouts.h b/src/declarative/fx/qfxlayouts.h index 112fe85..5767bc5 100644 --- a/src/declarative/fx/qfxlayouts.h +++ b/src/declarative/fx/qfxlayouts.h @@ -115,7 +115,7 @@ private: void applyTransition(const QList<QPair<QString, QVariant> >& changes, QFxItem* target, QmlTransition* transition); Q_DISABLE_COPY(QFxBaseLayout) - Q_DECLARE_PRIVATE(QFxBaseLayout) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxBaseLayout) }; class Q_DECLARATIVE_EXPORT QFxVerticalLayout : public QFxBaseLayout diff --git a/src/declarative/fx/qfxlineedit.h b/src/declarative/fx/qfxlineedit.h index 04dbee3..5abb418 100644 --- a/src/declarative/fx/qfxlineedit.h +++ b/src/declarative/fx/qfxlineedit.h @@ -181,7 +181,7 @@ private slots: void rainbowRedraw(); private: - Q_DECLARE_PRIVATE(QFxLineEdit); + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxLineEdit); }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxlistview.h b/src/declarative/fx/qfxlistview.h index 6e9451e..2a70af0 100644 --- a/src/declarative/fx/qfxlistview.h +++ b/src/declarative/fx/qfxlistview.h @@ -55,7 +55,7 @@ class QFxListViewPrivate; class Q_DECLARATIVE_EXPORT QFxListView : public QFxFlickable { Q_OBJECT - Q_DECLARE_PRIVATE(QFxListView) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxListView) Q_ENUMS(CurrentItemPositioning) Q_PROPERTY(QVariant model READ model WRITE setModel) diff --git a/src/declarative/fx/qfxmouseregion.cpp b/src/declarative/fx/qfxmouseregion.cpp index 6eb358b..af16d4d 100644 --- a/src/declarative/fx/qfxmouseregion.cpp +++ b/src/declarative/fx/qfxmouseregion.cpp @@ -173,28 +173,12 @@ void QFxDrag::setYmax(int m) \qmlsignal MouseRegion::onEntered This handler is called when the mouse enters the mouse region. - - \warning This handler is not yet implemented. */ /*! \qmlsignal MouseRegion::onExited This handler is called when the mouse exists the mouse region. - - \warning This handler is not yet implemented. -*/ - -/*! - \qmlsignal MouseRegion::onReenteredWhilePressed - - This handler is called when the mouse reenters the mouse region while pressed. -*/ - -/*! - \qmlsignal MouseRegion::onExitedWhilePressed - - This handler is called when the mouse exists the mouse region while pressed. */ /*! @@ -322,10 +306,6 @@ void QFxMouseRegion::mousePressEvent(QGraphicsSceneMouseEvent *event) if (!d->absorb) QFxItem::mousePressEvent(event); else { - if (!d->inside) { - d->inside = true; - emit hoveredChanged(); - } d->longPress = false; d->saveEvent(event); d->dragX = drag()->axis().contains(QLatin1String("x")); @@ -352,17 +332,13 @@ void QFxMouseRegion::mouseMoveEvent(QGraphicsSceneMouseEvent *event) d->saveEvent(event); // ### we should skip this if these signals aren't used + // ### can GV handle this for us? const QRect &bounds = itemBoundingRect(); bool contains = bounds.contains(d->lastPos.toPoint()); - if (d->inside && !contains) { - d->inside = false; - emit hoveredChanged(); - emit exitedWhilePressed(); - } else if (!d->inside && contains) { - d->inside = true; - emit hoveredChanged(); - emit reenteredWhilePressed(); - } + if (d->hovered && !contains) + setHovered(false); + else if (!d->hovered && contains) + setHovered(true); if (drag()->target()) { if (!d->moved) { @@ -373,8 +349,8 @@ void QFxMouseRegion::mouseMoveEvent(QGraphicsSceneMouseEvent *event) QPointF startLocalPos; QPointF curLocalPos; if (drag()->target()->parent()) { - startLocalPos = drag()->target()->parent()->mapFromScene(d->startScene); - curLocalPos = drag()->target()->parent()->mapFromScene(event->scenePos()); + startLocalPos = drag()->target()->parentItem()->mapFromScene(d->startScene); + curLocalPos = drag()->target()->parentItem()->mapFromScene(event->scenePos()); } else { startLocalPos = d->startScene; curLocalPos = event->scenePos(); @@ -424,8 +400,6 @@ void QFxMouseRegion::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) else { d->saveEvent(event); setPressed(false); - //d->inside = false; - //emit hoveredChanged(); event->accept(); } } @@ -436,8 +410,6 @@ void QFxMouseRegion::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) if (!d->absorb) QFxItem::mouseDoubleClickEvent(event); else { - //d->inside = true; - //emit hoveredChanged(); d->saveEvent(event); setPressed(true); QFxMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false); @@ -453,7 +425,6 @@ void QFxMouseRegion::hoverEnterEvent(QGraphicsSceneHoverEvent *event) QFxItem::hoverEnterEvent(event); else { setHovered(true); - emit entered(); } } @@ -464,7 +435,6 @@ void QFxMouseRegion::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) QFxItem::hoverLeaveEvent(event); else { setHovered(false); - emit exited(); } } @@ -475,7 +445,6 @@ void QFxMouseRegion::mouseUngrabEvent() // if our mouse grab has been removed (probably by Flickable), fix our // state d->pressed = false; - //d->inside = false; setKeepMouseGrab(false); emit pressedChanged(); //emit hoveredChanged(); @@ -487,7 +456,7 @@ void QFxMouseRegion::timerEvent(QTimerEvent *event) Q_D(QFxMouseRegion); if (event->timerId() == d->pressAndHoldTimer.timerId()) { d->pressAndHoldTimer.stop(); - if (d->pressed && d->dragged == false && d->inside == true) { + if (d->pressed && d->dragged == false && d->hovered == true) { d->longPress = true; QFxMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress); emit pressAndHold(&me); @@ -504,7 +473,7 @@ void QFxMouseRegion::timerEvent(QTimerEvent *event) bool QFxMouseRegion::hovered() { Q_D(QFxMouseRegion); - return d->hovered || d->inside; + return d->hovered; } /*! @@ -523,13 +492,14 @@ void QFxMouseRegion::setHovered(bool h) if (d->hovered != h) { d->hovered = h; emit hoveredChanged(); + d->hovered ? emit entered() : emit exited(); } } void QFxMouseRegion::setPressed(bool p) { Q_D(QFxMouseRegion); - bool isclick = d->pressed == true && p == false && d->dragged == false && d->inside == true; + bool isclick = d->pressed == true && p == false && d->dragged == false && d->hovered == true; if (d->pressed != p) { d->pressed = p; diff --git a/src/declarative/fx/qfxmouseregion.h b/src/declarative/fx/qfxmouseregion.h index 429ad00..47929be 100644 --- a/src/declarative/fx/qfxmouseregion.h +++ b/src/declarative/fx/qfxmouseregion.h @@ -129,8 +129,6 @@ Q_SIGNALS: void doubleClicked(QFxMouseEvent *mouse); void entered(); void exited(); - void exitedWhilePressed(); - void reenteredWhilePressed(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); @@ -151,7 +149,7 @@ protected: private: Q_DISABLE_COPY(QFxMouseRegion) - Q_DECLARE_PRIVATE(QFxMouseRegion) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxMouseRegion) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxmouseregion_p.h b/src/declarative/fx/qfxmouseregion_p.h index e444bf2..a41f32a 100644 --- a/src/declarative/fx/qfxmouseregion_p.h +++ b/src/declarative/fx/qfxmouseregion_p.h @@ -66,7 +66,7 @@ class QFxMouseRegionPrivate : public QFxItemPrivate public: QFxMouseRegionPrivate() - : absorb(true), hovered(false), inside(true), pressed(false), longPress(false), drag(0) + : absorb(true), hovered(false), pressed(false), longPress(false), drag(0) { } @@ -74,7 +74,7 @@ public: { Q_Q(QFxMouseRegion); q->setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton); - q->setOptions(QSimpleCanvasItem::HoverEvents | QSimpleCanvasItem::MouseEvents); + q->setOptions(QFxItem::HoverEvents | QFxItem::MouseEvents); } void saveEvent(QGraphicsSceneMouseEvent *event) { @@ -86,7 +86,6 @@ public: bool absorb : 1; bool hovered : 1; - bool inside : 1; bool pressed : 1; bool longPress : 1; bool moved : 1; diff --git a/src/declarative/fx/qfxpainteditem.cpp b/src/declarative/fx/qfxpainteditem.cpp index 0a13dc4..c79abbd 100644 --- a/src/declarative/fx/qfxpainteditem.cpp +++ b/src/declarative/fx/qfxpainteditem.cpp @@ -49,11 +49,6 @@ #include <QApplication> #include <QGraphicsSceneMouseEvent> -#if defined(QFX_RENDER_OPENGL2) -#include <QtOpenGL/qglframebufferobject.h> -#include <glsave.h> -#endif - QT_BEGIN_NAMESPACE /*! @@ -210,26 +205,16 @@ void QFxPaintedItem::init() connect(this,SIGNAL(visibleChanged()),this,SLOT(clearCache())); } -#if defined(QFX_RENDER_QPAINTER) /*! \reimp */ void QFxPaintedItem::paintContents(QPainter &p) -#elif defined(QFX_RENDER_OPENGL) -/*! - \reimp -*/ -void QFxPaintedItem::paintGLContents(GLPainter &p) -#else -#error "What render?" -#endif { Q_D(QFxPaintedItem); const QRect content(QPoint(0,0),d->contentsSize); if (content.width() <= 0 || content.height() <= 0) return; -#if defined(QFX_RENDER_QPAINTER) bool oldAntiAliasing = p.testRenderHint(QPainter::Antialiasing); bool oldSmoothPixmap = p.testRenderHint(QPainter::SmoothPixmapTransform); if (oldAntiAliasing) @@ -242,29 +227,12 @@ void QFxPaintedItem::paintGLContents(GLPainter &p) else clipf = mapToScene(clipf); -#elif defined(QFX_RENDER_OPENGL2) - p.useTextureShader(); - const QRectF clipf = p.sceneClipRect; - -#elif defined(QFX_RENDER_OPENGL1) - p.useTextureShader(); - const QRectF clipf = p.sceneClipRect; -#endif - const QRect clip = mapFromScene(clipf).toRect(); QRegion topaint(clip); topaint &= content; QRegion uncached(content); -#if defined(QFX_RENDER_OPENGL2) - glEnableVertexAttribArray(SingleTextureShader::Vertices); - glEnableVertexAttribArray(SingleTextureShader::TextureCoords); -#elif defined(QFX_RENDER_OPENGL1) - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); -#endif - int cachesize=0; for (int i=0; i<d->imagecache.count(); ++i) { QRect area = d->imagecache[i]->area; @@ -312,29 +280,17 @@ void QFxPaintedItem::paintGLContents(GLPainter &p) } QFxPaintedItemPrivate::ImageCacheItem *newitem = new QFxPaintedItemPrivate::ImageCacheItem; newitem->area = r; -#if defined(QFX_RENDER_QPAINTER) newitem->image = img; -#else - newitem->image.setImage(img.toImage()); -#endif d->imagecache.append(newitem); QRectF target(r.x(), r.y(), r.width(), r.height()); p.drawPixmap(target.toRect(), newitem->image); } } -#if defined(QFX_RENDER_OPENGL2) - glDisableVertexAttribArray(SingleTextureShader::Vertices); - glDisableVertexAttribArray(SingleTextureShader::TextureCoords); -#elif defined(QFX_RENDER_OPENGL1) - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -#endif -#if defined(QFX_RENDER_QPAINTER) + if (oldAntiAliasing) p.setRenderHints(QPainter::Antialiasing, oldAntiAliasing); if (d->smooth) p.setRenderHints(QPainter::SmoothPixmapTransform, oldSmoothPixmap); -#endif } /*! diff --git a/src/declarative/fx/qfxpainteditem.h b/src/declarative/fx/qfxpainteditem.h index 7a0a9a9..e74ead0 100644 --- a/src/declarative/fx/qfxpainteditem.h +++ b/src/declarative/fx/qfxpainteditem.h @@ -66,11 +66,7 @@ public: QFxPaintedItem(QFxItem *parent=0); ~QFxPaintedItem(); -#if defined(QFX_RENDER_QPAINTER) void paintContents(QPainter &painter); -#elif defined(QFX_RENDER_OPENGL) - void paintGLContents(GLPainter &); -#endif bool isSmooth() const; QSize contentsSize() const; @@ -99,7 +95,7 @@ protected Q_SLOTS: private: void init(); Q_DISABLE_COPY(QFxPaintedItem) - Q_DECLARE_PRIVATE(QFxPaintedItem) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxPaintedItem) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxpainteditem_p.h b/src/declarative/fx/qfxpainteditem_p.h index 4e953a0..06e80ff 100644 --- a/src/declarative/fx/qfxpainteditem_p.h +++ b/src/declarative/fx/qfxpainteditem_p.h @@ -54,11 +54,6 @@ // #include <private/qfxitem_p.h> -#include <QtDeclarative/qsimplecanvas.h> - -#if defined(QFX_RENDER_OPENGL) -#include "gltexture.h" -#endif QT_BEGIN_NAMESPACE @@ -77,11 +72,7 @@ public: ~ImageCacheItem() { } int age; QRect area; -#if defined(QFX_RENDER_QPAINTER) QPixmap image; -#else - GLTexture image; -#endif }; QList<ImageCacheItem*> imagecache; diff --git a/src/declarative/fx/qfxpath.cpp b/src/declarative/fx/qfxpath.cpp index 4c241d3..a1b6032 100644 --- a/src/declarative/fx/qfxpath.cpp +++ b/src/declarative/fx/qfxpath.cpp @@ -43,6 +43,7 @@ #include "qfxpath_p.h" #include <private/qfxperf_p.h> #include <private/qbezier_p.h> +#include <QSet> QT_BEGIN_NAMESPACE diff --git a/src/declarative/fx/qfxpathview.cpp b/src/declarative/fx/qfxpathview.cpp index 625d778..f940f68 100644 --- a/src/declarative/fx/qfxpathview.cpp +++ b/src/declarative/fx/qfxpathview.cpp @@ -489,6 +489,7 @@ void QFxPathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *) d->lastPosTime = QTime(); d->stealMouse = false; + ungrabMouse(); } bool QFxPathView::sendMouseEvent(QGraphicsSceneMouseEvent *event) @@ -524,8 +525,8 @@ bool QFxPathView::sendMouseEvent(QGraphicsSceneMouseEvent *event) break; } grabber = static_cast<QFxItem*>(mouseGrabberItem()); - if (grabber && d->stealMouse && !grabber->keepMouseGrab()) - mouseGrabberItem()->ungrabMouse(); + if (grabber && d->stealMouse && !grabber->keepMouseGrab() && grabber != this) + grabMouse(); return d->stealMouse; } else if (!d->lastPosTime.isNull()) { diff --git a/src/declarative/fx/qfxpathview.h b/src/declarative/fx/qfxpathview.h index 159c865..9d91006 100644 --- a/src/declarative/fx/qfxpathview.h +++ b/src/declarative/fx/qfxpathview.h @@ -125,7 +125,7 @@ private: friend class QFxPathViewAttached; static QHash<QObject*, QObject*> attachedProperties; Q_DISABLE_COPY(QFxPathView) - Q_DECLARE_PRIVATE(QFxPathView) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxPathView) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxpathview_p.h b/src/declarative/fx/qfxpathview_p.h index b77c2a0..63c8224 100644 --- a/src/declarative/fx/qfxpathview_p.h +++ b/src/declarative/fx/qfxpathview_p.h @@ -87,7 +87,7 @@ public: Q_Q(QFxPathView); _offset = 0; q->setAcceptedMouseButtons(Qt::NoButton); - q->setOptions(QSimpleCanvasItem::MouseFilter | QSimpleCanvasItem::MouseEvents | QSimpleCanvasItem::IsFocusRealm); + q->setOptions(QFxItem::ChildMouseFilter | QFxItem::MouseEvents | QFxItem::IsFocusRealm); q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked())); } diff --git a/src/declarative/fx/qfxpixmap.cpp b/src/declarative/fx/qfxpixmap.cpp index 5ee6528..ac8a701 100644 --- a/src/declarative/fx/qfxpixmap.cpp +++ b/src/declarative/fx/qfxpixmap.cpp @@ -46,6 +46,7 @@ #include <private/qfxperf_p.h> #include <QtDeclarative/qmlengine.h> #include <QFile> +#include <QtCore/qdebug.h> QT_BEGIN_NAMESPACE class QSharedNetworkReply; diff --git a/src/declarative/fx/qfxpixmap.h b/src/declarative/fx/qfxpixmap.h index ae693c1..f63299b 100644 --- a/src/declarative/fx/qfxpixmap.h +++ b/src/declarative/fx/qfxpixmap.h @@ -44,9 +44,8 @@ #include <QtCore/QString> #include <QtGui/QPixmap> -#include <QtDeclarative/qsimplecanvas.h> #include <QtDeclarative/qfxglobal.h> - +#include <QtCore/qurl.h> QT_BEGIN_HEADER diff --git a/src/declarative/fx/qfxrect.cpp b/src/declarative/fx/qfxrect.cpp index b521d00..2ad8536 100644 --- a/src/declarative/fx/qfxrect.cpp +++ b/src/declarative/fx/qfxrect.cpp @@ -251,17 +251,8 @@ QFxRect::QFxRect(QFxRectPrivate &dd, QFxItem *parent) void QFxRect::doUpdate() { -#if defined(QFX_RENDER_QPAINTER) Q_D(QFxRect); d->rectImage = QPixmap(); -#endif -#if defined(QFX_RENDER_OPENGL) - Q_D(QFxRect); - if (d->rectTexture) { - d->rectTexture->release(); - d->rectTexture = 0; - } -#endif const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0; setPaintMargin((pw+1)/2); update(); @@ -361,25 +352,10 @@ void QFxRect::setRadius(qreal radius) return; d->radius = radius; -#if defined(QFX_RENDER_QPAINTER) d->rectImage = QPixmap(); -#elif defined(QFX_RENDER_OPENGL) - if (d->rectTexture) { - d->rectTexture->release(); - d->rectTexture = 0; - } -#endif update(); } -void QFxRect::dump(int depth) -{ - Q_D(QFxRect); - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << "QFxRect:" << d->color; - QFxItem::dump(depth); -} - /*! \qmlproperty color Rect::color This property holds the color used to fill the rect. @@ -412,15 +388,7 @@ void QFxRect::setColor(const QColor &c) return; d->color = c; -#if defined(QFX_RENDER_QPAINTER) d->rectImage = QPixmap(); -#endif -#if defined(QFX_RENDER_OPENGL) - if (d->rectTexture) { - d->rectTexture->release(); - d->rectTexture = 0; - } -#endif update(); } @@ -488,7 +456,6 @@ QColor QFxRectPrivate::getColor() } -#if defined(QFX_RENDER_QPAINTER) void QFxRect::generateRoundedRect() { Q_D(QFxRect); @@ -535,72 +502,7 @@ void QFxRect::generateBorderedRect() p.drawRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw)); } } -#elif defined(QFX_RENDER_OPENGL) -void QFxRect::generateRoundedRect() -{ - Q_D(QFxRect); - if (!d->rectTexture) { - const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0; - QString key = QString("QFxRect://r_%1_%2_%3_%4").arg(pw).arg(d->radius).arg((d->pen && d->pen->isValid())?d->pen->color().name():QString()).arg(d->color.name()); - - d->rectTexture = cachedTexture(key); - - if (!d->rectTexture) { - QPixmap roundRect(d->radius*2 + 4 + pw*2, d->radius*2 + 4 + pw*2); - roundRect.fill(Qt::transparent); - QPainter p(&roundRect); - p.setRenderHint(QPainter::Antialiasing); - if (d->pen && d->pen->isValid()) { - QPen pn(QColor(pen()->color()), pen()->width()); - p.setPen(pn); - } else { - p.setPen(Qt::NoPen); - } - p.setBrush(d->color); - if (pw%2) - p.drawRoundedRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, roundRect.width()-(pw+1), roundRect.height()-(pw+1)), d->radius, d->radius); - else - p.drawRoundedRect(QRectF(qreal(pw)/2, qreal(pw)/2, roundRect.width()-pw, roundRect.height()-pw), d->radius, d->radius); - - d->rectTexture = cachedTexture(key, roundRect); - } - } -} - -void QFxRect::generateBorderedRect() -{ - Q_D(QFxRect); - if (!d->rectTexture) { - const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0; - QString key = QString("QFxRect://b_%1_%2_%3_%4").arg(pw).arg(d->radius).arg((d->pen && d->pen->isValid())?d->pen->color().name():QString()).arg(d->color.name()); - - d->rectTexture = cachedTexture(key); - - if (!d->rectTexture) { - QPixmap borderedRect(pw*2 + 4, pw*2 + 4); - borderedRect.fill(Qt::transparent); - QPainter p(&(borderedRect)); - p.setRenderHint(QPainter::Antialiasing); - if (d->pen && d->pen->isValid()) { - QPen pn(QColor(pen()->color()), pen()->width()); - pn.setJoinStyle(Qt::MiterJoin); - p.setPen(pn); - } else { - p.setPen(Qt::NoPen); - } - p.setBrush(d->color); - if (pw%2) - p.drawRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, borderedRect.width()-(pw+1), borderedRect.height()-(pw+1))); - else - p.drawRect(QRectF(qreal(pw)/2, qreal(pw)/2, borderedRect.width()-pw, borderedRect.height()-pw)); - d->rectTexture = cachedTexture(key, borderedRect); - } - } -} -#endif - -#if defined(QFX_RENDER_QPAINTER) void QFxRect::paintContents(QPainter &p) { Q_D(QFxRect); @@ -701,258 +603,5 @@ void QFxRect::drawRect(QPainter &p) QRect(d->rectImage.width()-xOffset, d->rectImage.height() - yOffset, xOffset, yOffset)); } } -#endif - -#if defined(QFX_RENDER_OPENGL2) -#include "glbasicshaders.h" - -void QFxRect::paintGLContents(GLPainter &p) -{ - Q_D(QFxRect); - if (d->radius == 0 && (!d->pen || !d->pen->isValid())) { - if (d->gradient) { - float widthV = width(); - float heightV = height(); - - GLfloat vertices[] = { 0, heightV, - widthV, heightV, - 0, 0, - widthV, 0 }; - - int count = d->gradient->stops()->size(); - GLfloat colors[count*8]; - for (int i = 0; i < count; i += 8) { - QFxGradientStop *g = d->gradient->stops()->at(i); - QColor c = g->color(); - colors[i] = c.redF(); colors[i+4] = colors[i]; - colors[i+1] = c.greenF(); colors[i+5] = colors[i+1]; - colors[i+2] = c.blueF(); colors[i+6] = colors[i+2]; - colors[i+3] = c.alphaF() * p.activeOpacity; colors[i+7] = colors[i+3]; - } - - p.invalidate(); - ColorShader *shader = basicShaders()->color(); - shader->enable(); - shader->setTransform(p.activeTransform); - - shader->setAttributeArray(ColorShader::Vertices, vertices, 2); - shader->setAttributeArray(ColorShader::Colors, colors, 4); - glDrawArrays(GL_TRIANGLE_STRIP, 0, count*2); - shader->disableAttributeArray(ColorShader::Vertices); - shader->disableAttributeArray(ColorShader::Colors); - } else { - - p.fillRect(QRectF(0, 0, width(), height()), d->getColor()); - - } - } else { - qreal offset = 0; - qreal pw = d->pen && d->pen->isValid() ? d->pen->width() : 0.0; - - if (d->radius > 0) { - generateRoundedRect(); - offset = d->radius + pw+1.5; - } else { - generateBorderedRect(); - offset = pw+1.5; - } - - QGLShaderProgram *shader = p.useTextureShader(); - - float texWidth = d->rectTexture->width(); - float texHeight = d->rectTexture->height(); - if (!texWidth || !texHeight) - return; - - float widthV = qreal(width())+pw/2; - float heightV = qreal(height())+pw/2; - - float xOffset = offset; - bool xMiddles = true; - if (xOffset*2 > width()+pw) { - xMiddles = false; - xOffset = (width()+pw)/2; - } - float yOffset = offset; - bool yMiddles = true; - if (yOffset*2 > height()+pw) { - yMiddles = false; - yOffset = (height()+pw)/2; - } - - float texleft = xOffset / texWidth; - float imgleft = xOffset-pw/2; - float texright = (texWidth-xOffset) / texWidth; - float imgright = widthV - xOffset; - - float textop = yOffset / texHeight; - float imgtop = yOffset-pw/2; - float texbottom = (texHeight-yOffset) / texHeight; - float imgbottom = heightV - yOffset; - - //Bug 231768: Inappropriate interpolation was occuring on 3x3 textures - if (offset==1) - texleft=texright=textop=texbottom=0.5; - - texleft *= d->rectTexture->glWidth(); - texright *= d->rectTexture->glWidth(); - textop *= d->rectTexture->glHeight(); - texbottom *= d->rectTexture->glHeight(); - - float vert1[] = { -pw/2, -pw/2, - -pw/2, imgtop, - imgleft, -pw/2, - - -pw/2, imgtop, - imgleft, -pw/2, - imgleft, imgtop, - - imgleft, -pw/2, - imgleft, imgtop, - imgright, -pw/2, - - imgleft, imgtop, - imgright, -pw/2, - imgright, imgtop, - - imgright, -pw/2, - imgright, imgtop, - widthV, -pw/2, - - imgright, imgtop, - widthV, -pw/2, - widthV, imgtop, - - -pw/2, heightV, - -pw/2, imgbottom, - imgleft, heightV, - - -pw/2, imgbottom, - imgleft, heightV, - imgleft, imgbottom, - - imgleft, heightV, - imgleft, imgbottom, - imgright, heightV, - - imgleft, imgbottom, - imgright, heightV, - imgright, imgbottom, - - imgright, heightV, - imgright, imgbottom, - widthV, heightV, - - imgright, imgbottom, - widthV, heightV, - widthV, imgbottom, - - -pw/2, imgtop, - -pw/2, imgbottom, - imgleft, imgtop, - - -pw/2, imgbottom, - imgleft, imgtop, - imgleft, imgbottom, - - imgleft, imgtop, - imgleft, imgbottom, - imgright, imgtop, - - imgleft, imgbottom, - imgright, imgtop, - imgright, imgbottom, - - imgright, imgtop, - imgright, imgbottom, - widthV, imgtop, - - imgright, imgbottom, - widthV, imgtop, - widthV, imgbottom }; - - - float tex1[] = { 0, 0, - 0, textop, - texleft, 0, - - 0, textop, - texleft, 0, - texleft, textop, - - texleft, 0, - texleft, textop, - texright, 0, - - texleft, textop, - texright, 0, - texright, textop, - - texright, 0, - texright, textop, - d->rectTexture->glWidth(), 0, - - texright, textop, - d->rectTexture->glWidth(), 0, - d->rectTexture->glWidth(), textop, - - 0, d->rectTexture->glHeight(), - 0, texbottom, - texleft, d->rectTexture->glHeight(), - - 0, texbottom, - texleft, d->rectTexture->glHeight(), - texleft, texbottom, - - texleft, d->rectTexture->glHeight(), - texleft, texbottom, - texright, d->rectTexture->glHeight(), - - texleft, texbottom, - texright, d->rectTexture->glHeight(), - texright, texbottom, - - texright, d->rectTexture->glHeight(), - texright, texbottom, - d->rectTexture->glWidth(), d->rectTexture->glHeight(), - - texright, texbottom, - d->rectTexture->glWidth(), d->rectTexture->glHeight(), - d->rectTexture->glWidth(), texbottom, - - 0, textop, - 0, texbottom, - texleft, textop, - - 0, texbottom, - texleft, textop, - texleft, texbottom, - - texleft, textop, - texleft, texbottom, - texright, textop, - - texleft, texbottom, - texright, textop, - texright, texbottom, - - texright, textop, - texright, texbottom, - d->rectTexture->glWidth(), textop, - - texright, texbottom, - d->rectTexture->glWidth(), textop, - d->rectTexture->glWidth(), texbottom }; - - - - glBindTexture(GL_TEXTURE_2D, d->rectTexture->texture()); - - shader->setAttributeArray(SingleTextureShader::Vertices, vert1, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, tex1, 2); - glDrawArrays(GL_TRIANGLES, 0, 36 + (yMiddles?18:0)); - } -} -#endif QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxrect.h b/src/declarative/fx/qfxrect.h index 2b35d8d..7790af1 100644 --- a/src/declarative/fx/qfxrect.h +++ b/src/declarative/fx/qfxrect.h @@ -43,6 +43,7 @@ #define QFXRECT_H #include <QtDeclarative/qfxitem.h> +#include <QtGui/qbrush.h> QT_BEGIN_HEADER @@ -156,14 +157,7 @@ public: qreal radius() const; void setRadius(qreal radius); - virtual void dump(int depth); -#if defined(QFX_RENDER_QPAINTER) void paintContents(QPainter &painter); -#endif - -#if defined(QFX_RENDER_OPENGL) - void paintGLContents(GLPainter &); -#endif private Q_SLOTS: void doUpdate(); @@ -179,7 +173,7 @@ protected: private: Q_DISABLE_COPY(QFxRect) - Q_DECLARE_PRIVATE(QFxRect) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxRect) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxrect_p.h b/src/declarative/fx/qfxrect_p.h index 23bb944..3544d36 100644 --- a/src/declarative/fx/qfxrect_p.h +++ b/src/declarative/fx/qfxrect_p.h @@ -55,10 +55,6 @@ #include "qfxitem_p.h" -#if defined(QFX_RENDER_OPENGL) -#include "gltexture.h" -#endif - QT_BEGIN_NAMESPACE class QFxGradient; @@ -69,9 +65,6 @@ class QFxRectPrivate : public QFxItemPrivate public: QFxRectPrivate() : -#if defined(QFX_RENDER_OPENGL) - rectTexture(0), -#endif //QFX_RENDER_OPENGL color(Qt::white), gradient(0), pen(0), radius(0) { } @@ -85,9 +78,6 @@ public: { } -#if defined(QFX_RENDER_OPENGL) - QSimpleCanvasItem::CachedTexture *rectTexture; -#endif QColor getColor(); QColor color; QFxGradient *gradient; diff --git a/src/declarative/fx/qfxreflectionfilter.cpp b/src/declarative/fx/qfxreflectionfilter.cpp deleted file mode 100644 index c66deb7..0000000 --- a/src/declarative/fx/qfxreflectionfilter.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfxreflectionfilter.h" - -#if defined(QFX_RENDER_OPENGL2) -#include <glsave.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <glbasicshaders.h> -#include <gltexture.h> -#endif - -QT_BEGIN_NAMESPACE -class QFxReflectionFilterPrivate -{ -public: - QFxReflectionFilterPrivate() - : alpha(1), height(-1), offset(0), scale(1) - { - } - qreal alpha; - int height; - int offset; - qreal scale; -}; - -/*! - \qmlclass Reflection - \inherits Filter - \brief The Reflection filter reflects an item and its contents. - - Here is an example of various Reflections applied to an image. - - \qml -HorizontalLayout { - Image { - source: "icon.png" - filter: Reflection { } - } - Image { - source: "icon.png" - filter: Reflection { offset: 1 } - } - Image { - source: "icon.png" - filter: Reflection { offset: 1; alpha: 0.5 } - } - Image { - source: "icon.png" - filter: Reflection { offset: 1; alpha: 0.5; height: 50 } - } - Image { - source: "icon.png" - filter: Reflection { offset: 1; alpha: 0.5; height: 50; scale: 0.5 } - } -} - \endqml - - \image reflection_example.png - - Reflection is only supported when Qt Declarative is compiled for OpenGL ES 2.0. - Otherwise the Reflection filter has no effect. -*/ - -/*! - \internal - \class QFxReflectionFilter - \ingroup group_effects - \brief The QFxReflectionFilter class allows you to add a reflection to an item. -*/ -QFxReflectionFilter::QFxReflectionFilter(QObject *parent) -: QSimpleCanvasFilter(parent), d(new QFxReflectionFilterPrivate) -{ -} - -QFxReflectionFilter::~QFxReflectionFilter() -{ - delete d; d = 0; -} - -/*! - \property QFxReflectionFilter::alpha - \brief the starting opacity of the reflection. - - The starting opacity is the opacity closest to the item. The opacity will fade - from this value to zero over the height of the reflection. -*/ -qreal QFxReflectionFilter::alpha() const -{ - return d->alpha; -} - -void QFxReflectionFilter::setAlpha(qreal a) -{ - if (d->alpha == a) return; - d->alpha = a; - emit alphaChanged(a); - update(); -} - -/*! - \qmlproperty int Reflection::height - - The height property controls how much of the item, in pixels, to reflect. - If it is set to the default value of -1, the whole item is reflected. If - it is set to 50, the bottom 50 pixels of the item are reflected. Data - binding could be used to reflect a percentage of the item. - - \qml -Image { - id: myImage - source: "album.png" - filter: Reflection { - height: myImage.height * 0.5 - } -} - \endqml - */ -/*! - \qmlproperty int Reflection::offset - - The offset controls how far from the base of the item, in pixels, the - start of the reflection is placed. This can be used to create a nice - sliver of space between the item and its reflection or for more advanced - effects. - - The default offset is 0 pixels. -*/ - -/*! - \qmlproperty real Reflection::alpha - - The alpha value controls the starting opacity of the reflected item. If - set to the default value of 1, the reflected item starts completely opaque - and gradually fades to completely transparent. If set to less than one, the - reflection starts out partially transparent as though the item was sitting - on a visually less reflective surface. - - Valid values are from 0 (which would be silly, but is allowed) to 1. -*/ -/*! - \qmlproperty real Reflection::scale - - When set to the default value of 1, the reflection is a 1:1 reflection of - the item. That is, each horizontal pixel in the item corresponds to one - horizontal pixel in the reflection. - - When set a value other than 1, the reflection is scaled acordingly - less - than 1 scales it down and greater than 1 scales it up. The scale is applied - after the height parameter and does not effect the reflection offset. -*/ - -/*! - \property QFxReflectionFilter::height - \brief the height of the reflection, in pixels. -*/ -int QFxReflectionFilter::height() const -{ - return d->height; -} - -void QFxReflectionFilter::setHeight(int h) -{ - if (d->height == h) return; - d->height = h; - emit heightChanged(h); - update(); -} - -/*! - \property QFxReflectionFilter::offset - \brief the distance of the reflection from the item, in pixels. -*/ -int QFxReflectionFilter::offset() -{ - return d->offset; -} - -void QFxReflectionFilter::setOffset(int o) -{ - if (d->offset == o) return; - d->offset = o; - emit offsetChanged(o); - update(); -} - -/*! - \property QFxReflectionFilter::scale - \brief the scale of the reflection relative to the item. -*/ -qreal QFxReflectionFilter::scale() const -{ - return d->scale; -} - -void QFxReflectionFilter::setScale(qreal s) -{ - if (d->scale == s) return; - d->scale = s; - emit scaleChanged(s); - update(); -} - -static inline float floatmin(float a, float b) -{ - return (a < b)?a:b; -} - -void QFxReflectionFilter::filterGL(QSimpleCanvasItem::GLPainter &p) -{ -#if defined(QFX_RENDER_OPENGL2) - QSimpleCanvasItem *item = this->item(); - - QRect r = item->itemBoundingRect(); - if (r.isEmpty()) - return; - float width = r.width(); - float height = r.height(); - - float refHeight = height; - if (d->height > 0) - refHeight = floatmin(height, d->height); - - QSimpleCanvas::Matrix simpMat; - QSimpleCanvasItem *simpItem = 0; - if (isSimpleItem(&simpItem, &simpMat) && - simpItem->glSimpleItemData(0, 0, 0, 0)) { - - GLfloat vertices[8]; - GLfloat texVertices[8]; - GLTexture *texture = 0; - - simpItem->glSimpleItemData(vertices, texVertices, &texture, 8); - - GLfloat opacity[4]; - - float invRefHeight = 1. / refHeight; - for (int ii = 0; ii < 4; ++ii) { - float vertex = vertices[ii * 2 + 1]; - float o = (1. - (height - vertex) * invRefHeight); - opacity[ii] = o * d->alpha * p.activeOpacity; - } - - QSimpleCanvas::Matrix trans = p.activeTransform; - trans.rotate(180, 1, 0, 0); - trans.translate(0, -r.height() - d->offset); - if (d->scale != 1) - trans.scale(1, d->scale, 1); - trans.translate(0, -r.height()); - trans *= simpMat; - - glBindTexture(GL_TEXTURE_2D, texture->texture()); - - SingleTextureVertexOpacityShader *shader = - item->basicShaders()->singleTextureVertexOpacity(); - shader->enable(); - shader->setTransform(trans); - shader->setAttributeArray(SingleTextureVertexOpacityShader::Vertices, vertices, 2); - shader->setAttributeArray(SingleTextureVertexOpacityShader::TextureCoords, texVertices, 2); - shader->setAttributeArray(SingleTextureVertexOpacityShader::OpacityCoords, opacity, 1); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::Vertices); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::TextureCoords); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::OpacityCoords); - - } else { - QGLFramebufferObject *fbo = renderToFBO(); - - float texWidth = width / float(fbo->width()); - float texHeight = refHeight / float(fbo->height()); - - GLfloat invVertices[] = { width, height + d->scale * refHeight + d->offset, - 0, height + d->scale * refHeight + d->offset, - width, height + d->offset, - 0, height + d->offset }; - GLfloat invTexVertices[] = { texWidth, texHeight, - 0, texHeight, - texWidth, 0, - 0, 0 }; - GLfloat invOpacity[] = { 0, 0, d->alpha * p.activeOpacity, d->alpha * p.activeOpacity}; - - glBindTexture(GL_TEXTURE_2D, fbo->texture()); - - SingleTextureVertexOpacityShader *shader = - item->basicShaders()->singleTextureVertexOpacity(); - shader->enable(); - shader->setTransform(p.activeTransform); - shader->setAttributeArray(SingleTextureVertexOpacityShader::Vertices, invVertices, 2); - shader->setAttributeArray(SingleTextureVertexOpacityShader::TextureCoords, invTexVertices, 2); - shader->setAttributeArray(SingleTextureVertexOpacityShader::OpacityCoords, invOpacity, 1); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::Vertices); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::TextureCoords); - shader->disableAttributeArray(SingleTextureVertexOpacityShader::OpacityCoords); - - releaseFBO(fbo); - } - - renderToScreen(); - -#else - Q_UNUSED(p); -#endif -} - -QRectF QFxReflectionFilter::itemBoundingRect(const QRectF &r) const -{ - QRectF rv = r; - rv |= r.translated(0, r.height() + d->offset); - return rv; -} - -QML_DEFINE_TYPE(QFxReflectionFilter,Reflection) -QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxreflectionfilter.h b/src/declarative/fx/qfxreflectionfilter.h deleted file mode 100644 index d862040..0000000 --- a/src/declarative/fx/qfxreflectionfilter.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFXREFLECTIONFILTER_H -#define QFXREFLECTIONFILTER_H - -#include <QtDeclarative/qsimplecanvasfilter.h> -#include <QtDeclarative/qml.h> - - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) -class QFxReflectionFilterPrivate; -class Q_DECLARATIVE_EXPORT QFxReflectionFilter : public QSimpleCanvasFilter -{ - Q_OBJECT - - Q_PROPERTY(qreal alpha READ alpha WRITE setAlpha NOTIFY alphaChanged) - Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged) - Q_PROPERTY(int offset READ offset WRITE setOffset NOTIFY offsetChanged) - Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) -public: - QFxReflectionFilter(QObject *parent=0); - virtual ~QFxReflectionFilter(); - - qreal alpha() const; - void setAlpha(qreal); - int height() const; - void setHeight(int); - int offset(); - void setOffset(int); - qreal scale() const; - void setScale(qreal); - -Q_SIGNALS: - void alphaChanged(qreal); - void heightChanged(int); - void offsetChanged(int); - void scaleChanged(qreal); - -protected: - virtual void filterGL(QSimpleCanvasItem::GLPainter &p); - virtual QRectF itemBoundingRect(const QRectF &r) const; - -private: - Q_DISABLE_COPY(QFxReflectionFilter) - QFxReflectionFilterPrivate *d; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QFxReflectionFilter) - -QT_END_HEADER - -#endif // QFXREFLECTIONFILTER_H diff --git a/src/declarative/fx/qfxrepeater.cpp b/src/declarative/fx/qfxrepeater.cpp index 0211ebb..a4dc809 100644 --- a/src/declarative/fx/qfxrepeater.cpp +++ b/src/declarative/fx/qfxrepeater.cpp @@ -57,12 +57,13 @@ QFxRepeaterPrivate::~QFxRepeaterPrivate() QFxItem *QFxRepeaterPrivate::addItem(QmlContext *ctxt, QFxItem *lastItem) { + Q_UNUSED(lastItem) Q_Q(QFxRepeater); QObject *nobj = component->create(ctxt); QFxItem *item = qobject_cast<QFxItem *>(nobj); if (item) { item->setParent(q->itemParent()); - item->stackUnder(lastItem); +// item->stackUnder(lastItem); deletables << nobj; } else { delete nobj; @@ -243,7 +244,7 @@ void QFxRepeater::componentComplete() /*! \internal */ -void QFxRepeater::parentChanged(QSimpleCanvasItem *o, QSimpleCanvasItem *n) +void QFxRepeater::parentChanged(QFxItem *o, QFxItem *n) { QFxItem::parentChanged(o, n); regenerate(); diff --git a/src/declarative/fx/qfxrepeater.h b/src/declarative/fx/qfxrepeater.h index b82b9b0..6f950d3 100644 --- a/src/declarative/fx/qfxrepeater.h +++ b/src/declarative/fx/qfxrepeater.h @@ -73,12 +73,12 @@ private: protected: virtual void componentComplete(); - virtual void parentChanged(QSimpleCanvasItem *, QSimpleCanvasItem *); + virtual void parentChanged(QFxItem *, QFxItem *); QFxRepeater(QFxRepeaterPrivate &dd, QFxItem *parent); private: Q_DISABLE_COPY(QFxRepeater) - Q_DECLARE_PRIVATE(QFxRepeater) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxRepeater) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxscalegrid.h b/src/declarative/fx/qfxscalegrid.h index 03b2dd3..986bcda 100644 --- a/src/declarative/fx/qfxscalegrid.h +++ b/src/declarative/fx/qfxscalegrid.h @@ -45,7 +45,6 @@ #include <QtCore/QString> #include <QtCore/QObject> #include <QtDeclarative/qfxglobal.h> -#include <QtDeclarative/qsimplecanvas.h> #include <QtDeclarative/qfxpixmap.h> #include <QtDeclarative/qml.h> diff --git a/src/declarative/fx/qfxshadowfilter.cpp b/src/declarative/fx/qfxshadowfilter.cpp deleted file mode 100644 index d37d565..0000000 --- a/src/declarative/fx/qfxshadowfilter.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfxshadowfilter.h" - -#if defined(QFX_RENDER_OPENGL2) -#include <glsave.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <glbasicshaders.h> -#endif - -QT_BEGIN_NAMESPACE - -class QFxShadowFilterPrivate -{ -public: - QFxShadowFilterPrivate() - : x(0), y(0) - { - } - - int x; - int y; -}; - -/*! - \qmlclass Shadow - \brief The Shadow filter casts a drop shadow. - \inherits Filter - - Shadows work on all visual elements - including transparent and masked - images. - - \table - \row - \o \image shadow_example.png - \o - \qml -Rect { - radius: 5 - color: "lightsteelblue" - width: 100 - height: 100 - filter: Shadow { - yOffset: 8 - xOffset: 8 - } -} - -Image { - source: "pics/qtlogo.png" - filter: Shadow { - yOffset: 8 - xOffset: 8 - } -} - \endqml - \endtable - - Shadows are only supported when Qt Qt Declarative is compiled for OpenGL ES 2.0. - Otherwise the Shadow filter has no effect. -*/ - -/*! - \internal - \class QFxShadowFilter - \ingroup group_effects - \brief The QFxShadowFilter class allows you to add a shadow to an item. -*/ - -QFxShadowFilter::QFxShadowFilter(QObject *parent) -: QSimpleCanvasFilter(parent), d(new QFxShadowFilterPrivate) -{ -} - -QFxShadowFilter::~QFxShadowFilter() -{ - delete d; d = 0; -} - -/*! - \qmlproperty int Shadow::xOffset - \qmlproperty int Shadow::yOffset - - Specify the x and y offset of the shadow relative to the item. -*/ - -int QFxShadowFilter::xOffset() const -{ - return d->x; -} - -/*! - \property QFxShadowFilter::xOffset - \brief the x offset of the shadow relative to the item. -*/ -void QFxShadowFilter::setXOffset(int offset) -{ - if (d->x == offset) return; - d->x = offset; - emit offsetChanged(d->x, d->y); -} - -/*! - \property QFxShadowFilter::yOffset - \brief the y offset of the shadow relative to the item. -*/ -int QFxShadowFilter::yOffset() const -{ - return d->y; -} - -void QFxShadowFilter::setYOffset(int offset) -{ - if (d->y == offset) return; - d->y = offset; - emit offsetChanged(d->x, d->y); -} - -QRectF QFxShadowFilter::itemBoundingRect(const QRectF &r) const -{ - QRectF rv = r; - rv |= r.translated(xOffset(), yOffset()); - return rv; -} - -void QFxShadowFilter::filterGL(QSimpleCanvasItem::GLPainter &p) -{ -#if defined(QFX_RENDER_OPENGL2) - - QSimpleCanvasItem *item = this->item(); - - QRect r = item->itemBoundingRect(); - - QGLFramebufferObject *fbo = renderToFBO(); - - float width = r.width(); - float height = r.height(); - - float texWidth = width / float(fbo->width()); - float texHeight = height / float(fbo->height()); - - GLfloat vertices[] = { d->x, height + d->y, - width + d->x, height + d->y, - d->x, d->y, - d->x + width, d->y }; - GLfloat texVertices[] = { 0, 0, - texWidth, 0, - 0, texHeight, - texWidth, texHeight }; - - SingleTextureShadowShader *shader = item->basicShaders()->singleTextureShadow(); - shader->enable(); - shader->setOpacity(0.8 * p.activeOpacity); - shader->setTransform(p.activeTransform); - - shader->setAttributeArray(SingleTextureShadowShader::Vertices, vertices, 2); - shader->setAttributeArray(SingleTextureShadowShader::TextureCoords, texVertices, 2); - - glBindTexture(GL_TEXTURE_2D, fbo->texture()); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - shader->disableAttributeArray(SingleTextureShadowShader::Vertices); - shader->disableAttributeArray(SingleTextureShadowShader::TextureCoords); - - releaseFBO(fbo); - - renderToScreen(); -#else - Q_UNUSED(p); -#endif -} - -QML_DEFINE_TYPE(QFxShadowFilter,Shadow) - -QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxshadowfilter.h b/src/declarative/fx/qfxshadowfilter.h deleted file mode 100644 index 1cbe54f..0000000 --- a/src/declarative/fx/qfxshadowfilter.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFXSHADOWFILTER_H -#define QFXSHADOWFILTER_H - -#include <QtDeclarative/qsimplecanvasfilter.h> -#include <QtDeclarative/qml.h> - - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) -class QFxShadowFilterPrivate; -class Q_DECLARATIVE_EXPORT QFxShadowFilter : public QSimpleCanvasFilter -{ - Q_OBJECT - Q_PROPERTY(int xOffset READ xOffset WRITE setXOffset NOTIFY offsetChanged) - Q_PROPERTY(int yOffset READ yOffset WRITE setYOffset NOTIFY offsetChanged) -public: - QFxShadowFilter(QObject *parent=0); - virtual ~QFxShadowFilter(); - - int xOffset() const; - void setXOffset(int offset); - - int yOffset() const; - void setYOffset(int offset); - -Q_SIGNALS: - void offsetChanged(int, int); - -protected: - virtual QRectF itemBoundingRect(const QRectF &) const; - virtual void filterGL(QSimpleCanvasItem::GLPainter &p); - -private: - QFxShadowFilterPrivate *d; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QFxShadowFilter) - -QT_END_HEADER - -#endif // QFXSHADOWFILTER_H diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp index 57897ed..8618b87 100644 --- a/src/declarative/fx/qfxtext.cpp +++ b/src/declarative/fx/qfxtext.cpp @@ -43,11 +43,6 @@ #include "qfxtext_p.h" #include <private/qtextcontrol_p.h> - -#if defined(QFX_RENDER_OPENGL2) -#include "glbasicshaders.h" -#endif - #include <private/qfxperf_p.h> #include <QTextLayout> #include <QTextLine> @@ -580,13 +575,6 @@ void QFxTextPrivate::updateSize() // ### text layout handling should be profiled and optimized as needed // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine); -void QFxText::dump(int depth) -{ - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << propertyInfo(); - QFxItem::dump(depth); -} - QString QFxText::propertyInfo() const { Q_D(const QFxText); @@ -765,10 +753,6 @@ void QFxTextPrivate::checkImgCache() break; } -#if defined(QFX_RENDER_OPENGL) - tex.setImage(imgCache.toImage(), GLTexture::PowerOfTwo); -#endif - imgDirty = false; } @@ -787,7 +771,6 @@ void QFxText::setSmoothTransform(bool s) update(); } -#if defined(QFX_RENDER_QPAINTER) void QFxText::paintContents(QPainter &p) { Q_D(QFxText); @@ -847,85 +830,6 @@ void QFxText::paintContents(QPainter &p) } } -#elif defined(QFX_RENDER_OPENGL2) -void QFxText::paintGLContents(GLPainter &p) -{ - //return; - Q_D(QFxText); - d->checkImgCache(); - if (d->imgCache.isNull()) - return; - - int w = width(); - int h = height(); - - float x = 0; - float y = 0; - - switch (d->hAlign) { - case AlignLeft: - x = 0; - break; - case AlignRight: - x = w - d->imgCache.width(); - break; - case AlignHCenter: - x = (w - d->imgCache.width()) / 2; - break; - } - - switch (d->vAlign) { - case AlignTop: - y = 0; - break; - case AlignBottom: - y = h - d->imgCache.height(); - break; - case AlignVCenter: - y = (h - d->imgCache.height()) / 2; - break; - } - - float widthV = d->imgCache.width(); - float heightV = d->imgCache.height(); - float glWidth = d->tex.glWidth(); - float glHeight = d->tex.glHeight(); - - QGLShaderProgram *shader = p.useTextureShader(); - - float deltaX = 0.5 / qreal(d->tex.glSize().width()); - float deltaY = 0.5 / qreal(d->tex.glSize().height()); - glWidth -= deltaX; - glHeight -= deltaY; - - GLfloat vertices[] = { x, y + heightV, - x + widthV, y + heightV, - x, y, - - x + widthV, y + heightV, - x, y, - x + widthV, y }; - - GLfloat texVertices[] = { deltaX, deltaY, - glWidth, deltaY, - deltaX, glHeight, - - glWidth, deltaY, - deltaX, glHeight, - glWidth, glHeight }; - - shader->setAttributeArray(SingleTextureShader::Vertices, vertices, 2); - shader->setAttributeArray(SingleTextureShader::TextureCoords, texVertices, 2); - - glBindTexture(GL_TEXTURE_2D, d->tex.texture()); - glDrawArrays(GL_TRIANGLES, 0, 6); - - shader->disableAttributeArray(SingleTextureShader::Vertices); - shader->disableAttributeArray(SingleTextureShader::TextureCoords); -} - -#endif - void QFxText::componentComplete() { Q_D(QFxText); diff --git a/src/declarative/fx/qfxtext.h b/src/declarative/fx/qfxtext.h index bd91f0e..b7ec333 100644 --- a/src/declarative/fx/qfxtext.h +++ b/src/declarative/fx/qfxtext.h @@ -125,14 +125,9 @@ public: bool smoothTransform() const; void setSmoothTransform(bool); - virtual void dump(int depth); virtual QString propertyInfo() const; -#if defined(QFX_RENDER_QPAINTER) void paintContents(QPainter &p); -#elif defined(QFX_RENDER_OPENGL) - void paintGLContents(GLPainter &); -#endif virtual void componentComplete(); @@ -153,7 +148,7 @@ protected: private: Q_DISABLE_COPY(QFxText) - Q_DECLARE_PRIVATE(QFxText) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxText) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxtext_p.h b/src/declarative/fx/qfxtext_p.h index 670b685..6692d9e 100644 --- a/src/declarative/fx/qfxtext_p.h +++ b/src/declarative/fx/qfxtext_p.h @@ -58,10 +58,6 @@ #include "qml.h" #include <QtGui/qtextlayout.h> -#if defined(QFX_RENDER_OPENGL) -#include "gltexture.h" -#endif - QT_BEGIN_NAMESPACE class QTextLayout; @@ -116,9 +112,6 @@ public: QColor styleColor; QString activeLink; bool imgDirty; -#if defined(QFX_RENDER_OPENGL) - GLTexture tex; -#endif QPixmap imgCache; QPixmap imgStyleCache; QFxText::HAlignment hAlign; diff --git a/src/declarative/fx/qfxtextedit.cpp b/src/declarative/fx/qfxtextedit.cpp index c2bda6f..5a62727 100644 --- a/src/declarative/fx/qfxtextedit.cpp +++ b/src/declarative/fx/qfxtextedit.cpp @@ -41,13 +41,7 @@ #include <qfxtextedit.h> #include "qfxtextedit_p.h" - #include <private/qtextcontrol_p.h> - -#if defined(QFX_RENDER_OPENGL2) -#include "glbasicshaders.h" -#endif - #include <private/qfxperf_p.h> #include "qfxevents_p.h" #include <QTextLayout> @@ -72,7 +66,6 @@ TextEdit { id: edit text: "<b>Hello</b> <i>World!</i>" focus: true - focusable: true font.family: "Helvetica" font.size: 20 color: "blue" @@ -542,7 +535,7 @@ void QFxTextEdit::loadCursorDelegate() d->cursor->setHeight(QFontMetrics(d->font.font()).height()); moveCursorDelegate(); }else{ - qWarning() << "Error loading cursor delegate for TextEdit:" + objectName(); + qWarning() << QLatin1String("Error loading cursor delegate for TextEdit:") + objectName(); } } @@ -686,16 +679,6 @@ void QFxTextEdit::geometryChanged(const QRectF &newGeometry, } /*! - \internal -*/ -void QFxTextEdit::dump(int depth) -{ - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << propertyInfo(); - QFxPaintedItem::dump(depth); -} - -/*! \internal */ QString QFxTextEdit::propertyInfo() const diff --git a/src/declarative/fx/qfxtextedit.h b/src/declarative/fx/qfxtextedit.h index 80636e2..77fac29 100644 --- a/src/declarative/fx/qfxtextedit.h +++ b/src/declarative/fx/qfxtextedit.h @@ -161,7 +161,6 @@ public: qreal textMargin() const; void setTextMargin(qreal margin); - virtual void dump(int depth); virtual QString propertyInfo() const; virtual void componentComplete(); @@ -229,7 +228,7 @@ private: friend class QmlFont; Q_DISABLE_COPY(QFxTextEdit) - Q_DECLARE_PRIVATE(QFxTextEdit) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxTextEdit) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxtextedit_p.h b/src/declarative/fx/qfxtextedit_p.h index b7d667e..45a8a60 100644 --- a/src/declarative/fx/qfxtextedit_p.h +++ b/src/declarative/fx/qfxtextedit_p.h @@ -71,7 +71,7 @@ public: : font(0), color("black"), imgDirty(true), hAlign(QFxTextEdit::AlignLeft), vAlign(QFxTextEdit::AlignTop), dirty(false), wrap(false), richText(false), cursorVisible(false), focusOnPress(false), preserveSelection(true), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), - cursor(0), cursorComponent(0), format(QFxTextEdit::AutoText), document(0) + cursorComponent(0), cursor(0), format(QFxTextEdit::AutoText), document(0) { } @@ -89,9 +89,6 @@ public: QString style; QColor styleColor; bool imgDirty; -#if defined(QFX_RENDER_OPENGL) - GLTexture texture; -#endif QPixmap imgCache; QPixmap imgStyleCache; QFxTextEdit::HAlignment hAlign; diff --git a/src/declarative/fx/qfxtransform.cpp b/src/declarative/fx/qfxtransform.cpp index 0f0ce80..f08d830 100644 --- a/src/declarative/fx/qfxtransform.cpp +++ b/src/declarative/fx/qfxtransform.cpp @@ -71,9 +71,9 @@ bool QFxTransform::isIdentity() const return true; } -QSimpleCanvas::Matrix QFxTransform::transform() const +QTransform QFxTransform::transform() const { - return QSimpleCanvas::Matrix(); + return QTransform(); } void QFxTransform::update() @@ -181,7 +181,6 @@ bool QFxScale::isIdentity() const return (_xScale == 1. && _yScale == 1.); } -#if defined(QFX_RENDER_QPAINTER) QTransform QFxScale::transform() const { if (_dirty) { @@ -193,19 +192,6 @@ QTransform QFxScale::transform() const } return _transform; } -#elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxScale::transform() const -{ - if (_dirty) { - _transform = QMatrix4x4(); - _dirty = false; - _transform.translate(_originX, _originY); - _transform.scale(_xScale, _yScale); - _transform.translate(-_originX, -_originY); - } - return _transform; -} -#endif void QFxScale::update() { @@ -387,7 +373,6 @@ bool QFxRotation::isIdentity() const return (_angle == 0.); } -#if defined(QFX_RENDER_QPAINTER) QTransform QFxRotation::transform() const { if (_dirty) { @@ -399,19 +384,6 @@ QTransform QFxRotation::transform() const } return _transform; } -#elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxRotation::transform() const -{ - if (_dirty) { - _transform = QMatrix4x4(); - _dirty = false; - _transform.translate(_originX, _originY); - _transform.rotate(_angle, 0, 0, 1); - _transform.translate(-_originX, -_originY); - } - return _transform; -} -#endif void QFxRotation::update() { @@ -484,7 +456,6 @@ bool QFxRotation3D::isIdentity() const return (_angle == 0.) || (_axis.endZ() == 0. && _axis.endY() == _axis.startY() && _axis.endX() == _axis.startX()); } -#if defined(QFX_RENDER_QPAINTER) const qreal inv_dist_to_plane = 1. / 1024.; QTransform QFxRotation3D::transform() const { @@ -529,29 +500,6 @@ QTransform QFxRotation3D::transform() const return _transform; } -#elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxRotation3D::transform() const -{ - if (_dirty) { - _dirty = false; - _transform = QMatrix4x4(); - - if (!isIdentity()) { - if (angle() != 0.) { - qreal x = _axis.endX() - _axis.startX(); - qreal y = _axis.endY() - _axis.startY(); - qreal z = _axis.endZ(); - - _transform.translate(_axis.startX(), _axis.startY(), 0); - _transform.rotate(angle(), x, y, z); - _transform.translate(-_axis.startX(), -_axis.startY(), 0); - } - } - } - - return _transform; -} -#endif void QFxRotation3D::update() { @@ -639,7 +587,6 @@ bool QFxTranslation3D::isIdentity() const return (_distance == 0.) || (_axis.endZ() == 0. && _axis.endY() == _axis.startY() && _axis.endX() == _axis.startX()); } -#if defined(QFX_RENDER_QPAINTER) QTransform QFxTranslation3D::transform() const { if (_dirty) { @@ -659,35 +606,14 @@ QTransform QFxTranslation3D::transform() const return _transform; } -#elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxTranslation3D::transform() const -{ - if (_dirty) { - _dirty = false; - _transform = QMatrix4x4(); - - if (!isIdentity()) { - if (distance() != 0.) - _transform.translate((_axis.endX() - _axis.startX()) * distance(), - (_axis.endY() - _axis.startY()) * distance(), - (_axis.endZ()) * distance()); - - } - } - - return _transform; -} -#endif void QFxTranslation3D::update() { _dirty = true; -#if !defined(QFX_RENDER_OPENGL) if (_axis.endZ() != 0. && distance() != 0.) { qmlInfo(this) << "QTransform cannot translate along Z-axis."; } -#endif QFxTransform::update(); } @@ -712,24 +638,6 @@ QFxPerspective::~QFxPerspective() { } -#if defined(QFX_RENDER_OPENGL) -bool QFxPerspective::isIdentity() const -{ - return false; -} - -QMatrix4x4 QFxPerspective::transform() const -{ - QMatrix4x4 rv; - rv.translate(_x, _y); - rv.perspective(_angle, _aspect, 1, 1024 * 1024); - rv.translate(-_x, -_y, -1); - rv.scale(1, 1, 1. / _scale); - - return rv; -} -#endif - /*! \qmlproperty real Perspective::angle */ @@ -996,7 +904,6 @@ bool QFxSquish::isIdentity() const return false; } -#if defined(QFX_RENDER_QPAINTER) QTransform QFxSquish::transform() const { QPolygonF poly; @@ -1008,21 +915,5 @@ QTransform QFxSquish::transform() const QTransform::quadToQuad(poly, poly2, t); return t; } -#elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxSquish::transform() const -{ - QPolygonF poly; - poly << p << QPointF(p.x() + s.width(), p.y()) << QPointF(p.x() + s.width(), p.y() + s.height()) << QPointF(p.x(), p.y() + s.height()); - QPolygonF poly2; - poly2 << p1 << p2 << p4 << p3; - - QTransform t; - QMatrix4x4 rv; - if (QTransform::quadToQuad(poly, poly2, t)) - rv = QMatrix4x4(t); - - return rv; -} -#endif QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxtransform.h b/src/declarative/fx/qfxtransform.h index e0bd276..fb49294 100644 --- a/src/declarative/fx/qfxtransform.h +++ b/src/declarative/fx/qfxtransform.h @@ -44,9 +44,6 @@ #include <QtCore/QObject> #include <QtGui/QTransform> -#if defined(QFX_RENDER_OPENGL) -#include <QtGui/qmatrix4x4.h> -#endif #include <QtDeclarative/qfxitem.h> QT_BEGIN_HEADER @@ -65,7 +62,7 @@ public: void update(); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; }; class Q_DECLARATIVE_EXPORT QFxScale : public QFxTransform @@ -93,7 +90,7 @@ public: void setYScale(qreal); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; Q_SIGNALS: void scaleChanged(); @@ -107,7 +104,7 @@ private: qreal _yScale; mutable bool _dirty; - mutable QSimpleCanvas::Matrix _transform; + mutable QTransform _transform; }; class Q_DECLARATIVE_EXPORT QFxAxis : public QObject @@ -170,7 +167,7 @@ public: void setAngle(qreal); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; Q_SIGNALS: void angleChanged(); @@ -183,7 +180,7 @@ private: qreal _angle; mutable bool _dirty; - mutable QSimpleCanvas::Matrix _transform; + mutable QTransform _transform; }; class Q_DECLARATIVE_EXPORT QFxRotation3D : public QFxTransform @@ -202,7 +199,7 @@ public: void setAngle(qreal); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; private Q_SLOTS: void update(); @@ -211,7 +208,7 @@ private: qreal _angle; mutable bool _dirty; - mutable QSimpleCanvas::Matrix _transform; + mutable QTransform _transform; }; class Q_DECLARATIVE_EXPORT QFxTranslation3D : public QFxTransform @@ -230,7 +227,7 @@ public: void setDistance(qreal); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; private Q_SLOTS: void update(); @@ -239,7 +236,7 @@ private: qreal _distance; mutable bool _dirty; - mutable QSimpleCanvas::Matrix _transform; + mutable QTransform _transform; }; class Q_DECLARATIVE_EXPORT QFxPerspective : public QFxTransform @@ -270,10 +267,6 @@ public: qreal scale() const { return _scale; } void setScale(qreal v) { _scale = v; update(); } -#if defined(QFX_RENDER_OPENGL) - virtual bool isIdentity() const; - virtual QMatrix4x4 transform() const; -#endif private: qreal _scale; qreal _x; @@ -339,7 +332,7 @@ public: void setbottomRight_x(qreal); virtual bool isIdentity() const; - virtual QSimpleCanvas::Matrix transform() const; + virtual QTransform transform() const; private: QPointF p; diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp index d3ab4cc..eb10df3 100644 --- a/src/declarative/fx/qfxvisualitemmodel.cpp +++ b/src/declarative/fx/qfxvisualitemmodel.cpp @@ -51,6 +51,7 @@ #include "qmlopenmetaobject.h" #include "qmllistaccessor.h" #include "qfxvisualitemmodel.h" +#include <QtCore/qdebug.h> QML_DECLARE_TYPE(QListModelInterface) diff --git a/src/declarative/fx/qfxwebview.cpp b/src/declarative/fx/qfxwebview.cpp index c6a8ebf..7149455 100644 --- a/src/declarative/fx/qfxwebview.cpp +++ b/src/declarative/fx/qfxwebview.cpp @@ -56,19 +56,9 @@ #include "qmlstate.h" #include "qfxtransform.h" #include "qfxscalegrid.h" -#include "qsimplecanvas.h" #include "qlistmodelinterface.h" -#if defined(QFX_RENDER_OPENGL2) -#include <QtOpenGL/qglframebufferobject.h> -#include <glsave.h> -#endif -#if defined(QFX_RENDER_OPENGL) -#include <gltexture.h> -#endif - #include "qfxwebview.h" -#include <qsimplecanvasfilter.h> #include <private/qfxpainteditem_p.h> QT_BEGIN_NAMESPACE @@ -247,7 +237,6 @@ void QFxWebView::init() setAcceptedMouseButtons(Qt::LeftButton); setOptions(HasContents | MouseEvents); - setFocusable(true); d->page = 0; } @@ -465,11 +454,51 @@ void QFxWebView::paintPage(const QRect& r) update(); } -void QFxWebView::dump(int depth) +/*! + \qmlproperty int WebView::cacheSize + + This property holds the maximum number of pixels of image cache to + allow. The default is 0.1 megapixels. The cache will not be larger + than the (unscaled) size of the WebView. +*/ + +/*! + \property QFxWebView::cacheSize + + The maximum number of pixels of image cache to allow. The default + is 0.1 megapixels. The cache will not be larger than the (unscaled) + size of the QFxWebView. +*/ +int QFxWebView::cacheSize() const { - QByteArray ba(depth * 4, ' '); - qWarning() << ba.constData() << "url:" << url(); - QFxPaintedItem::dump(depth); + Q_D(const QFxWebView); + return d->max_imagecache_size; +} + +void QFxWebView::setCacheSize(int pixels) +{ + Q_D(QFxWebView); + if (pixels < d->max_imagecache_size) { + int cachesize=0; + for (int i=0; i<d->imagecache.count(); ++i) { + QRect area = d->imagecache[i]->area; + cachesize += area.width()*area.height(); + } + while (d->imagecache.count() && cachesize > pixels) { + int oldest=-1; + int age=-1; + for (int i=0; i<d->imagecache.count(); ++i) { + int a = d->imagecache[i]->age; + if (a > age) { + oldest = i; + age = a; + } + } + cachesize -= d->imagecache[oldest]->area.width()*d->imagecache[oldest]->area.height(); + d->imagecache.removeAt(oldest); + } + } + d->max_imagecache_size = pixels; } void QFxWebView::drawContents(QPainter *p, const QRect &r) diff --git a/src/declarative/fx/qfxwebview.h b/src/declarative/fx/qfxwebview.h index f5fd721..ab20281 100644 --- a/src/declarative/fx/qfxwebview.h +++ b/src/declarative/fx/qfxwebview.h @@ -139,7 +139,6 @@ public: QAction *forwardAction() const; QAction *stopAction() const; - virtual void dump(int depth); virtual QString propertyInfo() const; QWebPage *page() const; @@ -160,6 +159,9 @@ public: QString status() const; + int cacheSize() const; + void setCacheSize(int pixels); + Q_SIGNALS: void idealWidthChanged(); void idealHeightChanged(); @@ -204,7 +206,7 @@ private: void init(); virtual void componentComplete(); Q_DISABLE_COPY(QFxWebView) - Q_DECLARE_PRIVATE(QFxWebView) + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxWebView) }; QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxwidgetcontainer.cpp b/src/declarative/fx/qfxwidgetcontainer.cpp index 421c2f7..ea702db 100644 --- a/src/declarative/fx/qfxwidgetcontainer.cpp +++ b/src/declarative/fx/qfxwidgetcontainer.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qfxwidgetcontainer.h" -#include <qsimplecanvas.h> #include <qgraphicswidget.h> QT_BEGIN_NAMESPACE @@ -83,17 +82,7 @@ void QFxWidgetContainer::setGraphicsWidget(QGraphicsWidget *widget) _graphicsWidget = widget; - QSimpleCanvas *c = canvas(); - if (!c) - return; - - if (c->canvasMode() != QSimpleCanvas::GraphicsView) { - qWarning("QFxWidgetContainer: Cannot add a widget to a non-graphicsview canvas. You might need to set QFX_USE_GRAPHICSVIEW=1"); - return; - } - - QGraphicsItem *item = (QGraphicsItem *)(*this); - _graphicsWidget->setParentItem(item); + _graphicsWidget->setParentItem(this); } void QFxWidgetContainer::canvasChanged() |