aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/debugger/qdeclarativedebugtrace_p.h2
-rw-r--r--src/declarative/declarative.pro1
-rw-r--r--src/declarative/graphicsitems/graphicsitems.pri94
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanchors.cpp1165
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanchors_p.h206
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanchors_p_p.h170
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp404
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h116
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage_p_p.h87
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage.cpp617
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage_p.h111
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage_p_p.h106
-rw-r--r--src/declarative/graphicsitems/qdeclarativeevents.cpp237
-rw-r--r--src/declarative/graphicsitems/qdeclarativeevents_p_p.h141
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable.cpp1799
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable_p.h229
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable_p_p.h241
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflipable.cpp254
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflipable_p.h100
-rw-r--r--src/declarative/graphicsitems/qdeclarativefocuspanel.cpp89
-rw-r--r--src/declarative/graphicsitems/qdeclarativefocuspanel_p.h78
-rw-r--r--src/declarative/graphicsitems/qdeclarativefocusscope.cpp73
-rw-r--r--src/declarative/graphicsitems/qdeclarativefocusscope_p.h69
-rw-r--r--src/declarative/graphicsitems/qdeclarativegraphicswidget.cpp125
-rw-r--r--src/declarative/graphicsitems/qdeclarativegraphicswidget_p.h90
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp3130
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview_p.h288
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage.cpp584
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage_p.h100
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage_p_p.h79
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase.cpp284
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase_p.h116
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h93
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp92
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h100
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h90
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp3814
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.h235
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem_p.h633
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitemchangelistener_p.h76
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp261
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitemsmodule_p.h63
-rw-r--r--src/declarative/graphicsitems/qdeclarativelayoutitem.cpp112
-rw-r--r--src/declarative/graphicsitems/qdeclarativelayoutitem_p.h94
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp3614
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview_p.h372
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader.cpp597
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader_p.h108
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader_p_p.h91
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea.cpp988
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea_p.h218
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea_p_p.h128
-rw-r--r--src/declarative/graphicsitems/qdeclarativepainteditem.cpp497
-rw-r--r--src/declarative/graphicsitems/qdeclarativepainteditem_p.h118
-rw-r--r--src/declarative/graphicsitems/qdeclarativepainteditem_p_p.h90
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp1729
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p.h252
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p_p.h192
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea.cpp607
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea_p.h313
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea_p_p.h115
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners.cpp1392
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners_p.h239
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners_p_p.h173
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle.cpp587
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle_p.h188
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle_p_p.h112
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater.cpp447
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater_p.h110
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater_p_p.h82
-rw-r--r--src/declarative/graphicsitems/qdeclarativescalegrid.cpp213
-rw-r--r--src/declarative/graphicsitems/qdeclarativescalegrid_p_p.h134
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext.cpp1640
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p.h213
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p_p.h143
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp1888
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p.h307
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p_p.h138
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp2010
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p.h306
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p_p.h156
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextlayout.cpp391
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextlayout_p.h75
-rw-r--r--src/declarative/graphicsitems/qdeclarativetranslate.cpp125
-rw-r--r--src/declarative/graphicsitems/qdeclarativetranslate_p.h89
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp1425
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h257
-rw-r--r--src/declarative/items/qsgitem.cpp4
-rw-r--r--src/declarative/items/qsgitem.h1
-rw-r--r--src/declarative/items/qsgtext_p_p.h2
-rw-r--r--src/declarative/qml/qdeclarative.h3
-rw-r--r--src/declarative/qml/qdeclarativeboundsignal_p.h4
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp2
-rw-r--r--src/declarative/qml/qdeclarativecontext_p.h2
-rw-r--r--src/declarative/qml/qdeclarativedata_p.h2
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp27
-rw-r--r--src/declarative/qml/qdeclarativeengine_p.h3
-rw-r--r--src/declarative/qml/qdeclarativefastproperties.cpp14
-rw-r--r--src/declarative/qml/qdeclarativefastproperties_p.h11
-rw-r--r--src/declarative/qml/qdeclarativeimport.cpp103
-rw-r--r--src/declarative/qml/qdeclarativemetatype.cpp66
-rw-r--r--src/declarative/qml/qdeclarativemetatype_p.h1
-rw-r--r--src/declarative/qml/qdeclarativenotifier_p.h2
-rw-r--r--src/declarative/qml/qdeclarativenullablevalue_p_p.h (renamed from src/declarative/util/qdeclarativenullablevalue_p_p.h)0
-rw-r--r--src/declarative/qml/qdeclarativepropertycache_p.h2
-rw-r--r--src/declarative/qml/qdeclarativevaluetype.cpp13
-rw-r--r--src/declarative/qml/qdeclarativevaluetype_p.h1
-rw-r--r--src/declarative/qml/qml.pri2
-rw-r--r--src/declarative/qml/rewriter/textwriter_p.h2
-rw-r--r--src/declarative/qml/v4/qdeclarativev4bindings.cpp16
-rw-r--r--src/declarative/qml/v4/qdeclarativev4compiler.cpp14
-rw-r--r--src/declarative/qml/v4/qdeclarativev4compiler_p.h2
-rw-r--r--src/declarative/qml/v4/qdeclarativev4compiler_p_p.h32
-rw-r--r--src/declarative/qml/v4/qdeclarativev4irbuilder.cpp4
-rw-r--r--src/declarative/qml/v8/qv8engine_p.h2
-rw-r--r--src/declarative/qml/v8/qv8qobjectwrapper_p.h2
-rw-r--r--src/declarative/qml/v8/qv8stringwrapper_p.h2
-rw-r--r--src/declarative/util/qdeclarativeanimation.cpp513
-rw-r--r--src/declarative/util/qdeclarativeanimation_p.h69
-rw-r--r--src/declarative/util/qdeclarativeanimation_p_p.h33
-rw-r--r--src/declarative/util/qdeclarativepath.cpp (renamed from src/declarative/graphicsitems/qdeclarativepath.cpp)0
-rw-r--r--src/declarative/util/qdeclarativepath_p.h (renamed from src/declarative/graphicsitems/qdeclarativepath_p.h)2
-rw-r--r--src/declarative/util/qdeclarativepath_p_p.h (renamed from src/declarative/graphicsitems/qdeclarativepath_p_p.h)1
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp1424
-rw-r--r--src/declarative/util/qdeclarativestateoperations_p.h211
-rw-r--r--src/declarative/util/qdeclarativeutilmodule.cpp128
-rw-r--r--src/declarative/util/qdeclarativeutilmodule_p.h1
-rw-r--r--src/declarative/util/qdeclarativeview.cpp737
-rw-r--r--src/declarative/util/qdeclarativeview.h120
-rw-r--r--src/declarative/util/util.pri6
130 files changed, 240 insertions, 43063 deletions
diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h
index 6681d28846..f2710cde93 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace_p.h
+++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h
@@ -63,7 +63,7 @@ struct QDeclarativeDebugData
};
class QUrl;
-class Q_AUTOTEST_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService
+class Q_DECLARATIVE_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService
{
public:
enum Message {
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index 5cb1d9570c..a43dbdac51 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -28,7 +28,6 @@ HEADERS += qtdeclarativeversion.h
#modules
include(util/util.pri)
-include(graphicsitems/graphicsitems.pri)
include(qml/qml.pri)
include(debugger/debugger.pri)
include(scenegraph/scenegraph.pri)
diff --git a/src/declarative/graphicsitems/graphicsitems.pri b/src/declarative/graphicsitems/graphicsitems.pri
deleted file mode 100644
index 9904274023..0000000000
--- a/src/declarative/graphicsitems/graphicsitems.pri
+++ /dev/null
@@ -1,94 +0,0 @@
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/qdeclarativeitemsmodule_p.h \
- $$PWD/qdeclarativeanchors_p.h \
- $$PWD/qdeclarativeanchors_p_p.h \
- $$PWD/qdeclarativeevents_p_p.h \
- $$PWD/qdeclarativeflickable_p.h \
- $$PWD/qdeclarativeflickable_p_p.h \
- $$PWD/qdeclarativeflipable_p.h \
- $$PWD/qdeclarativegridview_p.h \
- $$PWD/qdeclarativeimage_p.h \
- $$PWD/qdeclarativeimagebase_p.h \
- $$PWD/qdeclarativeborderimage_p.h \
- $$PWD/qdeclarativepainteditem_p.h \
- $$PWD/qdeclarativepainteditem_p_p.h \
- $$PWD/qdeclarativeimage_p_p.h \
- $$PWD/qdeclarativeborderimage_p_p.h \
- $$PWD/qdeclarativeimagebase_p_p.h \
- $$PWD/qdeclarativeanimatedimage_p.h \
- $$PWD/qdeclarativeanimatedimage_p_p.h \
- $$PWD/qdeclarativeitem.h \
- $$PWD/qdeclarativeitem_p.h \
- $$PWD/qdeclarativefocuspanel_p.h \
- $$PWD/qdeclarativefocusscope_p.h \
- $$PWD/qdeclarativepositioners_p.h \
- $$PWD/qdeclarativepositioners_p_p.h \
- $$PWD/qdeclarativeloader_p.h \
- $$PWD/qdeclarativeloader_p_p.h \
- $$PWD/qdeclarativemousearea_p.h \
- $$PWD/qdeclarativemousearea_p_p.h \
- $$PWD/qdeclarativepath_p.h \
- $$PWD/qdeclarativepath_p_p.h \
- $$PWD/qdeclarativepathview_p.h \
- $$PWD/qdeclarativepathview_p_p.h \
- $$PWD/qdeclarativerectangle_p.h \
- $$PWD/qdeclarativerectangle_p_p.h \
- $$PWD/qdeclarativerepeater_p.h \
- $$PWD/qdeclarativerepeater_p_p.h \
- $$PWD/qdeclarativescalegrid_p_p.h \
- $$PWD/qdeclarativetranslate_p.h \
- $$PWD/qdeclarativetextinput_p.h \
- $$PWD/qdeclarativetextinput_p_p.h \
- $$PWD/qdeclarativetextedit_p.h \
- $$PWD/qdeclarativetextedit_p_p.h \
- $$PWD/qdeclarativetext_p.h \
- $$PWD/qdeclarativetext_p_p.h \
- $$PWD/qdeclarativevisualitemmodel_p.h \
- $$PWD/qdeclarativelistview_p.h \
- $$PWD/qdeclarativelayoutitem_p.h \
- $$PWD/qdeclarativeitemchangelistener_p.h \
- $$PWD/qdeclarativegraphicswidget_p.h \
- $$PWD/qdeclarativetextlayout_p.h \
- $$PWD/qdeclarativepincharea_p.h \
- $$PWD/qdeclarativepincharea_p_p.h \
- $$PWD/qdeclarativeimplicitsizeitem_p.h \
- $$PWD/qdeclarativeimplicitsizeitem_p_p.h
-
-
-SOURCES += \
- $$PWD/qdeclarativeitemsmodule.cpp \
- $$PWD/qdeclarativeanchors.cpp \
- $$PWD/qdeclarativeevents.cpp \
- $$PWD/qdeclarativeflickable.cpp \
- $$PWD/qdeclarativeflipable.cpp \
- $$PWD/qdeclarativegridview.cpp \
- $$PWD/qdeclarativeimage.cpp \
- $$PWD/qdeclarativeborderimage.cpp \
- $$PWD/qdeclarativeimagebase.cpp \
- $$PWD/qdeclarativeanimatedimage.cpp \
- $$PWD/qdeclarativepainteditem.cpp \
- $$PWD/qdeclarativeitem.cpp \
- $$PWD/qdeclarativefocuspanel.cpp \
- $$PWD/qdeclarativefocusscope.cpp \
- $$PWD/qdeclarativepositioners.cpp \
- $$PWD/qdeclarativeloader.cpp \
- $$PWD/qdeclarativemousearea.cpp \
- $$PWD/qdeclarativepath.cpp \
- $$PWD/qdeclarativepathview.cpp \
- $$PWD/qdeclarativerectangle.cpp \
- $$PWD/qdeclarativerepeater.cpp \
- $$PWD/qdeclarativescalegrid.cpp \
- $$PWD/qdeclarativetranslate.cpp \
- $$PWD/qdeclarativetextinput.cpp \
- $$PWD/qdeclarativetext.cpp \
- $$PWD/qdeclarativetextedit.cpp \
- $$PWD/qdeclarativevisualitemmodel.cpp \
- $$PWD/qdeclarativelistview.cpp \
- $$PWD/qdeclarativelayoutitem.cpp \
- $$PWD/qdeclarativegraphicswidget.cpp \
- $$PWD/qdeclarativetextlayout.cpp \
- $$PWD/qdeclarativepincharea.cpp \
- $$PWD/qdeclarativeimplicitsizeitem.cpp
-
diff --git a/src/declarative/graphicsitems/qdeclarativeanchors.cpp b/src/declarative/graphicsitems/qdeclarativeanchors.cpp
deleted file mode 100644
index c15384e632..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanchors.cpp
+++ /dev/null
@@ -1,1165 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeanchors_p_p.h"
-
-#include "qdeclarativeitem.h"
-#include "private/qdeclarativeitem_p.h"
-
-#include <qdeclarativeinfo.h>
-
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-//TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
-//TODO: support non-parent, non-sibling (need to find lowest common ancestor)
-
-static qreal hcenter(QGraphicsItem *i)
-{
- QGraphicsItemPrivate *item = QGraphicsItemPrivate::get(i);
-
- qreal width = item->width();
- int iw = width;
- if (iw % 2)
- return (width + 1) / 2;
- else
- return width / 2;
-}
-
-static qreal vcenter(QGraphicsItem *i)
-{
- QGraphicsItemPrivate *item = QGraphicsItemPrivate::get(i);
-
- qreal height = item->height();
- int ih = height;
- if (ih % 2)
- return (height + 1) / 2;
- else
- return height / 2;
-}
-
-//### const item?
-//local position
-static qreal position(QGraphicsObject *item, QDeclarativeAnchorLine::AnchorLine anchorLine)
-{
- qreal ret = 0.0;
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(item);
- switch(anchorLine) {
- case QDeclarativeAnchorLine::Left:
- ret = item->x();
- break;
- case QDeclarativeAnchorLine::Right:
- ret = item->x() + d->width();
- break;
- case QDeclarativeAnchorLine::Top:
- ret = item->y();
- break;
- case QDeclarativeAnchorLine::Bottom:
- ret = item->y() + d->height();
- break;
- case QDeclarativeAnchorLine::HCenter:
- ret = item->x() + hcenter(item);
- break;
- case QDeclarativeAnchorLine::VCenter:
- ret = item->y() + vcenter(item);
- break;
- case QDeclarativeAnchorLine::Baseline:
- if (d->isDeclarativeItem)
- ret = item->y() + static_cast<QDeclarativeItem*>(item)->baselineOffset();
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-//position when origin is 0,0
-static qreal adjustedPosition(QGraphicsObject *item, QDeclarativeAnchorLine::AnchorLine anchorLine)
-{
- qreal ret = 0.0;
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(item);
- switch(anchorLine) {
- case QDeclarativeAnchorLine::Left:
- ret = 0.0;
- break;
- case QDeclarativeAnchorLine::Right:
- ret = d->width();
- break;
- case QDeclarativeAnchorLine::Top:
- ret = 0.0;
- break;
- case QDeclarativeAnchorLine::Bottom:
- ret = d->height();
- break;
- case QDeclarativeAnchorLine::HCenter:
- ret = hcenter(item);
- break;
- case QDeclarativeAnchorLine::VCenter:
- ret = vcenter(item);
- break;
- case QDeclarativeAnchorLine::Baseline:
- if (d->isDeclarativeItem)
- ret = static_cast<QDeclarativeItem*>(item)->baselineOffset();
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-QDeclarativeAnchors::QDeclarativeAnchors(QObject *parent)
- : QObject(*new QDeclarativeAnchorsPrivate(0), parent)
-{
- qFatal("QDeclarativeAnchors::QDeclarativeAnchors(QObject*) called");
-}
-
-QDeclarativeAnchors::QDeclarativeAnchors(QGraphicsObject *item, QObject *parent)
- : QObject(*new QDeclarativeAnchorsPrivate(item), parent)
-{
-}
-
-QDeclarativeAnchors::~QDeclarativeAnchors()
-{
- Q_D(QDeclarativeAnchors);
- d->remDepend(d->fill);
- d->remDepend(d->centerIn);
- d->remDepend(d->left.item);
- d->remDepend(d->right.item);
- d->remDepend(d->top.item);
- d->remDepend(d->bottom.item);
- d->remDepend(d->vCenter.item);
- d->remDepend(d->hCenter.item);
- d->remDepend(d->baseline.item);
-}
-
-void QDeclarativeAnchorsPrivate::fillChanged()
-{
- Q_Q(QDeclarativeAnchors);
- if (!fill || !isItemComplete())
- return;
-
- if (updatingFill < 2) {
- ++updatingFill;
-
- qreal horizontalMargin = q->mirrored() ? rightMargin : leftMargin;
-
- if (fill == item->parentItem()) { //child-parent
- setItemPos(QPointF(horizontalMargin, topMargin));
- } else if (fill->parentItem() == item->parentItem()) { //siblings
- setItemPos(QPointF(fill->x()+horizontalMargin, fill->y()+topMargin));
- }
- QGraphicsItemPrivate *fillPrivate = QGraphicsItemPrivate::get(fill);
- setItemSize(QSizeF(fillPrivate->width()-leftMargin-rightMargin, fillPrivate->height()-topMargin-bottomMargin));
-
- --updatingFill;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on fill.");
- }
-
-}
-
-void QDeclarativeAnchorsPrivate::centerInChanged()
-{
- Q_Q(QDeclarativeAnchors);
- if (!centerIn || fill || !isItemComplete())
- return;
-
- if (updatingCenterIn < 2) {
- ++updatingCenterIn;
-
- qreal effectiveHCenterOffset = q->mirrored() ? -hCenterOffset : hCenterOffset;
- if (centerIn == item->parentItem()) {
- QPointF p(hcenter(item->parentItem()) - hcenter(item) + effectiveHCenterOffset,
- vcenter(item->parentItem()) - vcenter(item) + vCenterOffset);
- setItemPos(p);
-
- } else if (centerIn->parentItem() == item->parentItem()) {
- QPointF p(centerIn->x() + hcenter(centerIn) - hcenter(item) + effectiveHCenterOffset,
- centerIn->y() + vcenter(centerIn) - vcenter(item) + vCenterOffset);
- setItemPos(p);
- }
-
- --updatingCenterIn;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on centerIn.");
- }
-}
-
-void QDeclarativeAnchorsPrivate::clearItem(QGraphicsObject *item)
-{
- if (!item)
- return;
- if (fill == item)
- fill = 0;
- if (centerIn == item)
- centerIn = 0;
- if (left.item == item) {
- left.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::LeftAnchor;
- }
- if (right.item == item) {
- right.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::RightAnchor;
- }
- if (top.item == item) {
- top.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::TopAnchor;
- }
- if (bottom.item == item) {
- bottom.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::BottomAnchor;
- }
- if (vCenter.item == item) {
- vCenter.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::VCenterAnchor;
- }
- if (hCenter.item == item) {
- hCenter.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::HCenterAnchor;
- }
- if (baseline.item == item) {
- baseline.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::BaselineAnchor;
- }
-}
-
-void QDeclarativeAnchorsPrivate::addDepend(QGraphicsObject *item)
-{
- if (!item)
- return;
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(item);
- if (itemPrivate->isDeclarativeItem) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(item));
- p->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- } else if(itemPrivate->isWidget) {
- Q_Q(QDeclarativeAnchors);
- QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);
- QObject::connect(widget, SIGNAL(destroyed(QObject*)), q, SLOT(_q_widgetDestroyed(QObject*)));
- QObject::connect(widget, SIGNAL(geometryChanged()), q, SLOT(_q_widgetGeometryChanged()));
- }
-}
-
-void QDeclarativeAnchorsPrivate::remDepend(QGraphicsObject *item)
-{
- if (!item)
- return;
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(item);
- if (itemPrivate->isDeclarativeItem) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(itemPrivate);
- p->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- } else if(itemPrivate->isWidget) {
- Q_Q(QDeclarativeAnchors);
- QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);
- QObject::disconnect(widget, SIGNAL(destroyed(QObject*)), q, SLOT(_q_widgetDestroyed(QObject*)));
- QObject::disconnect(widget, SIGNAL(geometryChanged()), q, SLOT(_q_widgetGeometryChanged()));
- }
-}
-
-bool QDeclarativeAnchorsPrivate::isItemComplete() const
-{
- return componentComplete;
-}
-
-void QDeclarativeAnchors::classBegin()
-{
- Q_D(QDeclarativeAnchors);
- d->componentComplete = false;
-}
-
-void QDeclarativeAnchors::componentComplete()
-{
- Q_D(QDeclarativeAnchors);
- d->componentComplete = true;
-}
-
-bool QDeclarativeAnchors::mirrored()
-{
- Q_D(QDeclarativeAnchors);
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(d->item);
- return itemPrivate->isDeclarativeItem ? static_cast<QDeclarativeItemPrivate *>(itemPrivate)->effectiveLayoutMirror : false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemHeight(qreal v)
-{
- updatingMe = true;
- QGraphicsItemPrivate::get(item)->setHeight(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemWidth(qreal v)
-{
- updatingMe = true;
- QGraphicsItemPrivate::get(item)->setWidth(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemX(qreal v)
-{
- updatingMe = true;
- item->setX(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemY(qreal v)
-{
- updatingMe = true;
- item->setY(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemPos(const QPointF &v)
-{
- updatingMe = true;
- item->setPos(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemSize(const QSizeF &v)
-{
- updatingMe = true;
- if(QGraphicsItemPrivate::get(item)->isWidget)
- static_cast<QGraphicsWidget *>(item)->resize(v);
- else if (QGraphicsItemPrivate::get(item)->isDeclarativeItem)
- static_cast<QDeclarativeItem *>(item)->setSize(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::updateMe()
-{
- if (updatingMe) {
- updatingMe = false;
- return;
- }
-
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::updateOnComplete()
-{
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::_q_widgetDestroyed(QObject *obj)
-{
- clearItem(qobject_cast<QGraphicsObject*>(obj));
-}
-
-void QDeclarativeAnchorsPrivate::_q_widgetGeometryChanged()
-{
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::itemGeometryChanged(QDeclarativeItem *, const QRectF &newG, const QRectF &oldG)
-{
- fillChanged();
- centerInChanged();
- if (newG.x() != oldG.x() || newG.width() != oldG.width())
- updateHorizontalAnchors();
- if (newG.y() != oldG.y() || newG.height() != oldG.height())
- updateVerticalAnchors();
-}
-
-QGraphicsObject *QDeclarativeAnchors::fill() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->fill;
-}
-
-void QDeclarativeAnchors::setFill(QGraphicsObject *f)
-{
- Q_D(QDeclarativeAnchors);
- if (d->fill == f)
- return;
-
- if (!f) {
- d->remDepend(d->fill);
- d->fill = f;
- emit fillChanged();
- return;
- }
- if (f != d->item->parentItem() && f->parentItem() != d->item->parentItem()){
- qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
- return;
- }
- d->remDepend(d->fill);
- d->fill = f;
- d->addDepend(d->fill);
- emit fillChanged();
- d->fillChanged();
-}
-
-void QDeclarativeAnchors::resetFill()
-{
- setFill(0);
-}
-
-QGraphicsObject *QDeclarativeAnchors::centerIn() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->centerIn;
-}
-
-void QDeclarativeAnchors::setCenterIn(QGraphicsObject* c)
-{
- Q_D(QDeclarativeAnchors);
- if (d->centerIn == c)
- return;
-
- if (!c) {
- d->remDepend(d->centerIn);
- d->centerIn = c;
- emit centerInChanged();
- return;
- }
- if (c != d->item->parentItem() && c->parentItem() != d->item->parentItem()){
- qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
- return;
- }
-
- d->remDepend(d->centerIn);
- d->centerIn = c;
- d->addDepend(d->centerIn);
- emit centerInChanged();
- d->centerInChanged();
-}
-
-void QDeclarativeAnchors::resetCenterIn()
-{
- setCenterIn(0);
-}
-
-bool QDeclarativeAnchorsPrivate::calcStretch(const QDeclarativeAnchorLine &edge1,
- const QDeclarativeAnchorLine &edge2,
- qreal offset1,
- qreal offset2,
- QDeclarativeAnchorLine::AnchorLine line,
- qreal &stretch)
-{
- bool edge1IsParent = (edge1.item == item->parentItem());
- bool edge2IsParent = (edge2.item == item->parentItem());
- bool edge1IsSibling = (edge1.item->parentItem() == item->parentItem());
- bool edge2IsSibling = (edge2.item->parentItem() == item->parentItem());
-
- bool invalid = false;
- if ((edge2IsParent && edge1IsParent) || (edge2IsSibling && edge1IsSibling)) {
- stretch = (position(edge2.item, edge2.anchorLine) + offset2)
- - (position(edge1.item, edge1.anchorLine) + offset1);
- } else if (edge2IsParent && edge1IsSibling) {
- stretch = (position(edge2.item, edge2.anchorLine) + offset2)
- - (position(item->parentObject(), line)
- + position(edge1.item, edge1.anchorLine) + offset1);
- } else if (edge2IsSibling && edge1IsParent) {
- stretch = (position(item->parentObject(), line) + position(edge2.item, edge2.anchorLine) + offset2)
- - (position(edge1.item, edge1.anchorLine) + offset1);
- } else
- invalid = true;
-
- return invalid;
-}
-
-void QDeclarativeAnchorsPrivate::updateVerticalAnchors()
-{
- if (fill || centerIn || !isItemComplete())
- return;
-
- if (updatingVerticalAnchor < 2) {
- ++updatingVerticalAnchor;
- QGraphicsItemPrivate *itemPrivate = QGraphicsItemPrivate::get(item);
- if (usedAnchors & QDeclarativeAnchors::TopAnchor) {
- //Handle stretching
- bool invalid = true;
- qreal height = 0.0;
- if (usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- invalid = calcStretch(top, bottom, topMargin, -bottomMargin, QDeclarativeAnchorLine::Top, height);
- } else if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- invalid = calcStretch(top, vCenter, topMargin, vCenterOffset, QDeclarativeAnchorLine::Top, height);
- height *= 2;
- }
- if (!invalid)
- setItemHeight(height);
-
- //Handle top
- if (top.item == item->parentItem()) {
- setItemY(adjustedPosition(top.item, top.anchorLine) + topMargin);
- } else if (top.item->parentItem() == item->parentItem()) {
- setItemY(position(top.item, top.anchorLine) + topMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- //Handle stretching (top + bottom case is handled above)
- if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- qreal height = 0.0;
- bool invalid = calcStretch(vCenter, bottom, vCenterOffset, -bottomMargin,
- QDeclarativeAnchorLine::Top, height);
- if (!invalid)
- setItemHeight(height*2);
- }
-
- //Handle bottom
- if (bottom.item == item->parentItem()) {
- setItemY(adjustedPosition(bottom.item, bottom.anchorLine) - itemPrivate->height() - bottomMargin);
- } else if (bottom.item->parentItem() == item->parentItem()) {
- setItemY(position(bottom.item, bottom.anchorLine) - itemPrivate->height() - bottomMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- //(stetching handled above)
-
- //Handle vCenter
- if (vCenter.item == item->parentItem()) {
- setItemY(adjustedPosition(vCenter.item, vCenter.anchorLine)
- - vcenter(item) + vCenterOffset);
- } else if (vCenter.item->parentItem() == item->parentItem()) {
- setItemY(position(vCenter.item, vCenter.anchorLine) - vcenter(item) + vCenterOffset);
- }
- } else if (usedAnchors & QDeclarativeAnchors::BaselineAnchor) {
- //Handle baseline
- if (baseline.item == item->parentItem()) {
- if (itemPrivate->isDeclarativeItem)
- setItemY(adjustedPosition(baseline.item, baseline.anchorLine)
- - static_cast<QDeclarativeItem *>(item)->baselineOffset() + baselineOffset);
- } else if (baseline.item->parentItem() == item->parentItem()) {
- if (itemPrivate->isDeclarativeItem)
- setItemY(position(baseline.item, baseline.anchorLine)
- - static_cast<QDeclarativeItem *>(item)->baselineOffset() + baselineOffset);
- }
- }
- --updatingVerticalAnchor;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on vertical anchor.");
- }
-}
-
-inline QDeclarativeAnchorLine::AnchorLine reverseAnchorLine(QDeclarativeAnchorLine::AnchorLine anchorLine) {
- if (anchorLine == QDeclarativeAnchorLine::Left) {
- return QDeclarativeAnchorLine::Right;
- } else if (anchorLine == QDeclarativeAnchorLine::Right) {
- return QDeclarativeAnchorLine::Left;
- } else {
- return anchorLine;
- }
-}
-
-void QDeclarativeAnchorsPrivate::updateHorizontalAnchors()
-{
- Q_Q(QDeclarativeAnchors);
- if (fill || centerIn || !isItemComplete())
- return;
-
- if (updatingHorizontalAnchor < 3) {
- ++updatingHorizontalAnchor;
- qreal effectiveRightMargin, effectiveLeftMargin, effectiveHorizontalCenterOffset;
- QDeclarativeAnchorLine effectiveLeft, effectiveRight, effectiveHorizontalCenter;
- QDeclarativeAnchors::Anchor effectiveLeftAnchor, effectiveRightAnchor;
- if (q->mirrored()) {
- effectiveLeftAnchor = QDeclarativeAnchors::RightAnchor;
- effectiveRightAnchor = QDeclarativeAnchors::LeftAnchor;
- effectiveLeft.item = right.item;
- effectiveLeft.anchorLine = reverseAnchorLine(right.anchorLine);
- effectiveRight.item = left.item;
- effectiveRight.anchorLine = reverseAnchorLine(left.anchorLine);
- effectiveHorizontalCenter.item = hCenter.item;
- effectiveHorizontalCenter.anchorLine = reverseAnchorLine(hCenter.anchorLine);
- effectiveLeftMargin = rightMargin;
- effectiveRightMargin = leftMargin;
- effectiveHorizontalCenterOffset = -hCenterOffset;
- } else {
- effectiveLeftAnchor = QDeclarativeAnchors::LeftAnchor;
- effectiveRightAnchor = QDeclarativeAnchors::RightAnchor;
- effectiveLeft = left;
- effectiveRight = right;
- effectiveHorizontalCenter = hCenter;
- effectiveLeftMargin = leftMargin;
- effectiveRightMargin = rightMargin;
- effectiveHorizontalCenterOffset = hCenterOffset;
- }
-
- QGraphicsItemPrivate *itemPrivate = QGraphicsItemPrivate::get(item);
- if (usedAnchors & effectiveLeftAnchor) {
- //Handle stretching
- bool invalid = true;
- qreal width = 0.0;
- if (usedAnchors & effectiveRightAnchor) {
- invalid = calcStretch(effectiveLeft, effectiveRight, effectiveLeftMargin, -effectiveRightMargin, QDeclarativeAnchorLine::Left, width);
- } else if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- invalid = calcStretch(effectiveLeft, effectiveHorizontalCenter, effectiveLeftMargin, effectiveHorizontalCenterOffset, QDeclarativeAnchorLine::Left, width);
- width *= 2;
- }
- if (!invalid)
- setItemWidth(width);
-
- //Handle left
- if (effectiveLeft.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
- } else if (effectiveLeft.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
- }
- } else if (usedAnchors & effectiveRightAnchor) {
- //Handle stretching (left + right case is handled in updateLeftAnchor)
- if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- qreal width = 0.0;
- bool invalid = calcStretch(effectiveHorizontalCenter, effectiveRight, effectiveHorizontalCenterOffset, -effectiveRightMargin,
- QDeclarativeAnchorLine::Left, width);
- if (!invalid)
- setItemWidth(width*2);
- }
-
- //Handle right
- if (effectiveRight.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveRight.item, effectiveRight.anchorLine) - itemPrivate->width() - effectiveRightMargin);
- } else if (effectiveRight.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveRight.item, effectiveRight.anchorLine) - itemPrivate->width() - effectiveRightMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- //Handle hCenter
- if (effectiveHorizontalCenter.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
- } else if (effectiveHorizontalCenter.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
- }
- }
- --updatingHorizontalAnchor;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on horizontal anchor.");
- }
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::top() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->top;
-}
-
-void QDeclarativeAnchors::setTop(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->top == edge)
- return;
-
- d->usedAnchors |= TopAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~TopAnchor;
- return;
- }
-
- d->remDepend(d->top.item);
- d->top = edge;
- d->addDepend(d->top.item);
- emit topChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetTop()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~TopAnchor;
- d->remDepend(d->top.item);
- d->top = QDeclarativeAnchorLine();
- emit topChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::bottom() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->bottom;
-}
-
-void QDeclarativeAnchors::setBottom(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->bottom == edge)
- return;
-
- d->usedAnchors |= BottomAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~BottomAnchor;
- return;
- }
-
- d->remDepend(d->bottom.item);
- d->bottom = edge;
- d->addDepend(d->bottom.item);
- emit bottomChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetBottom()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~BottomAnchor;
- d->remDepend(d->bottom.item);
- d->bottom = QDeclarativeAnchorLine();
- emit bottomChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::verticalCenter() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->vCenter;
-}
-
-void QDeclarativeAnchors::setVerticalCenter(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->vCenter == edge)
- return;
-
- d->usedAnchors |= VCenterAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~VCenterAnchor;
- return;
- }
-
- d->remDepend(d->vCenter.item);
- d->vCenter = edge;
- d->addDepend(d->vCenter.item);
- emit verticalCenterChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetVerticalCenter()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~VCenterAnchor;
- d->remDepend(d->vCenter.item);
- d->vCenter = QDeclarativeAnchorLine();
- emit verticalCenterChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::baseline() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->baseline;
-}
-
-void QDeclarativeAnchors::setBaseline(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->baseline == edge)
- return;
-
- d->usedAnchors |= BaselineAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~BaselineAnchor;
- return;
- }
-
- d->remDepend(d->baseline.item);
- d->baseline = edge;
- d->addDepend(d->baseline.item);
- emit baselineChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetBaseline()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~BaselineAnchor;
- d->remDepend(d->baseline.item);
- d->baseline = QDeclarativeAnchorLine();
- emit baselineChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::left() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->left;
-}
-
-void QDeclarativeAnchors::setLeft(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->left == edge)
- return;
-
- d->usedAnchors |= LeftAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~LeftAnchor;
- return;
- }
-
- d->remDepend(d->left.item);
- d->left = edge;
- d->addDepend(d->left.item);
- emit leftChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetLeft()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~LeftAnchor;
- d->remDepend(d->left.item);
- d->left = QDeclarativeAnchorLine();
- emit leftChanged();
- d->updateHorizontalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::right() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->right;
-}
-
-void QDeclarativeAnchors::setRight(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->right == edge)
- return;
-
- d->usedAnchors |= RightAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~RightAnchor;
- return;
- }
-
- d->remDepend(d->right.item);
- d->right = edge;
- d->addDepend(d->right.item);
- emit rightChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetRight()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~RightAnchor;
- d->remDepend(d->right.item);
- d->right = QDeclarativeAnchorLine();
- emit rightChanged();
- d->updateHorizontalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::horizontalCenter() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->hCenter;
-}
-
-void QDeclarativeAnchors::setHorizontalCenter(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->hCenter == edge)
- return;
-
- d->usedAnchors |= HCenterAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~HCenterAnchor;
- return;
- }
-
- d->remDepend(d->hCenter.item);
- d->hCenter = edge;
- d->addDepend(d->hCenter.item);
- emit horizontalCenterChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetHorizontalCenter()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~HCenterAnchor;
- d->remDepend(d->hCenter.item);
- d->hCenter = QDeclarativeAnchorLine();
- emit horizontalCenterChanged();
- d->updateHorizontalAnchors();
-}
-
-qreal QDeclarativeAnchors::leftMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->leftMargin;
-}
-
-void QDeclarativeAnchors::setLeftMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->leftMargin == offset)
- return;
- d->leftMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateHorizontalAnchors();
- emit leftMarginChanged();
-}
-
-qreal QDeclarativeAnchors::rightMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->rightMargin;
-}
-
-void QDeclarativeAnchors::setRightMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->rightMargin == offset)
- return;
- d->rightMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateHorizontalAnchors();
- emit rightMarginChanged();
-}
-
-qreal QDeclarativeAnchors::margins() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->margins;
-}
-
-void QDeclarativeAnchors::setMargins(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->margins == offset)
- return;
- //###Is it significantly faster to set them directly so we can call fillChanged only once?
- if(!d->rightMargin || d->rightMargin == d->margins)
- setRightMargin(offset);
- if(!d->leftMargin || d->leftMargin == d->margins)
- setLeftMargin(offset);
- if(!d->topMargin || d->topMargin == d->margins)
- setTopMargin(offset);
- if(!d->bottomMargin || d->bottomMargin == d->margins)
- setBottomMargin(offset);
- d->margins = offset;
- emit marginsChanged();
-
-}
-
-qreal QDeclarativeAnchors::horizontalCenterOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->hCenterOffset;
-}
-
-void QDeclarativeAnchors::setHorizontalCenterOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->hCenterOffset == offset)
- return;
- d->hCenterOffset = offset;
- if(d->centerIn)
- d->centerInChanged();
- else
- d->updateHorizontalAnchors();
- emit horizontalCenterOffsetChanged();
-}
-
-qreal QDeclarativeAnchors::topMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->topMargin;
-}
-
-void QDeclarativeAnchors::setTopMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->topMargin == offset)
- return;
- d->topMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateVerticalAnchors();
- emit topMarginChanged();
-}
-
-qreal QDeclarativeAnchors::bottomMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->bottomMargin;
-}
-
-void QDeclarativeAnchors::setBottomMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->bottomMargin == offset)
- return;
- d->bottomMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateVerticalAnchors();
- emit bottomMarginChanged();
-}
-
-qreal QDeclarativeAnchors::verticalCenterOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->vCenterOffset;
-}
-
-void QDeclarativeAnchors::setVerticalCenterOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->vCenterOffset == offset)
- return;
- d->vCenterOffset = offset;
- if(d->centerIn)
- d->centerInChanged();
- else
- d->updateVerticalAnchors();
- emit verticalCenterOffsetChanged();
-}
-
-qreal QDeclarativeAnchors::baselineOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->baselineOffset;
-}
-
-void QDeclarativeAnchors::setBaselineOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->baselineOffset == offset)
- return;
- d->baselineOffset = offset;
- d->updateVerticalAnchors();
- emit baselineOffsetChanged();
-}
-
-QDeclarativeAnchors::Anchors QDeclarativeAnchors::usedAnchors() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->usedAnchors;
-}
-
-bool QDeclarativeAnchorsPrivate::checkHValid() const
-{
- if (usedAnchors & QDeclarativeAnchors::LeftAnchor &&
- usedAnchors & QDeclarativeAnchors::RightAnchor &&
- usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot specify left, right, and hcenter anchors.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkHAnchorValid(QDeclarativeAnchorLine anchor) const
-{
- if (!anchor.item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to a null item.");
- return false;
- } else if (anchor.anchorLine & QDeclarativeAnchorLine::Vertical_Mask) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor a horizontal edge to a vertical edge.");
- return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
- return false;
- } else if (anchor.item == item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor item to self.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkVValid() const
-{
- if (usedAnchors & QDeclarativeAnchors::TopAnchor &&
- usedAnchors & QDeclarativeAnchors::BottomAnchor &&
- usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot specify top, bottom, and vcenter anchors.");
- return false;
- } else if (usedAnchors & QDeclarativeAnchors::BaselineAnchor &&
- (usedAnchors & QDeclarativeAnchors::TopAnchor ||
- usedAnchors & QDeclarativeAnchors::BottomAnchor ||
- usedAnchors & QDeclarativeAnchors::VCenterAnchor)) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkVAnchorValid(QDeclarativeAnchorLine anchor) const
-{
- if (!anchor.item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to a null item.");
- return false;
- } else if (anchor.anchorLine & QDeclarativeAnchorLine::Horizontal_Mask) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor a vertical edge to a horizontal edge.");
- return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
- return false;
- } else if (anchor.item == item){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor item to self.");
- return false;
- }
-
- return true;
-}
-
-QT_END_NAMESPACE
-
-#include <moc_qdeclarativeanchors_p.cpp>
-
diff --git a/src/declarative/graphicsitems/qdeclarativeanchors_p.h b/src/declarative/graphicsitems/qdeclarativeanchors_p.h
deleted file mode 100644
index d222ef5491..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanchors_p.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEANCHORS_H
-#define QDECLARATIVEANCHORS_H
-
-#include "qdeclarativeitem.h"
-
-#include <qdeclarative.h>
-
-#include <QtCore/QObject>
-
-#include <private/qdeclarativeglobal_p.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeAnchorsPrivate;
-class QDeclarativeAnchorLine;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeAnchors : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(QDeclarativeAnchorLine left READ left WRITE setLeft RESET resetLeft NOTIFY leftChanged)
- Q_PROPERTY(QDeclarativeAnchorLine right READ right WRITE setRight RESET resetRight NOTIFY rightChanged)
- Q_PROPERTY(QDeclarativeAnchorLine horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter NOTIFY horizontalCenterChanged)
- Q_PROPERTY(QDeclarativeAnchorLine top READ top WRITE setTop RESET resetTop NOTIFY topChanged)
- Q_PROPERTY(QDeclarativeAnchorLine bottom READ bottom WRITE setBottom RESET resetBottom NOTIFY bottomChanged)
- Q_PROPERTY(QDeclarativeAnchorLine verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter NOTIFY verticalCenterChanged)
- Q_PROPERTY(QDeclarativeAnchorLine baseline READ baseline WRITE setBaseline RESET resetBaseline NOTIFY baselineChanged)
- Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged)
- Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
- Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
- Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged)
- Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin NOTIFY topMarginChanged)
- Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
- Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged)
- Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged)
- Q_PROPERTY(QGraphicsObject *fill READ fill WRITE setFill RESET resetFill NOTIFY fillChanged)
- Q_PROPERTY(QGraphicsObject *centerIn READ centerIn WRITE setCenterIn RESET resetCenterIn NOTIFY centerInChanged)
- Q_PROPERTY(bool mirrored READ mirrored NOTIFY mirroredChanged REVISION 1)
-
-public:
- QDeclarativeAnchors(QObject *parent=0);
- QDeclarativeAnchors(QGraphicsObject *item, QObject *parent=0);
- virtual ~QDeclarativeAnchors();
-
- enum Anchor {
- LeftAnchor = 0x01,
- RightAnchor = 0x02,
- TopAnchor = 0x04,
- BottomAnchor = 0x08,
- HCenterAnchor = 0x10,
- VCenterAnchor = 0x20,
- BaselineAnchor = 0x40,
- Horizontal_Mask = LeftAnchor | RightAnchor | HCenterAnchor,
- Vertical_Mask = TopAnchor | BottomAnchor | VCenterAnchor | BaselineAnchor
- };
- Q_DECLARE_FLAGS(Anchors, Anchor)
-
- QDeclarativeAnchorLine left() const;
- void setLeft(const QDeclarativeAnchorLine &edge);
- void resetLeft();
-
- QDeclarativeAnchorLine right() const;
- void setRight(const QDeclarativeAnchorLine &edge);
- void resetRight();
-
- QDeclarativeAnchorLine horizontalCenter() const;
- void setHorizontalCenter(const QDeclarativeAnchorLine &edge);
- void resetHorizontalCenter();
-
- QDeclarativeAnchorLine top() const;
- void setTop(const QDeclarativeAnchorLine &edge);
- void resetTop();
-
- QDeclarativeAnchorLine bottom() const;
- void setBottom(const QDeclarativeAnchorLine &edge);
- void resetBottom();
-
- QDeclarativeAnchorLine verticalCenter() const;
- void setVerticalCenter(const QDeclarativeAnchorLine &edge);
- void resetVerticalCenter();
-
- QDeclarativeAnchorLine baseline() const;
- void setBaseline(const QDeclarativeAnchorLine &edge);
- void resetBaseline();
-
- qreal leftMargin() const;
- void setLeftMargin(qreal);
-
- qreal rightMargin() const;
- void setRightMargin(qreal);
-
- qreal horizontalCenterOffset() const;
- void setHorizontalCenterOffset(qreal);
-
- qreal topMargin() const;
- void setTopMargin(qreal);
-
- qreal bottomMargin() const;
- void setBottomMargin(qreal);
-
- qreal margins() const;
- void setMargins(qreal);
-
- qreal verticalCenterOffset() const;
- void setVerticalCenterOffset(qreal);
-
- qreal baselineOffset() const;
- void setBaselineOffset(qreal);
-
- QGraphicsObject *fill() const;
- void setFill(QGraphicsObject *);
- void resetFill();
-
- QGraphicsObject *centerIn() const;
- void setCenterIn(QGraphicsObject *);
- void resetCenterIn();
-
- Anchors usedAnchors() const;
-
- void classBegin();
- void componentComplete();
-
- bool mirrored();
-
-Q_SIGNALS:
- void leftChanged();
- void rightChanged();
- void topChanged();
- void bottomChanged();
- void verticalCenterChanged();
- void horizontalCenterChanged();
- void baselineChanged();
- void fillChanged();
- void centerInChanged();
- void leftMarginChanged();
- void rightMarginChanged();
- void topMarginChanged();
- void bottomMarginChanged();
- void marginsChanged();
- void verticalCenterOffsetChanged();
- void horizontalCenterOffsetChanged();
- void baselineOffsetChanged();
- Q_REVISION(1) void mirroredChanged();
-
-private:
- friend class QDeclarativeItem;
- friend class QDeclarativeItemPrivate;
- friend class QDeclarativeGraphicsWidget;
- Q_DISABLE_COPY(QDeclarativeAnchors)
- Q_DECLARE_PRIVATE(QDeclarativeAnchors)
- Q_PRIVATE_SLOT(d_func(), void _q_widgetGeometryChanged())
- Q_PRIVATE_SLOT(d_func(), void _q_widgetDestroyed(QObject *obj))
-};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeAnchors::Anchors)
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeAnchors)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeanchors_p_p.h b/src/declarative/graphicsitems/qdeclarativeanchors_p_p.h
deleted file mode 100644
index 2ceb5a4a73..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanchors_p_p.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEANCHORS_P_H
-#define QDECLARATIVEANCHORS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeanchors_p.h"
-#include "private/qdeclarativeitemchangelistener_p.h"
-#include <private/qobject_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeAnchorLine
-{
-public:
- QDeclarativeAnchorLine() : item(0), anchorLine(Invalid) {}
-
- enum AnchorLine {
- Invalid = 0x0,
- Left = 0x01,
- Right = 0x02,
- Top = 0x04,
- Bottom = 0x08,
- HCenter = 0x10,
- VCenter = 0x20,
- Baseline = 0x40,
- Horizontal_Mask = Left | Right | HCenter,
- Vertical_Mask = Top | Bottom | VCenter | Baseline
- };
-
- QGraphicsObject *item;
- AnchorLine anchorLine;
-};
-
-inline bool operator==(const QDeclarativeAnchorLine& a, const QDeclarativeAnchorLine& b)
-{
- return a.item == b.item && a.anchorLine == b.anchorLine;
-}
-
-class QDeclarativeAnchorsPrivate : public QObjectPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativeAnchors)
-public:
- QDeclarativeAnchorsPrivate(QGraphicsObject *i)
- : componentComplete(true), updatingMe(false), updatingHorizontalAnchor(0),
- updatingVerticalAnchor(0), updatingFill(0), updatingCenterIn(0), item(i), usedAnchors(0), fill(0),
- centerIn(0), leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
- margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)
- {
- }
-
- void clearItem(QGraphicsObject *);
-
- void addDepend(QGraphicsObject *);
- void remDepend(QGraphicsObject *);
- bool isItemComplete() const;
-
- bool componentComplete:1;
- bool updatingMe:1;
- uint updatingHorizontalAnchor:2;
- uint updatingVerticalAnchor:2;
- uint updatingFill:2;
- uint updatingCenterIn:2;
-
- void setItemHeight(qreal);
- void setItemWidth(qreal);
- void setItemX(qreal);
- void setItemY(qreal);
- void setItemPos(const QPointF &);
- void setItemSize(const QSizeF &);
-
- void updateOnComplete();
- void updateMe();
-
- // QDeclarativeItemGeometryListener interface
- void itemGeometryChanged(QDeclarativeItem *, const QRectF &, const QRectF &);
- void _q_widgetDestroyed(QObject *);
- void _q_widgetGeometryChanged();
- QDeclarativeAnchorsPrivate *anchorPrivate() { return this; }
-
- bool checkHValid() const;
- bool checkVValid() const;
- bool checkHAnchorValid(QDeclarativeAnchorLine anchor) const;
- bool checkVAnchorValid(QDeclarativeAnchorLine anchor) const;
- bool calcStretch(const QDeclarativeAnchorLine &edge1, const QDeclarativeAnchorLine &edge2, qreal offset1, qreal offset2, QDeclarativeAnchorLine::AnchorLine line, qreal &stretch);
-
- bool isMirrored() const;
- void updateHorizontalAnchors();
- void updateVerticalAnchors();
- void fillChanged();
- void centerInChanged();
-
- QGraphicsObject *item;
- QDeclarativeAnchors::Anchors usedAnchors;
-
- QGraphicsObject *fill;
- QGraphicsObject *centerIn;
-
- QDeclarativeAnchorLine left;
- QDeclarativeAnchorLine right;
- QDeclarativeAnchorLine top;
- QDeclarativeAnchorLine bottom;
- QDeclarativeAnchorLine vCenter;
- QDeclarativeAnchorLine hCenter;
- QDeclarativeAnchorLine baseline;
-
- qreal leftMargin;
- qreal rightMargin;
- qreal topMargin;
- qreal bottomMargin;
- qreal margins;
- qreal vCenterOffset;
- qreal hCenterOffset;
- qreal baselineOffset;
-};
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QDeclarativeAnchorLine)
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
deleted file mode 100644
index 8787a5ed68..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
+++ /dev/null
@@ -1,404 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeanimatedimage_p.h"
-#include "private/qdeclarativeanimatedimage_p_p.h"
-
-#ifndef QT_NO_MOVIE
-
-#include <qdeclarativeinfo.h>
-#include <private/qdeclarativeengine_p.h>
-
-#include <QMovie>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass AnimatedImage QDeclarativeAnimatedImage
- \inherits Image
- \since 4.7
- \ingroup basic-visual-elements
-
- The AnimatedImage element extends the features of the \l Image element, providing
- a way to play animations stored as images containing a series of frames,
- such as those stored in GIF files.
-
- Information about the current frame and totla length of the animation can be
- obtained using the \l currentFrame and \l frameCount properties. You can
- start, pause and stop the animation by changing the values of the \l playing
- and \l paused properties.
-
- The full list of supported formats can be determined with QMovie::supportedFormats().
-
- \section1 Example Usage
-
- \beginfloatleft
- \image animatedimageitem.gif
- \endfloat
-
- The following QML shows how to display an animated image and obtain information
- about its state, such as the current frame and total number of frames.
- The result is an animated image with a simple progress indicator underneath it.
-
- \clearfloat
- \snippet doc/src/snippets/declarative/animatedimage.qml document
-
- \sa BorderImage, Image
-*/
-
-/*!
- \qmlproperty url AnimatedImage::source
-
- This property holds the URL that refers to the source image.
-
- AnimatedImage can handle any image format supported by Qt, loaded from any
- URL scheme supported by Qt.
-
- \sa QDeclarativeImageProvider
-*/
-
-/*!
- \qmlproperty bool AnimatedImage::asynchronous
-
- Specifies that images on the local filesystem should be loaded
- asynchronously in a separate thread. The default value is
- false, causing the user interface thread to block while the
- image is loaded. Setting \a asynchronous to true is useful where
- maintaining a responsive user interface is more desirable
- than having images immediately visible.
-
- Note that this property is only valid for images read from the
- local filesystem. Images loaded via a network resource (e.g. HTTP)
- are always loaded asynchonously.
-*/
-
-/*!
- \qmlproperty bool AnimatedImage::cache
- \since Quick 1.1
-
- Specifies whether the image should be cached. The default value is
- true. Setting \a cache to false is useful when dealing with large images,
- to make sure that they aren't cached at the expense of small 'ui element' images.
-*/
-
-/*!
- \qmlproperty bool AnimatedImage::mirror
- \since Quick 1.1
-
- This property holds whether the image should be horizontally inverted
- (effectively displaying a mirrored image).
-
- The default value is false.
-*/
-
-QDeclarativeAnimatedImage::QDeclarativeAnimatedImage(QDeclarativeItem *parent)
- : QDeclarativeImage(*(new QDeclarativeAnimatedImagePrivate), parent)
-{
-}
-
-QDeclarativeAnimatedImage::~QDeclarativeAnimatedImage()
-{
- Q_D(QDeclarativeAnimatedImage);
- delete d->_movie;
-}
-
-/*!
- \qmlproperty bool AnimatedImage::paused
- This property holds whether the animated image is paused.
-
- By default, this property is false. Set it to true when you want to pause
- the animation.
-*/
-bool QDeclarativeAnimatedImage::isPaused() const
-{
- Q_D(const QDeclarativeAnimatedImage);
- if(!d->_movie)
- return false;
- return d->_movie->state()==QMovie::Paused;
-}
-
-void QDeclarativeAnimatedImage::setPaused(bool pause)
-{
- Q_D(QDeclarativeAnimatedImage);
- if(pause == d->paused)
- return;
- d->paused = pause;
- if(!d->_movie)
- return;
- d->_movie->setPaused(pause);
-}
-/*!
- \qmlproperty bool AnimatedImage::playing
- This property holds whether the animated image is playing.
-
- By default, this property is true, meaning that the animation
- will start playing immediately.
-*/
-bool QDeclarativeAnimatedImage::isPlaying() const
-{
- Q_D(const QDeclarativeAnimatedImage);
- if (!d->_movie)
- return false;
- return d->_movie->state()!=QMovie::NotRunning;
-}
-
-void QDeclarativeAnimatedImage::setPlaying(bool play)
-{
- Q_D(QDeclarativeAnimatedImage);
- if(play == d->playing)
- return;
- d->playing = play;
- if (!d->_movie)
- return;
- if (play)
- d->_movie->start();
- else
- d->_movie->stop();
-}
-
-/*!
- \qmlproperty int AnimatedImage::currentFrame
- \qmlproperty int AnimatedImage::frameCount
-
- currentFrame is the frame that is currently visible. By monitoring this property
- for changes, you can animate other items at the same time as the image.
-
- frameCount is the number of frames in the animation. For some animation formats,
- frameCount is unknown and has a value of zero.
-*/
-int QDeclarativeAnimatedImage::currentFrame() const
-{
- Q_D(const QDeclarativeAnimatedImage);
- if (!d->_movie)
- return d->preset_currentframe;
- return d->_movie->currentFrameNumber();
-}
-
-void QDeclarativeAnimatedImage::setCurrentFrame(int frame)
-{
- Q_D(QDeclarativeAnimatedImage);
- if (!d->_movie) {
- d->preset_currentframe = frame;
- return;
- }
- d->_movie->jumpToFrame(frame);
-}
-
-int QDeclarativeAnimatedImage::frameCount() const
-{
- Q_D(const QDeclarativeAnimatedImage);
- if (!d->_movie)
- return 0;
- return d->_movie->frameCount();
-}
-
-void QDeclarativeAnimatedImage::setSource(const QUrl &url)
-{
- Q_D(QDeclarativeAnimatedImage);
- if (url == d->url)
- return;
-
- delete d->_movie;
- d->_movie = 0;
-
- if (d->reply) {
- d->reply->deleteLater();
- d->reply = 0;
- }
-
- d->url = url;
- emit sourceChanged(d->url);
-
- if (isComponentComplete())
- load();
-}
-
-void QDeclarativeAnimatedImage::load()
-{
- Q_D(QDeclarativeAnimatedImage);
-
- QDeclarativeImageBase::Status oldStatus = d->status;
- qreal oldProgress = d->progress;
-
- if (d->url.isEmpty()) {
- delete d->_movie;
- d->setPixmap(QPixmap());
- d->progress = 0;
- d->status = Null;
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- if (d->progress != oldProgress)
- emit progressChanged(d->progress);
- } else {
-#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML
- QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(d->url);
- if (!lf.isEmpty()) {
- //### should be unified with movieRequestFinished
- d->_movie = new QMovie(lf);
- if (!d->_movie->isValid()){
- qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
- delete d->_movie;
- d->_movie = 0;
- d->status = Error;
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- return;
- }
- connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
- this, SLOT(playingStatusChanged()));
- connect(d->_movie, SIGNAL(frameChanged(int)),
- this, SLOT(movieUpdate()));
- d->_movie->setCacheMode(QMovie::CacheAll);
- if(d->playing)
- d->_movie->start();
- else
- d->_movie->jumpToFrame(0);
- if(d->paused)
- d->_movie->setPaused(true);
- d->setPixmap(d->_movie->currentPixmap());
- d->status = Ready;
- d->progress = 1.0;
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- if (d->progress != oldProgress)
- emit progressChanged(d->progress);
- return;
- }
-#endif
- d->status = Loading;
- d->progress = 0;
- emit statusChanged(d->status);
- emit progressChanged(d->progress);
- QNetworkRequest req(d->url);
- req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
- d->reply = qmlEngine(this)->networkAccessManager()->get(req);
- QObject::connect(d->reply, SIGNAL(finished()),
- this, SLOT(movieRequestFinished()));
- QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
- this, SLOT(requestProgress(qint64,qint64)));
- }
-}
-
-#define ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION 16
-
-void QDeclarativeAnimatedImage::movieRequestFinished()
-{
- Q_D(QDeclarativeAnimatedImage);
-
- d->redirectCount++;
- if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
- QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
- if (redirect.isValid()) {
- QUrl url = d->reply->url().resolved(redirect.toUrl());
- d->reply->deleteLater();
- d->reply = 0;
- setSource(url);
- return;
- }
- }
- d->redirectCount=0;
-
- d->_movie = new QMovie(d->reply);
- if (!d->_movie->isValid()){
-#ifndef QT_NO_DEBUG_STREAM
- qmlInfo(this) << "Error Reading Animated Image File " << d->url;
-#endif
- delete d->_movie;
- d->_movie = 0;
- d->status = Error;
- emit statusChanged(d->status);
- return;
- }
- connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
- this, SLOT(playingStatusChanged()));
- connect(d->_movie, SIGNAL(frameChanged(int)),
- this, SLOT(movieUpdate()));
- d->_movie->setCacheMode(QMovie::CacheAll);
- if(d->playing)
- d->_movie->start();
- if (d->paused || !d->playing) {
- d->_movie->jumpToFrame(d->preset_currentframe);
- d->preset_currentframe = 0;
- }
- if(d->paused)
- d->_movie->setPaused(true);
- d->setPixmap(d->_movie->currentPixmap());
- d->status = Ready;
- emit statusChanged(d->status);
-}
-
-void QDeclarativeAnimatedImage::movieUpdate()
-{
- Q_D(QDeclarativeAnimatedImage);
- d->setPixmap(d->_movie->currentPixmap());
- emit frameChanged();
-}
-
-void QDeclarativeAnimatedImage::playingStatusChanged()
-{
- Q_D(QDeclarativeAnimatedImage);
- if((d->_movie->state() != QMovie::NotRunning) != d->playing){
- d->playing = (d->_movie->state() != QMovie::NotRunning);
- emit playingChanged();
- }
- if((d->_movie->state() == QMovie::Paused) != d->paused){
- d->playing = (d->_movie->state() == QMovie::Paused);
- emit pausedChanged();
- }
-}
-
-void QDeclarativeAnimatedImage::componentComplete()
-{
- Q_D(QDeclarativeAnimatedImage);
- QDeclarativeItem::componentComplete(); // NOT QDeclarativeImage
- if (d->url.isValid())
- load();
- if (!d->reply) {
- setCurrentFrame(d->preset_currentframe);
- d->preset_currentframe = 0;
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_MOVIE
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h b/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h
deleted file mode 100644
index bc3255e808..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEANIMATEDIMAGE_H
-#define QDECLARATIVEANIMATEDIMAGE_H
-
-#include "private/qdeclarativeimage_p.h"
-
-#ifndef QT_NO_MOVIE
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QMovie;
-class QDeclarativeAnimatedImagePrivate;
-
-class Q_AUTOTEST_EXPORT QDeclarativeAnimatedImage : public QDeclarativeImage
-{
- Q_OBJECT
-
- Q_PROPERTY(bool playing READ isPlaying WRITE setPlaying NOTIFY playingChanged)
- Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged)
- Q_PROPERTY(int currentFrame READ currentFrame WRITE setCurrentFrame NOTIFY frameChanged)
- Q_PROPERTY(int frameCount READ frameCount)
-
- // read-only for AnimatedImage
- Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
-
-public:
- QDeclarativeAnimatedImage(QDeclarativeItem *parent=0);
- ~QDeclarativeAnimatedImage();
-
- bool isPlaying() const;
- void setPlaying(bool play);
-
- bool isPaused() const;
- void setPaused(bool pause);
-
- int currentFrame() const;
- void setCurrentFrame(int frame);
-
- int frameCount() const;
-
- // Extends QDeclarativeImage's src property*/
- virtual void setSource(const QUrl&);
-
-Q_SIGNALS:
- void playingChanged();
- void pausedChanged();
- void frameChanged();
- void sourceSizeChanged();
-
-private Q_SLOTS:
- void movieUpdate();
- void movieRequestFinished();
- void playingStatusChanged();
-
-protected:
- virtual void load();
- void componentComplete();
-
-private:
- Q_DISABLE_COPY(QDeclarativeAnimatedImage)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeAnimatedImage)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeAnimatedImage)
-
-QT_END_HEADER
-
-#endif // QT_NO_MOVIE
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p_p.h b/src/declarative/graphicsitems/qdeclarativeanimatedimage_p_p.h
deleted file mode 100644
index 0b7614e84b..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p_p.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEANIMATEDIMAGE_P_H
-#define QDECLARATIVEANIMATEDIMAGE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeimage_p_p.h"
-
-#ifndef QT_NO_MOVIE
-
-QT_BEGIN_NAMESPACE
-
-class QMovie;
-class QNetworkReply;
-
-class QDeclarativeAnimatedImagePrivate : public QDeclarativeImagePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeAnimatedImage)
-
-public:
- QDeclarativeAnimatedImagePrivate()
- : playing(true), paused(false), preset_currentframe(0), _movie(0), reply(0), redirectCount(0)
- {
- }
-
- bool playing;
- bool paused;
- int preset_currentframe;
- QMovie *_movie;
- QNetworkReply *reply;
- int redirectCount;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_MOVIE
-
-#endif // QDECLARATIVEANIMATEDIMAGE_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
deleted file mode 100644
index 9c274e93fa..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
+++ /dev/null
@@ -1,617 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeborderimage_p.h"
-#include "private/qdeclarativeborderimage_p_p.h"
-
-#include <qdeclarativeinfo.h>
-#include <private/qdeclarativeengine_p.h>
-
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QFile>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass BorderImage QDeclarativeBorderImage
- \brief The BorderImage element provides an image that can be used as a border.
- \inherits Item
- \since 4.7
- \ingroup qml-basic-visual-elements
-
- The BorderImage element is used to create borders out of images by scaling or tiling
- parts of each image.
-
- A BorderImage element breaks a source image, specified using the \l url property,
- into 9 regions, as shown below:
-
- \image declarative-scalegrid.png
-
- When the image is scaled, regions of the source image are scaled or tiled to
- create the displayed border image in the following way:
-
- \list
- \i The corners (regions 1, 3, 7, and 9) are not scaled at all.
- \i Regions 2 and 8 are scaled according to
- \l{BorderImage::horizontalTileMode}{horizontalTileMode}.
- \i Regions 4 and 6 are scaled according to
- \l{BorderImage::verticalTileMode}{verticalTileMode}.
- \i The middle (region 5) is scaled according to both
- \l{BorderImage::horizontalTileMode}{horizontalTileMode} and
- \l{BorderImage::verticalTileMode}{verticalTileMode}.
- \endlist
-
- The regions of the image are defined using the \l border property group, which
- describes the distance from each edge of the source image to use as a border.
-
- \section1 Example Usage
-
- The following examples show the effects of the different modes on an image.
- Guide lines are overlaid onto the image to show the different regions of the
- image as described above.
-
- \beginfloatleft
- \image qml-borderimage-normal-image.png
- \endfloat
-
- An unscaled image is displayed using an Image element. The \l border property is
- used to determine the parts of the image that will lie inside the unscaled corner
- areas and the parts that will be stretched horizontally and vertically.
-
- \snippet doc/src/snippets/declarative/borderimage/normal-image.qml normal image
-
- \clearfloat
- \beginfloatleft
- \image qml-borderimage-scaled.png
- \endfloat
-
- A BorderImage element is used to display the image, and it is given a size that is
- larger than the original image. Since the \l horizontalTileMode property is set to
- \l{BorderImage::horizontalTileMode}{BorderImage.Stretch}, the parts of image in
- regions 2 and 8 are stretched horizontally. Since the \l verticalTileMode property
- is set to \l{BorderImage::verticalTileMode}{BorderImage.Stretch}, the parts of image
- in regions 4 and 6 are stretched vertically.
-
- \snippet doc/src/snippets/declarative/borderimage/borderimage-scaled.qml scaled border image
-
- \clearfloat
- \beginfloatleft
- \image qml-borderimage-tiled.png
- \endfloat
-
- Again, a large BorderImage element is used to display the image. With the
- \l horizontalTileMode property set to \l{BorderImage::horizontalTileMode}{BorderImage.Repeat},
- the parts of image in regions 2 and 8 are tiled so that they fill the space at the
- top and bottom of the element. Similarly, the \l verticalTileMode property is set to
- \l{BorderImage::verticalTileMode}{BorderImage.Repeat}, the parts of image in regions
- 4 and 6 are tiled so that they fill the space at the left and right of the element.
-
- \snippet doc/src/snippets/declarative/borderimage/borderimage-tiled.qml tiled border image
-
- \clearfloat
- In some situations, the width of regions 2 and 8 may not be an exact multiple of the width
- of the corresponding regions in the source image. Similarly, the height of regions 4 and 6
- may not be an exact multiple of the height of the corresponding regions. It can be useful
- to use \l{BorderImage::horizontalTileMode}{BorderImage.Round} instead of
- \l{BorderImage::horizontalTileMode}{BorderImage.Repeat} in cases like these.
-
- The \l{declarative/imageelements/borderimage}{BorderImage example} shows how a BorderImage
- can be used to simulate a shadow effect on a rectangular item.
-
- \section1 Quality and Performance
-
- By default, any scaled regions of the image are rendered without smoothing to improve
- rendering speed. Setting the \l smooth property improves rendering quality of scaled
- regions, but may slow down rendering.
-
- The source image may not be loaded instantaneously, depending on its original location.
- Loading progress can be monitored with the \l progress property.
-
- \sa Image, AnimatedImage
- */
-
-/*!
- \qmlproperty bool BorderImage::asynchronous
-
- Specifies that images on the local filesystem should be loaded
- asynchronously in a separate thread. The default value is
- false, causing the user interface thread to block while the
- image is loaded. Setting \a asynchronous to true is useful where
- maintaining a responsive user interface is more desirable
- than having images immediately visible.
-
- Note that this property is only valid for images read from the
- local filesystem. Images loaded via a network resource (e.g. HTTP)
- are always loaded asynchonously.
-*/
-QDeclarativeBorderImage::QDeclarativeBorderImage(QDeclarativeItem *parent)
- : QDeclarativeImageBase(*(new QDeclarativeBorderImagePrivate), parent)
-{
-}
-
-QDeclarativeBorderImage::~QDeclarativeBorderImage()
-{
- Q_D(QDeclarativeBorderImage);
- if (d->sciReply)
- d->sciReply->deleteLater();
-}
-/*!
- \qmlproperty enumeration BorderImage::status
-
- This property describes the status of image loading. It can be one of:
-
- \list
- \o BorderImage.Null - no image has been set
- \o BorderImage.Ready - the image has been loaded
- \o BorderImage.Loading - the image is currently being loaded
- \o BorderImage.Error - an error occurred while loading the image
- \endlist
-
- \sa progress
-*/
-
-/*!
- \qmlproperty real BorderImage::progress
-
- This property holds the progress of image loading, from 0.0 (nothing loaded)
- to 1.0 (finished).
-
- \sa status
-*/
-
-/*!
- \qmlproperty bool BorderImage::smooth
-
- Set this property if you want the image to be smoothly filtered when scaled or
- transformed. Smooth filtering gives better visual quality, but is slower. If
- the image is displayed at its natural size, this property has no visual or
- performance effect.
-
- By default, this property is set to false.
-
- \note Generally scaling artifacts are only visible if the image is stationary on
- the screen. A common pattern when animating an image is to disable smooth
- filtering at the beginning of the animation and enable it at the conclusion.
-*/
-
-/*!
- \qmlproperty bool BorderImage::cache
- \since Quick 1.1
-
- Specifies whether the image should be cached. The default value is
- true. Setting \a cache to false is useful when dealing with large images,
- to make sure that they aren't cached at the expense of small 'ui element' images.
-*/
-
-/*!
- \qmlproperty bool BorderImage::mirror
- \since Quick 1.1
-
- This property holds whether the image should be horizontally inverted
- (effectively displaying a mirrored image).
-
- The default value is false.
-*/
-
-/*!
- \qmlproperty url BorderImage::source
-
- This property holds the URL that refers to the source image.
-
- BorderImage can handle any image format supported by Qt, loaded from any
- URL scheme supported by Qt.
-
- This property can also be used to refer to .sci files, which are
- written in a QML-specific, text-based format that specifies the
- borders, the image file and the tile rules for a given border image.
-
- The following .sci file sets the borders to 10 on each side for the
- image \c picture.png:
-
- \code
- border.left: 10
- border.top: 10
- border.bottom: 10
- border.right: 10
- source: "picture.png"
- \endcode
-
- The URL may be absolute, or relative to the URL of the component.
-
- \sa QDeclarativeImageProvider
-*/
-
-/*!
- \qmlproperty QSize BorderImage::sourceSize
-
- This property holds the actual width and height of the loaded image.
-
- In BorderImage, this property is read-only.
-
- \sa Image::sourceSize
-*/
-void QDeclarativeBorderImage::setSource(const QUrl &url)
-{
- Q_D(QDeclarativeBorderImage);
- //equality is fairly expensive, so we bypass for simple, common case
- if ((d->url.isEmpty() == url.isEmpty()) && url == d->url)
- return;
-
- if (d->sciReply) {
- d->sciReply->deleteLater();
- d->sciReply = 0;
- }
-
- d->url = url;
- d->sciurl = QUrl();
- emit sourceChanged(d->url);
-
- if (isComponentComplete())
- load();
-}
-
-void QDeclarativeBorderImage::load()
-{
- Q_D(QDeclarativeBorderImage);
- if (d->progress != 0.0) {
- d->progress = 0.0;
- emit progressChanged(d->progress);
- }
-
- if (d->url.isEmpty()) {
- d->pix.clear(this);
- d->status = Null;
- setImplicitWidth(0);
- setImplicitHeight(0);
- emit statusChanged(d->status);
- update();
- } else {
- d->status = Loading;
- if (d->url.path().endsWith(QLatin1String("sci"))) {
-#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML
- QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(d->url);
- if (!lf.isEmpty()) {
- QFile file(lf);
- file.open(QIODevice::ReadOnly);
- setGridScaledImage(QDeclarativeGridScaledImage(&file));
- } else
-#endif
- {
- QNetworkRequest req(d->url);
- d->sciReply = qmlEngine(this)->networkAccessManager()->get(req);
-
- static int sciReplyFinished = -1;
- static int thisSciRequestFinished = -1;
- if (sciReplyFinished == -1) {
- sciReplyFinished =
- QNetworkReply::staticMetaObject.indexOfSignal("finished()");
- thisSciRequestFinished =
- QDeclarativeBorderImage::staticMetaObject.indexOfSlot("sciRequestFinished()");
- }
-
- QMetaObject::connect(d->sciReply, sciReplyFinished, this,
- thisSciRequestFinished, Qt::DirectConnection);
- }
- } else {
-
- QDeclarativePixmap::Options options;
- if (d->async)
- options |= QDeclarativePixmap::Asynchronous;
- if (d->cache)
- options |= QDeclarativePixmap::Cache;
- d->pix.clear(this);
- d->pix.load(qmlEngine(this), d->url, options);
-
- if (d->pix.isLoading()) {
- d->pix.connectFinished(this, SLOT(requestFinished()));
- d->pix.connectDownloadProgress(this, SLOT(requestProgress(qint64,qint64)));
- } else {
- QSize impsize = d->pix.implicitSize();
- setImplicitWidth(impsize.width());
- setImplicitHeight(impsize.height());
-
- if (d->pix.isReady()) {
- d->status = Ready;
- } else {
- d->status = Error;
- qmlInfo(this) << d->pix.error();
- }
-
- d->progress = 1.0;
- emit statusChanged(d->status);
- emit progressChanged(d->progress);
- requestFinished();
- update();
- }
- }
- }
-
- emit statusChanged(d->status);
-}
-
-/*!
- \qmlproperty int BorderImage::border.left
- \qmlproperty int BorderImage::border.right
- \qmlproperty int BorderImage::border.top
- \qmlproperty int BorderImage::border.bottom
-
- The 4 border lines (2 horizontal and 2 vertical) break the image into 9 sections,
- as shown below:
-
- \image declarative-scalegrid.png
-
- Each border line (left, right, top, and bottom) specifies an offset in pixels
- from the respective edge of the source image. By default, each border line has
- a value of 0.
-
- For example, the following definition sets the bottom line 10 pixels up from
- the bottom of the image:
-
- \qml
- BorderImage {
- border.bottom: 10
- // ...
- }
- \endqml
-
- The border lines can also be specified using a
- \l {BorderImage::source}{.sci file}.
-*/
-
-QDeclarativeScaleGrid *QDeclarativeBorderImage::border()
-{
- Q_D(QDeclarativeBorderImage);
- return d->getScaleGrid();
-}
-
-/*!
- \qmlproperty enumeration BorderImage::horizontalTileMode
- \qmlproperty enumeration BorderImage::verticalTileMode
-
- This property describes how to repeat or stretch the middle parts of the border image.
-
- \list
- \o BorderImage.Stretch - Scales the image to fit to the available area.
- \o BorderImage.Repeat - Tile the image until there is no more space. May crop the last image.
- \o BorderImage.Round - Like Repeat, but scales the images down to ensure that the last image is not cropped.
- \endlist
-
- The default tile mode for each property is BorderImage.Stretch.
-*/
-QDeclarativeBorderImage::TileMode QDeclarativeBorderImage::horizontalTileMode() const
-{
- Q_D(const QDeclarativeBorderImage);
- return d->horizontalTileMode;
-}
-
-void QDeclarativeBorderImage::setHorizontalTileMode(TileMode t)
-{
- Q_D(QDeclarativeBorderImage);
- if (t != d->horizontalTileMode) {
- d->horizontalTileMode = t;
- emit horizontalTileModeChanged();
- update();
- }
-}
-
-QDeclarativeBorderImage::TileMode QDeclarativeBorderImage::verticalTileMode() const
-{
- Q_D(const QDeclarativeBorderImage);
- return d->verticalTileMode;
-}
-
-void QDeclarativeBorderImage::setVerticalTileMode(TileMode t)
-{
- Q_D(QDeclarativeBorderImage);
- if (t != d->verticalTileMode) {
- d->verticalTileMode = t;
- emit verticalTileModeChanged();
- update();
- }
-}
-
-void QDeclarativeBorderImage::setGridScaledImage(const QDeclarativeGridScaledImage& sci)
-{
- Q_D(QDeclarativeBorderImage);
- if (!sci.isValid()) {
- d->status = Error;
- emit statusChanged(d->status);
- } else {
- QDeclarativeScaleGrid *sg = border();
- sg->setTop(sci.gridTop());
- sg->setBottom(sci.gridBottom());
- sg->setLeft(sci.gridLeft());
- sg->setRight(sci.gridRight());
- d->horizontalTileMode = sci.horizontalTileRule();
- d->verticalTileMode = sci.verticalTileRule();
-
- d->sciurl = d->url.resolved(QUrl(sci.pixmapUrl()));
-
- QDeclarativePixmap::Options options;
- if (d->async)
- options |= QDeclarativePixmap::Asynchronous;
- if (d->cache)
- options |= QDeclarativePixmap::Cache;
- d->pix.clear(this);
- d->pix.load(qmlEngine(this), d->sciurl, options);
-
- if (d->pix.isLoading()) {
- static int thisRequestProgress = -1;
- static int thisRequestFinished = -1;
- if (thisRequestProgress == -1) {
- thisRequestProgress =
- QDeclarativeBorderImage::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)");
- thisRequestFinished =
- QDeclarativeBorderImage::staticMetaObject.indexOfSlot("requestFinished()");
- }
-
- d->pix.connectFinished(this, thisRequestFinished);
- d->pix.connectDownloadProgress(this, thisRequestProgress);
-
- } else {
-
- QSize impsize = d->pix.implicitSize();
- setImplicitWidth(impsize.width());
- setImplicitHeight(impsize.height());
-
- if (d->pix.isReady()) {
- d->status = Ready;
- } else {
- d->status = Error;
- qmlInfo(this) << d->pix.error();
- }
-
- d->progress = 1.0;
- emit statusChanged(d->status);
- emit progressChanged(1.0);
- update();
-
- }
- }
-}
-
-void QDeclarativeBorderImage::requestFinished()
-{
- Q_D(QDeclarativeBorderImage);
-
- QSize impsize = d->pix.implicitSize();
- if (d->pix.isError()) {
- d->status = Error;
- qmlInfo(this) << d->pix.error();
- } else {
- d->status = Ready;
- }
-
- setImplicitWidth(impsize.width());
- setImplicitHeight(impsize.height());
-
- if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
- emit sourceSizeChanged();
-
- d->progress = 1.0;
- emit statusChanged(d->status);
- emit progressChanged(1.0);
- update();
-}
-
-#define BORDERIMAGE_MAX_REDIRECT 16
-
-void QDeclarativeBorderImage::sciRequestFinished()
-{
- Q_D(QDeclarativeBorderImage);
-
- d->redirectCount++;
- if (d->redirectCount < BORDERIMAGE_MAX_REDIRECT) {
- QVariant redirect = d->sciReply->attribute(QNetworkRequest::RedirectionTargetAttribute);
- if (redirect.isValid()) {
- QUrl url = d->sciReply->url().resolved(redirect.toUrl());
- setSource(url);
- return;
- }
- }
- d->redirectCount=0;
-
- if (d->sciReply->error() != QNetworkReply::NoError) {
- d->status = Error;
- d->sciReply->deleteLater();
- d->sciReply = 0;
- emit statusChanged(d->status);
- } else {
- QDeclarativeGridScaledImage sci(d->sciReply);
- d->sciReply->deleteLater();
- d->sciReply = 0;
- setGridScaledImage(sci);
- }
-}
-
-void QDeclarativeBorderImage::doUpdate()
-{
- update();
-}
-
-void QDeclarativeBorderImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
-{
- Q_D(QDeclarativeBorderImage);
- if (d->pix.isNull() || d->width() <= 0.0 || d->height() <= 0.0)
- return;
-
- bool oldAA = p->testRenderHint(QPainter::Antialiasing);
- bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
- QTransform oldTransform;
- if (d->smooth)
- p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
- if (d->mirror) {
- oldTransform = p->transform();
- QTransform mirror;
- mirror.translate(d->width(), 0).scale(-1, 1.0);
- p->setWorldTransform(mirror * oldTransform);
- }
-
- const QDeclarativeScaleGrid *border = d->getScaleGrid();
- int left = border->left();
- int right = border->right();
- qreal borderWidth = left + right;
- if (borderWidth > 0.0 && d->width() < borderWidth) {
- qreal diff = borderWidth - d->width() - 1;
- left -= qRound(diff * qreal(left) / borderWidth);
- right -= qRound(diff * qreal(right) / borderWidth);
- }
- int top = border->top();
- int bottom = border->bottom();
- qreal borderHeight = top + bottom;
- if (borderHeight > 0.0 && d->height() < borderHeight) {
- qreal diff = borderHeight - d->height() - 1;
- top -= qRound(diff * qreal(top) / borderHeight);
- bottom -= qRound(diff * qreal(bottom) / borderHeight);
- }
- QMargins margins(left, top, right, bottom);
- QTileRules rules((Qt::TileRule)d->horizontalTileMode, (Qt::TileRule)d->verticalTileMode);
- qDrawBorderPixmap(p, QRect(0, 0, (int)d->width(), (int)d->height()), margins, d->pix, d->pix.rect(), margins, rules);
- if (d->smooth) {
- p->setRenderHint(QPainter::Antialiasing, oldAA);
- p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
- }
- if (d->mirror)
- p->setWorldTransform(oldTransform);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage_p.h b/src/declarative/graphicsitems/qdeclarativeborderimage_p.h
deleted file mode 100644
index 6a50c3cfec..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeborderimage_p.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEBORDERIMAGE_H
-#define QDECLARATIVEBORDERIMAGE_H
-
-#include "private/qdeclarativeimagebase_p.h"
-
-#include <QtNetwork/qnetworkreply.h>
-
-QT_BEGIN_HEADER
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeScaleGrid;
-class QDeclarativeGridScaledImage;
-class QDeclarativeBorderImagePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeBorderImage : public QDeclarativeImageBase
-{
- Q_OBJECT
- Q_ENUMS(TileMode)
-
- Q_PROPERTY(QDeclarativeScaleGrid *border READ border CONSTANT)
- Q_PROPERTY(TileMode horizontalTileMode READ horizontalTileMode WRITE setHorizontalTileMode NOTIFY horizontalTileModeChanged)
- Q_PROPERTY(TileMode verticalTileMode READ verticalTileMode WRITE setVerticalTileMode NOTIFY verticalTileModeChanged)
-
- // read-only for BorderImage
- Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
-
-public:
- QDeclarativeBorderImage(QDeclarativeItem *parent=0);
- ~QDeclarativeBorderImage();
-
- QDeclarativeScaleGrid *border();
-
- enum TileMode { Stretch = Qt::StretchTile, Repeat = Qt::RepeatTile, Round = Qt::RoundTile };
-
- TileMode horizontalTileMode() const;
- void setHorizontalTileMode(TileMode);
-
- TileMode verticalTileMode() const;
- void setVerticalTileMode(TileMode);
-
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
- void setSource(const QUrl &url);
-
-Q_SIGNALS:
- void horizontalTileModeChanged();
- void verticalTileModeChanged();
- void sourceSizeChanged();
-
-protected:
- virtual void load();
-
-private:
- void setGridScaledImage(const QDeclarativeGridScaledImage& sci);
-
-private Q_SLOTS:
- void doUpdate();
- void requestFinished();
- void sciRequestFinished();
-
-private:
- Q_DISABLE_COPY(QDeclarativeBorderImage)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeBorderImage)
-};
-
-QT_END_NAMESPACE
-QML_DECLARE_TYPE(QDeclarativeBorderImage)
-QT_END_HEADER
-
-#endif // QDECLARATIVEBORDERIMAGE_H
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage_p_p.h b/src/declarative/graphicsitems/qdeclarativeborderimage_p_p.h
deleted file mode 100644
index d847e222b7..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeborderimage_p_p.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEBORDERIMAGE_P_H
-#define QDECLARATIVEBORDERIMAGE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeimagebase_p_p.h"
-#include "private/qdeclarativescalegrid_p_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkReply;
-class QDeclarativeBorderImagePrivate : public QDeclarativeImageBasePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeBorderImage)
-
-public:
- QDeclarativeBorderImagePrivate()
- : border(0), sciReply(0),
- horizontalTileMode(QDeclarativeBorderImage::Stretch),
- verticalTileMode(QDeclarativeBorderImage::Stretch),
- redirectCount(0)
- {
- }
-
- ~QDeclarativeBorderImagePrivate()
- {
- }
-
-
- QDeclarativeScaleGrid *getScaleGrid()
- {
- Q_Q(QDeclarativeBorderImage);
- if (!border) {
- border = new QDeclarativeScaleGrid(q);
- static int borderChangedSignalIdx = -1;
- static int doUpdateSlotIdx = -1;
- if (borderChangedSignalIdx < 0)
- borderChangedSignalIdx = QDeclarativeScaleGrid::staticMetaObject.indexOfSignal("borderChanged()");
- if (doUpdateSlotIdx < 0)
- doUpdateSlotIdx = QDeclarativeBorderImage::staticMetaObject.indexOfSlot("doUpdate()");
- QMetaObject::connect(border, borderChangedSignalIdx, q, doUpdateSlotIdx);
- }
- return border;
- }
-
- QDeclarativeScaleGrid *border;
- QUrl sciurl;
- QNetworkReply *sciReply;
- QDeclarativeBorderImage::TileMode horizontalTileMode;
- QDeclarativeBorderImage::TileMode verticalTileMode;
- int redirectCount;
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEBORDERIMAGE_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeevents.cpp b/src/declarative/graphicsitems/qdeclarativeevents.cpp
deleted file mode 100644
index c0f71d46ee..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeevents.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeevents_p_p.h"
-
-QT_BEGIN_NAMESPACE
-/*!
- \qmlclass KeyEvent QDeclarativeKeyEvent
- \since 4.7
- \ingroup qml-event-elements
-
- \brief The KeyEvent object provides information about a key event.
-
- For example, the following changes the Item's state property when the Enter
- key is pressed:
- \qml
-Item {
- focus: true
- Keys.onPressed: { if (event.key == Qt.Key_Enter) state = 'ShowDetails'; }
-}
- \endqml
-*/
-
-/*!
- \qmlproperty int KeyEvent::key
-
- This property holds the code of the key that was pressed or released.
-
- See \l {Qt::Key}{Qt.Key} for the list of keyboard codes. These codes are
- independent of the underlying window system. Note that this
- function does not distinguish between capital and non-capital
- letters, use the text() function (returning the Unicode text the
- key generated) for this purpose.
-
- A value of either 0 or \l {Qt::Key_unknown}{Qt.Key_Unknown} means that the event is not
- the result of a known key; for example, it may be the result of
- a compose sequence, a keyboard macro, or due to key event
- compression.
-*/
-
-/*!
- \qmlproperty string KeyEvent::text
-
- This property holds the Unicode text that the key generated.
- The text returned can be an empty string in cases where modifier keys,
- such as Shift, Control, Alt, and Meta, are being pressed or released.
- In such cases \c key will contain a valid value
-*/
-
-/*!
- \qmlproperty bool KeyEvent::isAutoRepeat
-
- This property holds whether this event comes from an auto-repeating key.
-*/
-
-/*!
- \qmlproperty int KeyEvent::count
-
- This property holds the number of keys involved in this event. If \l KeyEvent::text
- is not empty, this is simply the length of the string.
-*/
-
-/*!
- \qmlproperty bool KeyEvent::accepted
-
- Setting \a accepted to true prevents the key event from being
- propagated to the item's parent.
-
- Generally, if the item acts on the key event then it should be accepted
- so that ancestor items do not also respond to the same event.
-*/
-
-/*!
- \qmlproperty int KeyEvent::modifiers
-
- This property holds the keyboard modifier flags that existed immediately
- before the event occurred.
-
- It contains a bitwise combination of:
- \list
- \o Qt.NoModifier - No modifier key is pressed.
- \o Qt.ShiftModifier - A Shift key on the keyboard is pressed.
- \o Qt.ControlModifier - A Ctrl key on the keyboard is pressed.
- \o Qt.AltModifier - An Alt key on the keyboard is pressed.
- \o Qt.MetaModifier - A Meta key on the keyboard is pressed.
- \o Qt.KeypadModifier - A keypad button is pressed.
- \endlist
-
- For example, to react to a Shift key + Enter key combination:
- \qml
- Item {
- focus: true
- Keys.onPressed: {
- if ((event.key == Qt.Key_Enter) && (event.modifiers & Qt.ShiftModifier))
- doSomething();
- }
- }
- \endqml
-*/
-
-
-/*!
- \qmlclass MouseEvent QDeclarativeMouseEvent
- \since 4.7
- \ingroup qml-event-elements
-
- \brief The MouseEvent object provides information about a mouse event.
-
- The position of the mouse can be found via the \l x and \l y properties.
- The button that caused the event is available via the \l button property.
-
- \sa MouseArea
-*/
-
-/*!
- \internal
- \class QDeclarativeMouseEvent
-*/
-
-/*!
- \qmlproperty int MouseEvent::x
- \qmlproperty int MouseEvent::y
-
- These properties hold the coordinates of the position supplied by the mouse event.
-*/
-
-
-/*!
- \qmlproperty bool MouseEvent::accepted
-
- Setting \a accepted to true prevents the mouse event from being
- propagated to items below this item.
-
- Generally, if the item acts on the mouse event then it should be accepted
- so that items lower in the stacking order do not also respond to the same event.
-*/
-
-/*!
- \qmlproperty enumeration MouseEvent::button
-
- This property holds the button that caused the event. It can be one of:
- \list
- \o Qt.LeftButton
- \o Qt.RightButton
- \o Qt.MiddleButton
- \endlist
-*/
-
-/*!
- \qmlproperty bool MouseEvent::wasHeld
-
- This property is true if the mouse button has been held pressed longer the
- threshold (800ms).
-*/
-
-/*!
- \qmlproperty int MouseEvent::buttons
-
- This property holds the mouse buttons pressed when the event was generated.
- For mouse move events, this is all buttons that are pressed down. For mouse
- press and double click events this includes the button that caused the event.
- For mouse release events this excludes the button that caused the event.
-
- It contains a bitwise combination of:
- \list
- \o Qt.LeftButton
- \o Qt.RightButton
- \o Qt.MiddleButton
- \endlist
-*/
-
-/*!
- \qmlproperty int MouseEvent::modifiers
-
- This property holds the keyboard modifier flags that existed immediately
- before the event occurred.
-
- It contains a bitwise combination of:
- \list
- \o Qt.NoModifier - No modifier key is pressed.
- \o Qt.ShiftModifier - A Shift key on the keyboard is pressed.
- \o Qt.ControlModifier - A Ctrl key on the keyboard is pressed.
- \o Qt.AltModifier - An Alt key on the keyboard is pressed.
- \o Qt.MetaModifier - A Meta key on the keyboard is pressed.
- \o Qt.KeypadModifier - A keypad button is pressed.
- \endlist
-
- For example, to react to a Shift key + Left mouse button click:
- \qml
- MouseArea {
- onClicked: {
- if ((mouse.button == Qt.LeftButton) && (mouse.modifiers & Qt.ShiftModifier))
- doSomething();
- }
- }
- \endqml
-*/
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeevents_p_p.h b/src/declarative/graphicsitems/qdeclarativeevents_p_p.h
deleted file mode 100644
index e22f64913a..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeevents_p_p.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEEVENTS_P_H
-#define QDECLARATIVEEVENTS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qdeclarative.h>
-
-#include <QtCore/qobject.h>
-#include <QtGui/qevent.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeKeyEvent : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(int key READ key)
- Q_PROPERTY(QString text READ text)
- Q_PROPERTY(int modifiers READ modifiers)
- Q_PROPERTY(bool isAutoRepeat READ isAutoRepeat)
- Q_PROPERTY(int count READ count)
- Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
-
-public:
- QDeclarativeKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text=QString(), bool autorep=false, ushort count=1)
- : event(type, key, modifiers, text, autorep, count) { event.setAccepted(false); }
- QDeclarativeKeyEvent(const QKeyEvent &ke)
- : event(ke) { event.setAccepted(false); }
-
- int key() const { return event.key(); }
- QString text() const { return event.text(); }
- int modifiers() const { return event.modifiers(); }
- bool isAutoRepeat() const { return event.isAutoRepeat(); }
- int count() const { return event.count(); }
-
- bool isAccepted() { return event.isAccepted(); }
- void setAccepted(bool accepted) { event.setAccepted(accepted); }
-
-private:
- QKeyEvent event;
-};
-
-class QDeclarativeMouseEvent : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(int x READ x)
- Q_PROPERTY(int y READ y)
- Q_PROPERTY(int button READ button)
- Q_PROPERTY(int buttons READ buttons)
- Q_PROPERTY(int modifiers READ modifiers)
- Q_PROPERTY(bool wasHeld READ wasHeld)
- Q_PROPERTY(bool isClick READ isClick)
- Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
-
-public:
- QDeclarativeMouseEvent(int x, int y, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers
- , bool isClick=false, bool wasHeld=false)
- : _x(x), _y(y), _button(button), _buttons(buttons), _modifiers(modifiers)
- , _wasHeld(wasHeld), _isClick(isClick), _accepted(true) {}
-
- int x() const { return _x; }
- int y() const { return _y; }
- int button() const { return _button; }
- int buttons() const { return _buttons; }
- int modifiers() const { return _modifiers; }
- bool wasHeld() const { return _wasHeld; }
- bool isClick() const { return _isClick; }
-
- // only for internal usage
- void setX(int x) { _x = x; }
- void setY(int y) { _y = y; }
-
- bool isAccepted() { return _accepted; }
- void setAccepted(bool accepted) { _accepted = accepted; }
-
-private:
- int _x;
- int _y;
- Qt::MouseButton _button;
- Qt::MouseButtons _buttons;
- Qt::KeyboardModifiers _modifiers;
- bool _wasHeld;
- bool _isClick;
- bool _accepted;
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeKeyEvent)
-QML_DECLARE_TYPE(QDeclarativeMouseEvent)
-
-#endif // QDECLARATIVEEVENTS_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
deleted file mode 100644
index ce7566b9c1..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ /dev/null
@@ -1,1799 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeflickable_p.h"
-#include "private/qdeclarativeflickable_p_p.h"
-#include <qdeclarativeinfo.h>
-#include <QGraphicsSceneMouseEvent>
-#include <QPointer>
-#include <QTimer>
-#include "qplatformdefs.h"
-
-QT_BEGIN_NAMESPACE
-
-// The maximum number of pixels a flick can overshoot
-#ifndef QML_FLICK_OVERSHOOT
-#define QML_FLICK_OVERSHOOT 200
-#endif
-
-// The number of samples to use in calculating the velocity of a flick
-#ifndef QML_FLICK_SAMPLEBUFFER
-#define QML_FLICK_SAMPLEBUFFER 3
-#endif
-
-// The number of samples to discard when calculating the flick velocity.
-// Touch panels often produce inaccurate results as the finger is lifted.
-#ifndef QML_FLICK_DISCARDSAMPLES
-#define QML_FLICK_DISCARDSAMPLES 1
-#endif
-
-// The default maximum velocity of a flick.
-#ifndef QML_FLICK_DEFAULTMAXVELOCITY
-#define QML_FLICK_DEFAULTMAXVELOCITY 2500
-#endif
-
-// The default deceleration of a flick.
-#ifndef QML_FLICK_DEFAULTDECELERATION
-#define QML_FLICK_DEFAULTDECELERATION 1750
-#endif
-
-// How much faster to decelerate when overshooting
-#ifndef QML_FLICK_OVERSHOOTFRICTION
-#define QML_FLICK_OVERSHOOTFRICTION 8
-#endif
-
-// FlickThreshold determines how far the "mouse" must have moved
-// before we perform a flick.
-static const int FlickThreshold = 20;
-
-// RetainGrabVelocity is the maxmimum instantaneous velocity that
-// will ensure the Flickable retains the grab on consecutive flicks.
-static const int RetainGrabVelocity = 15;
-
-QDeclarativeFlickableVisibleArea::QDeclarativeFlickableVisibleArea(QDeclarativeFlickable *parent)
- : QObject(parent), flickable(parent), m_xPosition(0.), m_widthRatio(0.)
- , m_yPosition(0.), m_heightRatio(0.)
-{
-}
-
-qreal QDeclarativeFlickableVisibleArea::widthRatio() const
-{
- return m_widthRatio;
-}
-
-qreal QDeclarativeFlickableVisibleArea::xPosition() const
-{
- return m_xPosition;
-}
-
-qreal QDeclarativeFlickableVisibleArea::heightRatio() const
-{
- return m_heightRatio;
-}
-
-qreal QDeclarativeFlickableVisibleArea::yPosition() const
-{
- return m_yPosition;
-}
-
-void QDeclarativeFlickableVisibleArea::updateVisible()
-{
- QDeclarativeFlickablePrivate *p = static_cast<QDeclarativeFlickablePrivate *>(QGraphicsItemPrivate::get(flickable));
-
- bool changeX = false;
- bool changeY = false;
- bool changeWidth = false;
- bool changeHeight = false;
-
- // Vertical
- const qreal viewheight = flickable->height();
- const qreal maxyextent = -flickable->maxYExtent() + flickable->minYExtent();
- qreal pagePos = (-p->vData.move.value() + flickable->minYExtent()) / (maxyextent + viewheight);
- qreal pageSize = viewheight / (maxyextent + viewheight);
-
- if (pageSize != m_heightRatio) {
- m_heightRatio = pageSize;
- changeHeight = true;
- }
- if (pagePos != m_yPosition) {
- m_yPosition = pagePos;
- changeY = true;
- }
-
- // Horizontal
- const qreal viewwidth = flickable->width();
- const qreal maxxextent = -flickable->maxXExtent() + flickable->minXExtent();
- pagePos = (-p->hData.move.value() + flickable->minXExtent()) / (maxxextent + viewwidth);
- pageSize = viewwidth / (maxxextent + viewwidth);
-
- if (pageSize != m_widthRatio) {
- m_widthRatio = pageSize;
- changeWidth = true;
- }
- if (pagePos != m_xPosition) {
- m_xPosition = pagePos;
- changeX = true;
- }
-
- if (changeX)
- emit xPositionChanged(m_xPosition);
- if (changeY)
- emit yPositionChanged(m_yPosition);
- if (changeWidth)
- emit widthRatioChanged(m_widthRatio);
- if (changeHeight)
- emit heightRatioChanged(m_heightRatio);
-}
-
-
-QDeclarativeFlickablePrivate::QDeclarativeFlickablePrivate()
- : contentItem(new QDeclarativeItem)
- , hData(this, &QDeclarativeFlickablePrivate::setRoundedViewportX)
- , vData(this, &QDeclarativeFlickablePrivate::setRoundedViewportY)
- , flickingHorizontally(false), flickingVertically(false)
- , hMoved(false), vMoved(false)
- , movingHorizontally(false), movingVertically(false)
- , stealMouse(false), pressed(false), interactive(true), calcVelocity(false)
- , deceleration(QML_FLICK_DEFAULTDECELERATION)
- , maxVelocity(QML_FLICK_DEFAULTMAXVELOCITY), reportedVelocitySmoothing(100)
- , delayedPressEvent(0), delayedPressTarget(0), pressDelay(0), fixupDuration(400)
- , fixupMode(Normal), vTime(0), visibleArea(0)
- , flickableDirection(QDeclarativeFlickable::AutoFlickDirection)
- , boundsBehavior(QDeclarativeFlickable::DragAndOvershootBounds)
-{
-}
-
-void QDeclarativeFlickablePrivate::init()
-{
- Q_Q(QDeclarativeFlickable);
- QDeclarative_setParent_noEvent(contentItem, q);
- contentItem->setParentItem(q);
- static int timelineUpdatedIdx = -1;
- static int timelineCompletedIdx = -1;
- static int flickableTickedIdx = -1;
- static int flickableMovementEndingIdx = -1;
- if (timelineUpdatedIdx == -1) {
- timelineUpdatedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("updated()");
- timelineCompletedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("completed()");
- flickableTickedIdx = QDeclarativeFlickable::staticMetaObject.indexOfSlot("ticked()");
- flickableMovementEndingIdx = QDeclarativeFlickable::staticMetaObject.indexOfSlot("movementEnding()");
- }
- QMetaObject::connect(&timeline, timelineUpdatedIdx,
- q, flickableTickedIdx, Qt::DirectConnection);
- QMetaObject::connect(&timeline, timelineCompletedIdx,
- q, flickableMovementEndingIdx, Qt::DirectConnection);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFiltersChildEvents(true);
- QDeclarativeItemPrivate *viewportPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(contentItem));
- viewportPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- lastPosTime.invalidate();
-}
-
-/*
- Returns the amount to overshoot by given a view size.
- Will be up to the lesser of 1/3 of the view size or QML_FLICK_OVERSHOOT
-*/
-qreal QDeclarativeFlickablePrivate::overShootDistance(qreal size)
-{
- if (maxVelocity <= 0)
- return 0.0;
-
- return qMin(qreal(QML_FLICK_OVERSHOOT), size/3);
-}
-
-void QDeclarativeFlickablePrivate::AxisData::addVelocitySample(qreal v, qreal maxVelocity)
-{
- if (v > maxVelocity)
- v = maxVelocity;
- else if (v < -maxVelocity)
- v = -maxVelocity;
- velocityBuffer.append(v);
- if (velocityBuffer.count() > QML_FLICK_SAMPLEBUFFER)
- velocityBuffer.remove(0);
-}
-
-void QDeclarativeFlickablePrivate::AxisData::updateVelocity()
-{
- if (velocityBuffer.count() > QML_FLICK_DISCARDSAMPLES) {
- velocity = 0;
- int count = velocityBuffer.count()-QML_FLICK_DISCARDSAMPLES;
- for (int i = 0; i < count; ++i) {
- qreal v = velocityBuffer.at(i);
- velocity += v;
- }
- velocity /= count;
- }
-}
-
-void QDeclarativeFlickablePrivate::itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeom, const QRectF &oldGeom)
-{
- Q_Q(QDeclarativeFlickable);
- if (item == contentItem) {
- if (newGeom.x() != oldGeom.x())
- emit q->contentXChanged();
- if (newGeom.y() != oldGeom.y())
- emit q->contentYChanged();
- }
-}
-
-void QDeclarativeFlickablePrivate::flickX(qreal velocity)
-{
- Q_Q(QDeclarativeFlickable);
- flick(hData, q->minXExtent(), q->maxXExtent(), q->width(), fixupX_callback, velocity);
-}
-
-void QDeclarativeFlickablePrivate::flickY(qreal velocity)
-{
- Q_Q(QDeclarativeFlickable);
- flick(vData, q->minYExtent(), q->maxYExtent(), q->height(), fixupY_callback, velocity);
-}
-
-void QDeclarativeFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
-{
- Q_Q(QDeclarativeFlickable);
- qreal maxDistance = -1;
- data.fixingUp = false;
- // -ve velocity means list is moving up
- if (velocity > 0) {
- maxDistance = qAbs(minExtent - data.move.value());
- data.flickTarget = minExtent;
- } else {
- maxDistance = qAbs(maxExtent - data.move.value());
- data.flickTarget = maxExtent;
- }
- if (maxDistance > 0) {
- qreal v = velocity;
- if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
- if (v < 0)
- v = -maxVelocity;
- else
- v = maxVelocity;
- }
- timeline.reset(data.move);
- if (boundsBehavior == QDeclarativeFlickable::DragAndOvershootBounds)
- timeline.accel(data.move, v, deceleration);
- else
- timeline.accel(data.move, v, deceleration, maxDistance);
- timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
- if (!flickingHorizontally && q->xflick()) {
- flickingHorizontally = true;
- emit q->flickingChanged();
- emit q->flickingHorizontallyChanged();
- if (!flickingVertically)
- emit q->flickStarted();
- }
- if (!flickingVertically && q->yflick()) {
- flickingVertically = true;
- emit q->flickingChanged();
- emit q->flickingVerticallyChanged();
- if (!flickingHorizontally)
- emit q->flickStarted();
- }
- } else {
- timeline.reset(data.move);
- fixup(data, minExtent, maxExtent);
- }
-}
-
-void QDeclarativeFlickablePrivate::fixupY_callback(void *data)
-{
- ((QDeclarativeFlickablePrivate *)data)->fixupY();
-}
-
-void QDeclarativeFlickablePrivate::fixupX_callback(void *data)
-{
- ((QDeclarativeFlickablePrivate *)data)->fixupX();
-}
-
-void QDeclarativeFlickablePrivate::fixupX()
-{
- Q_Q(QDeclarativeFlickable);
- fixup(hData, q->minXExtent(), q->maxXExtent());
-}
-
-void QDeclarativeFlickablePrivate::fixupY()
-{
- Q_Q(QDeclarativeFlickable);
- fixup(vData, q->minYExtent(), q->maxYExtent());
-}
-
-void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
-{
- if (data.move.value() > minExtent || maxExtent > minExtent) {
- timeline.reset(data.move);
- if (data.move.value() != minExtent) {
- switch (fixupMode) {
- case Immediate:
- timeline.set(data.move, minExtent);
- break;
- case ExtentChanged:
- // The target has changed. Don't start from the beginning; just complete the
- // second half of the animation using the new extent.
- timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
- data.fixingUp = true;
- break;
- default: {
- qreal dist = minExtent - data.move;
- timeline.move(data.move, minExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
- timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
- data.fixingUp = true;
- }
- }
- }
- } else if (data.move.value() < maxExtent) {
- timeline.reset(data.move);
- switch (fixupMode) {
- case Immediate:
- timeline.set(data.move, maxExtent);
- break;
- case ExtentChanged:
- // The target has changed. Don't start from the beginning; just complete the
- // second half of the animation using the new extent.
- timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
- data.fixingUp = true;
- break;
- default: {
- qreal dist = maxExtent - data.move;
- timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
- timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
- data.fixingUp = true;
- }
- }
- }
- data.inOvershoot = false;
- fixupMode = Normal;
- vTime = timeline.time();
-}
-
-void QDeclarativeFlickablePrivate::updateBeginningEnd()
-{
- Q_Q(QDeclarativeFlickable);
- bool atBoundaryChange = false;
-
- // Vertical
- const int maxyextent = int(-q->maxYExtent());
- const qreal ypos = -vData.move.value();
- bool atBeginning = (ypos <= -q->minYExtent());
- bool atEnd = (maxyextent <= ypos);
-
- if (atBeginning != vData.atBeginning) {
- vData.atBeginning = atBeginning;
- atBoundaryChange = true;
- }
- if (atEnd != vData.atEnd) {
- vData.atEnd = atEnd;
- atBoundaryChange = true;
- }
-
- // Horizontal
- const int maxxextent = int(-q->maxXExtent());
- const qreal xpos = -hData.move.value();
- atBeginning = (xpos <= -q->minXExtent());
- atEnd = (maxxextent <= xpos);
-
- if (atBeginning != hData.atBeginning) {
- hData.atBeginning = atBeginning;
- atBoundaryChange = true;
- }
- if (atEnd != hData.atEnd) {
- hData.atEnd = atEnd;
- atBoundaryChange = true;
- }
-
- if (atBoundaryChange)
- emit q->isAtBoundaryChanged();
-
- if (visibleArea)
- visibleArea->updateVisible();
-}
-
-/*!
- \qmlclass Flickable QDeclarativeFlickable
- \since 4.7
- \ingroup qml-basic-interaction-elements
-
- \brief The Flickable item provides a surface that can be "flicked".
- \inherits Item
-
- The Flickable item places its children on a surface that can be dragged
- and flicked, causing the view onto the child items to scroll. This
- behavior forms the basis of Items that are designed to show large numbers
- of child items, such as \l ListView and \l GridView.
-
- In traditional user interfaces, views can be scrolled using standard
- controls, such as scroll bars and arrow buttons. In some situations, it
- is also possible to drag the view directly by pressing and holding a
- mouse button while moving the cursor. In touch-based user interfaces,
- this dragging action is often complemented with a flicking action, where
- scrolling continues after the user has stopped touching the view.
-
- Flickable does not automatically clip its contents. If it is not used as
- a full-screen item, you should consider setting the \l{Item::}{clip} property
- to true.
-
- \section1 Example Usage
-
- \div {class="float-right"}
- \inlineimage flickable.gif
- \enddiv
-
- The following example shows a small view onto a large image in which the
- user can drag or flick the image in order to view different parts of it.
-
- \snippet doc/src/snippets/declarative/flickable.qml document
-
- \clearfloat
-
- Items declared as children of a Flickable are automatically parented to the
- Flickable's \l contentItem. This should be taken into account when
- operating on the children of the Flickable; it is usually the children of
- \c contentItem that are relevant. For example, the bound of Items added
- to the Flickable will be available by \c contentItem.childrenRect
-
- \section1 Limitations
-
- \note Due to an implementation detail, items placed inside a Flickable cannot anchor to it by
- \c id. Use \c parent instead.
-*/
-
-/*!
- \qmlsignal Flickable::onMovementStarted()
-
- This handler is called when the view begins moving due to user
- interaction.
-*/
-
-/*!
- \qmlsignal Flickable::onMovementEnded()
-
- This handler is called when the view stops moving due to user
- interaction. If a flick was generated, this handler will
- be triggered once the flick stops. If a flick was not
- generated, the handler will be triggered when the
- user stops dragging - i.e. a mouse or touch release.
-*/
-
-/*!
- \qmlsignal Flickable::onFlickStarted()
-
- This handler is called when the view is flicked. A flick
- starts from the point that the mouse or touch is released,
- while still in motion.
-*/
-
-/*!
- \qmlsignal Flickable::onFlickEnded()
-
- This handler is called when the view stops moving due to a flick.
-*/
-
-/*!
- \qmlproperty real Flickable::visibleArea.xPosition
- \qmlproperty real Flickable::visibleArea.widthRatio
- \qmlproperty real Flickable::visibleArea.yPosition
- \qmlproperty real Flickable::visibleArea.heightRatio
-
- These properties describe the position and size of the currently viewed area.
- The size is defined as the percentage of the full view currently visible,
- scaled to 0.0 - 1.0. The page position is usually in the range 0.0 (beginning) to
- 1.0 minus size ratio (end), i.e. \c yPosition is in the range 0.0 to 1.0-\c heightRatio.
- However, it is possible for the contents to be dragged outside of the normal
- range, resulting in the page positions also being outside the normal range.
-
- These properties are typically used to draw a scrollbar. For example:
-
- \snippet doc/src/snippets/declarative/flickableScrollbar.qml 0
- \dots 8
- \snippet doc/src/snippets/declarative/flickableScrollbar.qml 1
-
- \sa {declarative/ui-components/scrollbar}{scrollbar example}
-*/
-
-QDeclarativeFlickable::QDeclarativeFlickable(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeFlickablePrivate), parent)
-{
- Q_D(QDeclarativeFlickable);
- d->init();
-}
-
-QDeclarativeFlickable::QDeclarativeFlickable(QDeclarativeFlickablePrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeItem(dd, parent)
-{
- Q_D(QDeclarativeFlickable);
- d->init();
-}
-
-QDeclarativeFlickable::~QDeclarativeFlickable()
-{
-}
-
-/*!
- \qmlproperty real Flickable::contentX
- \qmlproperty real Flickable::contentY
-
- These properties hold the surface coordinate currently at the top-left
- corner of the Flickable. For example, if you flick an image up 100 pixels,
- \c contentY will be 100.
-*/
-qreal QDeclarativeFlickable::contentX() const
-{
- Q_D(const QDeclarativeFlickable);
- return -d->contentItem->x();
-}
-
-void QDeclarativeFlickable::setContentX(qreal pos)
-{
- Q_D(QDeclarativeFlickable);
- d->timeline.reset(d->hData.move);
- d->vTime = d->timeline.time();
- movementXEnding();
- if (-pos != d->hData.move.value()) {
- d->hData.move.setValue(-pos);
- viewportMoved();
- }
-}
-
-qreal QDeclarativeFlickable::contentY() const
-{
- Q_D(const QDeclarativeFlickable);
- return -d->contentItem->y();
-}
-
-void QDeclarativeFlickable::setContentY(qreal pos)
-{
- Q_D(QDeclarativeFlickable);
- d->timeline.reset(d->vData.move);
- d->vTime = d->timeline.time();
- movementYEnding();
- if (-pos != d->vData.move.value()) {
- d->vData.move.setValue(-pos);
- viewportMoved();
- }
-}
-
-/*!
- \qmlproperty bool Flickable::interactive
-
- This property describes whether the user can interact with the Flickable.
- A user cannot drag or flick a Flickable that is not interactive.
-
- By default, this property is true.
-
- This property is useful for temporarily disabling flicking. This allows
- special interaction with Flickable's children; for example, you might want
- to freeze a flickable map while scrolling through a pop-up dialog that
- is a child of the Flickable.
-*/
-bool QDeclarativeFlickable::isInteractive() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->interactive;
-}
-
-void QDeclarativeFlickable::setInteractive(bool interactive)
-{
- Q_D(QDeclarativeFlickable);
- if (interactive != d->interactive) {
- d->interactive = interactive;
- if (!interactive && (d->flickingHorizontally || d->flickingVertically)) {
- d->timeline.clear();
- d->vTime = d->timeline.time();
- d->flickingHorizontally = false;
- d->flickingVertically = false;
- emit flickingChanged();
- emit flickingHorizontallyChanged();
- emit flickingVerticallyChanged();
- emit flickEnded();
- }
- emit interactiveChanged();
- }
-}
-
-/*!
- \qmlproperty real Flickable::horizontalVelocity
- \qmlproperty real Flickable::verticalVelocity
-
- The instantaneous velocity of movement along the x and y axes, in pixels/sec.
-
- The reported velocity is smoothed to avoid erratic output.
-*/
-qreal QDeclarativeFlickable::horizontalVelocity() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->hData.smoothVelocity.value();
-}
-
-qreal QDeclarativeFlickable::verticalVelocity() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->vData.smoothVelocity.value();
-}
-
-/*!
- \qmlproperty bool Flickable::atXBeginning
- \qmlproperty bool Flickable::atXEnd
- \qmlproperty bool Flickable::atYBeginning
- \qmlproperty bool Flickable::atYEnd
-
- These properties are true if the flickable view is positioned at the beginning,
- or end respecively.
-*/
-bool QDeclarativeFlickable::isAtXEnd() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->hData.atEnd;
-}
-
-bool QDeclarativeFlickable::isAtXBeginning() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->hData.atBeginning;
-}
-
-bool QDeclarativeFlickable::isAtYEnd() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->vData.atEnd;
-}
-
-bool QDeclarativeFlickable::isAtYBeginning() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->vData.atBeginning;
-}
-
-void QDeclarativeFlickable::ticked()
-{
- viewportMoved();
-}
-
-/*!
- \qmlproperty Item Flickable::contentItem
-
- The internal item that contains the Items to be moved in the Flickable.
-
- Items declared as children of a Flickable are automatically parented to the Flickable's contentItem.
-
- Items created dynamically need to be explicitly parented to the \e contentItem:
- \code
- Flickable {
- id: myFlickable
- function addItem(file) {
- var component = Qt.createComponent(file)
- component.createObject(myFlickable.contentItem);
- }
- }
- \endcode
-*/
-QDeclarativeItem *QDeclarativeFlickable::contentItem()
-{
- Q_D(QDeclarativeFlickable);
- return d->contentItem;
-}
-
-QDeclarativeFlickableVisibleArea *QDeclarativeFlickable::visibleArea()
-{
- Q_D(QDeclarativeFlickable);
- if (!d->visibleArea)
- d->visibleArea = new QDeclarativeFlickableVisibleArea(this);
- return d->visibleArea;
-}
-
-/*!
- \qmlproperty enumeration Flickable::flickableDirection
-
- This property determines which directions the view can be flicked.
-
- \list
- \o Flickable.AutoFlickDirection (default) - allows flicking vertically if the
- \e contentHeight is not equal to the \e height of the Flickable.
- Allows flicking horizontally if the \e contentWidth is not equal
- to the \e width of the Flickable.
- \o Flickable.HorizontalFlick - allows flicking horizontally.
- \o Flickable.VerticalFlick - allows flicking vertically.
- \o Flickable.HorizontalAndVerticalFlick - allows flicking in both directions.
- \endlist
-*/
-QDeclarativeFlickable::FlickableDirection QDeclarativeFlickable::flickableDirection() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->flickableDirection;
-}
-
-void QDeclarativeFlickable::setFlickableDirection(FlickableDirection direction)
-{
- Q_D(QDeclarativeFlickable);
- if (direction != d->flickableDirection) {
- d->flickableDirection = direction;
- emit flickableDirectionChanged();
- }
-}
-
-void QDeclarativeFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativeFlickable);
- if (interactive && timeline.isActive()
- && (qAbs(hData.smoothVelocity.value()) > RetainGrabVelocity || qAbs(vData.smoothVelocity.value()) > RetainGrabVelocity))
- stealMouse = true; // If we've been flicked then steal the click.
- else
- stealMouse = false;
- q->setKeepMouseGrab(stealMouse);
- pressed = true;
- timeline.clear();
- hData.reset();
- vData.reset();
- hData.dragMinBound = q->minXExtent();
- vData.dragMinBound = q->minYExtent();
- hData.dragMaxBound = q->maxXExtent();
- vData.dragMaxBound = q->maxYExtent();
- fixupMode = Normal;
- lastPos = QPoint();
- QDeclarativeItemPrivate::start(lastPosTime);
- pressPos = event->pos();
- hData.pressPos = hData.move.value();
- vData.pressPos = vData.move.value();
- flickingHorizontally = false;
- flickingVertically = false;
- QDeclarativeItemPrivate::start(pressTime);
- QDeclarativeItemPrivate::start(velocityTime);
-}
-
-void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativeFlickable);
- if (!interactive || !lastPosTime.isValid())
- return;
- bool rejectY = false;
- bool rejectX = false;
-
- bool stealY = stealMouse;
- bool stealX = stealMouse;
-
- if (q->yflick()) {
- int dy = int(event->pos().y() - pressPos.y());
- if (qAbs(dy) > QApplication::startDragDistance() || QDeclarativeItemPrivate::elapsed(pressTime) > 200) {
- if (!vMoved)
- vData.dragStartOffset = dy;
- qreal newY = dy + vData.pressPos - vData.dragStartOffset;
- const qreal minY = vData.dragMinBound;
- const qreal maxY = vData.dragMaxBound;
- if (newY > minY)
- newY = minY + (newY - minY) / 2;
- if (newY < maxY && maxY - minY <= 0)
- newY = maxY + (newY - maxY) / 2;
- if (boundsBehavior == QDeclarativeFlickable::StopAtBounds && (newY > minY || newY < maxY)) {
- rejectY = true;
- if (newY < maxY) {
- newY = maxY;
- rejectY = false;
- }
- if (newY > minY) {
- newY = minY;
- rejectY = false;
- }
- }
- if (!rejectY && stealMouse) {
- vData.move.setValue(qRound(newY));
- vMoved = true;
- }
- if (qAbs(dy) > QApplication::startDragDistance())
- stealY = true;
- }
- }
-
- if (q->xflick()) {
- int dx = int(event->pos().x() - pressPos.x());
- if (qAbs(dx) > QApplication::startDragDistance() || QDeclarativeItemPrivate::elapsed(pressTime) > 200) {
- if (!hMoved)
- hData.dragStartOffset = dx;
- qreal newX = dx + hData.pressPos - hData.dragStartOffset;
- const qreal minX = hData.dragMinBound;
- const qreal maxX = hData.dragMaxBound;
- if (newX > minX)
- newX = minX + (newX - minX) / 2;
- if (newX < maxX && maxX - minX <= 0)
- newX = maxX + (newX - maxX) / 2;
- if (boundsBehavior == QDeclarativeFlickable::StopAtBounds && (newX > minX || newX < maxX)) {
- rejectX = true;
- if (newX < maxX) {
- newX = maxX;
- rejectX = false;
- }
- if (newX > minX) {
- newX = minX;
- rejectX = false;
- }
- }
- if (!rejectX && stealMouse) {
- hData.move.setValue(qRound(newX));
- hMoved = true;
- }
-
- if (qAbs(dx) > QApplication::startDragDistance())
- stealX = true;
- }
- }
-
- stealMouse = stealX || stealY;
- if (stealMouse)
- q->setKeepMouseGrab(true);
-
- if (rejectY) {
- vData.velocityBuffer.clear();
- vData.velocity = 0;
- }
- if (rejectX) {
- hData.velocityBuffer.clear();
- hData.velocity = 0;
- }
-
- if (hMoved || vMoved) {
- q->movementStarting();
- q->viewportMoved();
- }
-
- if (!lastPos.isNull()) {
- qreal elapsed = qreal(QDeclarativeItemPrivate::elapsed(lastPosTime)) / 1000.;
- if (elapsed <= 0)
- return;
- QDeclarativeItemPrivate::restart(lastPosTime);
- qreal dy = event->pos().y()-lastPos.y();
- if (q->yflick() && !rejectY)
- vData.addVelocitySample(dy/elapsed, maxVelocity);
- qreal dx = event->pos().x()-lastPos.x();
- if (q->xflick() && !rejectX)
- hData.addVelocitySample(dx/elapsed, maxVelocity);
- }
-
- lastPos = event->pos();
-}
-
-void QDeclarativeFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativeFlickable);
- stealMouse = false;
- q->setKeepMouseGrab(false);
- pressed = false;
- if (!lastPosTime.isValid())
- return;
-
- // if we drag then pause before release we should not cause a flick.
- if (QDeclarativeItemPrivate::elapsed(lastPosTime) < 100) {
- vData.updateVelocity();
- hData.updateVelocity();
- } else {
- hData.velocity = 0.0;
- vData.velocity = 0.0;
- }
-
- vTime = timeline.time();
-
- qreal velocity = vData.velocity;
- if (vData.atBeginning || vData.atEnd)
- velocity /= 2;
- if (qAbs(velocity) > MinimumFlickVelocity && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold)
- flickY(velocity);
- else
- fixupY();
-
- velocity = hData.velocity;
- if (hData.atBeginning || hData.atEnd)
- velocity /= 2;
- if (qAbs(velocity) > MinimumFlickVelocity && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold)
- flickX(velocity);
- else
- fixupX();
-
- if (!timeline.isActive())
- q->movementEnding();
-}
-
-void QDeclarativeFlickable::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- if (d->interactive) {
- if (!d->pressed)
- d->handleMousePressEvent(event);
- event->accept();
- } else {
- QDeclarativeItem::mousePressEvent(event);
- }
-}
-
-void QDeclarativeFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- if (d->interactive) {
- d->handleMouseMoveEvent(event);
- event->accept();
- } else {
- QDeclarativeItem::mouseMoveEvent(event);
- }
-}
-
-void QDeclarativeFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- if (d->interactive) {
- d->clearDelayedPress();
- d->handleMouseReleaseEvent(event);
- event->accept();
- ungrabMouse();
- } else {
- QDeclarativeItem::mouseReleaseEvent(event);
- }
-}
-
-void QDeclarativeFlickable::wheelEvent(QGraphicsSceneWheelEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- if (!d->interactive) {
- QDeclarativeItem::wheelEvent(event);
- } else if (yflick() && event->orientation() == Qt::Vertical) {
- bool valid = false;
- if (event->delta() > 0 && contentY() > -minYExtent()) {
- d->vData.velocity = qMax(event->delta()*2 - d->vData.smoothVelocity.value(), qreal(d->maxVelocity/4));
- valid = true;
- } else if (event->delta() < 0 && contentY() < -maxYExtent()) {
- d->vData.velocity = qMin(event->delta()*2 - d->vData.smoothVelocity.value(), qreal(-d->maxVelocity/4));
- valid = true;
- }
- if (valid) {
- d->flickingVertically = false;
- d->flickY(d->vData.velocity);
- if (d->flickingVertically) {
- d->vMoved = true;
- movementStarting();
- }
- event->accept();
- }
- } else if (xflick() && event->orientation() == Qt::Horizontal) {
- bool valid = false;
- if (event->delta() > 0 && contentX() > -minXExtent()) {
- d->hData.velocity = qMax(event->delta()*2 - d->hData.smoothVelocity.value(), qreal(d->maxVelocity/4));
- valid = true;
- } else if (event->delta() < 0 && contentX() < -maxXExtent()) {
- d->hData.velocity = qMin(event->delta()*2 - d->hData.smoothVelocity.value(), qreal(-d->maxVelocity/4));
- valid = true;
- }
- if (valid) {
- d->flickingHorizontally = false;
- d->flickX(d->hData.velocity);
- if (d->flickingHorizontally) {
- d->hMoved = true;
- movementStarting();
- }
- event->accept();
- }
- } else {
- QDeclarativeItem::wheelEvent(event);
- }
-}
-
-bool QDeclarativeFlickablePrivate::isOutermostPressDelay() const
-{
- Q_Q(const QDeclarativeFlickable);
- QDeclarativeItem *item = q->parentItem();
- while (item) {
- QDeclarativeFlickable *flick = qobject_cast<QDeclarativeFlickable*>(item);
- if (flick && flick->pressDelay() > 0 && flick->isInteractive())
- return false;
- item = item->parentItem();
- }
-
- return true;
-}
-
-void QDeclarativeFlickablePrivate::captureDelayedPress(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativeFlickable);
- if (!q->scene() || pressDelay <= 0)
- return;
- if (!isOutermostPressDelay())
- return;
- delayedPressTarget = q->scene()->mouseGrabberItem();
- delayedPressEvent = new QGraphicsSceneMouseEvent(event->type());
- delayedPressEvent->setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- delayedPressEvent->setButtonDownPos(button, event->buttonDownPos(button));
- delayedPressEvent->setButtonDownScenePos(button, event->buttonDownScenePos(button));
- delayedPressEvent->setButtonDownScreenPos(button, event->buttonDownScreenPos(button));
- }
- }
- delayedPressEvent->setButtons(event->buttons());
- delayedPressEvent->setButton(event->button());
- delayedPressEvent->setPos(event->pos());
- delayedPressEvent->setScenePos(event->scenePos());
- delayedPressEvent->setScreenPos(event->screenPos());
- delayedPressEvent->setLastPos(event->lastPos());
- delayedPressEvent->setLastScenePos(event->lastScenePos());
- delayedPressEvent->setLastScreenPos(event->lastScreenPos());
- delayedPressEvent->setModifiers(event->modifiers());
- delayedPressTimer.start(pressDelay, q);
-}
-
-void QDeclarativeFlickablePrivate::clearDelayedPress()
-{
- if (delayedPressEvent) {
- delayedPressTimer.stop();
- delete delayedPressEvent;
- delayedPressEvent = 0;
- }
-}
-
-void QDeclarativeFlickablePrivate::setRoundedViewportX(qreal x)
-{
- contentItem->setX(qRound(x));
-}
-
-void QDeclarativeFlickablePrivate::setRoundedViewportY(qreal y)
-{
- contentItem->setY(qRound(y));
-}
-
-void QDeclarativeFlickable::timerEvent(QTimerEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- if (event->timerId() == d->delayedPressTimer.timerId()) {
- d->delayedPressTimer.stop();
- if (d->delayedPressEvent) {
- QDeclarativeItem *grabber = scene() ? qobject_cast<QDeclarativeItem*>(scene()->mouseGrabberItem()) : 0;
- if (!grabber || grabber != this) {
- // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay)
- // so we reset the grabber
- if (scene()->mouseGrabberItem() == d->delayedPressTarget)
- d->delayedPressTarget->ungrabMouse();
- //Use the event handler that will take care of finding the proper item to propagate the event
- QApplication::postEvent(scene(), d->delayedPressEvent);
- } else {
- delete d->delayedPressEvent;
- }
- d->delayedPressEvent = 0;
- }
- }
-}
-
-qreal QDeclarativeFlickable::minYExtent() const
-{
- return 0.0;
-}
-
-qreal QDeclarativeFlickable::minXExtent() const
-{
- return 0.0;
-}
-
-/* returns -ve */
-qreal QDeclarativeFlickable::maxXExtent() const
-{
- return width() - vWidth();
-}
-/* returns -ve */
-qreal QDeclarativeFlickable::maxYExtent() const
-{
- return height() - vHeight();
-}
-
-void QDeclarativeFlickable::viewportMoved()
-{
- Q_D(QDeclarativeFlickable);
-
- qreal prevX = d->lastFlickablePosition.x();
- qreal prevY = d->lastFlickablePosition.y();
- d->velocityTimeline.clear();
- if (d->pressed || d->calcVelocity) {
- int elapsed = QDeclarativeItemPrivate::restart(d->velocityTime);
- if (elapsed > 0) {
- qreal horizontalVelocity = (prevX - d->hData.move.value()) * 1000 / elapsed;
- qreal verticalVelocity = (prevY - d->vData.move.value()) * 1000 / elapsed;
- d->velocityTimeline.move(d->hData.smoothVelocity, horizontalVelocity, d->reportedVelocitySmoothing);
- d->velocityTimeline.move(d->hData.smoothVelocity, 0, d->reportedVelocitySmoothing);
- d->velocityTimeline.move(d->vData.smoothVelocity, verticalVelocity, d->reportedVelocitySmoothing);
- d->velocityTimeline.move(d->vData.smoothVelocity, 0, d->reportedVelocitySmoothing);
- }
- } else {
- if (d->timeline.time() > d->vTime) {
- qreal horizontalVelocity = (prevX - d->hData.move.value()) * 1000 / (d->timeline.time() - d->vTime);
- qreal verticalVelocity = (prevY - d->vData.move.value()) * 1000 / (d->timeline.time() - d->vTime);
- d->hData.smoothVelocity.setValue(horizontalVelocity);
- d->vData.smoothVelocity.setValue(verticalVelocity);
- }
- }
-
- if (!d->vData.inOvershoot && !d->vData.fixingUp && d->flickingVertically
- && (d->vData.move.value() > minYExtent() || d->vData.move.value() < maxYExtent())
- && qAbs(d->vData.smoothVelocity.value()) > 100) {
- // Increase deceleration if we've passed a bound
- d->vData.inOvershoot = true;
- qreal maxDistance = d->overShootDistance(height());
- d->timeline.reset(d->vData.move);
- d->timeline.accel(d->vData.move, -d->vData.smoothVelocity.value(), d->deceleration*QML_FLICK_OVERSHOOTFRICTION, maxDistance);
- d->timeline.callback(QDeclarativeTimeLineCallback(&d->vData.move, d->fixupY_callback, d));
- }
- if (!d->hData.inOvershoot && !d->hData.fixingUp && d->flickingHorizontally
- && (d->hData.move.value() > minXExtent() || d->hData.move.value() < maxXExtent())
- && qAbs(d->hData.smoothVelocity.value()) > 100) {
- // Increase deceleration if we've passed a bound
- d->hData.inOvershoot = true;
- qreal maxDistance = d->overShootDistance(width());
- d->timeline.reset(d->hData.move);
- d->timeline.accel(d->hData.move, -d->hData.smoothVelocity.value(), d->deceleration*QML_FLICK_OVERSHOOTFRICTION, maxDistance);
- d->timeline.callback(QDeclarativeTimeLineCallback(&d->hData.move, d->fixupX_callback, d));
- }
-
- d->lastFlickablePosition = QPointF(d->hData.move.value(), d->vData.move.value());
-
- d->vTime = d->timeline.time();
- d->updateBeginningEnd();
-}
-
-void QDeclarativeFlickable::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeFlickable);
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-
- bool changed = false;
- if (newGeometry.width() != oldGeometry.width()) {
- if (xflick())
- changed = true;
- if (d->hData.viewSize < 0) {
- d->contentItem->setWidth(width());
- emit contentWidthChanged();
- }
- // Make sure that we're entirely in view.
- if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
- d->fixupMode = QDeclarativeFlickablePrivate::Immediate;
- d->fixupX();
- }
- }
- if (newGeometry.height() != oldGeometry.height()) {
- if (yflick())
- changed = true;
- if (d->vData.viewSize < 0) {
- d->contentItem->setHeight(height());
- emit contentHeightChanged();
- }
- // Make sure that we're entirely in view.
- if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
- d->fixupMode = QDeclarativeFlickablePrivate::Immediate;
- d->fixupY();
- }
- }
-
- if (changed)
- d->updateBeginningEnd();
-}
-
-void QDeclarativeFlickable::cancelFlick()
-{
- Q_D(QDeclarativeFlickable);
- d->timeline.reset(d->hData.move);
- d->timeline.reset(d->vData.move);
- movementEnding();
-}
-
-void QDeclarativeFlickablePrivate::data_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
-{
- QGraphicsObject *i = qobject_cast<QGraphicsObject *>(o);
- if (i) {
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(i);
- if (static_cast<QDeclarativeItemPrivate*>(d)->componentComplete) {
- i->setParentItem(static_cast<QDeclarativeFlickablePrivate*>(prop->data)->contentItem);
- } else {
- d->setParentItemHelper(static_cast<QDeclarativeFlickablePrivate*>(prop->data)->contentItem, 0, 0);
- }
- } else {
- o->setParent(prop->object);
- }
-}
-
-int QDeclarativeFlickablePrivate::data_count(QDeclarativeListProperty<QObject> *property)
-{
- QDeclarativeItem *contentItem= static_cast<QDeclarativeFlickablePrivate*>(property->data)->contentItem;
- return contentItem->childItems().count() + contentItem->children().count();
-}
-
-QObject *QDeclarativeFlickablePrivate::data_at(QDeclarativeListProperty<QObject> *property, int index)
-{
- QDeclarativeItem *contentItem = static_cast<QDeclarativeFlickablePrivate*>(property->data)->contentItem;
-
- int childItemCount = contentItem->childItems().count();
-
- if (index < 0)
- return 0;
-
- if (index < childItemCount) {
- return contentItem->childItems().at(index)->toGraphicsObject();
- } else {
- return contentItem->children().at(index - childItemCount);
- }
-
- return 0;
-}
-
-void QDeclarativeFlickablePrivate::data_clear(QDeclarativeListProperty<QObject> *property)
-{
- QDeclarativeItem *contentItem = static_cast<QDeclarativeFlickablePrivate*>(property->data)->contentItem;
-
- const QList<QGraphicsItem*> graphicsItems = contentItem->childItems();
- for (int i = 0; i < graphicsItems.count(); i++)
- contentItem->scene()->removeItem(graphicsItems[i]);
-
- const QList<QObject*> objects = contentItem->children();
- for (int i = 0; i < objects.count(); i++)
- objects[i]->setParent(0);
-}
-
-QDeclarativeListProperty<QObject> QDeclarativeFlickable::flickableData()
-{
- Q_D(QDeclarativeFlickable);
- return QDeclarativeListProperty<QObject>(this, (void *)d, QDeclarativeFlickablePrivate::data_append,
- QDeclarativeFlickablePrivate::data_count,
- QDeclarativeFlickablePrivate::data_at,
- QDeclarativeFlickablePrivate::data_clear);
-}
-
-QDeclarativeListProperty<QGraphicsObject> QDeclarativeFlickable::flickableChildren()
-{
- Q_D(QDeclarativeFlickable);
- return QGraphicsItemPrivate::get(d->contentItem)->childrenList();
-}
-
-/*!
- \qmlproperty enumeration Flickable::boundsBehavior
- This property holds whether the surface may be dragged
- beyond the Fickable's boundaries, or overshoot the
- Flickable's boundaries when flicked.
-
- This enables the feeling that the edges of the view are soft,
- rather than a hard physical boundary.
-
- The \c boundsBehavior can be one of:
-
- \list
- \o Flickable.StopAtBounds - the contents can not be dragged beyond the boundary
- of the flickable, and flicks will not overshoot.
- \o Flickable.DragOverBounds - the contents can be dragged beyond the boundary
- of the Flickable, but flicks will not overshoot.
- \o Flickable.DragAndOvershootBounds (default) - the contents can be dragged
- beyond the boundary of the Flickable, and can overshoot the
- boundary when flicked.
- \endlist
-*/
-QDeclarativeFlickable::BoundsBehavior QDeclarativeFlickable::boundsBehavior() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->boundsBehavior;
-}
-
-void QDeclarativeFlickable::setBoundsBehavior(BoundsBehavior b)
-{
- Q_D(QDeclarativeFlickable);
- if (b == d->boundsBehavior)
- return;
- d->boundsBehavior = b;
- emit boundsBehaviorChanged();
-}
-
-/*!
- \qmlproperty real Flickable::contentWidth
- \qmlproperty real Flickable::contentHeight
-
- The dimensions of the content (the surface controlled by Flickable).
- This should typically be set to the combined size of the items placed in the
- Flickable.
-
- The following snippet shows how these properties are used to display
- an image that is larger than the Flickable item itself:
-
- \snippet doc/src/snippets/declarative/flickable.qml document
-
- In some cases, the the content dimensions can be automatically set
- using the \l {Item::childrenRect.width}{childrenRect.width}
- and \l {Item::childrenRect.height}{childrenRect.height} properties.
-*/
-qreal QDeclarativeFlickable::contentWidth() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->hData.viewSize;
-}
-
-void QDeclarativeFlickable::setContentWidth(qreal w)
-{
- Q_D(QDeclarativeFlickable);
- if (d->hData.viewSize == w)
- return;
- d->hData.viewSize = w;
- if (w < 0)
- d->contentItem->setWidth(width());
- else
- d->contentItem->setWidth(w);
- // Make sure that we're entirely in view.
- if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
- d->fixupMode = QDeclarativeFlickablePrivate::Immediate;
- d->fixupX();
- } else if (!d->pressed && d->hData.fixingUp) {
- d->fixupMode = QDeclarativeFlickablePrivate::ExtentChanged;
- d->fixupX();
- }
- emit contentWidthChanged();
- d->updateBeginningEnd();
-}
-
-qreal QDeclarativeFlickable::contentHeight() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->vData.viewSize;
-}
-
-void QDeclarativeFlickable::setContentHeight(qreal h)
-{
- Q_D(QDeclarativeFlickable);
- if (d->vData.viewSize == h)
- return;
- d->vData.viewSize = h;
- if (h < 0)
- d->contentItem->setHeight(height());
- else
- d->contentItem->setHeight(h);
- // Make sure that we're entirely in view.
- if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
- d->fixupMode = QDeclarativeFlickablePrivate::Immediate;
- d->fixupY();
- } else if (!d->pressed && d->vData.fixingUp) {
- d->fixupMode = QDeclarativeFlickablePrivate::ExtentChanged;
- d->fixupY();
- }
- emit contentHeightChanged();
- d->updateBeginningEnd();
-}
-
-/*!
- \qmlmethod Flickable::resizeContent(real width, real height, QPointF center)
- \preliminary
- \since Quick 1.1
-
- Resizes the content to \a width x \a height about \a center.
-
- This does not scale the contents of the Flickable - it only resizes the \l contentWidth
- and \l contentHeight.
-
- Resizing the content may result in the content being positioned outside
- the bounds of the Flickable. Calling \l returnToBounds() will
- move the content back within legal bounds.
-*/
-void QDeclarativeFlickable::resizeContent(qreal w, qreal h, QPointF center)
-{
- Q_D(QDeclarativeFlickable);
- if (w != d->hData.viewSize) {
- qreal oldSize = d->hData.viewSize;
- d->hData.viewSize = w;
- d->contentItem->setWidth(w);
- emit contentWidthChanged();
- if (center.x() != 0) {
- qreal pos = center.x() * w / oldSize;
- setContentX(contentX() + pos - center.x());
- }
- }
- if (h != d->vData.viewSize) {
- qreal oldSize = d->vData.viewSize;
- d->vData.viewSize = h;
- d->contentItem->setHeight(h);
- emit contentHeightChanged();
- if (center.y() != 0) {
- qreal pos = center.y() * h / oldSize;
- setContentY(contentY() + pos - center.y());
- }
- }
- d->updateBeginningEnd();
-}
-
-/*!
- \qmlmethod Flickable::returnToBounds()
- \preliminary
- \since Quick 1.1
-
- Ensures the content is within legal bounds.
-
- This may be called to ensure that the content is within legal bounds
- after manually positioning the content.
-*/
-void QDeclarativeFlickable::returnToBounds()
-{
- Q_D(QDeclarativeFlickable);
- d->fixupX();
- d->fixupY();
-}
-
-qreal QDeclarativeFlickable::vWidth() const
-{
- Q_D(const QDeclarativeFlickable);
- if (d->hData.viewSize < 0)
- return width();
- else
- return d->hData.viewSize;
-}
-
-qreal QDeclarativeFlickable::vHeight() const
-{
- Q_D(const QDeclarativeFlickable);
- if (d->vData.viewSize < 0)
- return height();
- else
- return d->vData.viewSize;
-}
-
-bool QDeclarativeFlickable::xflick() const
-{
- Q_D(const QDeclarativeFlickable);
- if (d->flickableDirection == QDeclarativeFlickable::AutoFlickDirection)
- return vWidth() != width();
- return d->flickableDirection & QDeclarativeFlickable::HorizontalFlick;
-}
-
-bool QDeclarativeFlickable::yflick() const
-{
- Q_D(const QDeclarativeFlickable);
- if (d->flickableDirection == QDeclarativeFlickable::AutoFlickDirection)
- return vHeight() != height();
- return d->flickableDirection & QDeclarativeFlickable::VerticalFlick;
-}
-
-bool QDeclarativeFlickable::sceneEvent(QEvent *event)
-{
- bool rv = QDeclarativeItem::sceneEvent(event);
- if (event->type() == QEvent::UngrabMouse) {
- Q_D(QDeclarativeFlickable);
- if (d->pressed) {
- // if our mouse grab has been removed (probably by another Flickable),
- // fix our state
- d->pressed = false;
- d->stealMouse = false;
- setKeepMouseGrab(false);
- }
- }
- return rv;
-}
-
-bool QDeclarativeFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeFlickable);
- QGraphicsSceneMouseEvent mouseEvent(event->type());
- QRectF myRect = mapToScene(QRectF(0, 0, width(), height())).boundingRect();
-
- QGraphicsScene *s = scene();
- QDeclarativeItem *grabber = s ? qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem()) : 0;
- QGraphicsItem *grabberItem = s ? s->mouseGrabberItem() : 0;
- bool disabledItem = grabberItem && !grabberItem->isEnabled();
- bool stealThisEvent = d->stealMouse;
- if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab() || disabledItem)) {
- mouseEvent.setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
- }
- }
- mouseEvent.setScenePos(event->scenePos());
- mouseEvent.setLastScenePos(event->lastScenePos());
- mouseEvent.setPos(mapFromScene(event->scenePos()));
- mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
-
- switch(mouseEvent.type()) {
- case QEvent::GraphicsSceneMouseMove:
- d->handleMouseMoveEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMousePress:
- if (d->pressed) // we are already pressed - this is a delayed replay
- return false;
-
- d->handleMousePressEvent(&mouseEvent);
- d->captureDelayedPress(event);
- stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above
- break;
- case QEvent::GraphicsSceneMouseRelease:
- if (d->delayedPressEvent) {
- // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay)
- // so we reset the grabber
- if (s->mouseGrabberItem() == d->delayedPressTarget)
- d->delayedPressTarget->ungrabMouse();
- //Use the event handler that will take care of finding the proper item to propagate the event
- QApplication::sendEvent(scene(), d->delayedPressEvent);
- d->clearDelayedPress();
- // We send the release
- scene()->sendEvent(s->mouseGrabberItem(), event);
- // And the event has been consumed
- d->stealMouse = false;
- d->pressed = false;
- return true;
- }
- d->handleMouseReleaseEvent(&mouseEvent);
- break;
- default:
- break;
- }
- grabber = qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem());
- if ((grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) || disabledItem) {
- d->clearDelayedPress();
- grabMouse();
- }
-
- return stealThisEvent || d->delayedPressEvent || disabledItem;
- } else if (d->lastPosTime.isValid()) {
- d->lastPosTime.invalidate();
- }
- if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
- d->clearDelayedPress();
- d->stealMouse = false;
- d->pressed = false;
- }
-
- return false;
-}
-
-bool QDeclarativeFlickable::sceneEventFilter(QGraphicsItem *i, QEvent *e)
-{
- Q_D(QDeclarativeFlickable);
- if (!isVisible() || !d->interactive)
- return QDeclarativeItem::sceneEventFilter(i, e);
- switch (e->type()) {
- case QEvent::GraphicsSceneMousePress:
- case QEvent::GraphicsSceneMouseMove:
- case QEvent::GraphicsSceneMouseRelease:
- return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
- default:
- break;
- }
-
- return QDeclarativeItem::sceneEventFilter(i, e);
-}
-
-/*!
- \qmlproperty real Flickable::maximumFlickVelocity
- This property holds the maximum velocity that the user can flick the view in pixels/second.
-
- The default value is platform dependent.
-*/
-qreal QDeclarativeFlickable::maximumFlickVelocity() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->maxVelocity;
-}
-
-void QDeclarativeFlickable::setMaximumFlickVelocity(qreal v)
-{
- Q_D(QDeclarativeFlickable);
- if (v == d->maxVelocity)
- return;
- d->maxVelocity = v;
- emit maximumFlickVelocityChanged();
-}
-
-/*!
- \qmlproperty real Flickable::flickDeceleration
- This property holds the rate at which a flick will decelerate.
-
- The default value is platform dependent.
-*/
-qreal QDeclarativeFlickable::flickDeceleration() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->deceleration;
-}
-
-void QDeclarativeFlickable::setFlickDeceleration(qreal deceleration)
-{
- Q_D(QDeclarativeFlickable);
- if (deceleration == d->deceleration)
- return;
- d->deceleration = deceleration;
- emit flickDecelerationChanged();
-}
-
-bool QDeclarativeFlickable::isFlicking() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->flickingHorizontally || d->flickingVertically;
-}
-
-/*!
- \qmlproperty bool Flickable::flicking
- \qmlproperty bool Flickable::flickingHorizontally
- \qmlproperty bool Flickable::flickingVertically
-
- These properties describe whether the view is currently moving horizontally,
- vertically or in either direction, due to the user flicking the view.
-*/
-bool QDeclarativeFlickable::isFlickingHorizontally() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->flickingHorizontally;
-}
-
-bool QDeclarativeFlickable::isFlickingVertically() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->flickingVertically;
-}
-
-/*!
- \qmlproperty int Flickable::pressDelay
-
- This property holds the time to delay (ms) delivering a press to
- children of the Flickable. This can be useful where reacting
- to a press before a flicking action has undesirable effects.
-
- If the flickable is dragged/flicked before the delay times out
- the press event will not be delivered. If the button is released
- within the timeout, both the press and release will be delivered.
-
- Note that for nested Flickables with pressDelay set, the pressDelay of
- inner Flickables is overridden by the outermost Flickable.
-*/
-int QDeclarativeFlickable::pressDelay() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->pressDelay;
-}
-
-void QDeclarativeFlickable::setPressDelay(int delay)
-{
- Q_D(QDeclarativeFlickable);
- if (d->pressDelay == delay)
- return;
- d->pressDelay = delay;
- emit pressDelayChanged();
-}
-
-
-bool QDeclarativeFlickable::isMoving() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->movingHorizontally || d->movingVertically;
-}
-
-/*!
- \qmlproperty bool Flickable::moving
- \qmlproperty bool Flickable::movingHorizontally
- \qmlproperty bool Flickable::movingVertically
-
- These properties describe whether the view is currently moving horizontally,
- vertically or in either direction, due to the user either dragging or
- flicking the view.
-*/
-bool QDeclarativeFlickable::isMovingHorizontally() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->movingHorizontally;
-}
-
-bool QDeclarativeFlickable::isMovingVertically() const
-{
- Q_D(const QDeclarativeFlickable);
- return d->movingVertically;
-}
-
-void QDeclarativeFlickable::movementStarting()
-{
- Q_D(QDeclarativeFlickable);
- if (d->hMoved && !d->movingHorizontally) {
- d->movingHorizontally = true;
- emit movingChanged();
- emit movingHorizontallyChanged();
- if (!d->movingVertically)
- emit movementStarted();
- }
- else if (d->vMoved && !d->movingVertically) {
- d->movingVertically = true;
- emit movingChanged();
- emit movingVerticallyChanged();
- if (!d->movingHorizontally)
- emit movementStarted();
- }
-}
-
-void QDeclarativeFlickable::movementEnding()
-{
- Q_D(QDeclarativeFlickable);
- movementXEnding();
- movementYEnding();
- d->hData.smoothVelocity.setValue(0);
- d->vData.smoothVelocity.setValue(0);
-}
-
-void QDeclarativeFlickable::movementXEnding()
-{
- Q_D(QDeclarativeFlickable);
- if (d->flickingHorizontally) {
- d->flickingHorizontally = false;
- emit flickingChanged();
- emit flickingHorizontallyChanged();
- if (!d->flickingVertically)
- emit flickEnded();
- }
- if (!d->pressed && !d->stealMouse) {
- if (d->movingHorizontally) {
- d->movingHorizontally = false;
- d->hMoved = false;
- emit movingChanged();
- emit movingHorizontallyChanged();
- if (!d->movingVertically)
- emit movementEnded();
- }
- }
- d->hData.fixingUp = false;
-}
-
-void QDeclarativeFlickable::movementYEnding()
-{
- Q_D(QDeclarativeFlickable);
- if (d->flickingVertically) {
- d->flickingVertically = false;
- emit flickingChanged();
- emit flickingVerticallyChanged();
- if (!d->flickingHorizontally)
- emit flickEnded();
- }
- if (!d->pressed && !d->stealMouse) {
- if (d->movingVertically) {
- d->movingVertically = false;
- d->vMoved = false;
- emit movingChanged();
- emit movingVerticallyChanged();
- if (!d->movingHorizontally)
- emit movementEnded();
- }
- }
- d->vData.fixingUp = false;
-}
-
-void QDeclarativeFlickablePrivate::updateVelocity()
-{
- Q_Q(QDeclarativeFlickable);
- emit q->horizontalVelocityChanged();
- emit q->verticalVelocityChanged();
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable_p.h b/src/declarative/graphicsitems/qdeclarativeflickable_p.h
deleted file mode 100644
index 90eb00b123..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeflickable_p.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEFLICKABLE_H
-#define QDECLARATIVEFLICKABLE_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeFlickablePrivate;
-class QDeclarativeFlickableVisibleArea;
-class Q_AUTOTEST_EXPORT QDeclarativeFlickable : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged)
- Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged)
- Q_PROPERTY(qreal contentX READ contentX WRITE setContentX NOTIFY contentXChanged)
- Q_PROPERTY(qreal contentY READ contentY WRITE setContentY NOTIFY contentYChanged)
- Q_PROPERTY(QDeclarativeItem *contentItem READ contentItem CONSTANT)
-
- Q_PROPERTY(qreal horizontalVelocity READ horizontalVelocity NOTIFY horizontalVelocityChanged)
- Q_PROPERTY(qreal verticalVelocity READ verticalVelocity NOTIFY verticalVelocityChanged)
-
- Q_PROPERTY(BoundsBehavior boundsBehavior READ boundsBehavior WRITE setBoundsBehavior NOTIFY boundsBehaviorChanged)
- Q_PROPERTY(qreal maximumFlickVelocity READ maximumFlickVelocity WRITE setMaximumFlickVelocity NOTIFY maximumFlickVelocityChanged)
- Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
- Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
- Q_PROPERTY(bool movingHorizontally READ isMovingHorizontally NOTIFY movingHorizontallyChanged)
- Q_PROPERTY(bool movingVertically READ isMovingVertically NOTIFY movingVerticallyChanged)
- Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
- Q_PROPERTY(bool flickingHorizontally READ isFlickingHorizontally NOTIFY flickingHorizontallyChanged)
- Q_PROPERTY(bool flickingVertically READ isFlickingVertically NOTIFY flickingVerticallyChanged)
- Q_PROPERTY(FlickableDirection flickableDirection READ flickableDirection WRITE setFlickableDirection NOTIFY flickableDirectionChanged)
-
- Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
- Q_PROPERTY(int pressDelay READ pressDelay WRITE setPressDelay NOTIFY pressDelayChanged)
-
- Q_PROPERTY(bool atXEnd READ isAtXEnd NOTIFY isAtBoundaryChanged)
- Q_PROPERTY(bool atYEnd READ isAtYEnd NOTIFY isAtBoundaryChanged)
- Q_PROPERTY(bool atXBeginning READ isAtXBeginning NOTIFY isAtBoundaryChanged)
- Q_PROPERTY(bool atYBeginning READ isAtYBeginning NOTIFY isAtBoundaryChanged)
-
- Q_PROPERTY(QDeclarativeFlickableVisibleArea *visibleArea READ visibleArea CONSTANT)
-
- Q_PROPERTY(QDeclarativeListProperty<QObject> flickableData READ flickableData)
- Q_PROPERTY(QDeclarativeListProperty<QGraphicsObject> flickableChildren READ flickableChildren)
- Q_CLASSINFO("DefaultProperty", "flickableData")
-
- Q_ENUMS(FlickableDirection)
- Q_ENUMS(BoundsBehavior)
-
-public:
- QDeclarativeFlickable(QDeclarativeItem *parent=0);
- ~QDeclarativeFlickable();
-
- QDeclarativeListProperty<QObject> flickableData();
- QDeclarativeListProperty<QGraphicsObject> flickableChildren();
-
- enum BoundsBehavior { StopAtBounds, DragOverBounds, DragAndOvershootBounds };
- BoundsBehavior boundsBehavior() const;
- void setBoundsBehavior(BoundsBehavior);
-
- qreal contentWidth() const;
- void setContentWidth(qreal);
-
- qreal contentHeight() const;
- void setContentHeight(qreal);
-
- qreal contentX() const;
- virtual void setContentX(qreal pos);
-
- qreal contentY() const;
- virtual void setContentY(qreal pos);
-
- bool isMoving() const;
- bool isMovingHorizontally() const;
- bool isMovingVertically() const;
- bool isFlicking() const;
- bool isFlickingHorizontally() const;
- bool isFlickingVertically() const;
-
- int pressDelay() const;
- void setPressDelay(int delay);
-
- qreal maximumFlickVelocity() const;
- void setMaximumFlickVelocity(qreal);
-
- qreal flickDeceleration() const;
- void setFlickDeceleration(qreal);
-
- bool isInteractive() const;
- void setInteractive(bool);
-
- qreal horizontalVelocity() const;
- qreal verticalVelocity() const;
-
- bool isAtXEnd() const;
- bool isAtXBeginning() const;
- bool isAtYEnd() const;
- bool isAtYBeginning() const;
-
- QDeclarativeItem *contentItem();
-
- enum FlickableDirection { AutoFlickDirection=0x00, HorizontalFlick=0x01, VerticalFlick=0x02, HorizontalAndVerticalFlick=0x03 };
- FlickableDirection flickableDirection() const;
- void setFlickableDirection(FlickableDirection);
-
- Q_INVOKABLE Q_REVISION(1) void resizeContent(qreal w, qreal h, QPointF center);
- Q_INVOKABLE Q_REVISION(1) void returnToBounds();
-
-Q_SIGNALS:
- void contentWidthChanged();
- void contentHeightChanged();
- void contentXChanged();
- void contentYChanged();
- void movingChanged();
- void movingHorizontallyChanged();
- void movingVerticallyChanged();
- void flickingChanged();
- void flickingHorizontallyChanged();
- void flickingVerticallyChanged();
- void horizontalVelocityChanged();
- void verticalVelocityChanged();
- void isAtBoundaryChanged();
- void flickableDirectionChanged();
- void interactiveChanged();
- void boundsBehaviorChanged();
- void maximumFlickVelocityChanged();
- void flickDecelerationChanged();
- void pressDelayChanged();
- void movementStarted();
- void movementEnded();
- void flickStarted();
- void flickEnded();
-
-protected:
- virtual bool sceneEventFilter(QGraphicsItem *, QEvent *);
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void wheelEvent(QGraphicsSceneWheelEvent *event);
- void timerEvent(QTimerEvent *event);
-
- QDeclarativeFlickableVisibleArea *visibleArea();
-
-protected Q_SLOTS:
- virtual void ticked();
- void movementStarting();
- void movementEnding();
-
-protected:
- void movementXEnding();
- void movementYEnding();
- virtual qreal minXExtent() const;
- virtual qreal minYExtent() const;
- virtual qreal maxXExtent() const;
- virtual qreal maxYExtent() const;
- qreal vWidth() const;
- qreal vHeight() const;
- virtual void viewportMoved();
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
- bool sceneEvent(QEvent *event);
- bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
-
- bool xflick() const;
- bool yflick() const;
- void cancelFlick();
-
-protected:
- QDeclarativeFlickable(QDeclarativeFlickablePrivate &dd, QDeclarativeItem *parent);
-
-private:
- Q_DISABLE_COPY(QDeclarativeFlickable)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeFlickable)
- friend class QDeclarativeFlickableVisibleArea;
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeFlickable)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h b/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
deleted file mode 100644
index 46b2104384..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEFLICKABLE_P_H
-#define QDECLARATIVEFLICKABLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeflickable_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativeitemchangelistener_p.h"
-
-#include <qdeclarative.h>
-#include <qdeclarativetimeline_p_p.h>
-#include <qdeclarativeanimation_p_p.h>
-
-#include <qdatetime.h>
-
-QT_BEGIN_NAMESPACE
-
-// Really slow flicks can be annoying.
-const qreal MinimumFlickVelocity = 75.0;
-
-class QDeclarativeFlickableVisibleArea;
-class QDeclarativeFlickablePrivate : public QDeclarativeItemPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativeFlickable)
-
-public:
- QDeclarativeFlickablePrivate();
- void init();
-
- struct Velocity : public QDeclarativeTimeLineValue
- {
- Velocity(QDeclarativeFlickablePrivate *p)
- : parent(p) {}
- virtual void setValue(qreal v) {
- if (v != value()) {
- QDeclarativeTimeLineValue::setValue(v);
- parent->updateVelocity();
- }
- }
- QDeclarativeFlickablePrivate *parent;
- };
-
- struct AxisData {
- AxisData(QDeclarativeFlickablePrivate *fp, void (QDeclarativeFlickablePrivate::*func)(qreal))
- : move(fp, func), viewSize(-1), smoothVelocity(fp), atEnd(false), atBeginning(true)
- , fixingUp(false), inOvershoot(false)
- {}
-
- void reset() {
- velocityBuffer.clear();
- dragStartOffset = 0;
- fixingUp = false;
- inOvershoot = false;
- }
-
- void addVelocitySample(qreal v, qreal maxVelocity);
- void updateVelocity();
-
- QDeclarativeTimeLineValueProxy<QDeclarativeFlickablePrivate> move;
- qreal viewSize;
- qreal pressPos;
- qreal dragStartOffset;
- qreal dragMinBound;
- qreal dragMaxBound;
- qreal velocity;
- qreal flickTarget;
- QDeclarativeFlickablePrivate::Velocity smoothVelocity;
- QPODVector<qreal,10> velocityBuffer;
- bool atEnd : 1;
- bool atBeginning : 1;
- bool fixingUp : 1;
- bool inOvershoot : 1;
- };
-
- void flickX(qreal velocity);
- void flickY(qreal velocity);
- virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
-
- void fixupX();
- void fixupY();
- virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
-
- void updateBeginningEnd();
-
- bool isOutermostPressDelay() const;
- void captureDelayedPress(QGraphicsSceneMouseEvent *event);
- void clearDelayedPress();
-
- void setRoundedViewportX(qreal x);
- void setRoundedViewportY(qreal y);
-
- qreal overShootDistance(qreal size);
-
- void itemGeometryChanged(QDeclarativeItem *, const QRectF &, const QRectF &);
-
-public:
- QDeclarativeItem *contentItem;
-
- AxisData hData;
- AxisData vData;
-
- QDeclarativeTimeLine timeline;
- bool flickingHorizontally : 1;
- bool flickingVertically : 1;
- bool hMoved : 1;
- bool vMoved : 1;
- bool movingHorizontally : 1;
- bool movingVertically : 1;
- bool stealMouse : 1;
- bool pressed : 1;
- bool interactive : 1;
- bool calcVelocity : 1;
- QElapsedTimer lastPosTime;
- QPointF lastPos;
- QPointF pressPos;
- QElapsedTimer pressTime;
- qreal deceleration;
- qreal maxVelocity;
- QElapsedTimer velocityTime;
- QPointF lastFlickablePosition;
- qreal reportedVelocitySmoothing;
- QGraphicsSceneMouseEvent *delayedPressEvent;
- QGraphicsItem *delayedPressTarget;
- QBasicTimer delayedPressTimer;
- int pressDelay;
- int fixupDuration;
-
- enum FixupMode { Normal, Immediate, ExtentChanged };
- FixupMode fixupMode;
-
- static void fixupY_callback(void *);
- static void fixupX_callback(void *);
-
- void updateVelocity();
- int vTime;
- QDeclarativeTimeLine velocityTimeline;
- QDeclarativeFlickableVisibleArea *visibleArea;
- QDeclarativeFlickable::FlickableDirection flickableDirection;
- QDeclarativeFlickable::BoundsBehavior boundsBehavior;
-
- void handleMousePressEvent(QGraphicsSceneMouseEvent *);
- void handleMouseMoveEvent(QGraphicsSceneMouseEvent *);
- void handleMouseReleaseEvent(QGraphicsSceneMouseEvent *);
-
- // flickableData property
- static void data_append(QDeclarativeListProperty<QObject> *, QObject *);
- static int data_count(QDeclarativeListProperty<QObject> *);
- static QObject *data_at(QDeclarativeListProperty<QObject> *, int);
- static void data_clear(QDeclarativeListProperty<QObject> *);
-};
-
-class QDeclarativeFlickableVisibleArea : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(qreal xPosition READ xPosition NOTIFY xPositionChanged)
- Q_PROPERTY(qreal yPosition READ yPosition NOTIFY yPositionChanged)
- Q_PROPERTY(qreal widthRatio READ widthRatio NOTIFY widthRatioChanged)
- Q_PROPERTY(qreal heightRatio READ heightRatio NOTIFY heightRatioChanged)
-
-public:
- QDeclarativeFlickableVisibleArea(QDeclarativeFlickable *parent=0);
-
- qreal xPosition() const;
- qreal widthRatio() const;
- qreal yPosition() const;
- qreal heightRatio() const;
-
- void updateVisible();
-
-signals:
- void xPositionChanged(qreal xPosition);
- void yPositionChanged(qreal yPosition);
- void widthRatioChanged(qreal widthRatio);
- void heightRatioChanged(qreal heightRatio);
-
-private:
- QDeclarativeFlickable *flickable;
- qreal m_xPosition;
- qreal m_widthRatio;
- qreal m_yPosition;
- qreal m_heightRatio;
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeFlickableVisibleArea)
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeflipable.cpp b/src/declarative/graphicsitems/qdeclarativeflipable.cpp
deleted file mode 100644
index 70fc702bee..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeflipable.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeflipable_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativeguard_p.h"
-
-#include <qdeclarativeinfo.h>
-
-#include <QtGui/qgraphicstransform.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeFlipablePrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeFlipable)
-public:
- QDeclarativeFlipablePrivate() : current(QDeclarativeFlipable::Front), front(0), back(0) {}
-
- void updateSceneTransformFromParent();
- void setBackTransform();
-
- QDeclarativeFlipable::Side current;
- QDeclarativeGuard<QGraphicsObject> front;
- QDeclarativeGuard<QGraphicsObject> back;
-
- bool wantBackXFlipped;
- bool wantBackYFlipped;
-};
-
-/*!
- \qmlclass Flipable QDeclarativeFlipable
- \since 4.7
- \ingroup qml-basic-interaction-elements
- \brief The Flipable item provides a surface that can be flipped.
- \inherits Item
-
- Flipable is an item that can be visibly "flipped" between its front and
- back sides, like a card. It is used together with \l Rotation, \l State
- and \l Transition elements to produce a flipping effect.
-
- The \l front and \l back properties are used to hold the items that are
- shown respectively on the front and back sides of the flipable item.
-
- \section1 Example Usage
-
- The following example shows a Flipable item that flips whenever it is
- clicked, rotating about the y-axis.
-
- This flipable item has a \c flipped boolean property that is toggled
- whenever the MouseArea within the flipable is clicked. When
- \c flipped is true, the item changes to the "back" state; in this
- state, the \c angle of the \l Rotation item is changed to 180
- degrees to produce the flipping effect. When \c flipped is false, the
- item reverts to the default state, in which the \c angle value is 0.
-
- \snippet doc/src/snippets/declarative/flipable/flipable.qml 0
-
- \image flipable.gif
-
- The \l Transition creates the animation that changes the angle over
- four seconds. When the item changes between its "back" and
- default states, the NumberAnimation animates the angle between
- its old and new values.
-
- See \l {QML States} for details on state changes and the default
- state, and \l {QML Animation and Transitions} for more information on how
- animations work within transitions.
-
- \sa {declarative/ui-components/flipable}{Flipable example}
-*/
-
-QDeclarativeFlipable::QDeclarativeFlipable(QDeclarativeItem *parent)
-: QDeclarativeItem(*(new QDeclarativeFlipablePrivate), parent)
-{
-}
-
-QDeclarativeFlipable::~QDeclarativeFlipable()
-{
-}
-
-/*!
- \qmlproperty Item Flipable::front
- \qmlproperty Item Flipable::back
-
- The front and back sides of the flipable.
-*/
-
-QGraphicsObject *QDeclarativeFlipable::front()
-{
- Q_D(const QDeclarativeFlipable);
- return d->front;
-}
-
-void QDeclarativeFlipable::setFront(QGraphicsObject *front)
-{
- Q_D(QDeclarativeFlipable);
- if (d->front) {
- qmlInfo(this) << tr("front is a write-once property");
- return;
- }
- d->front = front;
- d->front->setParentItem(this);
- if (Back == d->current)
- d->front->setOpacity(0.);
- emit frontChanged();
-}
-
-QGraphicsObject *QDeclarativeFlipable::back()
-{
- Q_D(const QDeclarativeFlipable);
- return d->back;
-}
-
-void QDeclarativeFlipable::setBack(QGraphicsObject *back)
-{
- Q_D(QDeclarativeFlipable);
- if (d->back) {
- qmlInfo(this) << tr("back is a write-once property");
- return;
- }
- d->back = back;
- d->back->setParentItem(this);
- if (Front == d->current)
- d->back->setOpacity(0.);
- connect(back, SIGNAL(widthChanged()),
- this, SLOT(retransformBack()));
- connect(back, SIGNAL(heightChanged()),
- this, SLOT(retransformBack()));
- emit backChanged();
-}
-
-void QDeclarativeFlipable::retransformBack()
-{
- Q_D(QDeclarativeFlipable);
- if (d->current == QDeclarativeFlipable::Back && d->back)
- d->setBackTransform();
-}
-
-/*!
- \qmlproperty enumeration Flipable::side
-
- The side of the Flipable currently visible. Possible values are \c
- Flipable.Front and \c Flipable.Back.
-*/
-QDeclarativeFlipable::Side QDeclarativeFlipable::side() const
-{
- Q_D(const QDeclarativeFlipable);
- if (d->dirtySceneTransform)
- const_cast<QDeclarativeFlipablePrivate *>(d)->ensureSceneTransform();
-
- return d->current;
-}
-
-// determination on the currently visible side of the flipable
-// has to be done on the complete scene transform to give
-// correct results.
-void QDeclarativeFlipablePrivate::updateSceneTransformFromParent()
-{
- Q_Q(QDeclarativeFlipable);
-
- QDeclarativeItemPrivate::updateSceneTransformFromParent();
- QPointF p1(0, 0);
- QPointF p2(1, 0);
- QPointF p3(1, 1);
-
- QPointF scenep1 = sceneTransform.map(p1);
- QPointF scenep2 = sceneTransform.map(p2);
- QPointF scenep3 = sceneTransform.map(p3);
- p1 = q->mapToParent(p1);
- p2 = q->mapToParent(p2);
- p3 = q->mapToParent(p3);
-
- qreal cross = (scenep1.x() - scenep2.x()) * (scenep3.y() - scenep2.y()) -
- (scenep1.y() - scenep2.y()) * (scenep3.x() - scenep2.x());
-
- wantBackYFlipped = p1.x() >= p2.x();
- wantBackXFlipped = p2.y() >= p3.y();
-
- QDeclarativeFlipable::Side newSide;
- if (cross > 0) {
- newSide = QDeclarativeFlipable::Back;
- } else {
- newSide = QDeclarativeFlipable::Front;
- }
-
- if (newSide != current) {
- current = newSide;
- if (current == QDeclarativeFlipable::Back && back)
- setBackTransform();
- if (front)
- front->setOpacity((current==QDeclarativeFlipable::Front)?1.:0.);
- if (back)
- back->setOpacity((current==QDeclarativeFlipable::Back)?1.:0.);
- emit q->sideChanged();
- }
-}
-
-/* Depends on the width/height of the back item, and so needs reevaulating
- if those change.
-*/
-void QDeclarativeFlipablePrivate::setBackTransform()
-{
- QTransform mat;
- QGraphicsItemPrivate *dBack = QGraphicsItemPrivate::get(back);
- mat.translate(dBack->width()/2,dBack->height()/2);
- if (dBack->width() && wantBackYFlipped)
- mat.rotate(180, Qt::YAxis);
- if (dBack->height() && wantBackXFlipped)
- mat.rotate(180, Qt::XAxis);
- mat.translate(-dBack->width()/2,-dBack->height()/2);
- back->setTransform(mat);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeflipable_p.h b/src/declarative/graphicsitems/qdeclarativeflipable_p.h
deleted file mode 100644
index c1dbe6f44d..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeflipable_p.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEFLIPABLE_H
-#define QDECLARATIVEFLIPABLE_H
-
-#include "qdeclarativeitem.h"
-
-#include <QtCore/QObject>
-#include <QtGui/QTransform>
-#include <QtGui/qvector3d.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeFlipablePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeFlipable : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_ENUMS(Side)
- Q_PROPERTY(QGraphicsObject *front READ front WRITE setFront NOTIFY frontChanged)
- Q_PROPERTY(QGraphicsObject *back READ back WRITE setBack NOTIFY backChanged)
- Q_PROPERTY(Side side READ side NOTIFY sideChanged)
- //### flipAxis
- //### flipRotation
-public:
- QDeclarativeFlipable(QDeclarativeItem *parent=0);
- ~QDeclarativeFlipable();
-
- QGraphicsObject *front();
- void setFront(QGraphicsObject *);
-
- QGraphicsObject *back();
- void setBack(QGraphicsObject *);
-
- enum Side { Front, Back };
- Side side() const;
-
-Q_SIGNALS:
- void frontChanged();
- void backChanged();
- void sideChanged();
-
-private Q_SLOTS:
- void retransformBack();
-
-private:
- Q_DISABLE_COPY(QDeclarativeFlipable)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeFlipable)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeFlipable)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEFLIPABLE_H
diff --git a/src/declarative/graphicsitems/qdeclarativefocuspanel.cpp b/src/declarative/graphicsitems/qdeclarativefocuspanel.cpp
deleted file mode 100644
index 7ad0f41182..0000000000
--- a/src/declarative/graphicsitems/qdeclarativefocuspanel.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativefocuspanel_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-
-#include <QtGui/qgraphicsscene.h>
-#include <QEvent>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass FocusPanel QDeclarativeFocusPanel
- \since 4.7
- \ingroup qml-basic-interaction-elements
-
- \brief The FocusPanel item 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}.
-*/
-
-QDeclarativeFocusPanel::QDeclarativeFocusPanel(QDeclarativeItem *parent) :
- QDeclarativeItem(parent)
-{
- Q_D(QDeclarativeItem);
- d->flags |= QGraphicsItem::ItemIsPanel;
-}
-
-QDeclarativeFocusPanel::~QDeclarativeFocusPanel()
-{
-}
-
-/*!
- \qmlproperty bool FocusPanel::active
-
- Sets whether the item is the active focus panel.
-*/
-
-bool QDeclarativeFocusPanel::sceneEvent(QEvent *event)
-{
- if (event->type() == QEvent::WindowActivate ||
- event->type() == QEvent::WindowDeactivate)
- emit activeChanged();
- return QDeclarativeItem::sceneEvent(event);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativefocuspanel_p.h b/src/declarative/graphicsitems/qdeclarativefocuspanel_p.h
deleted file mode 100644
index 5965a74259..0000000000
--- a/src/declarative/graphicsitems/qdeclarativefocuspanel_p.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEFOCUSPANEL_H
-#define QDECLARATIVEFOCUSPANEL_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class Q_AUTOTEST_EXPORT QDeclarativeFocusPanel : public QDeclarativeItem
-{
- Q_OBJECT
- Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
-public:
- QDeclarativeFocusPanel(QDeclarativeItem *parent=0);
- virtual ~QDeclarativeFocusPanel();
-
-Q_SIGNALS:
- void activeChanged();
-
-protected:
- bool sceneEvent(QEvent *event);
-
-private:
- Q_DISABLE_COPY(QDeclarativeFocusPanel)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeFocusPanel)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEFOCUSPANEL_H
diff --git a/src/declarative/graphicsitems/qdeclarativefocusscope.cpp b/src/declarative/graphicsitems/qdeclarativefocusscope.cpp
deleted file mode 100644
index c9b62b344a..0000000000
--- a/src/declarative/graphicsitems/qdeclarativefocusscope.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativefocusscope_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass FocusScope QDeclarativeFocusScope
- \since 4.7
- \ingroup qml-basic-interaction-elements
-
- \brief The FocusScope object explicitly creates a focus scope.
- \inherits Item
-
- Focus scopes assist in keyboard focus handling when building reusable QML
- components. All the details are covered in the
- \l {qmlfocus}{keyboard focus documentation}.
-
- \sa {declarative/keyinteraction/focus}{Keyboard focus example}
-*/
-
-QDeclarativeFocusScope::QDeclarativeFocusScope(QDeclarativeItem *parent) :
- QDeclarativeItem(parent)
-{
- Q_D(QDeclarativeItem);
- d->flags |= QGraphicsItem::ItemIsFocusScope;
-}
-
-QDeclarativeFocusScope::~QDeclarativeFocusScope()
-{
-}
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativefocusscope_p.h b/src/declarative/graphicsitems/qdeclarativefocusscope_p.h
deleted file mode 100644
index 9b515e6571..0000000000
--- a/src/declarative/graphicsitems/qdeclarativefocusscope_p.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEFOCUSSCOPE_H
-#define QDECLARATIVEFOCUSSCOPE_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-//### set component root as focusscope
-class Q_AUTOTEST_EXPORT QDeclarativeFocusScope : public QDeclarativeItem
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem)
-public:
- QDeclarativeFocusScope(QDeclarativeItem *parent=0);
- virtual ~QDeclarativeFocusScope();
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeFocusScope)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEFOCUSSCOPE_H
diff --git a/src/declarative/graphicsitems/qdeclarativegraphicswidget.cpp b/src/declarative/graphicsitems/qdeclarativegraphicswidget.cpp
deleted file mode 100644
index cb9a6d9587..0000000000
--- a/src/declarative/graphicsitems/qdeclarativegraphicswidget.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativegraphicswidget_p.h"
-#include "private/qdeclarativeanchors_p.h"
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativeanchors_p_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeGraphicsWidgetPrivate : public QObjectPrivate {
- Q_DECLARE_PUBLIC(QDeclarativeGraphicsWidget)
-public :
- QDeclarativeGraphicsWidgetPrivate() :
- _anchors(0), _anchorLines(0)
- {}
- QDeclarativeItemPrivate::AnchorLines *anchorLines() const;
- QDeclarativeAnchors *_anchors;
- mutable QDeclarativeItemPrivate::AnchorLines *_anchorLines;
-};
-
-QDeclarativeGraphicsWidget::QDeclarativeGraphicsWidget(QObject *parent) :
- QObject(*new QDeclarativeGraphicsWidgetPrivate, parent)
-{
-}
-QDeclarativeGraphicsWidget::~QDeclarativeGraphicsWidget()
-{
- Q_D(QDeclarativeGraphicsWidget);
- delete d->_anchorLines; d->_anchorLines = 0;
- delete d->_anchors; d->_anchors = 0;
-}
-
-QDeclarativeAnchors *QDeclarativeGraphicsWidget::anchors()
-{
- Q_D(QDeclarativeGraphicsWidget);
- if (!d->_anchors)
- d->_anchors = new QDeclarativeAnchors(static_cast<QGraphicsObject *>(parent()));
- return d->_anchors;
-}
-
-QDeclarativeItemPrivate::AnchorLines *QDeclarativeGraphicsWidgetPrivate::anchorLines() const
-{
- Q_Q(const QDeclarativeGraphicsWidget);
- if (!_anchorLines)
- _anchorLines = new QDeclarativeItemPrivate::AnchorLines(static_cast<QGraphicsObject *>(q->parent()));
- return _anchorLines;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::left() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->left;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::right() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->right;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::horizontalCenter() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->hCenter;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::top() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->top;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::bottom() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->bottom;
-}
-
-QDeclarativeAnchorLine QDeclarativeGraphicsWidget::verticalCenter() const
-{
- Q_D(const QDeclarativeGraphicsWidget);
- return d->anchorLines()->vCenter;
-}
-
-QT_END_NAMESPACE
-
-#include <moc_qdeclarativegraphicswidget_p.cpp>
diff --git a/src/declarative/graphicsitems/qdeclarativegraphicswidget_p.h b/src/declarative/graphicsitems/qdeclarativegraphicswidget_p.h
deleted file mode 100644
index 5b0cdb4812..0000000000
--- a/src/declarative/graphicsitems/qdeclarativegraphicswidget_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEGRAPHICSWIDGET_P_H
-#define QDECLARATIVEGRAPHICSWIDGET_P_H
-
-#include <QObject>
-#include <QtDeclarative/qdeclarativecomponent.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeAnchorLine;
-class QDeclarativeAnchors;
-class QGraphicsObject;
-class QDeclarativeGraphicsWidgetPrivate;
-
-// ### TODO can the extension object be the anchor directly? We save one allocation -> awesome.
-class QDeclarativeGraphicsWidget : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QDeclarativeAnchors * anchors READ anchors DESIGNABLE false CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine left READ left CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine right READ right CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine horizontalCenter READ horizontalCenter CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine top READ top CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine bottom READ bottom CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeAnchorLine verticalCenter READ verticalCenter CONSTANT FINAL)
- // ### TODO : QGraphicsWidget don't have a baseline concept yet.
- //Q_PROPERTY(QDeclarativeAnchorLine baseline READ baseline CONSTANT FINAL)
-public:
- QDeclarativeGraphicsWidget(QObject *parent = 0);
- ~QDeclarativeGraphicsWidget();
- QDeclarativeAnchors *anchors();
- QDeclarativeAnchorLine left() const;
- QDeclarativeAnchorLine right() const;
- QDeclarativeAnchorLine horizontalCenter() const;
- QDeclarativeAnchorLine top() const;
- QDeclarativeAnchorLine bottom() const;
- QDeclarativeAnchorLine verticalCenter() const;
- Q_DISABLE_COPY(QDeclarativeGraphicsWidget)
- Q_DECLARE_PRIVATE(QDeclarativeGraphicsWidget)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEGRAPHICSWIDGET_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
deleted file mode 100644
index aee91e1135..0000000000
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ /dev/null
@@ -1,3130 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativegridview_p.h"
-
-#include "private/qdeclarativevisualitemmodel_p.h"
-#include "private/qdeclarativeflickable_p_p.h"
-
-#include "private/qdeclarativesmoothedanimation_p_p.h"
-#include <qdeclarativeguard_p.h>
-
-#include <qlistmodelinterface_p.h>
-#include <QKeyEvent>
-
-#include <qmath.h>
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-
-//----------------------------------------------------------------------------
-
-class FxGridItem
-{
-public:
- FxGridItem(QDeclarativeItem *i, QDeclarativeGridView *v) : item(i), view(v) {
- attached = static_cast<QDeclarativeGridViewAttached*>(qmlAttachedPropertiesObject<QDeclarativeGridView>(item));
- if (attached)
- attached->setView(view);
- }
- ~FxGridItem() {}
-
- qreal rowPos() const {
- qreal rowPos = 0;
- if (view->flow() == QDeclarativeGridView::LeftToRight) {
- rowPos = item->y();
- } else {
- if (view->effectiveLayoutDirection() == Qt::RightToLeft)
- rowPos = -view->cellWidth()-item->x();
- else
- rowPos = item->x();
- }
- return rowPos;
- }
- qreal colPos() const {
- qreal colPos = 0;
- if (view->flow() == QDeclarativeGridView::LeftToRight) {
- if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
- int colSize = view->cellWidth();
- int columns = view->width()/colSize;
- colPos = colSize * (columns-1) - item->x();
- } else {
- colPos = item->x();
- }
- } else {
- colPos = item->y();
- }
-
- return colPos;
- }
-
- qreal endRowPos() const {
- if (view->flow() == QDeclarativeGridView::LeftToRight) {
- return item->y() + view->cellHeight() - 1;
- } else {
- if (view->effectiveLayoutDirection() == Qt::RightToLeft)
- return -item->x() - 1;
- else
- return item->x() + view->cellWidth() - 1;
- }
- }
- void setPosition(qreal col, qreal row) {
- if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
- if (view->flow() == QDeclarativeGridView::LeftToRight) {
- int columns = view->width()/view->cellWidth();
- item->setPos(QPointF((view->cellWidth() * (columns-1) - col), row));
- } else {
- item->setPos(QPointF(-view->cellWidth()-row, col));
- }
- } else {
- if (view->flow() == QDeclarativeGridView::LeftToRight)
- item->setPos(QPointF(col, row));
- else
- item->setPos(QPointF(row, col));
- }
-
- }
- bool contains(qreal x, qreal y) const {
- return (x >= item->x() && x < item->x() + view->cellWidth() &&
- y >= item->y() && y < item->y() + view->cellHeight());
- }
-
- QDeclarativeItem *item;
- QDeclarativeGridView *view;
- QDeclarativeGridViewAttached *attached;
- int index;
-};
-
-//----------------------------------------------------------------------------
-
-class QDeclarativeGridViewPrivate : public QDeclarativeFlickablePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeGridView)
-
-public:
- QDeclarativeGridViewPrivate()
- : currentItem(0), layoutDirection(Qt::LeftToRight), flow(QDeclarativeGridView::LeftToRight)
- , visibleIndex(0) , currentIndex(-1)
- , cellWidth(100), cellHeight(100), columns(1), requestedIndex(-1), itemCount(0)
- , highlightRangeStart(0), highlightRangeEnd(0)
- , highlightRangeStartValid(false), highlightRangeEndValid(false)
- , highlightRange(QDeclarativeGridView::NoHighlightRange)
- , highlightComponent(0), highlight(0), trackedItem(0)
- , moveReason(Other), buffer(0), highlightXAnimator(0), highlightYAnimator(0)
- , highlightMoveDuration(150)
- , footerComponent(0), footer(0), headerComponent(0), header(0)
- , bufferMode(BufferBefore | BufferAfter), snapMode(QDeclarativeGridView::NoSnap)
- , ownModel(false), wrap(false), autoHighlight(true)
- , fixCurrentVisibility(false), lazyRelease(false), layoutScheduled(false)
- , deferredRelease(false), haveHighlightRange(false), currentIndexCleared(false) {}
-
- void init();
- void clear();
- FxGridItem *createItem(int modelIndex);
- void releaseItem(FxGridItem *item);
- void refill(qreal from, qreal to, bool doBuffer=false);
-
- void updateGrid();
- void scheduleLayout();
- void layout();
- void updateUnrequestedIndexes();
- void updateUnrequestedPositions();
- void updateTrackedItem();
- void createHighlight();
- void updateHighlight();
- void updateCurrent(int modelIndex);
- void updateHeader();
- void updateFooter();
- void fixupPosition();
-
- FxGridItem *visibleItem(int modelIndex) const {
- if (modelIndex >= visibleIndex && modelIndex < visibleIndex + visibleItems.count()) {
- for (int i = modelIndex - visibleIndex; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems.at(i);
- if (item->index == modelIndex)
- return item;
- }
- }
- return 0;
- }
-
- bool isRightToLeftTopToBottom() const {
- Q_Q(const QDeclarativeGridView);
- return flow == QDeclarativeGridView::TopToBottom && q->effectiveLayoutDirection() == Qt::RightToLeft;
- }
-
- void regenerate() {
- Q_Q(QDeclarativeGridView);
- if (q->isComponentComplete()) {
- clear();
- updateGrid();
- setPosition(0);
- q->refill();
- updateCurrent(currentIndex);
- }
- }
-
- void mirrorChange() {
- Q_Q(QDeclarativeGridView);
- regenerate();
- emit q->effectiveLayoutDirectionChanged();
- }
-
- qreal position() const {
- Q_Q(const QDeclarativeGridView);
- return flow == QDeclarativeGridView::LeftToRight ? q->contentY() : q->contentX();
- }
- void setPosition(qreal pos) {
- Q_Q(QDeclarativeGridView);
- if (flow == QDeclarativeGridView::LeftToRight) {
- q->QDeclarativeFlickable::setContentY(pos);
- q->QDeclarativeFlickable::setContentX(0);
- } else {
- if (q->effectiveLayoutDirection() == Qt::LeftToRight)
- q->QDeclarativeFlickable::setContentX(pos);
- else
- q->QDeclarativeFlickable::setContentX(-pos-size());
- q->QDeclarativeFlickable::setContentY(0);
- }
- }
- int size() const {
- Q_Q(const QDeclarativeGridView);
- return flow == QDeclarativeGridView::LeftToRight ? q->height() : q->width();
- }
- qreal originPosition() const {
- qreal pos = 0;
- if (!visibleItems.isEmpty())
- pos = visibleItems.first()->rowPos() - visibleIndex / columns * rowSize();
- return pos;
- }
-
- qreal lastPosition() const {
- qreal pos = 0;
- if (model && model->count())
- pos = rowPosAt(model->count() - 1) + rowSize();
- return pos;
- }
-
- qreal startPosition() const {
- return isRightToLeftTopToBottom() ? -lastPosition()+1 : originPosition();
- }
-
- qreal endPosition() const {
- return isRightToLeftTopToBottom() ? -originPosition()+1 : lastPosition();
-
- }
-
- bool isValid() const {
- return model && model->count() && model->isValid();
- }
-
- int rowSize() const {
- return flow == QDeclarativeGridView::LeftToRight ? cellHeight : cellWidth;
- }
- int colSize() const {
- return flow == QDeclarativeGridView::LeftToRight ? cellWidth : cellHeight;
- }
-
- qreal colPosAt(int modelIndex) const {
- if (FxGridItem *item = visibleItem(modelIndex))
- return item->colPos();
- if (!visibleItems.isEmpty()) {
- if (modelIndex < visibleIndex) {
- int count = (visibleIndex - modelIndex) % columns;
- int col = visibleItems.first()->colPos() / colSize();
- col = (columns - count + col) % columns;
- return col * colSize();
- } else {
- int count = columns - 1 - (modelIndex - visibleItems.last()->index - 1) % columns;
- return visibleItems.last()->colPos() - count * colSize();
- }
- } else {
- return (modelIndex % columns) * colSize();
- }
- return 0;
- }
- qreal rowPosAt(int modelIndex) const {
- if (FxGridItem *item = visibleItem(modelIndex))
- return item->rowPos();
- if (!visibleItems.isEmpty()) {
- if (modelIndex < visibleIndex) {
- int firstCol = visibleItems.first()->colPos() / colSize();
- int col = visibleIndex - modelIndex + (columns - firstCol - 1);
- int rows = col / columns;
- return visibleItems.first()->rowPos() - rows * rowSize();
- } else {
- int count = modelIndex - visibleItems.last()->index;
- int col = visibleItems.last()->colPos() + count * colSize();
- int rows = col / (columns * colSize());
- return visibleItems.last()->rowPos() + rows * rowSize();
- }
- } else {
- qreal pos = (modelIndex / columns) * rowSize();
- if (header)
- pos += headerSize();
- return pos;
- }
- return 0;
- }
-
- FxGridItem *firstVisibleItem() const {
- const qreal pos = isRightToLeftTopToBottom() ? -position()-size() : position();
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems.at(i);
- if (item->index != -1 && item->endRowPos() > pos)
- return item;
- }
- return visibleItems.count() ? visibleItems.first() : 0;
- }
-
- int lastVisibleIndex() const {
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems.at(i);
- if (item->index != -1)
- return item->index;
- }
- return -1;
- }
-
- // Map a model index to visibleItems list index.
- // These may differ if removed items are still present in the visible list,
- // e.g. doing a removal animation
- int mapFromModel(int modelIndex) const {
- if (modelIndex < visibleIndex || modelIndex >= visibleIndex + visibleItems.count())
- return -1;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *listItem = visibleItems.at(i);
- if (listItem->index == modelIndex)
- return i + visibleIndex;
- if (listItem->index > modelIndex)
- return -1;
- }
- return -1; // Not in visibleList
- }
-
- qreal snapPosAt(qreal pos) const {
- Q_Q(const QDeclarativeGridView);
- qreal snapPos = 0;
- if (!visibleItems.isEmpty()) {
- pos += rowSize()/2;
- snapPos = visibleItems.first()->rowPos() - visibleIndex / columns * rowSize();
- snapPos = pos - fmodf(pos - snapPos, qreal(rowSize()));
- qreal maxExtent;
- qreal minExtent;
- if (isRightToLeftTopToBottom()) {
- maxExtent = q->minXExtent();
- minExtent = q->maxXExtent();
- } else {
- maxExtent = flow == QDeclarativeGridView::LeftToRight ? -q->maxYExtent() : -q->maxXExtent();
- minExtent = flow == QDeclarativeGridView::LeftToRight ? -q->minYExtent() : -q->minXExtent();
- }
- if (snapPos > maxExtent)
- snapPos = maxExtent;
- if (snapPos < minExtent)
- snapPos = minExtent;
- }
- return snapPos;
- }
-
- FxGridItem *snapItemAt(qreal pos) {
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems[i];
- if (item->index == -1)
- continue;
- qreal itemTop = item->rowPos();
- if (itemTop+rowSize()/2 >= pos && itemTop - rowSize()/2 <= pos)
- return item;
- }
- return 0;
- }
-
- int snapIndex() {
- int index = currentIndex;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems[i];
- if (item->index == -1)
- continue;
- qreal itemTop = item->rowPos();
- if (itemTop >= highlight->rowPos()-rowSize()/2 && itemTop < highlight->rowPos()+rowSize()/2) {
- index = item->index;
- if (item->colPos() >= highlight->colPos()-colSize()/2 && item->colPos() < highlight->colPos()+colSize()/2)
- return item->index;
- }
- }
- return index;
- }
-
- qreal headerSize() const {
- if (!header)
- return 0.0;
-
- return flow == QDeclarativeGridView::LeftToRight
- ? header->item->height()
- : header->item->width();
- }
-
-
- virtual void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
- Q_Q(const QDeclarativeGridView);
- QDeclarativeFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
- if (item == q) {
- if (newGeometry.height() != oldGeometry.height()
- || newGeometry.width() != oldGeometry.width()) {
- if (q->isComponentComplete()) {
- updateGrid();
- scheduleLayout();
- }
- }
- } else if ((header && header->item == item) || (footer && footer->item == item)) {
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- }
- }
-
- void positionViewAtIndex(int index, int mode);
- virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
- virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
-
- // for debugging only
- void checkVisible() const {
- int skip = 0;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxGridItem *listItem = visibleItems.at(i);
- if (listItem->index == -1) {
- ++skip;
- } else if (listItem->index != visibleIndex + i - skip) {
- for (int j = 0; j < visibleItems.count(); j++)
- qDebug() << " index" << j << "item index" << visibleItems.at(j)->index;
- qFatal("index %d %d %d", visibleIndex, i, listItem->index);
- }
- }
- }
-
- QDeclarativeGuard<QDeclarativeVisualModel> model;
- QVariant modelVariant;
- QList<FxGridItem*> visibleItems;
- QHash<QDeclarativeItem*,int> unrequestedItems;
- FxGridItem *currentItem;
- Qt::LayoutDirection layoutDirection;
- QDeclarativeGridView::Flow flow;
- int visibleIndex;
- int currentIndex;
- int cellWidth;
- int cellHeight;
- int columns;
- int requestedIndex;
- int itemCount;
- qreal highlightRangeStart;
- qreal highlightRangeEnd;
- bool highlightRangeStartValid;
- bool highlightRangeEndValid;
- QDeclarativeGridView::HighlightRangeMode highlightRange;
- QDeclarativeComponent *highlightComponent;
- FxGridItem *highlight;
- FxGridItem *trackedItem;
- enum MovementReason { Other, SetIndex, Mouse };
- MovementReason moveReason;
- int buffer;
- QSmoothedAnimation *highlightXAnimator;
- QSmoothedAnimation *highlightYAnimator;
- int highlightMoveDuration;
- QDeclarativeComponent *footerComponent;
- FxGridItem *footer;
- QDeclarativeComponent *headerComponent;
- FxGridItem *header;
- enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
- int bufferMode;
- QDeclarativeGridView::SnapMode snapMode;
-
- bool ownModel : 1;
- bool wrap : 1;
- bool autoHighlight : 1;
- bool fixCurrentVisibility : 1;
- bool lazyRelease : 1;
- bool layoutScheduled : 1;
- bool deferredRelease : 1;
- bool haveHighlightRange : 1;
- bool currentIndexCleared : 1;
-};
-
-void QDeclarativeGridViewPrivate::init()
-{
- Q_Q(QDeclarativeGridView);
- QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped()));
- q->setFlag(QGraphicsItem::ItemIsFocusScope);
- q->setFlickableDirection(QDeclarativeFlickable::VerticalFlick);
- addItemChangeListener(this, Geometry);
-}
-
-void QDeclarativeGridViewPrivate::clear()
-{
- for (int i = 0; i < visibleItems.count(); ++i)
- releaseItem(visibleItems.at(i));
- visibleItems.clear();
- visibleIndex = 0;
- releaseItem(currentItem);
- currentItem = 0;
- createHighlight();
- trackedItem = 0;
- itemCount = 0;
-}
-
-FxGridItem *QDeclarativeGridViewPrivate::createItem(int modelIndex)
-{
- Q_Q(QDeclarativeGridView);
- // create object
- requestedIndex = modelIndex;
- FxGridItem *listItem = 0;
- if (QDeclarativeItem *item = model->item(modelIndex, false)) {
- listItem = new FxGridItem(item, q);
- listItem->index = modelIndex;
- if (model->completePending()) {
- // complete
- listItem->item->setZValue(1);
- listItem->item->setParentItem(q->contentItem());
- model->completeItem();
- } else {
- listItem->item->setParentItem(q->contentItem());
- }
- unrequestedItems.remove(listItem->item);
- }
- requestedIndex = -1;
- return listItem;
-}
-
-
-void QDeclarativeGridViewPrivate::releaseItem(FxGridItem *item)
-{
- Q_Q(QDeclarativeGridView);
- if (!item || !model)
- return;
- if (trackedItem == item) {
- QObject::disconnect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
- QObject::disconnect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
- trackedItem = 0;
- }
- if (model->release(item->item) == 0) {
- // item was not destroyed, and we no longer reference it.
- unrequestedItems.insert(item->item, model->indexOf(item->item, q));
- }
- delete item;
-}
-
-void QDeclarativeGridViewPrivate::refill(qreal from, qreal to, bool doBuffer)
-{
- Q_Q(QDeclarativeGridView);
- if (!isValid() || !q->isComponentComplete())
- return;
- itemCount = model->count();
- qreal bufferFrom = from - buffer;
- qreal bufferTo = to + buffer;
- qreal fillFrom = from;
- qreal fillTo = to;
- if (doBuffer && (bufferMode & BufferAfter))
- fillTo = bufferTo;
- if (doBuffer && (bufferMode & BufferBefore))
- fillFrom = bufferFrom;
-
- bool changed = false;
-
- int colPos = colPosAt(visibleIndex);
- int rowPos = rowPosAt(visibleIndex);
- int modelIndex = visibleIndex;
- if (visibleItems.count()) {
- rowPos = visibleItems.last()->rowPos();
- colPos = visibleItems.last()->colPos() + colSize();
- if (colPos > colSize() * (columns-1)) {
- colPos = 0;
- rowPos += rowSize();
- }
- int i = visibleItems.count() - 1;
- while (i > 0 && visibleItems.at(i)->index == -1)
- --i;
- modelIndex = visibleItems.at(i)->index + 1;
- }
-
- if (visibleItems.count() && (fillFrom > rowPos + rowSize()*2
- || fillTo < rowPosAt(visibleIndex) - rowSize())) {
- // We've jumped more than a page. Estimate which items are now
- // visible and fill from there.
- int count = (fillFrom - (rowPos + rowSize())) / (rowSize()) * columns;
- for (int i = 0; i < visibleItems.count(); ++i)
- releaseItem(visibleItems.at(i));
- visibleItems.clear();
- modelIndex += count;
- if (modelIndex >= model->count())
- modelIndex = model->count() - 1;
- else if (modelIndex < 0)
- modelIndex = 0;
- modelIndex = modelIndex / columns * columns;
- visibleIndex = modelIndex;
- colPos = colPosAt(visibleIndex);
- rowPos = rowPosAt(visibleIndex);
- }
-
- int colNum = colPos / colSize();
-
- FxGridItem *item = 0;
-
- // Item creation and release is staggered in order to avoid
- // creating/releasing multiple items in one frame
- // while flicking (as much as possible).
- while (modelIndex < model->count() && rowPos <= fillTo + rowSize()*(columns - colNum)/(columns+1)) {
-// qDebug() << "refill: append item" << modelIndex;
- if (!(item = createItem(modelIndex)))
- break;
- item->setPosition(colPos, rowPos);
- visibleItems.append(item);
- colPos += colSize();
- colNum++;
- if (colPos > colSize() * (columns-1)) {
- colPos = 0;
- colNum = 0;
- rowPos += rowSize();
- }
- ++modelIndex;
- changed = true;
- if (doBuffer) // never buffer more than one item per frame
- break;
- }
-
- if (visibleItems.count()) {
- rowPos = visibleItems.first()->rowPos();
- colPos = visibleItems.first()->colPos() - colSize();
- if (colPos < 0) {
- colPos = colSize() * (columns - 1);
- rowPos -= rowSize();
- }
- }
- colNum = colPos / colSize();
- while (visibleIndex > 0 && rowPos + rowSize() - 1 >= fillFrom - rowSize()*(colNum+1)/(columns+1)){
-// qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos;
- if (!(item = createItem(visibleIndex-1)))
- break;
- --visibleIndex;
- item->setPosition(colPos, rowPos);
- visibleItems.prepend(item);
- colPos -= colSize();
- colNum--;
- if (colPos < 0) {
- colPos = colSize() * (columns - 1);
- colNum = columns-1;
- rowPos -= rowSize();
- }
- changed = true;
- if (doBuffer) // never buffer more than one item per frame
- break;
- }
-
- if (!lazyRelease || !changed || deferredRelease) { // avoid destroying items in the same frame that we create
- while (visibleItems.count() > 1
- && (item = visibleItems.first())
- && item->rowPos()+rowSize()-1 < bufferFrom - rowSize()*(item->colPos()/colSize()+1)/(columns+1)) {
- if (item->attached->delayRemove())
- break;
-// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos();
- if (item->index != -1)
- visibleIndex++;
- visibleItems.removeFirst();
- releaseItem(item);
- changed = true;
- }
- while (visibleItems.count() > 1
- && (item = visibleItems.last())
- && item->rowPos() > bufferTo + rowSize()*(columns - item->colPos()/colSize())/(columns+1)) {
- if (item->attached->delayRemove())
- break;
-// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1;
- visibleItems.removeLast();
- releaseItem(item);
- changed = true;
- }
- deferredRelease = false;
- } else {
- deferredRelease = true;
- }
- if (changed) {
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- if (flow == QDeclarativeGridView::LeftToRight)
- q->setContentHeight(endPosition() - startPosition());
- else
- q->setContentWidth(endPosition() - startPosition());
- } else if (!doBuffer && buffer && bufferMode != NoBuffer) {
- refill(from, to, true);
- }
- lazyRelease = false;
-}
-
-void QDeclarativeGridViewPrivate::updateGrid()
-{
- Q_Q(QDeclarativeGridView);
-
- columns = (int)qMax((flow == QDeclarativeGridView::LeftToRight ? q->width() : q->height()) / colSize(), qreal(1.));
- if (isValid()) {
- if (flow == QDeclarativeGridView::LeftToRight)
- q->setContentHeight(endPosition() - startPosition());
- else
- q->setContentWidth(lastPosition() - originPosition());
- }
-}
-
-void QDeclarativeGridViewPrivate::scheduleLayout()
-{
- Q_Q(QDeclarativeGridView);
- if (!layoutScheduled) {
- layoutScheduled = true;
- QCoreApplication::postEvent(q, new QEvent(QEvent::User), Qt::HighEventPriority);
- }
-}
-
-void QDeclarativeGridViewPrivate::layout()
-{
- Q_Q(QDeclarativeGridView);
- layoutScheduled = false;
- if (!isValid() && !visibleItems.count()) {
- clear();
- return;
- }
- if (visibleItems.count()) {
- qreal rowPos = visibleItems.first()->rowPos();
- qreal colPos = visibleItems.first()->colPos();
- int col = visibleIndex % columns;
- if (colPos != col * colSize()) {
- colPos = col * colSize();
- visibleItems.first()->setPosition(colPos, rowPos);
- }
- for (int i = 1; i < visibleItems.count(); ++i) {
- FxGridItem *item = visibleItems.at(i);
- colPos += colSize();
- if (colPos > colSize() * (columns-1)) {
- colPos = 0;
- rowPos += rowSize();
- }
- item->setPosition(colPos, rowPos);
- }
- }
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- q->refill();
- updateHighlight();
- moveReason = Other;
- if (flow == QDeclarativeGridView::LeftToRight) {
- q->setContentHeight(endPosition() - startPosition());
- fixupY();
- } else {
- q->setContentWidth(endPosition() - startPosition());
- fixupX();
- }
- updateUnrequestedPositions();
-}
-
-void QDeclarativeGridViewPrivate::updateUnrequestedIndexes()
-{
- Q_Q(QDeclarativeGridView);
- QHash<QDeclarativeItem*,int>::iterator it;
- for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it)
- *it = model->indexOf(it.key(), q);
-}
-
-void QDeclarativeGridViewPrivate::updateUnrequestedPositions()
-{
- QHash<QDeclarativeItem*,int>::const_iterator it;
- for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it) {
- QDeclarativeItem *item = it.key();
- if (flow == QDeclarativeGridView::LeftToRight) {
- item->setPos(QPointF(colPosAt(*it), rowPosAt(*it)));
- } else {
- if (isRightToLeftTopToBottom())
- item->setPos(QPointF(-rowPosAt(*it)-item->width(), colPosAt(*it)));
- else
- item->setPos(QPointF(rowPosAt(*it), colPosAt(*it)));
- }
- }
-}
-
-void QDeclarativeGridViewPrivate::updateTrackedItem()
-{
- Q_Q(QDeclarativeGridView);
- FxGridItem *item = currentItem;
- if (highlight)
- item = highlight;
-
- if (trackedItem && item != trackedItem) {
- QObject::disconnect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
- QObject::disconnect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
- trackedItem = 0;
- }
-
- if (!trackedItem && item) {
- trackedItem = item;
- QObject::connect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged()));
- QObject::connect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged()));
- }
- if (trackedItem)
- q->trackedPositionChanged();
-}
-
-void QDeclarativeGridViewPrivate::createHighlight()
-{
- Q_Q(QDeclarativeGridView);
- bool changed = false;
- if (highlight) {
- if (trackedItem == highlight)
- trackedItem = 0;
- if (highlight->item->scene())
- highlight->item->scene()->removeItem(highlight->item);
- highlight->item->deleteLater();
- delete highlight;
- highlight = 0;
- delete highlightXAnimator;
- delete highlightYAnimator;
- highlightXAnimator = 0;
- highlightYAnimator = 0;
- changed = true;
- }
-
- if (currentItem) {
- QDeclarativeItem *item = 0;
- if (highlightComponent) {
- QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = highlightComponent->create(highlightContext);
- if (nobj) {
- QDeclarative_setParent_noEvent(highlightContext, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete highlightContext;
- }
- } else {
- item = new QDeclarativeItem;
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- highlight = new FxGridItem(item, q);
- if (currentItem && autoHighlight)
- highlight->setPosition(currentItem->colPos(), currentItem->rowPos());
- highlightXAnimator = new QSmoothedAnimation(q);
- highlightXAnimator->target = QDeclarativeProperty(highlight->item, QLatin1String("x"));
- highlightXAnimator->userDuration = highlightMoveDuration;
- highlightYAnimator = new QSmoothedAnimation(q);
- highlightYAnimator->target = QDeclarativeProperty(highlight->item, QLatin1String("y"));
- highlightYAnimator->userDuration = highlightMoveDuration;
- if (autoHighlight) {
- highlightXAnimator->restart();
- highlightYAnimator->restart();
- }
- changed = true;
- }
- }
- if (changed)
- emit q->highlightItemChanged();
-}
-
-void QDeclarativeGridViewPrivate::updateHighlight()
-{
- if ((!currentItem && highlight) || (currentItem && !highlight))
- createHighlight();
- if (currentItem && autoHighlight && highlight && !movingHorizontally && !movingVertically) {
- // auto-update highlight
- highlightXAnimator->to = currentItem->item->x();
- highlightYAnimator->to = currentItem->item->y();
- highlight->item->setWidth(currentItem->item->width());
- highlight->item->setHeight(currentItem->item->height());
- highlightXAnimator->restart();
- highlightYAnimator->restart();
- }
- updateTrackedItem();
-}
-
-void QDeclarativeGridViewPrivate::updateCurrent(int modelIndex)
-{
- Q_Q(QDeclarativeGridView);
- if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) {
- if (currentItem) {
- currentItem->attached->setIsCurrentItem(false);
- releaseItem(currentItem);
- currentItem = 0;
- currentIndex = modelIndex;
- emit q->currentIndexChanged();
- updateHighlight();
- } else if (currentIndex != modelIndex) {
- currentIndex = modelIndex;
- emit q->currentIndexChanged();
- }
- return;
- }
-
- if (currentItem && currentIndex == modelIndex) {
- updateHighlight();
- return;
- }
-
- FxGridItem *oldCurrentItem = currentItem;
- currentIndex = modelIndex;
- currentItem = createItem(modelIndex);
- fixCurrentVisibility = true;
- if (oldCurrentItem && (!currentItem || oldCurrentItem->item != currentItem->item))
- oldCurrentItem->attached->setIsCurrentItem(false);
- if (currentItem) {
- currentItem->setPosition(colPosAt(modelIndex), rowPosAt(modelIndex));
- currentItem->item->setFocus(true);
- currentItem->attached->setIsCurrentItem(true);
- }
- updateHighlight();
- emit q->currentIndexChanged();
- releaseItem(oldCurrentItem);
-}
-
-void QDeclarativeGridViewPrivate::updateFooter()
-{
- Q_Q(QDeclarativeGridView);
- if (!footer && footerComponent) {
- QDeclarativeItem *item = 0;
- QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = footerComponent->create(context);
- if (nobj) {
- QDeclarative_setParent_noEvent(context, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete context;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- item->setZValue(1);
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- footer = new FxGridItem(item, q);
- }
- }
- if (footer) {
- qreal colOffset = 0;
- qreal rowOffset;
- if (isRightToLeftTopToBottom()) {
- rowOffset = footer->item->width()-cellWidth;
- } else {
- rowOffset = 0;
- if (q->effectiveLayoutDirection() == Qt::RightToLeft)
- colOffset = footer->item->width()-cellWidth;
- }
- if (visibleItems.count()) {
- qreal endPos = lastPosition();
- if (lastVisibleIndex() == model->count()-1) {
- footer->setPosition(colOffset, endPos + rowOffset);
- } else {
- qreal visiblePos = isRightToLeftTopToBottom() ? -position() : position() + size();
- if (endPos <= visiblePos || footer->endRowPos() < endPos + rowOffset)
- footer->setPosition(colOffset, endPos + rowOffset);
- }
- } else {
- qreal endPos = 0;
- if (header) {
- endPos += flow == QDeclarativeGridView::LeftToRight ? header->item->height() : header->item->width();
- }
- footer->setPosition(colOffset, endPos);
- }
- }
-}
-
-void QDeclarativeGridViewPrivate::updateHeader()
-{
- Q_Q(QDeclarativeGridView);
- if (!header && headerComponent) {
- QDeclarativeItem *item = 0;
- QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = headerComponent->create(context);
- if (nobj) {
- QDeclarative_setParent_noEvent(context, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete context;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- item->setZValue(1);
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- header = new FxGridItem(item, q);
- }
- }
- if (header) {
- qreal colOffset = 0;
- qreal rowOffset;
- if (isRightToLeftTopToBottom()) {
- rowOffset = -cellWidth;
- } else {
- rowOffset = -headerSize();
- if (q->effectiveLayoutDirection() == Qt::RightToLeft)
- colOffset = header->item->width()-cellWidth;
- }
- if (visibleItems.count()) {
- qreal startPos = originPosition();
- if (visibleIndex == 0) {
- header->setPosition(colOffset, startPos + rowOffset);
- } else {
- qreal tempPos = isRightToLeftTopToBottom() ? -position()-size() : position();
- qreal headerPos = isRightToLeftTopToBottom() ? header->rowPos() + cellWidth - headerSize() : header->rowPos();
- if (tempPos <= startPos || headerPos > startPos + rowOffset)
- header->setPosition(colOffset, startPos + rowOffset);
- }
- } else {
- header->setPosition(colOffset, 0);
- }
- }
-}
-
-void QDeclarativeGridViewPrivate::fixupPosition()
-{
- moveReason = Other;
- if (flow == QDeclarativeGridView::LeftToRight)
- fixupY();
- else
- fixupX();
-}
-
-void QDeclarativeGridViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
-{
- if ((flow == QDeclarativeGridView::TopToBottom && &data == &vData)
- || (flow == QDeclarativeGridView::LeftToRight && &data == &hData))
- return;
-
- fixupMode = moveReason == Mouse ? fixupMode : Immediate;
-
- qreal highlightStart;
- qreal highlightEnd;
- qreal viewPos;
- if (isRightToLeftTopToBottom()) {
- // Handle Right-To-Left exceptions
- viewPos = -position()-size();
- highlightStart = highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
- highlightEnd = highlightRangeEndValid ? size()-highlightRangeStart : highlightRangeEnd;
- } else {
- viewPos = position();
- highlightStart = highlightRangeStart;
- highlightEnd = highlightRangeEnd;
- }
-
- if (snapMode != QDeclarativeGridView::NoSnap) {
- qreal tempPosition = isRightToLeftTopToBottom() ? -position()-size() : position();
- FxGridItem *topItem = snapItemAt(tempPosition+highlightStart);
- FxGridItem *bottomItem = snapItemAt(tempPosition+highlightEnd);
- qreal pos;
- if (topItem && bottomItem && haveHighlightRange && highlightRange == QDeclarativeGridView::StrictlyEnforceRange) {
- qreal topPos = qMin(topItem->rowPos() - highlightStart, -maxExtent);
- qreal bottomPos = qMax(bottomItem->rowPos() - highlightEnd, -minExtent);
- pos = qAbs(data.move + topPos) < qAbs(data.move + bottomPos) ? topPos : bottomPos;
- } else if (topItem) {
- qreal headerPos = 0;
- if (header)
- headerPos = isRightToLeftTopToBottom() ? header->rowPos() + cellWidth - headerSize() : header->rowPos();
- if (topItem->index == 0 && header && tempPosition+highlightStart < headerPos+headerSize()/2) {
- pos = isRightToLeftTopToBottom() ? - headerPos + highlightStart - size() : headerPos - highlightStart;
- } else {
- if (isRightToLeftTopToBottom())
- pos = qMax(qMin(-topItem->rowPos() + highlightStart - size(), -maxExtent), -minExtent);
- else
- pos = qMax(qMin(topItem->rowPos() - highlightStart, -maxExtent), -minExtent);
- }
- } else if (bottomItem) {
- if (isRightToLeftTopToBottom())
- pos = qMax(qMin(-bottomItem->rowPos() + highlightStart - size(), -maxExtent), -minExtent);
- else
- pos = qMax(qMin(bottomItem->rowPos() - highlightStart, -maxExtent), -minExtent);
- } else {
- QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
- return;
- }
- if (currentItem && haveHighlightRange && highlightRange == QDeclarativeGridView::StrictlyEnforceRange) {
- updateHighlight();
- qreal currPos = currentItem->rowPos();
- if (isRightToLeftTopToBottom())
- pos = -pos-size(); // Transform Pos if required
- if (pos < currPos + rowSize() - highlightEnd)
- pos = currPos + rowSize() - highlightEnd;
- if (pos > currPos - highlightStart)
- pos = currPos - highlightStart;
- if (isRightToLeftTopToBottom())
- pos = -pos-size(); // Untransform
- }
- qreal dist = qAbs(data.move + pos);
- if (dist > 0) {
- timeline.reset(data.move);
- if (fixupMode != Immediate) {
- timeline.move(data.move, -pos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
- data.fixingUp = true;
- } else {
- timeline.set(data.move, -pos);
- }
- vTime = timeline.time();
- }
- } else if (haveHighlightRange && highlightRange == QDeclarativeGridView::StrictlyEnforceRange) {
- if (currentItem) {
- updateHighlight();
- qreal pos = currentItem->rowPos();
- if (viewPos < pos + rowSize() - highlightEnd)
- viewPos = pos + rowSize() - highlightEnd;
- if (viewPos > pos - highlightStart)
- viewPos = pos - highlightStart;
- if (isRightToLeftTopToBottom())
- viewPos = -viewPos-size();
- timeline.reset(data.move);
- if (viewPos != position()) {
- if (fixupMode != Immediate) {
- timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
- data.fixingUp = true;
- } else {
- timeline.set(data.move, -viewPos);
- }
- }
- vTime = timeline.time();
- }
- } else {
- QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
- }
- data.inOvershoot = false;
- fixupMode = Normal;
-}
-
-void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
-{
- Q_Q(QDeclarativeGridView);
- data.fixingUp = false;
- moveReason = Mouse;
- if ((!haveHighlightRange || highlightRange != QDeclarativeGridView::StrictlyEnforceRange)
- && snapMode == QDeclarativeGridView::NoSnap) {
- QDeclarativeFlickablePrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity);
- return;
- }
- qreal maxDistance = 0;
- qreal dataValue = isRightToLeftTopToBottom() ? -data.move.value()+size() : data.move.value();
- // -ve velocity means list is moving up/left
- if (velocity > 0) {
- if (data.move.value() < minExtent) {
- if (snapMode == QDeclarativeGridView::SnapOneRow) {
- if (FxGridItem *item = firstVisibleItem()) {
- maxDistance = qAbs(item->rowPos() + dataValue);
- }
- } else {
- maxDistance = qAbs(minExtent - data.move.value());
- }
- }
- if (snapMode == QDeclarativeGridView::NoSnap && highlightRange != QDeclarativeGridView::StrictlyEnforceRange)
- data.flickTarget = minExtent;
- } else {
- if (data.move.value() > maxExtent) {
- if (snapMode == QDeclarativeGridView::SnapOneRow) {
- qreal pos = snapPosAt(-dataValue) + (isRightToLeftTopToBottom() ? 0 : rowSize());
- maxDistance = qAbs(pos + dataValue);
- } else {
- maxDistance = qAbs(maxExtent - data.move.value());
- }
- }
- if (snapMode == QDeclarativeGridView::NoSnap && highlightRange != QDeclarativeGridView::StrictlyEnforceRange)
- data.flickTarget = maxExtent;
- }
-
- bool overShoot = boundsBehavior == QDeclarativeFlickable::DragAndOvershootBounds;
- qreal highlightStart = isRightToLeftTopToBottom() && highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
-
- if (maxDistance > 0 || overShoot) {
- // This mode requires the grid to stop exactly on a row boundary.
- qreal v = velocity;
- if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
- if (v < 0)
- v = -maxVelocity;
- else
- v = maxVelocity;
- }
- qreal accel = deceleration;
- qreal v2 = v * v;
- qreal overshootDist = 0.0;
- if ((maxDistance > 0.0 && v2 / (2.0f * maxDistance) < accel) || snapMode == QDeclarativeGridView::SnapOneRow) {
- // + rowSize()/4 to encourage moving at least one item in the flick direction
- qreal dist = v2 / (accel * 2.0) + rowSize()/4;
- dist = qMin(dist, maxDistance);
- if (v > 0)
- dist = -dist;
- qreal distTemp = isRightToLeftTopToBottom() ? -dist : dist;
- data.flickTarget = -snapPosAt(-(dataValue - highlightStart) + distTemp) + highlightStart;
- data.flickTarget = isRightToLeftTopToBottom() ? -data.flickTarget+size() : data.flickTarget;
- qreal adjDist = -data.flickTarget + data.move.value();
- if (qAbs(adjDist) > qAbs(dist)) {
- // Prevent painfully slow flicking - adjust velocity to suit flickDeceleration
- qreal adjv2 = accel * 2.0f * qAbs(adjDist);
- if (adjv2 > v2) {
- v2 = adjv2;
- v = qSqrt(v2);
- if (dist > 0)
- v = -v;
- }
- }
- dist = adjDist;
- accel = v2 / (2.0f * qAbs(dist));
- } else {
- data.flickTarget = velocity > 0 ? minExtent : maxExtent;
- overshootDist = overShoot ? overShootDistance(vSize) : 0;
- }
- timeline.reset(data.move);
- timeline.accel(data.move, v, accel, maxDistance + overshootDist);
- timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
- if (!flickingHorizontally && q->xflick()) {
- flickingHorizontally = true;
- emit q->flickingChanged();
- emit q->flickingHorizontallyChanged();
- emit q->flickStarted();
- }
- if (!flickingVertically && q->yflick()) {
- flickingVertically = true;
- emit q->flickingChanged();
- emit q->flickingVerticallyChanged();
- emit q->flickStarted();
- }
- } else {
- timeline.reset(data.move);
- fixup(data, minExtent, maxExtent);
- }
-}
-
-
-//----------------------------------------------------------------------------
-
-/*!
- \qmlclass GridView QDeclarativeGridView
- \since 4.7
- \ingroup qml-view-elements
-
- \inherits Flickable
- \brief The GridView item provides a grid view of items provided by a model.
-
- A GridView displays data from models created from built-in QML elements like ListModel
- and XmlListModel, or custom model classes defined in C++ that inherit from
- QAbstractListModel.
-
- A GridView has a \l model, which defines the data to be displayed, and
- a \l delegate, which defines how the data should be displayed. Items in a
- GridView are laid out horizontally or vertically. Grid views are inherently flickable
- as GridView inherits from \l Flickable.
-
- \section1 Example Usage
-
- The following example shows the definition of a simple list model defined
- in a file called \c ContactModel.qml:
-
- \snippet doc/src/snippets/declarative/gridview/ContactModel.qml 0
-
- \div {class="float-right"}
- \inlineimage gridview-simple.png
- \enddiv
-
- This model can be referenced as \c ContactModel in other QML files. See \l{QML Modules}
- for more information about creating reusable components like this.
-
- Another component can display this model data in a GridView, as in the following
- example, which creates a \c ContactModel component for its model, and a \l Column element
- (containing \l Image and \l Text elements) for its delegate.
-
- \clearfloat
- \snippet doc/src/snippets/declarative/gridview/gridview.qml import
- \codeline
- \snippet doc/src/snippets/declarative/gridview/gridview.qml classdocs simple
-
- \div {class="float-right"}
- \inlineimage gridview-highlight.png
- \enddiv
-
- The view will create a new delegate for each item in the model. Note that the delegate
- is able to access the model's \c name and \c portrait data directly.
-
- An improved grid view is shown below. The delegate is visually improved and is moved
- into a separate \c contactDelegate component.
-
- \clearfloat
- \snippet doc/src/snippets/declarative/gridview/gridview.qml classdocs advanced
-
- The currently selected item is highlighted with a blue \l Rectangle using the \l highlight property,
- and \c focus is set to \c true to enable keyboard navigation for the grid view.
- The grid view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
-
- Delegates are instantiated as needed and may be destroyed at any time.
- State should \e never be stored in a delegate.
-
- GridView attaches a number of properties to the root item of the delegate, for example
- \c {GridView.isCurrentItem}. In the following example, the root delegate item can access
- this attached property directly as \c GridView.isCurrentItem, while the child
- \c contactInfo object must refer to this property as \c wrapper.GridView.isCurrentItem.
-
- \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
-
- \note Views do not set the \l{Item::}{clip} property automatically.
- If the view is not clipped by another item or the screen, it will be necessary
- to set this property to true in order to clip the items that are partially or
- fully outside the view.
-
- \sa {declarative/modelviews/gridview}{GridView example}
-*/
-QDeclarativeGridView::QDeclarativeGridView(QDeclarativeItem *parent)
- : QDeclarativeFlickable(*(new QDeclarativeGridViewPrivate), parent)
-{
- Q_D(QDeclarativeGridView);
- d->init();
-}
-
-QDeclarativeGridView::~QDeclarativeGridView()
-{
- Q_D(QDeclarativeGridView);
- d->clear();
- if (d->ownModel)
- delete d->model;
- delete d->header;
- delete d->footer;
-}
-
-/*!
- \qmlattachedproperty bool GridView::isCurrentItem
- This attached property is true if this delegate is the current item; otherwise false.
-
- It is attached to each instance of the delegate.
-*/
-
-/*!
- \qmlattachedproperty GridView GridView::view
- This attached property holds the view that manages this delegate instance.
-
- It is attached to each instance of the delegate.
-
- \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
-*/
-
-/*!
- \qmlattachedproperty bool GridView::delayRemove
- This attached property holds whether the delegate may be destroyed.
-
- It is attached to each instance of the delegate.
-
- It is sometimes necessary to delay the destruction of an item
- until an animation completes.
-
- The example below ensures that the animation completes before
- the item is removed from the grid.
-
- \snippet doc/src/snippets/declarative/gridview/gridview.qml delayRemove
-*/
-
-/*!
- \qmlattachedsignal GridView::onAdd()
- This attached handler is called immediately after an item is added to the view.
-*/
-
-/*!
- \qmlattachedsignal GridView::onRemove()
- This attached handler is called immediately before an item is removed from the view.
-*/
-
-
-/*!
- \qmlproperty model GridView::model
- This property holds the model providing data for the grid.
-
- The model provides the set of data that is used to create the items
- in the view. Models can be created directly in QML using \l ListModel, \l XmlListModel
- or \l VisualItemModel, or provided by C++ model classes. If a C++ model class is
- used, it must be a subclass of \l QAbstractItemModel or a simple list.
-
- \sa {qmlmodels}{Data Models}
-*/
-QVariant QDeclarativeGridView::model() const
-{
- Q_D(const QDeclarativeGridView);
- return d->modelVariant;
-}
-
-// For internal use
-int QDeclarativeGridView::modelCount() const
-{
- Q_D(const QDeclarativeGridView);
- return d->model->count();
-}
-
-void QDeclarativeGridView::setModel(const QVariant &model)
-{
- Q_D(QDeclarativeGridView);
- if (d->modelVariant == model)
- return;
- if (d->model) {
- disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- disconnect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- disconnect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- }
- d->clear();
- d->modelVariant = model;
- QObject *object = qvariant_cast<QObject*>(model);
- QDeclarativeVisualModel *vim = 0;
- if (object && (vim = qobject_cast<QDeclarativeVisualModel *>(object))) {
- if (d->ownModel) {
- delete d->model;
- d->ownModel = false;
- }
- d->model = vim;
- } else {
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this), this);
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- dataModel->setModel(model);
- }
- if (d->model) {
- d->bufferMode = QDeclarativeGridViewPrivate::BufferBefore | QDeclarativeGridViewPrivate::BufferAfter;
- if (isComponentComplete()) {
- refill();
- if ((d->currentIndex >= d->model->count() || d->currentIndex < 0) && !d->currentIndexCleared) {
- setCurrentIndex(0);
- } else {
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- }
- }
- connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- connect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- connect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- emit countChanged();
- }
- emit modelChanged();
-}
-
-/*!
- \qmlproperty Component GridView::delegate
-
- The delegate provides a template defining each item instantiated by the view.
- The index is exposed as an accessible \c index property. Properties of the
- model are also available depending upon the type of \l {qmlmodels}{Data Model}.
-
- The number of elements in the delegate has a direct effect on the
- flicking performance of the view. If at all possible, place functionality
- that is not needed for the normal display of the delegate in a \l Loader which
- can load additional elements when needed.
-
- The GridView will layout the items based on the size of the root item
- in the delegate.
-
- \note Delegates are instantiated as needed and may be destroyed at any time.
- State should \e never be stored in a delegate.
-*/
-QDeclarativeComponent *QDeclarativeGridView::delegate() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->model) {
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- return dataModel->delegate();
- }
-
- return 0;
-}
-
-void QDeclarativeGridView::setDelegate(QDeclarativeComponent *delegate)
-{
- Q_D(QDeclarativeGridView);
- if (delegate == this->delegate())
- return;
-
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this));
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model)) {
- int oldCount = dataModel->count();
- dataModel->setDelegate(delegate);
- if (isComponentComplete()) {
- for (int i = 0; i < d->visibleItems.count(); ++i)
- d->releaseItem(d->visibleItems.at(i));
- d->visibleItems.clear();
- d->releaseItem(d->currentItem);
- d->currentItem = 0;
- refill();
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- }
- if (oldCount != dataModel->count())
- emit countChanged();
- emit delegateChanged();
- }
-}
-
-/*!
- \qmlproperty int GridView::currentIndex
- \qmlproperty Item GridView::currentItem
-
- The \c currentIndex property holds the index of the current item, and
- \c currentItem holds the current item. Setting the currentIndex to -1
- will clear the highlight and set currentItem to null.
-
- If highlightFollowsCurrentItem is \c true, setting either of these
- properties will smoothly scroll the GridView so that the current
- item becomes visible.
-
- Note that the position of the current item
- may only be approximate until it becomes visible in the view.
-*/
-int QDeclarativeGridView::currentIndex() const
-{
- Q_D(const QDeclarativeGridView);
- return d->currentIndex;
-}
-
-void QDeclarativeGridView::setCurrentIndex(int index)
-{
- Q_D(QDeclarativeGridView);
- if (d->requestedIndex >= 0) // currently creating item
- return;
- d->currentIndexCleared = (index == -1);
- if (index == d->currentIndex)
- return;
- if (isComponentComplete() && d->isValid()) {
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- d->updateCurrent(index);
- } else {
- d->currentIndex = index;
- emit currentIndexChanged();
- }
-}
-
-QDeclarativeItem *QDeclarativeGridView::currentItem()
-{
- Q_D(QDeclarativeGridView);
- if (!d->currentItem)
- return 0;
- return d->currentItem->item;
-}
-
-/*!
- \qmlproperty Item GridView::highlightItem
-
- This holds the highlight item created from the \l highlight component.
-
- The highlightItem is managed by the view unless
- \l highlightFollowsCurrentItem is set to false.
-
- \sa highlight, highlightFollowsCurrentItem
-*/
-QDeclarativeItem *QDeclarativeGridView::highlightItem()
-{
- Q_D(QDeclarativeGridView);
- if (!d->highlight)
- return 0;
- return d->highlight->item;
-}
-
-/*!
- \qmlproperty int GridView::count
- This property holds the number of items in the view.
-*/
-int QDeclarativeGridView::count() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->model)
- return d->model->count();
- return 0;
-}
-
-/*!
- \qmlproperty Component GridView::highlight
- This property holds the component to use as the highlight.
-
- An instance of the highlight component is created for each view.
- The geometry of the resulting component instance will be managed by the view
- so as to stay with the current item, unless the highlightFollowsCurrentItem property is false.
-
- \sa highlightItem, highlightFollowsCurrentItem
-*/
-QDeclarativeComponent *QDeclarativeGridView::highlight() const
-{
- Q_D(const QDeclarativeGridView);
- return d->highlightComponent;
-}
-
-void QDeclarativeGridView::setHighlight(QDeclarativeComponent *highlight)
-{
- Q_D(QDeclarativeGridView);
- if (highlight != d->highlightComponent) {
- d->highlightComponent = highlight;
- d->updateCurrent(d->currentIndex);
- emit highlightChanged();
- }
-}
-
-/*!
- \qmlproperty bool GridView::highlightFollowsCurrentItem
- This property sets whether the highlight is managed by the view.
-
- If this property is true (the default value), the highlight is moved smoothly
- to follow the current item. Otherwise, the
- highlight is not moved by the view, and any movement must be implemented
- by the highlight.
-
- Here is a highlight with its motion defined by a \l {SpringAnimation} item:
-
- \snippet doc/src/snippets/declarative/gridview/gridview.qml highlightFollowsCurrentItem
-*/
-bool QDeclarativeGridView::highlightFollowsCurrentItem() const
-{
- Q_D(const QDeclarativeGridView);
- return d->autoHighlight;
-}
-
-void QDeclarativeGridView::setHighlightFollowsCurrentItem(bool autoHighlight)
-{
- Q_D(QDeclarativeGridView);
- if (d->autoHighlight != autoHighlight) {
- d->autoHighlight = autoHighlight;
- if (autoHighlight) {
- d->updateHighlight();
- } else if (d->highlightXAnimator) {
- d->highlightXAnimator->stop();
- d->highlightYAnimator->stop();
- }
- }
-}
-
-/*!
- \qmlproperty int GridView::highlightMoveDuration
- This property holds the move animation duration of the highlight delegate.
-
- highlightFollowsCurrentItem must be true for this property
- to have effect.
-
- The default value for the duration is 150ms.
-
- \sa highlightFollowsCurrentItem
-*/
-int QDeclarativeGridView::highlightMoveDuration() const
-{
- Q_D(const QDeclarativeGridView);
- return d->highlightMoveDuration;
-}
-
-void QDeclarativeGridView::setHighlightMoveDuration(int duration)
-{
- Q_D(QDeclarativeGridView);
- if (d->highlightMoveDuration != duration) {
- d->highlightMoveDuration = duration;
- if (d->highlightYAnimator) {
- d->highlightXAnimator->userDuration = d->highlightMoveDuration;
- d->highlightYAnimator->userDuration = d->highlightMoveDuration;
- }
- emit highlightMoveDurationChanged();
- }
-}
-
-
-/*!
- \qmlproperty real GridView::preferredHighlightBegin
- \qmlproperty real GridView::preferredHighlightEnd
- \qmlproperty enumeration GridView::highlightRangeMode
-
- These properties define the preferred range of the highlight (for the current item)
- within the view. The \c preferredHighlightBegin value must be less than the
- \c preferredHighlightEnd value.
-
- These properties affect the position of the current item when the view is scrolled.
- For example, if the currently selected item should stay in the middle of the
- view when it is scrolled, set the \c preferredHighlightBegin and
- \c preferredHighlightEnd values to the top and bottom coordinates of where the middle
- item would be. If the \c currentItem is changed programmatically, the view will
- automatically scroll so that the current item is in the middle of the view.
- Furthermore, the behavior of the current item index will occur whether or not a
- highlight exists.
-
- Valid values for \c highlightRangeMode are:
-
- \list
- \o GridView.ApplyRange - the view attempts to maintain the highlight within the range.
- However, the highlight can move outside of the range at the ends of the view or due
- to mouse interaction.
- \o GridView.StrictlyEnforceRange - the highlight never moves outside of the range.
- The current item changes if a keyboard or mouse action would cause the highlight to move
- outside of the range.
- \o GridView.NoHighlightRange - this is the default value.
- \endlist
-*/
-qreal QDeclarativeGridView::preferredHighlightBegin() const
-{
- Q_D(const QDeclarativeGridView);
- return d->highlightRangeStart;
-}
-
-void QDeclarativeGridView::setPreferredHighlightBegin(qreal start)
-{
- Q_D(QDeclarativeGridView);
- d->highlightRangeStartValid = true;
- if (d->highlightRangeStart == start)
- return;
- d->highlightRangeStart = start;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit preferredHighlightBeginChanged();
-}
-
-void QDeclarativeGridView::resetPreferredHighlightBegin()
-{
- Q_D(QDeclarativeGridView);
- d->highlightRangeStartValid = false;
- if (d->highlightRangeStart == 0)
- return;
- d->highlightRangeStart = 0;
- emit preferredHighlightBeginChanged();
-}
-
-qreal QDeclarativeGridView::preferredHighlightEnd() const
-{
- Q_D(const QDeclarativeGridView);
- return d->highlightRangeEnd;
-}
-
-void QDeclarativeGridView::setPreferredHighlightEnd(qreal end)
-{
- Q_D(QDeclarativeGridView);
- d->highlightRangeEndValid = true;
- if (d->highlightRangeEnd == end)
- return;
- d->highlightRangeEnd = end;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit preferredHighlightEndChanged();
-}
-
-void QDeclarativeGridView::resetPreferredHighlightEnd()
-{
- Q_D(QDeclarativeGridView);
- d->highlightRangeEndValid = false;
- if (d->highlightRangeEnd == 0)
- return;
- d->highlightRangeEnd = 0;
- emit preferredHighlightEndChanged();
-}
-
-QDeclarativeGridView::HighlightRangeMode QDeclarativeGridView::highlightRangeMode() const
-{
- Q_D(const QDeclarativeGridView);
- return d->highlightRange;
-}
-
-void QDeclarativeGridView::setHighlightRangeMode(HighlightRangeMode mode)
-{
- Q_D(QDeclarativeGridView);
- if (d->highlightRange == mode)
- return;
- d->highlightRange = mode;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit highlightRangeModeChanged();
-}
-
-/*!
- \qmlproperty enumeration GridView::layoutDirection
- This property holds the layout direction of the grid.
-
- Possible values:
-
- \list
- \o Qt.LeftToRight (default) - Items will be laid out starting in the top, left corner. The flow is
- dependent on the \l GridView::flow property.
- \o Qt.RightToLeft - Items will be laid out starting in the top, right corner. The flow is dependent
- on the \l GridView::flow property.
- \endlist
-
- \bold Note: If GridView::flow is set to GridView.LeftToRight, this is not to be confused if
- GridView::layoutDirection is set to Qt.RightToLeft. The GridView.LeftToRight flow value simply
- indicates that the flow is horizontal.
-*/
-
-Qt::LayoutDirection QDeclarativeGridView::layoutDirection() const
-{
- Q_D(const QDeclarativeGridView);
- return d->layoutDirection;
-}
-
-void QDeclarativeGridView::setLayoutDirection(Qt::LayoutDirection layoutDirection)
-{
- Q_D(QDeclarativeGridView);
- if (d->layoutDirection != layoutDirection) {
- d->layoutDirection = layoutDirection;
- d->regenerate();
- emit layoutDirectionChanged();
- emit effectiveLayoutDirectionChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration GridView::effectiveLayoutDirection
- This property holds the effective layout direction of the grid.
-
- When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts,
- the visual layout direction of the grid will be mirrored. However, the
- property \l {GridView::layoutDirection}{layoutDirection} will remain unchanged.
-
- \sa GridView::layoutDirection, {LayoutMirroring}{LayoutMirroring}
-*/
-
-Qt::LayoutDirection QDeclarativeGridView::effectiveLayoutDirection() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->effectiveLayoutMirror)
- return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
- else
- return d->layoutDirection;
-}
-
-/*!
- \qmlproperty enumeration GridView::flow
- This property holds the flow of the grid.
-
- Possible values:
-
- \list
- \o GridView.LeftToRight (default) - Items are laid out from left to right, and the view scrolls vertically
- \o GridView.TopToBottom - Items are laid out from top to bottom, and the view scrolls horizontally
- \endlist
-*/
-QDeclarativeGridView::Flow QDeclarativeGridView::flow() const
-{
- Q_D(const QDeclarativeGridView);
- return d->flow;
-}
-
-void QDeclarativeGridView::setFlow(Flow flow)
-{
- Q_D(QDeclarativeGridView);
- if (d->flow != flow) {
- d->flow = flow;
- if (d->flow == LeftToRight) {
- setContentWidth(-1);
- setFlickableDirection(QDeclarativeFlickable::VerticalFlick);
- } else {
- setContentHeight(-1);
- setFlickableDirection(QDeclarativeFlickable::HorizontalFlick);
- }
- setContentX(0);
- setContentY(0);
- d->regenerate();
- emit flowChanged();
- }
-}
-
-/*!
- \qmlproperty bool GridView::keyNavigationWraps
- This property holds whether the grid wraps key navigation
-
- If this is true, key navigation that would move the current item selection
- past one end of the view instead wraps around and moves the selection to
- the other end of the view.
-
- By default, key navigation is not wrapped.
-*/
-bool QDeclarativeGridView::isWrapEnabled() const
-{
- Q_D(const QDeclarativeGridView);
- return d->wrap;
-}
-
-void QDeclarativeGridView::setWrapEnabled(bool wrap)
-{
- Q_D(QDeclarativeGridView);
- if (d->wrap == wrap)
- return;
- d->wrap = wrap;
- emit keyNavigationWrapsChanged();
-}
-
-/*!
- \qmlproperty int GridView::cacheBuffer
- This property determines whether delegates are retained outside the
- visible area of the view.
-
- If non-zero the view will keep as many delegates
- instantiated as will fit within the buffer specified. For example,
- if in a vertical view the delegate is 20 pixels high and \c cacheBuffer is
- set to 40, then up to 2 delegates above and 2 delegates below the visible
- area may be retained.
-
- Note that cacheBuffer is not a pixel buffer - it only maintains additional
- instantiated delegates.
-
- Setting this value can make scrolling the list smoother at the expense
- of additional memory usage. It is not a substitute for creating efficient
- delegates; the fewer elements in a delegate, the faster a view may be
- scrolled.
-*/
-int QDeclarativeGridView::cacheBuffer() const
-{
- Q_D(const QDeclarativeGridView);
- return d->buffer;
-}
-
-void QDeclarativeGridView::setCacheBuffer(int buffer)
-{
- Q_D(QDeclarativeGridView);
- if (d->buffer != buffer) {
- d->buffer = buffer;
- if (isComponentComplete())
- refill();
- emit cacheBufferChanged();
- }
-}
-
-/*!
- \qmlproperty int GridView::cellWidth
- \qmlproperty int GridView::cellHeight
-
- These properties holds the width and height of each cell in the grid.
-
- The default cell size is 100x100.
-*/
-int QDeclarativeGridView::cellWidth() const
-{
- Q_D(const QDeclarativeGridView);
- return d->cellWidth;
-}
-
-void QDeclarativeGridView::setCellWidth(int cellWidth)
-{
- Q_D(QDeclarativeGridView);
- if (cellWidth != d->cellWidth && cellWidth > 0) {
- d->cellWidth = qMax(1, cellWidth);
- d->updateGrid();
- emit cellWidthChanged();
- d->layout();
- }
-}
-
-int QDeclarativeGridView::cellHeight() const
-{
- Q_D(const QDeclarativeGridView);
- return d->cellHeight;
-}
-
-void QDeclarativeGridView::setCellHeight(int cellHeight)
-{
- Q_D(QDeclarativeGridView);
- if (cellHeight != d->cellHeight && cellHeight > 0) {
- d->cellHeight = qMax(1, cellHeight);
- d->updateGrid();
- emit cellHeightChanged();
- d->layout();
- }
-}
-/*!
- \qmlproperty enumeration GridView::snapMode
-
- This property determines how the view scrolling will settle following a drag or flick.
- The possible values are:
-
- \list
- \o GridView.NoSnap (default) - the view stops anywhere within the visible area.
- \o GridView.SnapToRow - the view settles with a row (or column for \c GridView.TopToBottom flow)
- aligned with the start of the view.
- \o GridView.SnapOneRow - the view will settle no more than one row (or column for \c GridView.TopToBottom flow)
- away from the first visible row at the time the mouse button is released.
- This mode is particularly useful for moving one page at a time.
- \endlist
-
-*/
-QDeclarativeGridView::SnapMode QDeclarativeGridView::snapMode() const
-{
- Q_D(const QDeclarativeGridView);
- return d->snapMode;
-}
-
-void QDeclarativeGridView::setSnapMode(SnapMode mode)
-{
- Q_D(QDeclarativeGridView);
- if (d->snapMode != mode) {
- d->snapMode = mode;
- emit snapModeChanged();
- }
-}
-
-/*!
- \qmlproperty Component GridView::footer
- This property holds the component to use as the footer.
-
- An instance of the footer component is created for each view. The
- footer is positioned at the end of the view, after any items.
-
- \sa header
-*/
-QDeclarativeComponent *QDeclarativeGridView::footer() const
-{
- Q_D(const QDeclarativeGridView);
- return d->footerComponent;
-}
-
-void QDeclarativeGridView::setFooter(QDeclarativeComponent *footer)
-{
- Q_D(QDeclarativeGridView);
- if (d->footerComponent != footer) {
- if (d->footer) {
- if (scene())
- scene()->removeItem(d->footer->item);
- d->footer->item->deleteLater();
- delete d->footer;
- d->footer = 0;
- }
- d->footerComponent = footer;
- if (isComponentComplete()) {
- d->updateFooter();
- d->updateGrid();
- d->fixupPosition();
- }
- emit footerChanged();
- }
-}
-
-/*!
- \qmlproperty Component GridView::header
- This property holds the component to use as the header.
-
- An instance of the header component is created for each view. The
- header is positioned at the beginning of the view, before any items.
-
- \sa footer
-*/
-QDeclarativeComponent *QDeclarativeGridView::header() const
-{
- Q_D(const QDeclarativeGridView);
- return d->headerComponent;
-}
-
-void QDeclarativeGridView::setHeader(QDeclarativeComponent *header)
-{
- Q_D(QDeclarativeGridView);
- if (d->headerComponent != header) {
- if (d->header) {
- if (scene())
- scene()->removeItem(d->header->item);
- d->header->item->deleteLater();
- delete d->header;
- d->header = 0;
- }
- d->headerComponent = header;
- if (isComponentComplete()) {
- d->updateHeader();
- d->updateFooter();
- d->updateGrid();
- d->fixupPosition();
- }
- emit headerChanged();
- }
-}
-
-void QDeclarativeGridView::setContentX(qreal pos)
-{
- Q_D(QDeclarativeGridView);
- // Positioning the view manually should override any current movement state
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- QDeclarativeFlickable::setContentX(pos);
-}
-
-void QDeclarativeGridView::setContentY(qreal pos)
-{
- Q_D(QDeclarativeGridView);
- // Positioning the view manually should override any current movement state
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- QDeclarativeFlickable::setContentY(pos);
-}
-
-bool QDeclarativeGridView::event(QEvent *event)
-{
- Q_D(QDeclarativeGridView);
- if (event->type() == QEvent::User) {
- d->layout();
- return true;
- }
-
- return QDeclarativeFlickable::event(event);
-}
-
-void QDeclarativeGridView::viewportMoved()
-{
- Q_D(QDeclarativeGridView);
- QDeclarativeFlickable::viewportMoved();
- if (!d->itemCount)
- return;
- d->lazyRelease = true;
- if (d->flickingHorizontally || d->flickingVertically) {
- if (yflick()) {
- if (d->vData.velocity > 0)
- d->bufferMode = QDeclarativeGridViewPrivate::BufferBefore;
- else if (d->vData.velocity < 0)
- d->bufferMode = QDeclarativeGridViewPrivate::BufferAfter;
- }
-
- if (xflick()) {
- if (d->hData.velocity > 0)
- d->bufferMode = QDeclarativeGridViewPrivate::BufferBefore;
- else if (d->hData.velocity < 0)
- d->bufferMode = QDeclarativeGridViewPrivate::BufferAfter;
- }
- }
- refill();
- if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
- d->moveReason = QDeclarativeGridViewPrivate::Mouse;
- if (d->moveReason != QDeclarativeGridViewPrivate::SetIndex) {
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange && d->highlight) {
- // reposition highlight
- qreal pos = d->highlight->rowPos();
- qreal viewPos;
- qreal highlightStart;
- qreal highlightEnd;
- if (d->isRightToLeftTopToBottom()) {
- highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
- highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
- viewPos = -d->position()-d->size();
- } else {
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- viewPos = d->position();
- }
- if (pos > viewPos + highlightEnd - d->rowSize())
- pos = viewPos + highlightEnd - d->rowSize();
- if (pos < viewPos + highlightStart)
- pos = viewPos + highlightStart;
-
- d->highlight->setPosition(d->highlight->colPos(), qRound(pos));
-
- // update current index
- int idx = d->snapIndex();
- if (idx >= 0 && idx != d->currentIndex) {
- d->updateCurrent(idx);
- if (d->currentItem && d->currentItem->colPos() != d->highlight->colPos() && d->autoHighlight) {
- if (d->flow == LeftToRight)
- d->highlightXAnimator->to = d->currentItem->item->x();
- else
- d->highlightYAnimator->to = d->currentItem->item->y();
- }
- }
- }
- }
-}
-
-qreal QDeclarativeGridView::minYExtent() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->flow == QDeclarativeGridView::TopToBottom)
- return QDeclarativeFlickable::minYExtent();
- qreal extent = -d->startPosition();
- if (d->header && d->visibleItems.count())
- extent += d->header->item->height();
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- extent += d->highlightRangeStart;
- extent = qMax(extent, -(d->rowPosAt(0) + d->rowSize() - d->highlightRangeEnd));
- }
- return extent;
-}
-
-qreal QDeclarativeGridView::maxYExtent() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->flow == QDeclarativeGridView::TopToBottom)
- return QDeclarativeFlickable::maxYExtent();
- qreal extent;
- if (!d->model || !d->model->count()) {
- extent = 0;
- } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- extent = -(d->rowPosAt(d->model->count()-1) - d->highlightRangeStart);
- if (d->highlightRangeEnd != d->highlightRangeStart)
- extent = qMin(extent, -(d->endPosition() - d->highlightRangeEnd + 1));
- } else {
- extent = -(d->endPosition() - height());
- }
- if (d->footer)
- extent -= d->footer->item->height();
- const qreal minY = minYExtent();
- if (extent > minY)
- extent = minY;
- return extent;
-}
-
-qreal QDeclarativeGridView::minXExtent() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->flow == QDeclarativeGridView::LeftToRight)
- return QDeclarativeFlickable::minXExtent();
- qreal extent = -d->startPosition();
- qreal highlightStart;
- qreal highlightEnd;
- qreal endPositionFirstItem;
- if (d->isRightToLeftTopToBottom()) {
- endPositionFirstItem = d->rowPosAt(d->model->count()-1);
- highlightStart = d->highlightRangeStartValid
- ? d->highlightRangeStart - (d->lastPosition()-endPositionFirstItem)
- : d->size() - (d->lastPosition()-endPositionFirstItem);
- highlightEnd = d->highlightRangeEndValid ? d->highlightRangeEnd : d->size();
- if (d->footer && d->visibleItems.count())
- extent += d->footer->item->width();
- } else {
- endPositionFirstItem = d->rowPosAt(0)+d->rowSize();
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- if (d->header && d->visibleItems.count())
- extent += d->header->item->width();
- }
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- extent += highlightStart;
- extent = qMax(extent, -(endPositionFirstItem - highlightEnd));
- }
- return extent;
-}
-
-qreal QDeclarativeGridView::maxXExtent() const
-{
- Q_D(const QDeclarativeGridView);
- if (d->flow == QDeclarativeGridView::LeftToRight)
- return QDeclarativeFlickable::maxXExtent();
- qreal extent;
- qreal highlightStart;
- qreal highlightEnd;
- qreal lastItemPosition = 0;
- if (d->isRightToLeftTopToBottom()){
- highlightStart = d->highlightRangeStartValid ? d->highlightRangeEnd : d->size();
- highlightEnd = d->highlightRangeEndValid ? d->highlightRangeStart : d->size();
- lastItemPosition = d->endPosition();
- } else {
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- lastItemPosition = 0;
- if (d->model && d->model->count())
- lastItemPosition = d->rowPosAt(d->model->count()-1);
- }
- if (!d->model || !d->model->count()) {
- extent = 0;
- } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- extent = -(lastItemPosition - highlightStart);
- if (highlightEnd != highlightStart)
- extent = d->isRightToLeftTopToBottom()
- ? qMax(extent, -(d->endPosition() - highlightEnd + 1))
- : qMin(extent, -(d->endPosition() - highlightEnd + 1));
- } else {
- extent = -(d->endPosition() - width());
- }
- if (d->isRightToLeftTopToBottom()) {
- if (d->header)
- extent -= d->header->item->width();
- } else {
- if (d->footer)
- extent -= d->footer->item->width();
- }
-
- const qreal minX = minXExtent();
- if (extent > minX)
- extent = minX;
- return extent;
-}
-
-void QDeclarativeGridView::keyPressEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeGridView);
- keyPressPreHandler(event);
- if (event->isAccepted())
- return;
- if (d->model && d->model->count() && d->interactive) {
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- int oldCurrent = currentIndex();
- switch (event->key()) {
- case Qt::Key_Up:
- moveCurrentIndexUp();
- break;
- case Qt::Key_Down:
- moveCurrentIndexDown();
- break;
- case Qt::Key_Left:
- moveCurrentIndexLeft();
- break;
- case Qt::Key_Right:
- moveCurrentIndexRight();
- break;
- default:
- break;
- }
- if (oldCurrent != currentIndex()) {
- event->accept();
- return;
- }
- }
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- event->ignore();
- QDeclarativeFlickable::keyPressEvent(event);
-}
-
-/*!
- \qmlmethod GridView::moveCurrentIndexUp()
-
- Move the currentIndex up one item in the view.
- The current index will wrap if keyNavigationWraps is true and it
- is currently at the end. This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeGridView::moveCurrentIndexUp()
-{
- Q_D(QDeclarativeGridView);
- const int count = d->model ? d->model->count() : 0;
- if (!count)
- return;
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() >= d->columns || d->wrap) {
- int index = currentIndex() - d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- } else {
- if (currentIndex() > 0 || d->wrap) {
- int index = currentIndex() - 1;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- }
-}
-
-/*!
- \qmlmethod GridView::moveCurrentIndexDown()
-
- Move the currentIndex down one item in the view.
- The current index will wrap if keyNavigationWraps is true and it
- is currently at the end. This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeGridView::moveCurrentIndexDown()
-{
- Q_D(QDeclarativeGridView);
- const int count = d->model ? d->model->count() : 0;
- if (!count)
- return;
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() < count - d->columns || d->wrap) {
- int index = currentIndex()+d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- } else {
- if (currentIndex() < count - 1 || d->wrap) {
- int index = currentIndex() + 1;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- }
-}
-
-/*!
- \qmlmethod GridView::moveCurrentIndexLeft()
-
- Move the currentIndex left one item in the view.
- The current index will wrap if keyNavigationWraps is true and it
- is currently at the end. This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeGridView::moveCurrentIndexLeft()
-{
- Q_D(QDeclarativeGridView);
- const int count = d->model ? d->model->count() : 0;
- if (!count)
- return;
-
- if (effectiveLayoutDirection() == Qt::LeftToRight) {
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() > 0 || d->wrap) {
- int index = currentIndex() - 1;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- } else {
- if (currentIndex() >= d->columns || d->wrap) {
- int index = currentIndex() - d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- }
- } else {
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() < count - 1 || d->wrap) {
- int index = currentIndex() + 1;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- } else {
- if (currentIndex() < count - d->columns || d->wrap) {
- int index = currentIndex() + d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- }
- }
-}
-
-/*!
- \qmlmethod GridView::moveCurrentIndexRight()
-
- Move the currentIndex right one item in the view.
- The current index will wrap if keyNavigationWraps is true and it
- is currently at the end. This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeGridView::moveCurrentIndexRight()
-{
- Q_D(QDeclarativeGridView);
- const int count = d->model ? d->model->count() : 0;
- if (!count)
- return;
-
- if (effectiveLayoutDirection() == Qt::LeftToRight) {
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() < count - 1 || d->wrap) {
- int index = currentIndex() + 1;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- } else {
- if (currentIndex() < count - d->columns || d->wrap) {
- int index = currentIndex()+d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
- }
- } else {
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- if (currentIndex() > 0 || d->wrap) {
- int index = currentIndex() - 1;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- } else {
- if (currentIndex() >= d->columns || d->wrap) {
- int index = currentIndex() - d->columns;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
- }
- }
-}
-
-void QDeclarativeGridViewPrivate::positionViewAtIndex(int index, int mode)
-{
- Q_Q(QDeclarativeGridView);
- if (!isValid())
- return;
- if (mode < QDeclarativeGridView::Beginning || mode > QDeclarativeGridView::Contain)
- return;
-
- int idx = qMax(qMin(index, model->count()-1), 0);
-
- if (layoutScheduled)
- layout();
- qreal pos = isRightToLeftTopToBottom() ? -position() - size() : position();
- FxGridItem *item = visibleItem(idx);
- qreal maxExtent;
- if (flow == QDeclarativeGridView::LeftToRight)
- maxExtent = -q->maxYExtent();
- else
- maxExtent = isRightToLeftTopToBottom() ? q->minXExtent()-size() : -q->maxXExtent();
-
- if (!item) {
- int itemPos = rowPosAt(idx);
- // save the currently visible items in case any of them end up visible again
- QList<FxGridItem*> oldVisible = visibleItems;
- visibleItems.clear();
- visibleIndex = idx - idx % columns;
- if (flow == QDeclarativeGridView::LeftToRight)
- maxExtent = -q->maxYExtent();
- else
- maxExtent = isRightToLeftTopToBottom() ? q->minXExtent()-size() : -q->maxXExtent();
- setPosition(qMin(qreal(itemPos), maxExtent));
- // now release the reference to all the old visible items.
- for (int i = 0; i < oldVisible.count(); ++i)
- releaseItem(oldVisible.at(i));
- item = visibleItem(idx);
- }
- if (item) {
- qreal itemPos = item->rowPos();
- switch (mode) {
- case QDeclarativeGridView::Beginning:
- pos = itemPos;
- if (index < 0 && header) {
- pos -= flow == QDeclarativeGridView::LeftToRight
- ? header->item->height()
- : header->item->width();
- }
- break;
- case QDeclarativeGridView::Center:
- pos = itemPos - (size() - rowSize())/2;
- break;
- case QDeclarativeGridView::End:
- pos = itemPos - size() + rowSize();
- if (index >= model->count() && footer) {
- pos += flow == QDeclarativeGridView::LeftToRight
- ? footer->item->height()
- : footer->item->width();
- }
- break;
- case QDeclarativeGridView::Visible:
- if (itemPos > pos + size())
- pos = itemPos - size() + rowSize();
- else if (item->endRowPos() < pos)
- pos = itemPos;
- break;
- case QDeclarativeGridView::Contain:
- if (item->endRowPos() > pos + size())
- pos = itemPos - size() + rowSize();
- if (itemPos < pos)
- pos = itemPos;
- }
-
- pos = qMin(pos, maxExtent);
- qreal minExtent;
- if (flow == QDeclarativeGridView::LeftToRight)
- minExtent = -q->minYExtent();
- else
- minExtent = isRightToLeftTopToBottom() ? q->maxXExtent()-size() : -q->minXExtent();
- pos = qMax(pos, minExtent);
- moveReason = QDeclarativeGridViewPrivate::Other;
- q->cancelFlick();
- setPosition(pos);
- }
- fixupPosition();
-}
-
-/*!
- \qmlmethod GridView::positionViewAtIndex(int index, PositionMode mode)
-
- Positions the view such that the \a index is at the position specified by
- \a mode:
-
- \list
- \o GridView.Beginning - position item at the top (or left for \c GridView.TopToBottom flow) of the view.
- \o GridView.Center - position item in the center of the view.
- \o GridView.End - position item at bottom (or right for horizontal orientation) of the view.
- \o GridView.Visible - if any part of the item is visible then take no action, otherwise
- bring the item into view.
- \o GridView.Contain - ensure the entire item is visible. If the item is larger than
- the view the item is positioned at the top (or left for \c GridView.TopToBottom flow) of the view.
- \endlist
-
- If positioning the view at the index would cause empty space to be displayed at
- the beginning or end of the view, the view will be positioned at the boundary.
-
- It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
- at a particular index. This is unreliable since removing items from the start
- of the view does not cause all other items to be repositioned.
- The correct way to bring an item into view is with \c positionViewAtIndex.
-
- \bold Note: methods should only be called after the Component has completed. To position
- the view at startup, this method should be called by Component.onCompleted. For
- example, to position the view at the end:
-
- \code
- Component.onCompleted: positionViewAtIndex(count - 1, GridView.Beginning)
- \endcode
-*/
-void QDeclarativeGridView::positionViewAtIndex(int index, int mode)
-{
- Q_D(QDeclarativeGridView);
- if (!d->isValid() || index < 0 || index >= d->model->count())
- return;
- d->positionViewAtIndex(index, mode);
-}
-
-/*!
- \qmlmethod GridView::positionViewAtBeginning()
- \qmlmethod GridView::positionViewAtEnd()
- \since Quick 1.1
-
- Positions the view at the beginning or end, taking into account any header or footer.
-
- It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
- at a particular index. This is unreliable since removing items from the start
- of the list does not cause all other items to be repositioned, and because
- the actual start of the view can vary based on the size of the delegates.
-
- \bold Note: methods should only be called after the Component has completed. To position
- the view at startup, this method should be called by Component.onCompleted. For
- example, to position the view at the end on startup:
-
- \code
- Component.onCompleted: positionViewAtEnd()
- \endcode
-*/
-void QDeclarativeGridView::positionViewAtBeginning()
-{
- Q_D(QDeclarativeGridView);
- if (!d->isValid())
- return;
- d->positionViewAtIndex(-1, Beginning);
-}
-
-void QDeclarativeGridView::positionViewAtEnd()
-{
- Q_D(QDeclarativeGridView);
- if (!d->isValid())
- return;
- d->positionViewAtIndex(d->model->count(), End);
-}
-
-/*!
- \qmlmethod int GridView::indexAt(int x, int y)
-
- Returns the index of the visible item containing the point \a x, \a y in content
- coordinates. If there is no item at the point specified, or the item is
- not visible -1 is returned.
-
- If the item is outside the visible area, -1 is returned, regardless of
- whether an item will exist at that point when scrolled into view.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-int QDeclarativeGridView::indexAt(qreal x, qreal y) const
-{
- Q_D(const QDeclarativeGridView);
- for (int i = 0; i < d->visibleItems.count(); ++i) {
- const FxGridItem *listItem = d->visibleItems.at(i);
- if(listItem->contains(x, y))
- return listItem->index;
- }
-
- return -1;
-}
-
-void QDeclarativeGridView::componentComplete()
-{
- Q_D(QDeclarativeGridView);
- QDeclarativeFlickable::componentComplete();
- d->updateHeader();
- d->updateFooter();
- d->updateGrid();
- if (d->isValid()) {
- refill();
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- if (d->currentIndex < 0 && !d->currentIndexCleared)
- d->updateCurrent(0);
- else
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- d->fixupPosition();
- }
-}
-
-void QDeclarativeGridView::trackedPositionChanged()
-{
- Q_D(QDeclarativeGridView);
- if (!d->trackedItem || !d->currentItem)
- return;
- if (d->moveReason == QDeclarativeGridViewPrivate::SetIndex) {
- const qreal trackedPos = d->trackedItem->rowPos();
- qreal viewPos;
- qreal highlightStart;
- qreal highlightEnd;
- if (d->isRightToLeftTopToBottom()) {
- viewPos = -d->position()-d->size();
- highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
- highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
- } else {
- viewPos = d->position();
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- }
- qreal pos = viewPos;
- if (d->haveHighlightRange) {
- if (d->highlightRange == StrictlyEnforceRange) {
- if (trackedPos > pos + highlightEnd - d->rowSize())
- pos = trackedPos - highlightEnd + d->rowSize();
- if (trackedPos < pos + highlightStart)
- pos = trackedPos - highlightStart;
- } else {
- if (trackedPos < d->startPosition() + highlightStart) {
- pos = d->startPosition();
- } else if (d->trackedItem->endRowPos() > d->endPosition() - d->size() + highlightEnd) {
- pos = d->endPosition() - d->size() + 1;
- if (pos < d->startPosition())
- pos = d->startPosition();
- } else {
- if (trackedPos < viewPos + highlightStart) {
- pos = trackedPos - highlightStart;
- } else if (trackedPos > viewPos + highlightEnd - d->rowSize()) {
- pos = trackedPos - highlightEnd + d->rowSize();
- }
- }
- }
- } else {
- if (trackedPos < viewPos && d->currentItem->rowPos() < viewPos) {
- pos = qMax(trackedPos, d->currentItem->rowPos());
- } else if (d->trackedItem->endRowPos() >= viewPos + d->size()
- && d->currentItem->endRowPos() >= viewPos + d->size()) {
- if (d->trackedItem->endRowPos() <= d->currentItem->endRowPos()) {
- pos = d->trackedItem->endRowPos() - d->size() + 1;
- if (d->rowSize() > d->size())
- pos = trackedPos;
- } else {
- pos = d->currentItem->endRowPos() - d->size() + 1;
- if (d->rowSize() > d->size())
- pos = d->currentItem->rowPos();
- }
- }
- }
- if (viewPos != pos) {
- cancelFlick();
- d->calcVelocity = true;
- d->setPosition(pos);
- d->calcVelocity = false;
- }
- }
-}
-
-void QDeclarativeGridView::itemsInserted(int modelIndex, int count)
-{
- Q_D(QDeclarativeGridView);
- if (!isComponentComplete())
- return;
-
- int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
- if (index < 0) {
- int i = d->visibleItems.count() - 1;
- while (i > 0 && d->visibleItems.at(i)->index == -1)
- --i;
- if (d->visibleItems.at(i)->index + 1 == modelIndex) {
- // Special case of appending an item to the model.
- index = d->visibleIndex + d->visibleItems.count();
- } else {
- if (modelIndex <= d->visibleIndex) {
- // Insert before visible items
- d->visibleIndex += count;
- for (int i = 0; i < d->visibleItems.count(); ++i) {
- FxGridItem *listItem = d->visibleItems.at(i);
- if (listItem->index != -1 && listItem->index >= modelIndex)
- listItem->index += count;
- }
- }
- if (d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem)
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- }
- d->scheduleLayout();
- d->itemCount += count;
- emit countChanged();
- return;
- }
- }
-
- int insertCount = count;
- if (index < d->visibleIndex && d->visibleItems.count()) {
- insertCount -= d->visibleIndex - index;
- index = d->visibleIndex;
- modelIndex = d->visibleIndex;
- }
-
- qreal tempPos = d->isRightToLeftTopToBottom() ? -d->position()-d->size()+d->width()+1 : d->position();
- int to = d->buffer+tempPos+d->size()-1;
- int colPos = 0;
- int rowPos = 0;
- if (d->visibleItems.count()) {
- index -= d->visibleIndex;
- if (index < d->visibleItems.count()) {
- colPos = d->visibleItems.at(index)->colPos();
- rowPos = d->visibleItems.at(index)->rowPos();
- } else {
- // appending items to visible list
- colPos = d->visibleItems.at(index-1)->colPos() + d->colSize();
- rowPos = d->visibleItems.at(index-1)->rowPos();
- if (colPos > d->colSize() * (d->columns-1)) {
- colPos = 0;
- rowPos += d->rowSize();
- }
- }
- } else if (d->itemCount == 0 && d->header) {
- rowPos = d->headerSize();
- }
-
- // Update the indexes of the following visible items.
- for (int i = 0; i < d->visibleItems.count(); ++i) {
- FxGridItem *listItem = d->visibleItems.at(i);
- if (listItem->index != -1 && listItem->index >= modelIndex)
- listItem->index += count;
- }
-
- bool addedVisible = false;
- QList<FxGridItem*> added;
- int i = 0;
- while (i < insertCount && rowPos <= to + d->rowSize()*(d->columns - (colPos/d->colSize()))/qreal(d->columns)) {
- if (!addedVisible) {
- d->scheduleLayout();
- addedVisible = true;
- }
- FxGridItem *item = d->createItem(modelIndex + i);
- d->visibleItems.insert(index, item);
- item->setPosition(colPos, rowPos);
- added.append(item);
- colPos += d->colSize();
- if (colPos > d->colSize() * (d->columns-1)) {
- colPos = 0;
- rowPos += d->rowSize();
- }
- ++index;
- ++i;
- }
- if (i < insertCount) {
- // We didn't insert all our new items, which means anything
- // beyond the current index is not visible - remove it.
- while (d->visibleItems.count() > index) {
- d->releaseItem(d->visibleItems.takeLast());
- }
- }
-
- // update visibleIndex
- d->visibleIndex = 0;
- for (QList<FxGridItem*>::Iterator it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
- if ((*it)->index != -1) {
- d->visibleIndex = (*it)->index;
- break;
- }
- }
-
- if (d->itemCount && d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem) {
- d->currentItem->index = d->currentIndex;
- d->currentItem->setPosition(d->colPosAt(d->currentIndex), d->rowPosAt(d->currentIndex));
- }
- emit currentIndexChanged();
- } else if (d->itemCount == 0 && (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared))) {
- setCurrentIndex(0);
- }
-
- // everything is in order now - emit add() signal
- for (int j = 0; j < added.count(); ++j)
- added.at(j)->attached->emitAdd();
-
- d->itemCount += count;
- emit countChanged();
-}
-
-void QDeclarativeGridView::itemsRemoved(int modelIndex, int count)
-{
- Q_D(QDeclarativeGridView);
- if (!isComponentComplete())
- return;
-
- d->itemCount -= count;
- bool currentRemoved = d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count;
- bool removedVisible = false;
-
- // Remove the items from the visible list, skipping anything already marked for removal
- QList<FxGridItem*>::Iterator it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxGridItem *item = *it;
- if (item->index == -1 || item->index < modelIndex) {
- // already removed, or before removed items
- if (item->index < modelIndex && !removedVisible) {
- d->scheduleLayout();
- removedVisible = true;
- }
- ++it;
- } else if (item->index >= modelIndex + count) {
- // after removed items
- item->index -= count;
- ++it;
- } else {
- // removed item
- if (!removedVisible) {
- d->scheduleLayout();
- removedVisible = true;
- }
- item->attached->emitRemove();
- if (item->attached->delayRemove()) {
- item->index = -1;
- connect(item->attached, SIGNAL(delayRemoveChanged()), this, SLOT(destroyRemoved()), Qt::QueuedConnection);
- ++it;
- } else {
- it = d->visibleItems.erase(it);
- d->releaseItem(item);
- }
- }
- }
-
- // fix current
- if (d->currentIndex >= modelIndex + count) {
- d->currentIndex -= count;
- if (d->currentItem)
- d->currentItem->index -= count;
- emit currentIndexChanged();
- } else if (currentRemoved) {
- // current item has been removed.
- d->releaseItem(d->currentItem);
- d->currentItem = 0;
- d->currentIndex = -1;
- if (d->itemCount)
- d->updateCurrent(qMin(modelIndex, d->itemCount-1));
- else
- emit currentIndexChanged();
- }
-
- // update visibleIndex
- d->visibleIndex = 0;
- for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
- if ((*it)->index != -1) {
- d->visibleIndex = (*it)->index;
- break;
- }
- }
-
- if (removedVisible && d->visibleItems.isEmpty()) {
- d->timeline.clear();
- if (d->itemCount == 0) {
- d->setPosition(0);
- d->updateHeader();
- d->updateFooter();
- update();
- }
- }
-
- emit countChanged();
-}
-
-void QDeclarativeGridView::destroyRemoved()
-{
- Q_D(QDeclarativeGridView);
- for (QList<FxGridItem*>::Iterator it = d->visibleItems.begin();
- it != d->visibleItems.end();) {
- FxGridItem *listItem = *it;
- if (listItem->index == -1 && listItem->attached->delayRemove() == false) {
- d->releaseItem(listItem);
- it = d->visibleItems.erase(it);
- } else {
- ++it;
- }
- }
-
- // Correct the positioning of the items
- d->layout();
-}
-
-void QDeclarativeGridView::itemsMoved(int from, int to, int count)
-{
- Q_D(QDeclarativeGridView);
- if (!isComponentComplete())
- return;
- QHash<int,FxGridItem*> moved;
-
- FxGridItem *firstItem = d->firstVisibleItem();
-
- QList<FxGridItem*>::Iterator it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxGridItem *item = *it;
- if (item->index >= from && item->index < from + count) {
- // take the items that are moving
- item->index += (to-from);
- moved.insert(item->index, item);
- it = d->visibleItems.erase(it);
- } else {
- if (item->index > from && item->index != -1) {
- // move everything after the moved items.
- item->index -= count;
- if (item->index < d->visibleIndex)
- d->visibleIndex = item->index;
- }
- ++it;
- }
- }
-
- int remaining = count;
- int endIndex = d->visibleIndex;
- it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxGridItem *item = *it;
- if (remaining && item->index >= to && item->index < to + count) {
- // place items in the target position, reusing any existing items
- FxGridItem *movedItem = moved.take(item->index);
- if (!movedItem)
- movedItem = d->createItem(item->index);
- it = d->visibleItems.insert(it, movedItem);
- if (it == d->visibleItems.begin() && firstItem)
- movedItem->setPosition(firstItem->colPos(), firstItem->rowPos());
- ++it;
- --remaining;
- } else {
- if (item->index != -1) {
- if (item->index >= to) {
- // update everything after the moved items.
- item->index += count;
- }
- endIndex = item->index;
- }
- ++it;
- }
- }
-
- // If we have moved items to the end of the visible items
- // then add any existing moved items that we have
- while (FxGridItem *item = moved.take(endIndex+1)) {
- d->visibleItems.append(item);
- ++endIndex;
- }
-
- // update visibleIndex
- for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
- if ((*it)->index != -1) {
- d->visibleIndex = (*it)->index;
- break;
- }
- }
-
- // Fix current index
- if (d->currentIndex >= 0 && d->currentItem) {
- int oldCurrent = d->currentIndex;
- d->currentIndex = d->model->indexOf(d->currentItem->item, this);
- if (oldCurrent != d->currentIndex) {
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- }
- }
-
- // Whatever moved items remain are no longer visible items.
- while (moved.count()) {
- int idx = moved.begin().key();
- FxGridItem *item = moved.take(idx);
- if (d->currentItem && item->item == d->currentItem->item)
- item->setPosition(d->colPosAt(idx), d->rowPosAt(idx));
- d->releaseItem(item);
- }
-
- d->layout();
-}
-
-void QDeclarativeGridView::modelReset()
-{
- Q_D(QDeclarativeGridView);
- d->clear();
- refill();
- d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeGridViewPrivate::Other;
-
- emit countChanged();
-}
-
-void QDeclarativeGridView::createdItem(int index, QDeclarativeItem *item)
-{
- Q_D(QDeclarativeGridView);
- if (d->requestedIndex != index) {
- item->setParentItem(this);
- d->unrequestedItems.insert(item, index);
- if (d->flow == QDeclarativeGridView::LeftToRight) {
- item->setPos(QPointF(d->colPosAt(index), d->rowPosAt(index)));
- } else {
- item->setPos(QPointF(d->rowPosAt(index), d->colPosAt(index)));
- }
- }
-}
-
-void QDeclarativeGridView::destroyingItem(QDeclarativeItem *item)
-{
- Q_D(QDeclarativeGridView);
- d->unrequestedItems.remove(item);
-}
-
-void QDeclarativeGridView::animStopped()
-{
- Q_D(QDeclarativeGridView);
- d->bufferMode = QDeclarativeGridViewPrivate::NoBuffer;
- if (d->haveHighlightRange && d->highlightRange == QDeclarativeGridView::StrictlyEnforceRange)
- d->updateHighlight();
-}
-
-void QDeclarativeGridView::refill()
-{
- Q_D(QDeclarativeGridView);
- if (d->isRightToLeftTopToBottom())
- d->refill(-d->position()-d->size()+1, -d->position());
- else
- d->refill(d->position(), d->position()+d->size()-1);
-}
-
-
-QDeclarativeGridViewAttached *QDeclarativeGridView::qmlAttachedProperties(QObject *obj)
-{
- return new QDeclarativeGridViewAttached(obj);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativegridview_p.h b/src/declarative/graphicsitems/qdeclarativegridview_p.h
deleted file mode 100644
index d2dff48dc6..0000000000
--- a/src/declarative/graphicsitems/qdeclarativegridview_p.h
+++ /dev/null
@@ -1,288 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEGRIDVIEW_H
-#define QDECLARATIVEGRIDVIEW_H
-
-#include "private/qdeclarativeflickable_p.h"
-#include "private/qdeclarativeguard_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-class QDeclarativeVisualModel;
-class QDeclarativeGridViewAttached;
-class QDeclarativeGridViewPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeGridView : public QDeclarativeFlickable
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeGridView)
-
- Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
- Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
- Q_PROPERTY(QDeclarativeItem *currentItem READ currentItem NOTIFY currentIndexChanged)
- Q_PROPERTY(int count READ count NOTIFY countChanged)
-
- Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
- Q_PROPERTY(QDeclarativeItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
- Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem)
- Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
-
- Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged RESET resetPreferredHighlightBegin)
- Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged RESET resetPreferredHighlightEnd)
- Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
-
- Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
- Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
- Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1)
- Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged)
- Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
- Q_PROPERTY(int cellWidth READ cellWidth WRITE setCellWidth NOTIFY cellWidthChanged)
- Q_PROPERTY(int cellHeight READ cellHeight WRITE setCellHeight NOTIFY cellHeightChanged)
-
- Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged)
-
- Q_PROPERTY(QDeclarativeComponent *header READ header WRITE setHeader NOTIFY headerChanged)
- Q_PROPERTY(QDeclarativeComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
-
- Q_ENUMS(HighlightRangeMode)
- Q_ENUMS(SnapMode)
- Q_ENUMS(Flow)
- Q_ENUMS(PositionMode)
- Q_CLASSINFO("DefaultProperty", "data")
-
-public:
- QDeclarativeGridView(QDeclarativeItem *parent=0);
- ~QDeclarativeGridView();
-
- QVariant model() const;
- int modelCount() const;
- void setModel(const QVariant &);
-
- QDeclarativeComponent *delegate() const;
- void setDelegate(QDeclarativeComponent *);
-
- int currentIndex() const;
- void setCurrentIndex(int idx);
-
- QDeclarativeItem *currentItem();
- QDeclarativeItem *highlightItem();
- int count() const;
-
- QDeclarativeComponent *highlight() const;
- void setHighlight(QDeclarativeComponent *highlight);
-
- bool highlightFollowsCurrentItem() const;
- void setHighlightFollowsCurrentItem(bool);
-
- int highlightMoveDuration() const;
- void setHighlightMoveDuration(int);
-
- enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
- HighlightRangeMode highlightRangeMode() const;
- void setHighlightRangeMode(HighlightRangeMode mode);
-
- qreal preferredHighlightBegin() const;
- void setPreferredHighlightBegin(qreal);
- void resetPreferredHighlightBegin();
-
- qreal preferredHighlightEnd() const;
- void setPreferredHighlightEnd(qreal);
- void resetPreferredHighlightEnd();
-
- Qt::LayoutDirection layoutDirection() const;
- void setLayoutDirection(Qt::LayoutDirection);
- Qt::LayoutDirection effectiveLayoutDirection() const;
-
- enum Flow { LeftToRight, TopToBottom };
- Flow flow() const;
- void setFlow(Flow);
-
- bool isWrapEnabled() const;
- void setWrapEnabled(bool);
-
- int cacheBuffer() const;
- void setCacheBuffer(int);
-
- int cellWidth() const;
- void setCellWidth(int);
-
- int cellHeight() const;
- void setCellHeight(int);
-
- enum SnapMode { NoSnap, SnapToRow, SnapOneRow };
- SnapMode snapMode() const;
- void setSnapMode(SnapMode mode);
-
- QDeclarativeComponent *footer() const;
- void setFooter(QDeclarativeComponent *);
-
- QDeclarativeComponent *header() const;
- void setHeader(QDeclarativeComponent *);
-
- virtual void setContentX(qreal pos);
- virtual void setContentY(qreal pos);
-
- enum PositionMode { Beginning, Center, End, Visible, Contain };
-
- Q_INVOKABLE void positionViewAtIndex(int index, int mode);
- Q_INVOKABLE int indexAt(qreal x, qreal y) const;
- Q_INVOKABLE Q_REVISION(1) void positionViewAtBeginning();
- Q_INVOKABLE Q_REVISION(1) void positionViewAtEnd();
-
- static QDeclarativeGridViewAttached *qmlAttachedProperties(QObject *);
-
-public Q_SLOTS:
- void moveCurrentIndexUp();
- void moveCurrentIndexDown();
- void moveCurrentIndexLeft();
- void moveCurrentIndexRight();
-
-Q_SIGNALS:
- void countChanged();
- void currentIndexChanged();
- void cellWidthChanged();
- void cellHeightChanged();
- void highlightChanged();
- void highlightItemChanged();
- void preferredHighlightBeginChanged();
- void preferredHighlightEndChanged();
- void highlightRangeModeChanged();
- void highlightMoveDurationChanged();
- void modelChanged();
- void delegateChanged();
- void flowChanged();
- Q_REVISION(1) void layoutDirectionChanged();
- Q_REVISION(1) void effectiveLayoutDirectionChanged();
- void keyNavigationWrapsChanged();
- void cacheBufferChanged();
- void snapModeChanged();
- void headerChanged();
- void footerChanged();
-
-protected:
- virtual bool event(QEvent *event);
- virtual void viewportMoved();
- virtual qreal minYExtent() const;
- virtual qreal maxYExtent() const;
- virtual qreal minXExtent() const;
- virtual qreal maxXExtent() const;
- virtual void keyPressEvent(QKeyEvent *);
- virtual void componentComplete();
-
-private Q_SLOTS:
- void trackedPositionChanged();
- void itemsInserted(int index, int count);
- void itemsRemoved(int index, int count);
- void itemsMoved(int from, int to, int count);
- void modelReset();
- void destroyRemoved();
- void createdItem(int index, QDeclarativeItem *item);
- void destroyingItem(QDeclarativeItem *item);
- void animStopped();
-
-private:
- void refill();
-};
-
-class QDeclarativeGridViewAttached : public QObject
-{
- Q_OBJECT
-public:
- QDeclarativeGridViewAttached(QObject *parent)
- : QObject(parent), m_view(0), m_isCurrent(false), m_delayRemove(false) {}
- ~QDeclarativeGridViewAttached() {}
-
- Q_PROPERTY(QDeclarativeGridView *view READ view NOTIFY viewChanged)
- QDeclarativeGridView *view() { return m_view; }
- void setView(QDeclarativeGridView *view) {
- if (view != m_view) {
- m_view = view;
- emit viewChanged();
- }
- }
-
- Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
- bool isCurrentItem() const { return m_isCurrent; }
- void setIsCurrentItem(bool c) {
- if (m_isCurrent != c) {
- m_isCurrent = c;
- emit currentItemChanged();
- }
- }
-
- Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
- bool delayRemove() const { return m_delayRemove; }
- void setDelayRemove(bool delay) {
- if (m_delayRemove != delay) {
- m_delayRemove = delay;
- emit delayRemoveChanged();
- }
- }
-
- void emitAdd() { emit add(); }
- void emitRemove() { emit remove(); }
-
-Q_SIGNALS:
- void currentItemChanged();
- void delayRemoveChanged();
- void add();
- void remove();
- void viewChanged();
-
-public:
- QDeclarativeGuard<QDeclarativeGridView> m_view;
- bool m_isCurrent : 1;
- bool m_delayRemove : 1;
-};
-
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeGridView)
-QML_DECLARE_TYPEINFO(QDeclarativeGridView, QML_HAS_ATTACHED_PROPERTIES)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
deleted file mode 100644
index e6bb798ece..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ /dev/null
@@ -1,584 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeimage_p.h"
-#include "private/qdeclarativeimage_p_p.h"
-
-#include <QKeyEvent>
-#include <QPainter>
-
-QT_BEGIN_NAMESPACE
-
-
-/*!
- \qmlclass Image QDeclarativeImage
- \since 4.7
- \ingroup qml-basic-visual-elements
- \brief The Image element displays an image in a declarative user interface
- \inherits Item
-
- The Image element is used to display images in a declarative user interface.
-
- The source of the image is specified as a URL using the \l source property.
- Images can be supplied in any of the standard image formats supported by Qt,
- including bitmap formats such as PNG and JPEG, and vector graphics formats
- such as SVG. If you need to display animated images, use the \l AnimatedImage
- element.
-
- If the \l{Item::width}{width} and \l{Item::height}{height} properties are not
- specified, the Image element automatically uses the size of the loaded image.
- By default, specifying the width and height of the element causes the image
- to be scaled to that size. This behavior can be changed by setting the
- \l fillMode property, allowing the image to be stretched and tiled instead.
-
- \section1 Example Usage
-
- The following example shows the simplest usage of the Image element.
-
- \snippet doc/src/snippets/declarative/image.qml document
-
- \beginfloatleft
- \image declarative-qtlogo.png
- \endfloat
-
- \clearfloat
-
- \section1 Performance
-
- By default, locally available images are loaded immediately, and the user interface
- is blocked until loading is complete. If a large image is to be loaded, it may be
- preferable to load the image in a low priority thread, by enabling the \l asynchronous
- property.
-
- If the image is obtained from a network rather than a local resource, it is
- automatically loaded asynchronously, and the \l progress and \l status properties
- are updated as appropriate.
-
- Images are cached and shared internally, so if several Image elements have the same \l source,
- only one copy of the image will be loaded.
-
- \bold Note: Images are often the greatest user of memory in QML user interfaces. It is recommended
- that images which do not form part of the user interface have their
- size bounded via the \l sourceSize property. This is especially important for content
- that is loaded from external sources or provided by the user.
-
- \sa {declarative/imageelements/image}{Image example}, QDeclarativeImageProvider
-*/
-
-QDeclarativeImage::QDeclarativeImage(QDeclarativeItem *parent)
- : QDeclarativeImageBase(*(new QDeclarativeImagePrivate), parent)
-{
-}
-
-QDeclarativeImage::QDeclarativeImage(QDeclarativeImagePrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeImageBase(dd, parent)
-{
-}
-
-QDeclarativeImage::~QDeclarativeImage()
-{
-}
-
-QPixmap QDeclarativeImage::pixmap() const
-{
- Q_D(const QDeclarativeImage);
- return d->pix.pixmap();
-}
-
-void QDeclarativeImage::setPixmap(const QPixmap &pix)
-{
- Q_D(QDeclarativeImage);
- if (!d->url.isEmpty())
- return;
- d->setPixmap(pix);
-}
-
-void QDeclarativeImagePrivate::setPixmap(const QPixmap &pixmap)
-{
- Q_Q(QDeclarativeImage);
- pix.setPixmap(pixmap);
-
- q->pixmapChange();
- status = pix.isNull() ? QDeclarativeImageBase::Null : QDeclarativeImageBase::Ready;
-
- q->update();
-}
-
-/*!
- \qmlproperty enumeration Image::fillMode
-
- Set this property to define what happens when the source image has a different size
- than the item.
-
- \list
- \o Image.Stretch - the image is scaled to fit
- \o Image.PreserveAspectFit - the image is scaled uniformly to fit without cropping
- \o Image.PreserveAspectCrop - the image is scaled uniformly to fill, cropping if necessary
- \o Image.Tile - the image is duplicated horizontally and vertically
- \o Image.TileVertically - the image is stretched horizontally and tiled vertically
- \o Image.TileHorizontally - the image is stretched vertically and tiled horizontally
- \endlist
-
- \table
-
- \row
- \o \image declarative-qtlogo-stretch.png
- \o Stretch (default)
- \qml
- Image {
- width: 130; height: 100
- smooth: true
- source: "qtlogo.png"
- }
- \endqml
-
- \row
- \o \image declarative-qtlogo-preserveaspectfit.png
- \o PreserveAspectFit
- \qml
- Image {
- width: 130; height: 100
- fillMode: Image.PreserveAspectFit
- smooth: true
- source: "qtlogo.png"
- }
- \endqml
-
- \row
- \o \image declarative-qtlogo-preserveaspectcrop.png
- \o PreserveAspectCrop
- \qml
- Image {
- width: 130; height: 100
- fillMode: Image.PreserveAspectCrop
- smooth: true
- source: "qtlogo.png"
- clip: true
- }
- \endqml
-
- \row
- \o \image declarative-qtlogo-tile.png
- \o Tile
- \qml
- Image {
- width: 120; height: 120
- fillMode: Image.Tile
- source: "qtlogo.png"
- }
- \endqml
-
- \row
- \o \image declarative-qtlogo-tilevertically.png
- \o TileVertically
- \qml
- Image {
- width: 120; height: 120
- fillMode: Image.TileVertically
- smooth: true
- source: "qtlogo.png"
- }
- \endqml
-
- \row
- \o \image declarative-qtlogo-tilehorizontally.png
- \o TileHorizontally
- \qml
- Image {
- width: 120; height: 120
- fillMode: Image.TileHorizontally
- smooth: true
- source: "qtlogo.png"
- }
- \endqml
-
- \endtable
-
- Note that \c clip is \c false by default which means that the element might
- paint outside its bounding rectangle even if the fillMode is set to \c PreserveAspectCrop.
-
- \sa {declarative/imageelements/image}{Image example}
-*/
-QDeclarativeImage::FillMode QDeclarativeImage::fillMode() const
-{
- Q_D(const QDeclarativeImage);
- return d->fillMode;
-}
-
-void QDeclarativeImage::setFillMode(FillMode mode)
-{
- Q_D(QDeclarativeImage);
- if (d->fillMode == mode)
- return;
- d->fillMode = mode;
- update();
- updatePaintedGeometry();
- emit fillModeChanged();
-}
-
-/*!
-
- \qmlproperty real Image::paintedWidth
- \qmlproperty real Image::paintedHeight
-
- These properties hold the size of the image that is actually painted.
- In most cases it is the same as \c width and \c height, but when using a
- \c fillMode \c PreserveAspectFit or \c fillMode \c PreserveAspectCrop
- \c paintedWidth or \c paintedHeight can be smaller or larger than
- \c width and \c height of the Image element.
-*/
-qreal QDeclarativeImage::paintedWidth() const
-{
- Q_D(const QDeclarativeImage);
- return d->paintedWidth;
-}
-
-qreal QDeclarativeImage::paintedHeight() const
-{
- Q_D(const QDeclarativeImage);
- return d->paintedHeight;
-}
-
-/*!
- \qmlproperty enumeration Image::status
-
- This property holds the status of image loading. It can be one of:
- \list
- \o Image.Null - no image has been set
- \o Image.Ready - the image has been loaded
- \o Image.Loading - the image is currently being loaded
- \o Image.Error - an error occurred while loading the image
- \endlist
-
- Use this status to provide an update or respond to the status change in some way.
- For example, you could:
-
- \list
- \o Trigger a state change:
- \qml
- State { name: 'loaded'; when: image.status == Image.Ready }
- \endqml
-
- \o Implement an \c onStatusChanged signal handler:
- \qml
- Image {
- id: image
- onStatusChanged: if (image.status == Image.Ready) console.log('Loaded')
- }
- \endqml
-
- \o Bind to the status value:
- \qml
- Text { text: image.status == Image.Ready ? 'Loaded' : 'Not loaded' }
- \endqml
- \endlist
-
- \sa progress
-*/
-
-/*!
- \qmlproperty real Image::progress
-
- This property holds the progress of image loading, from 0.0 (nothing loaded)
- to 1.0 (finished).
-
- \sa status
-*/
-
-/*!
- \qmlproperty bool Image::smooth
-
- Set this property if you want the image to be smoothly filtered when scaled or
- transformed. Smooth filtering gives better visual quality, but is slower. If
- the image is displayed at its natural size, this property has no visual or
- performance effect.
-
- \note Generally scaling artifacts are only visible if the image is stationary on
- the screen. A common pattern when animating an image is to disable smooth
- filtering at the beginning of the animation and reenable it at the conclusion.
-*/
-
-/*!
- \qmlproperty QSize Image::sourceSize
-
- This property holds the actual width and height of the loaded image.
-
- Unlike the \l {Item::}{width} and \l {Item::}{height} properties, which scale
- the painting of the image, this property sets the actual number of pixels
- stored for the loaded image so that large images do not use more
- memory than necessary. For example, this ensures the image in memory is no
- larger than 1024x1024 pixels, regardless of the Image's \l {Item::}{width} and
- \l {Item::}{height} values:
-
- \code
- Rectangle {
- width: ...
- height: ...
-
- Image {
- anchors.fill: parent
- source: "reallyBigImage.jpg"
- sourceSize.width: 1024
- sourceSize.height: 1024
- }
- }
- \endcode
-
- If the image's actual size is larger than the sourceSize, the image is scaled down.
- If only one dimension of the size is set to greater than 0, the
- other dimension is set in proportion to preserve the source image's aspect ratio.
- (The \l fillMode is independent of this.)
-
- If the source is an instrinsically scalable image (eg. SVG), this property
- determines the size of the loaded image regardless of intrinsic size.
- Avoid changing this property dynamically; rendering an SVG is \e slow compared
- to an image.
-
- If the source is a non-scalable image (eg. JPEG), the loaded image will
- be no greater than this property specifies. For some formats (currently only JPEG),
- the whole image will never actually be loaded into memory.
-
- Since QtQuick 1.1 the sourceSize can be cleared to the natural size of the image
- by setting sourceSize to \c undefined.
-
- \note \e {Changing this property dynamically causes the image source to be reloaded,
- potentially even from the network, if it is not in the disk cache.}
-*/
-
-void QDeclarativeImage::updatePaintedGeometry()
-{
- Q_D(QDeclarativeImage);
-
- if (d->fillMode == PreserveAspectFit) {
- if (!d->pix.width() || !d->pix.height()) {
- setImplicitWidth(0);
- setImplicitHeight(0);
- return;
- }
- qreal w = widthValid() ? width() : d->pix.width();
- qreal widthScale = w / qreal(d->pix.width());
- qreal h = heightValid() ? height() : d->pix.height();
- qreal heightScale = h / qreal(d->pix.height());
- if (widthScale <= heightScale) {
- d->paintedWidth = w;
- d->paintedHeight = widthScale * qreal(d->pix.height());
- } else if(heightScale < widthScale) {
- d->paintedWidth = heightScale * qreal(d->pix.width());
- d->paintedHeight = h;
- }
- if (widthValid() && !heightValid()) {
- setImplicitHeight(d->paintedHeight);
- } else {
- setImplicitHeight(d->pix.height());
- }
- if (heightValid() && !widthValid()) {
- setImplicitWidth(d->paintedWidth);
- } else {
- setImplicitWidth(d->pix.width());
- }
- } else if (d->fillMode == PreserveAspectCrop) {
- if (!d->pix.width() || !d->pix.height())
- return;
- qreal widthScale = width() / qreal(d->pix.width());
- qreal heightScale = height() / qreal(d->pix.height());
- if (widthScale < heightScale) {
- widthScale = heightScale;
- } else if(heightScale < widthScale) {
- heightScale = widthScale;
- }
-
- d->paintedHeight = heightScale * qreal(d->pix.height());
- d->paintedWidth = widthScale * qreal(d->pix.width());
- } else {
- d->paintedWidth = width();
- d->paintedHeight = height();
- }
- emit paintedGeometryChanged();
-}
-
-void QDeclarativeImage::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- QDeclarativeImageBase::geometryChanged(newGeometry, oldGeometry);
- updatePaintedGeometry();
-}
-
-QRectF QDeclarativeImage::boundingRect() const
-{
- Q_D(const QDeclarativeImage);
- return QRectF(0, 0, qMax(d->mWidth, d->paintedWidth), qMax(d->mHeight, d->paintedHeight));
-}
-
-/*!
- \qmlproperty url Image::source
-
- Image can handle any image format supported by Qt, loaded from any URL scheme supported by Qt.
-
- The URL may be absolute, or relative to the URL of the component.
-
- \sa QDeclarativeImageProvider
-*/
-
-/*!
- \qmlproperty bool Image::asynchronous
-
- Specifies that images on the local filesystem should be loaded
- asynchronously in a separate thread. The default value is
- false, causing the user interface thread to block while the
- image is loaded. Setting \a asynchronous to true is useful where
- maintaining a responsive user interface is more desirable
- than having images immediately visible.
-
- Note that this property is only valid for images read from the
- local filesystem. Images loaded via a network resource (e.g. HTTP)
- are always loaded asynchonously.
-*/
-
-/*!
- \qmlproperty bool Image::cache
- \since Quick 1.1
-
- Specifies whether the image should be cached. The default value is
- true. Setting \a cache to false is useful when dealing with large images,
- to make sure that they aren't cached at the expense of small 'ui element' images.
-*/
-
-/*!
- \qmlproperty bool Image::mirror
- \since Quick 1.1
-
- This property holds whether the image should be horizontally inverted
- (effectively displaying a mirrored image).
-
- The default value is false.
-*/
-
-
-void QDeclarativeImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
-{
- Q_D(QDeclarativeImage);
- if (d->pix.pixmap().isNull() )
- return;
-
- int drawWidth = width();
- int drawHeight = height();
- bool doClip = false;
- QTransform transform;
- qreal widthScale = width() / qreal(d->pix.width());
- qreal heightScale = height() / qreal(d->pix.height());
-
- if (width() != d->pix.width() || height() != d->pix.height()) {
- if (d->fillMode >= Tile) {
- if (d->fillMode == TileVertically) {
- transform.scale(widthScale, 1.0);
- drawWidth = d->pix.width();
- } else if (d->fillMode == TileHorizontally) {
- transform.scale(1.0, heightScale);
- drawHeight = d->pix.height();
- }
- } else {
- if (d->fillMode == PreserveAspectFit) {
- if (widthScale <= heightScale) {
- heightScale = widthScale;
- transform.translate(0, (height() - heightScale * d->pix.height()) / 2);
- } else if(heightScale < widthScale) {
- widthScale = heightScale;
- transform.translate((width() - widthScale * d->pix.width()) / 2, 0);
- }
- } else if (d->fillMode == PreserveAspectCrop) {
- if (widthScale < heightScale) {
- widthScale = heightScale;
- transform.translate((width() - widthScale * d->pix.width()) / 2, 0);
- } else if(heightScale < widthScale) {
- heightScale = widthScale;
- transform.translate(0, (height() - heightScale * d->pix.height()) / 2);
- }
- }
- transform.scale(widthScale, heightScale);
- drawWidth = d->pix.width();
- drawHeight = d->pix.height();
- doClip = clip();
- }
- }
-
- QTransform oldTransform;
- bool oldAA = p->testRenderHint(QPainter::Antialiasing);
- bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
- if (d->smooth)
- p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
- if (doClip) {
- p->save();
- p->setClipRect(QRectF(0, 0, d->mWidth, d->mHeight), Qt::IntersectClip);
- }
- if (d->mirror)
- transform.translate(drawWidth, 0).scale(-1.0, 1.0);
- if (!transform.isIdentity()) {
- oldTransform = p->transform();
- p->setWorldTransform(transform * oldTransform);
- }
-
- if (d->fillMode >= Tile)
- p->drawTiledPixmap(QRectF(0, 0, drawWidth, drawHeight), d->pix);
- else
- p->drawPixmap(QRectF(0, 0, drawWidth, drawHeight), d->pix, QRectF(0, 0, drawWidth, drawHeight));
-
- if (d->smooth) {
- p->setRenderHint(QPainter::Antialiasing, oldAA);
- p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
- }
- if (doClip)
- p->restore();
- if (!transform.isIdentity())
- p->setWorldTransform(oldTransform);
-}
-
-void QDeclarativeImage::pixmapChange()
-{
- Q_D(QDeclarativeImage);
- // PreserveAspectFit calculates the implicit size differently so we
- // don't call our superclass pixmapChange(), since that would
- // result in the implicit size being set incorrectly, then updated
- // in updatePaintedGeometry()
- if (d->fillMode != PreserveAspectFit)
- QDeclarativeImageBase::pixmapChange();
- updatePaintedGeometry();
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeimage_p.h b/src/declarative/graphicsitems/qdeclarativeimage_p.h
deleted file mode 100644
index 82c4396914..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimage_p.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGE_H
-#define QDECLARATIVEIMAGE_H
-
-#include "private/qdeclarativeimagebase_p.h"
-
-#include <QtNetwork/qnetworkreply.h>
-
-QT_BEGIN_HEADER
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeImagePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeImage : public QDeclarativeImageBase
-{
- Q_OBJECT
- Q_ENUMS(FillMode)
-
- Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
- Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedGeometryChanged)
- Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedGeometryChanged)
-
-public:
- QDeclarativeImage(QDeclarativeItem *parent=0);
- ~QDeclarativeImage();
-
- enum FillMode { Stretch, PreserveAspectFit, PreserveAspectCrop, Tile, TileVertically, TileHorizontally };
- FillMode fillMode() const;
- void setFillMode(FillMode);
-
- QPixmap pixmap() const;
- void setPixmap(const QPixmap &);
-
- qreal paintedWidth() const;
- qreal paintedHeight() const;
-
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
- QRectF boundingRect() const;
-
-Q_SIGNALS:
- void fillModeChanged();
- void paintedGeometryChanged();
-
-protected:
- QDeclarativeImage(QDeclarativeImagePrivate &dd, QDeclarativeItem *parent);
- void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
- void pixmapChange();
- void updatePaintedGeometry();
-
-private:
- Q_DISABLE_COPY(QDeclarativeImage)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImage)
-};
-
-QT_END_NAMESPACE
-QML_DECLARE_TYPE(QDeclarativeImage)
-QT_END_HEADER
-
-#endif // QDECLARATIVEIMAGE_H
diff --git a/src/declarative/graphicsitems/qdeclarativeimage_p_p.h b/src/declarative/graphicsitems/qdeclarativeimage_p_p.h
deleted file mode 100644
index 29b004c9d6..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimage_p_p.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGE_P_H
-#define QDECLARATIVEIMAGE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativeimagebase_p_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeImagePrivate : public QDeclarativeImageBasePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeImage)
-
-public:
- QDeclarativeImagePrivate()
- : fillMode(QDeclarativeImage::Stretch), paintedWidth(0), paintedHeight(0)
- {
- }
-
- QDeclarativeImage::FillMode fillMode;
- qreal paintedWidth;
- qreal paintedHeight;
- void setPixmap(const QPixmap &pix);
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEIMAGE_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
deleted file mode 100644
index 92303fc051..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeimagebase_p.h"
-#include "private/qdeclarativeimagebase_p_p.h"
-
-#include <qdeclarativeengine.h>
-#include <qdeclarativeinfo.h>
-#include <qdeclarativepixmapcache_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QDeclarativeImageBase::QDeclarativeImageBase(QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(*(new QDeclarativeImageBasePrivate), parent)
-{
-}
-
-QDeclarativeImageBase::QDeclarativeImageBase(QDeclarativeImageBasePrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(dd, parent)
-{
-}
-
-QDeclarativeImageBase::~QDeclarativeImageBase()
-{
-}
-
-QDeclarativeImageBase::Status QDeclarativeImageBase::status() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->status;
-}
-
-
-qreal QDeclarativeImageBase::progress() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->progress;
-}
-
-
-bool QDeclarativeImageBase::asynchronous() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->async;
-}
-
-void QDeclarativeImageBase::setAsynchronous(bool async)
-{
- Q_D(QDeclarativeImageBase);
- if (d->async != async) {
- d->async = async;
- emit asynchronousChanged();
- }
-}
-
-QUrl QDeclarativeImageBase::source() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->url;
-}
-
-void QDeclarativeImageBase::setSource(const QUrl &url)
-{
- Q_D(QDeclarativeImageBase);
- //equality is fairly expensive, so we bypass for simple, common case
- if ((d->url.isEmpty() == url.isEmpty()) && url == d->url)
- return;
-
- d->url = url;
- emit sourceChanged(d->url);
-
- if (isComponentComplete())
- load();
-}
-
-void QDeclarativeImageBase::setSourceSize(const QSize& size)
-{
- Q_D(QDeclarativeImageBase);
- if (d->sourcesize == size)
- return;
-
- d->sourcesize = size;
- d->explicitSourceSize = true;
- emit sourceSizeChanged();
- if (isComponentComplete())
- load();
-}
-
-QSize QDeclarativeImageBase::sourceSize() const
-{
- Q_D(const QDeclarativeImageBase);
-
- int width = d->sourcesize.width();
- int height = d->sourcesize.height();
- return QSize(width != -1 ? width : d->pix.width(), height != -1 ? height : d->pix.height());
-}
-
-void QDeclarativeImageBase::resetSourceSize()
-{
- Q_D(QDeclarativeImageBase);
- if (!d->explicitSourceSize)
- return;
- d->explicitSourceSize = false;
- d->sourcesize = QSize();
- emit sourceSizeChanged();
- if (isComponentComplete())
- load();
-}
-
-bool QDeclarativeImageBase::cache() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->cache;
-}
-
-void QDeclarativeImageBase::setCache(bool cache)
-{
- Q_D(QDeclarativeImageBase);
- if (d->cache == cache)
- return;
-
- d->cache = cache;
- emit cacheChanged();
- if (isComponentComplete())
- load();
-}
-
-void QDeclarativeImageBase::setMirror(bool mirror)
-{
- Q_D(QDeclarativeImageBase);
- if (mirror == d->mirror)
- return;
-
- d->mirror = mirror;
-
- if (isComponentComplete())
- update();
-
- emit mirrorChanged();
-}
-
-bool QDeclarativeImageBase::mirror() const
-{
- Q_D(const QDeclarativeImageBase);
- return d->mirror;
-}
-
-void QDeclarativeImageBase::load()
-{
- Q_D(QDeclarativeImageBase);
-
- if (d->url.isEmpty()) {
- d->pix.clear(this);
- d->status = Null;
- d->progress = 0.0;
- pixmapChange();
- emit progressChanged(d->progress);
- emit statusChanged(d->status);
- update();
- } else {
- QDeclarativePixmap::Options options;
- if (d->async)
- options |= QDeclarativePixmap::Asynchronous;
- if (d->cache)
- options |= QDeclarativePixmap::Cache;
- d->pix.clear(this);
- d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), options);
-
- if (d->pix.isLoading()) {
- d->progress = 0.0;
- d->status = Loading;
- emit progressChanged(d->progress);
- emit statusChanged(d->status);
-
- static int thisRequestProgress = -1;
- static int thisRequestFinished = -1;
- if (thisRequestProgress == -1) {
- thisRequestProgress =
- QDeclarativeImageBase::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)");
- thisRequestFinished =
- QDeclarativeImageBase::staticMetaObject.indexOfSlot("requestFinished()");
- }
-
- d->pix.connectFinished(this, thisRequestFinished);
- d->pix.connectDownloadProgress(this, thisRequestProgress);
-
- } else {
- requestFinished();
- }
- }
-}
-
-void QDeclarativeImageBase::requestFinished()
-{
- Q_D(QDeclarativeImageBase);
-
- QDeclarativeImageBase::Status oldStatus = d->status;
- qreal oldProgress = d->progress;
-
- if (d->pix.isError()) {
- d->status = Error;
- qmlInfo(this) << d->pix.error();
- } else {
- d->status = Ready;
- }
-
- d->progress = 1.0;
-
- pixmapChange();
-
- if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
- emit sourceSizeChanged();
-
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- if (d->progress != oldProgress)
- emit progressChanged(d->progress);
-
- update();
-}
-
-void QDeclarativeImageBase::requestProgress(qint64 received, qint64 total)
-{
- Q_D(QDeclarativeImageBase);
- if (d->status == Loading && total > 0) {
- d->progress = qreal(received)/total;
- emit progressChanged(d->progress);
- }
-}
-
-void QDeclarativeImageBase::componentComplete()
-{
- Q_D(QDeclarativeImageBase);
- QDeclarativeItem::componentComplete();
- if (d->url.isValid())
- load();
-}
-
-void QDeclarativeImageBase::pixmapChange()
-{
- Q_D(QDeclarativeImageBase);
- setImplicitWidth(d->pix.width());
- setImplicitHeight(d->pix.height());
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase_p.h b/src/declarative/graphicsitems/qdeclarativeimagebase_p.h
deleted file mode 100644
index 4352299874..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimagebase_p.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGEBASE_H
-#define QDECLARATIVEIMAGEBASE_H
-
-#include "qdeclarativeimplicitsizeitem_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeImageBasePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeImageBase : public QDeclarativeImplicitSizeItem
-{
- Q_OBJECT
- Q_ENUMS(Status)
-
- Q_PROPERTY(Status status READ status NOTIFY statusChanged)
- Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
- Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
- Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged)
- Q_PROPERTY(bool cache READ cache WRITE setCache NOTIFY cacheChanged REVISION 1)
- Q_PROPERTY(QSize sourceSize READ sourceSize WRITE setSourceSize RESET resetSourceSize NOTIFY sourceSizeChanged)
- Q_PROPERTY(bool mirror READ mirror WRITE setMirror NOTIFY mirrorChanged REVISION 1)
-
-public:
- QDeclarativeImageBase(QDeclarativeItem *parent=0);
- ~QDeclarativeImageBase();
- enum Status { Null, Ready, Loading, Error };
- Status status() const;
- qreal progress() const;
-
- QUrl source() const;
- virtual void setSource(const QUrl &url);
-
- bool asynchronous() const;
- void setAsynchronous(bool);
-
- bool cache() const;
- void setCache(bool);
-
- virtual void setSourceSize(const QSize&);
- QSize sourceSize() const;
- void resetSourceSize();
-
- virtual void setMirror(bool mirror);
- bool mirror() const;
-
-Q_SIGNALS:
- void sourceChanged(const QUrl &);
- void sourceSizeChanged();
- void statusChanged(QDeclarativeImageBase::Status);
- void progressChanged(qreal progress);
- void asynchronousChanged();
- Q_REVISION(1) void cacheChanged();
- Q_REVISION(1) void mirrorChanged();
-
-protected:
- virtual void load();
- virtual void componentComplete();
- virtual void pixmapChange();
- QDeclarativeImageBase(QDeclarativeImageBasePrivate &dd, QDeclarativeItem *parent);
-
-private Q_SLOTS:
- virtual void requestFinished();
- void requestProgress(qint64,qint64);
-
-private:
- Q_DISABLE_COPY(QDeclarativeImageBase)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImageBase)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEIMAGEBASE_H
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h b/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
deleted file mode 100644
index adff87f2e1..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGEBASE_P_H
-#define QDECLARATIVEIMAGEBASE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-#include "private/qdeclarativepixmapcache_p.h"
-
-#include <QtCore/QPointer>
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkReply;
-class QDeclarativeImageBasePrivate : public QDeclarativeImplicitSizeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeImageBase)
-
-public:
- QDeclarativeImageBasePrivate()
- : status(QDeclarativeImageBase::Null),
- progress(0.0),
- explicitSourceSize(false),
- async(false),
- cache(true),
- mirror(false)
- {
- QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
- }
-
- QDeclarativePixmap pix;
- QDeclarativeImageBase::Status status;
- QUrl url;
- qreal progress;
- QSize sourcesize;
- bool explicitSourceSize : 1;
- bool async : 1;
- bool cache : 1;
- bool mirror: 1;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp
deleted file mode 100644
index 8798d71073..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeimplicitsizeitem_p.h"
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-
-QT_BEGIN_NAMESPACE
-
-void QDeclarativeImplicitSizeItemPrivate::implicitWidthChanged()
-{
- Q_Q(QDeclarativeImplicitSizeItem);
- emit q->implicitWidthChanged();
-}
-
-void QDeclarativeImplicitSizeItemPrivate::implicitHeightChanged()
-{
- Q_Q(QDeclarativeImplicitSizeItem);
- emit q->implicitHeightChanged();
-}
-
-QDeclarativeImplicitSizeItem::QDeclarativeImplicitSizeItem(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeImplicitSizeItemPrivate), parent)
-{
-}
-
-QDeclarativeImplicitSizeItem::QDeclarativeImplicitSizeItem(QDeclarativeImplicitSizeItemPrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeItem(dd, parent)
-{
-}
-
-
-void QDeclarativeImplicitSizePaintedItemPrivate::implicitWidthChanged()
-{
- Q_Q(QDeclarativeImplicitSizePaintedItem);
- emit q->implicitWidthChanged();
-}
-
-void QDeclarativeImplicitSizePaintedItemPrivate::implicitHeightChanged()
-{
- Q_Q(QDeclarativeImplicitSizePaintedItem);
- emit q->implicitHeightChanged();
-}
-
-QDeclarativeImplicitSizePaintedItem::QDeclarativeImplicitSizePaintedItem(QDeclarativeItem *parent)
- : QDeclarativePaintedItem(*(new QDeclarativeImplicitSizePaintedItemPrivate), parent)
-{
-}
-
-QDeclarativeImplicitSizePaintedItem::QDeclarativeImplicitSizePaintedItem(QDeclarativeImplicitSizePaintedItemPrivate &dd, QDeclarativeItem *parent)
- : QDeclarativePaintedItem(dd, parent)
-{
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h
deleted file mode 100644
index 4770af275b..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMPLICITSIZEITEM_H
-#define QDECLARATIVEIMPLICITSIZEITEM_H
-
-#include "qdeclarativepainteditem_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeImplicitSizeItemPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeImplicitSizeItem : public QDeclarativeItem
-{
- Q_OBJECT
- Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged REVISION 1)
- Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged REVISION 1)
-
-public:
- QDeclarativeImplicitSizeItem(QDeclarativeItem *parent = 0);
-
-protected:
- QDeclarativeImplicitSizeItem(QDeclarativeImplicitSizeItemPrivate &dd, QDeclarativeItem *parent);
-
-Q_SIGNALS:
- Q_REVISION(1) void implicitWidthChanged();
- Q_REVISION(1) void implicitHeightChanged();
-
-private:
- Q_DISABLE_COPY(QDeclarativeImplicitSizeItem)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImplicitSizeItem)
-};
-
-class QDeclarativeImplicitSizePaintedItemPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeImplicitSizePaintedItem : public QDeclarativePaintedItem
-{
- Q_OBJECT
- Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged REVISION 1)
- Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged REVISION 1)
-
-public:
- QDeclarativeImplicitSizePaintedItem(QDeclarativeItem *parent = 0);
-
-protected:
- QDeclarativeImplicitSizePaintedItem(QDeclarativeImplicitSizePaintedItemPrivate &dd, QDeclarativeItem *parent);
- virtual void drawContents(QPainter *, const QRect &) {};
-
-Q_SIGNALS:
- Q_REVISION(1) void implicitWidthChanged();
- Q_REVISION(1) void implicitHeightChanged();
-
-private:
- Q_DISABLE_COPY(QDeclarativeImplicitSizePaintedItem)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImplicitSizePaintedItem)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEIMPLICITSIZEITEM_H
diff --git a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h
deleted file mode 100644
index b96bf98d4c..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMPLICITSIZEITEM_P_H
-#define QDECLARATIVEIMPLICITSIZEITEM_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativepainteditem_p_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeImplicitSizeItemPrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeImplicitSizeItem)
-
-public:
- QDeclarativeImplicitSizeItemPrivate()
- {
- }
-
- virtual void implicitWidthChanged();
- virtual void implicitHeightChanged();
-};
-
-
-class QDeclarativeImplicitSizePaintedItemPrivate : public QDeclarativePaintedItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeImplicitSizePaintedItem)
-
-public:
- QDeclarativeImplicitSizePaintedItemPrivate()
- {
- }
-
- virtual void implicitWidthChanged();
- virtual void implicitHeightChanged();
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEIMPLICITSIZEITEM_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
deleted file mode 100644
index 87e058037f..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ /dev/null
@@ -1,3814 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativeitem.h"
-
-#include "private/qdeclarativeevents_p_p.h"
-#include <private/qdeclarativeengine_p.h>
-#include <private/qgraphicsitem_p.h>
-#include <QtDeclarative/private/qdeclarativeitem_p.h>
-
-#include <qdeclarativeengine.h>
-#include <qdeclarativeopenmetaobject_p.h>
-#include <qdeclarativestate_p.h>
-#include <qdeclarativeview.h>
-#include <qdeclarativestategroup_p.h>
-#include <qdeclarativecomponent.h>
-#include <qdeclarativeinfo.h>
-
-#include <QDebug>
-#include <QPen>
-#include <QEvent>
-#include <QGraphicsSceneMouseEvent>
-#include <QtCore/qnumeric.h>
-#include <QtScript/qscriptengine.h>
-#include <QtGui/qgraphicstransform.h>
-#include <qlistmodelinterface_p.h>
-
-#include <private/qv8engine_p.h>
-
-#include <float.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass Transform QGraphicsTransform
- \ingroup qml-transform-elements
- \since 4.7
- \brief The Transform elements provide a way of building advanced transformations on Items.
-
- The Transform element is a base type which cannot be instantiated directly.
- The following concrete Transform types are available:
-
- \list
- \o \l Rotation
- \o \l Scale
- \o \l Translate
- \endlist
-
- The Transform elements let you create and control advanced transformations that can be configured
- independently using specialized properties.
-
- You can assign any number of Transform elements to an \l Item. Each Transform is applied in order,
- one at a time.
-*/
-
-/*!
- \qmlclass Translate QDeclarativeTranslate
- \ingroup qml-transform-elements
- \since 4.7
- \brief The Translate object provides a way to move an Item without changing its x or y properties.
-
- The Translate object provides independent control over position in addition to the Item's x and y properties.
-
- The following example moves the Y axis of the \l Rectangle elements while still allowing the \l Row element
- to lay the items out as if they had not been transformed:
- \qml
- import QtQuick 1.0
-
- Row {
- Rectangle {
- width: 100; height: 100
- color: "blue"
- transform: Translate { y: 20 }
- }
- Rectangle {
- width: 100; height: 100
- color: "red"
- transform: Translate { y: -20 }
- }
- }
- \endqml
-
- \image translate.png
-*/
-
-/*!
- \qmlproperty real Translate::x
-
- The translation along the X axis.
-*/
-
-/*!
- \qmlproperty real Translate::y
-
- The translation along the Y axis.
-*/
-
-/*!
- \qmlclass Scale QGraphicsScale
- \ingroup qml-transform-elements
- \since 4.7
- \brief The Scale element provides a way to scale an Item.
-
- The Scale element gives more control over scaling than using \l Item's \l{Item::scale}{scale} property. Specifically,
- it allows a different scale for the x and y axes, and allows the scale to be relative to an
- arbitrary point.
-
- The following example scales the X axis of the Rectangle, relative to its interior point 25, 25:
- \qml
- Rectangle {
- width: 100; height: 100
- color: "blue"
- transform: Scale { origin.x: 25; origin.y: 25; xScale: 3}
- }
- \endqml
-
- \sa Rotation, Translate
-*/
-
-/*!
- \qmlproperty real Scale::origin.x
- \qmlproperty real Scale::origin.y
-
- The point that the item is scaled from (i.e., the point that stays fixed relative to the parent as
- the rest of the item grows). By default the origin is 0, 0.
-*/
-
-/*!
- \qmlproperty real Scale::xScale
-
- The scaling factor for the X axis.
-*/
-
-/*!
- \qmlproperty real Scale::yScale
-
- The scaling factor for the Y axis.
-*/
-
-/*!
- \qmlclass Rotation QGraphicsRotation
- \ingroup qml-transform-elements
- \since 4.7
- \brief The Rotation object provides a way to rotate an Item.
-
- The Rotation object gives more control over rotation than using \l Item's \l{Item::rotation}{rotation} property.
- Specifically, it allows (z axis) rotation to be relative to an arbitrary point.
-
- The following example rotates a Rectangle around its interior point 25, 25:
- \qml
- Rectangle {
- width: 100; height: 100
- color: "blue"
- transform: Rotation { origin.x: 25; origin.y: 25; angle: 45}
- }
- \endqml
-
- Rotation also provides a way to specify 3D-like rotations for Items. For these types of
- rotations you must specify the axis to rotate around in addition to the origin point.
-
- The following example shows various 3D-like rotations applied to an \l Image.
- \snippet doc/src/snippets/declarative/rotation.qml 0
-
- \image axisrotation.png
-
- \sa {declarative/ui-components/dialcontrol}{Dial Control example}, {declarative/toys/clocks}{Clocks example}
-*/
-
-/*!
- \qmlproperty real Rotation::origin.x
- \qmlproperty real Rotation::origin.y
-
- The origin point of the rotation (i.e., the point that stays fixed relative to the parent as
- the rest of the item rotates). By default the origin is 0, 0.
-*/
-
-/*!
- \qmlproperty real Rotation::axis.x
- \qmlproperty real Rotation::axis.y
- \qmlproperty real Rotation::axis.z
-
- The axis to rotate around. For simple (2D) rotation around a point, you do not need to specify an axis,
- as the default axis is the z axis (\c{ axis { x: 0; y: 0; z: 1 } }).
-
- For a typical 3D-like rotation you will usually specify both the origin and the axis.
-
- \image 3d-rotation-axis.png
-*/
-
-/*!
- \qmlproperty real Rotation::angle
-
- The angle to rotate, in degrees clockwise.
-*/
-
-QDeclarativeContents::QDeclarativeContents(QDeclarativeItem *item) : m_item(item), m_x(0), m_y(0), m_width(0), m_height(0)
-{
- //### optimize
- connect(this, SIGNAL(rectChanged(QRectF)), m_item, SIGNAL(childrenRectChanged(QRectF)));
-}
-
-QDeclarativeContents::~QDeclarativeContents()
-{
- QList<QGraphicsItem *> children = m_item->childItems();
- for (int i = 0; i < children.count(); ++i) {
- QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i));
- if(!child)//### Should this be ignoring non-QDeclarativeItem graphicsobjects?
- continue;
- QDeclarativeItemPrivate::get(child)->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed);
- }
-}
-
-QRectF QDeclarativeContents::rectF() const
-{
- return QRectF(m_x, m_y, m_width, m_height);
-}
-
-void QDeclarativeContents::calcHeight(QDeclarativeItem *changed)
-{
- qreal oldy = m_y;
- qreal oldheight = m_height;
-
- if (changed) {
- qreal top = oldy;
- qreal bottom = oldy + oldheight;
- qreal y = changed->y();
- if (y + changed->height() > bottom)
- bottom = y + changed->height();
- if (y < top)
- top = y;
- m_y = top;
- m_height = bottom - top;
- } else {
- qreal top = FLT_MAX;
- qreal bottom = 0;
- QList<QGraphicsItem *> children = m_item->childItems();
- for (int i = 0; i < children.count(); ++i) {
- QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i));
- if(!child)//### Should this be ignoring non-QDeclarativeItem graphicsobjects?
- continue;
- qreal y = child->y();
- if (y + child->height() > bottom)
- bottom = y + child->height();
- if (y < top)
- top = y;
- }
- if (!children.isEmpty())
- m_y = top;
- m_height = qMax(bottom - top, qreal(0.0));
- }
-
- if (m_height != oldheight || m_y != oldy)
- emit rectChanged(rectF());
-}
-
-void QDeclarativeContents::calcWidth(QDeclarativeItem *changed)
-{
- qreal oldx = m_x;
- qreal oldwidth = m_width;
-
- if (changed) {
- qreal left = oldx;
- qreal right = oldx + oldwidth;
- qreal x = changed->x();
- if (x + changed->width() > right)
- right = x + changed->width();
- if (x < left)
- left = x;
- m_x = left;
- m_width = right - left;
- } else {
- qreal left = FLT_MAX;
- qreal right = 0;
- QList<QGraphicsItem *> children = m_item->childItems();
- for (int i = 0; i < children.count(); ++i) {
- QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i));
- if(!child)//### Should this be ignoring non-QDeclarativeItem graphicsobjects?
- continue;
- qreal x = child->x();
- if (x + child->width() > right)
- right = x + child->width();
- if (x < left)
- left = x;
- }
- if (!children.isEmpty())
- m_x = left;
- m_width = qMax(right - left, qreal(0.0));
- }
-
- if (m_width != oldwidth || m_x != oldx)
- emit rectChanged(rectF());
-}
-
-void QDeclarativeContents::complete()
-{
- QList<QGraphicsItem *> children = m_item->childItems();
- for (int i = 0; i < children.count(); ++i) {
- QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i));
- if(!child)//### Should this be ignoring non-QDeclarativeItem graphicsobjects?
- continue;
- QDeclarativeItemPrivate::get(child)->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed);
- //###what about changes to visibility?
- }
-
- calcGeometry();
-}
-
-void QDeclarativeContents::itemGeometryChanged(QDeclarativeItem *changed, const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- Q_UNUSED(changed)
- //### we can only pass changed if the left edge has moved left, or the right edge has moved right
- if (newGeometry.width() != oldGeometry.width() || newGeometry.x() != oldGeometry.x())
- calcWidth(/*changed*/);
- if (newGeometry.height() != oldGeometry.height() || newGeometry.y() != oldGeometry.y())
- calcHeight(/*changed*/);
-}
-
-void QDeclarativeContents::itemDestroyed(QDeclarativeItem *item)
-{
- if (item)
- QDeclarativeItemPrivate::get(item)->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed);
- calcGeometry();
-}
-
-void QDeclarativeContents::childRemoved(QDeclarativeItem *item)
-{
- if (item)
- QDeclarativeItemPrivate::get(item)->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed);
- calcGeometry();
-}
-
-void QDeclarativeContents::childAdded(QDeclarativeItem *item)
-{
- if (item)
- QDeclarativeItemPrivate::get(item)->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Destroyed);
- calcWidth(item);
- calcHeight(item);
-}
-
-QDeclarativeItemKeyFilter::QDeclarativeItemKeyFilter(QDeclarativeItem *item)
-: m_processPost(false), m_next(0)
-{
- QDeclarativeItemPrivate *p =
- item?static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(item)):0;
- if (p) {
- m_next = p->keyHandler;
- p->keyHandler = this;
- }
-}
-
-QDeclarativeItemKeyFilter::~QDeclarativeItemKeyFilter()
-{
-}
-
-void QDeclarativeItemKeyFilter::keyPressed(QKeyEvent *event, bool post)
-{
- if (m_next) m_next->keyPressed(event, post);
-}
-
-void QDeclarativeItemKeyFilter::keyReleased(QKeyEvent *event, bool post)
-{
- if (m_next) m_next->keyReleased(event, post);
-}
-
-void QDeclarativeItemKeyFilter::inputMethodEvent(QInputMethodEvent *event, bool post)
-{
- if (m_next) m_next->inputMethodEvent(event, post);
-}
-
-QVariant QDeclarativeItemKeyFilter::inputMethodQuery(Qt::InputMethodQuery query) const
-{
- if (m_next) return m_next->inputMethodQuery(query);
- return QVariant();
-}
-
-void QDeclarativeItemKeyFilter::componentComplete()
-{
- if (m_next) m_next->componentComplete();
-}
-
-
-/*!
- \qmlclass KeyNavigation QDeclarativeKeyNavigationAttached
- \ingroup qml-basic-interaction-elements
- \since 4.7
- \brief The KeyNavigation attached property supports key navigation by arrow keys.
-
- Key-based user interfaces commonly allow the use of arrow keys to navigate between
- focusable items. The KeyNavigation attached property enables this behavior by providing a
- convenient way to specify the item that should gain focus when an arrow or tab key is pressed.
-
- The following example provides key navigation for a 2x2 grid of items:
-
- \snippet doc/src/snippets/declarative/keynavigation.qml 0
-
- The top-left item initially receives focus by setting \l {Item::}{focus} to
- \c true. When an arrow key is pressed, the focus will move to the
- appropriate item, as defined by the value that has been set for
- the KeyNavigation \l left, \l right, \l up or \l down properties.
-
- Note that if a KeyNavigation attached property receives the key press and release
- events for a requested arrow or tab key, the event is accepted and does not
- propagate any further.
-
- By default, KeyNavigation receives key events after the item to which it is attached.
- If the item accepts the key event, the KeyNavigation attached property will not
- receive an event for that key. Setting the \l priority property to
- \c KeyNavigation.BeforeItem allows the event to be used for key navigation
- before the item, rather than after.
-
- If item to which the focus is switching is not enabled or visible, an attempt will
- be made to skip this item and focus on the next. This is possible if there are
- a chain of items with the same KeyNavigation handler. If multiple items in a row are not enabled
- or visible, they will also be skipped.
-
- KeyNavigation will implicitly set the other direction to return focus to this item. So if you set
- \l left to another item, \l right will be set on that item's KeyNavigation to set focus back to this
- item. However, if that item's KeyNavigation has had right explicitly set then no change will occur.
- This means that the above example could have been written, with the same behaviour, without specifing
- KeyNavigation.right or KeyNavigation.down for any of the items.
-
- \sa {Keys}{Keys attached property}
-*/
-
-/*!
- \qmlproperty Item KeyNavigation::left
- \qmlproperty Item KeyNavigation::right
- \qmlproperty Item KeyNavigation::up
- \qmlproperty Item KeyNavigation::down
- \qmlproperty Item KeyNavigation::tab
- \qmlproperty Item KeyNavigation::backtab
-
- These properties hold the item to assign focus to
- when the left, right, up or down cursor keys, or the
- tab key are pressed.
-*/
-
-/*!
- \qmlproperty Item KeyNavigation::tab
- \qmlproperty Item KeyNavigation::backtab
-
- These properties hold the item to assign focus to
- when the Tab key or Shift+Tab key combination (Backtab) are pressed.
-*/
-
-QDeclarativeKeyNavigationAttached::QDeclarativeKeyNavigationAttached(QObject *parent)
-: QObject(*(new QDeclarativeKeyNavigationAttachedPrivate), parent),
- QDeclarativeItemKeyFilter(qobject_cast<QDeclarativeItem*>(parent))
-{
- m_processPost = true;
-}
-
-QDeclarativeKeyNavigationAttached *
-QDeclarativeKeyNavigationAttached::qmlAttachedProperties(QObject *obj)
-{
- return new QDeclarativeKeyNavigationAttached(obj);
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::left() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->left;
-}
-
-void QDeclarativeKeyNavigationAttached::setLeft(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->left == i)
- return;
- d->left = i;
- d->leftSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->rightSet){
- other->d_func()->right = qobject_cast<QDeclarativeItem*>(parent());
- emit other->rightChanged();
- }
- emit leftChanged();
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::right() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->right;
-}
-
-void QDeclarativeKeyNavigationAttached::setRight(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->right == i)
- return;
- d->right = i;
- d->rightSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->leftSet){
- other->d_func()->left = qobject_cast<QDeclarativeItem*>(parent());
- emit other->leftChanged();
- }
- emit rightChanged();
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::up() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->up;
-}
-
-void QDeclarativeKeyNavigationAttached::setUp(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->up == i)
- return;
- d->up = i;
- d->upSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->downSet){
- other->d_func()->down = qobject_cast<QDeclarativeItem*>(parent());
- emit other->downChanged();
- }
- emit upChanged();
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::down() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->down;
-}
-
-void QDeclarativeKeyNavigationAttached::setDown(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->down == i)
- return;
- d->down = i;
- d->downSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->upSet){
- other->d_func()->up = qobject_cast<QDeclarativeItem*>(parent());
- emit other->upChanged();
- }
- emit downChanged();
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::tab() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->tab;
-}
-
-void QDeclarativeKeyNavigationAttached::setTab(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->tab == i)
- return;
- d->tab = i;
- d->tabSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->backtabSet){
- other->d_func()->backtab = qobject_cast<QDeclarativeItem*>(parent());
- emit other->backtabChanged();
- }
- emit tabChanged();
-}
-
-QDeclarativeItem *QDeclarativeKeyNavigationAttached::backtab() const
-{
- Q_D(const QDeclarativeKeyNavigationAttached);
- return d->backtab;
-}
-
-void QDeclarativeKeyNavigationAttached::setBacktab(QDeclarativeItem *i)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- if (d->backtab == i)
- return;
- d->backtab = i;
- d->backtabSet = true;
- QDeclarativeKeyNavigationAttached* other =
- qobject_cast<QDeclarativeKeyNavigationAttached*>(qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(i));
- if(other && !other->d_func()->tabSet){
- other->d_func()->tab = qobject_cast<QDeclarativeItem*>(parent());
- emit other->tabChanged();
- }
- emit backtabChanged();
-}
-
-/*!
- \qmlproperty enumeration KeyNavigation::priority
-
- This property determines whether the keys are processed before
- or after the attached item's own key handling.
-
- \list
- \o KeyNavigation.BeforeItem - process the key events before normal
- item key processing. If the event is used for key navigation, it will be accepted and will not
- be passed on to the item.
- \o KeyNavigation.AfterItem (default) - process the key events after normal item key
- handling. If the item accepts the key event it will not be
- handled by the KeyNavigation attached property handler.
- \endlist
-*/
-QDeclarativeKeyNavigationAttached::Priority QDeclarativeKeyNavigationAttached::priority() const
-{
- return m_processPost ? AfterItem : BeforeItem;
-}
-
-void QDeclarativeKeyNavigationAttached::setPriority(Priority order)
-{
- bool processPost = order == AfterItem;
- if (processPost != m_processPost) {
- m_processPost = processPost;
- emit priorityChanged();
- }
-}
-
-void QDeclarativeKeyNavigationAttached::keyPressed(QKeyEvent *event, bool post)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- event->ignore();
-
- if (post != m_processPost) {
- QDeclarativeItemKeyFilter::keyPressed(event, post);
- return;
- }
-
- bool mirror = false;
- switch(event->key()) {
- case Qt::Key_Left: {
- if (QDeclarativeItem *parentItem = qobject_cast<QDeclarativeItem*>(parent()))
- mirror = QDeclarativeItemPrivate::get(parentItem)->effectiveLayoutMirror;
- QDeclarativeItem* leftItem = mirror ? d->right : d->left;
- if (leftItem) {
- setFocusNavigation(leftItem, mirror ? "right" : "left");
- event->accept();
- }
- break;
- }
- case Qt::Key_Right: {
- if (QDeclarativeItem *parentItem = qobject_cast<QDeclarativeItem*>(parent()))
- mirror = QDeclarativeItemPrivate::get(parentItem)->effectiveLayoutMirror;
- QDeclarativeItem* rightItem = mirror ? d->left : d->right;
- if (rightItem) {
- setFocusNavigation(rightItem, mirror ? "left" : "right");
- event->accept();
- }
- break;
- }
- case Qt::Key_Up:
- if (d->up) {
- setFocusNavigation(d->up, "up");
- event->accept();
- }
- break;
- case Qt::Key_Down:
- if (d->down) {
- setFocusNavigation(d->down, "down");
- event->accept();
- }
- break;
- case Qt::Key_Tab:
- if (d->tab) {
- setFocusNavigation(d->tab, "tab");
- event->accept();
- }
- break;
- case Qt::Key_Backtab:
- if (d->backtab) {
- setFocusNavigation(d->backtab, "backtab");
- event->accept();
- }
- break;
- default:
- break;
- }
-
- if (!event->isAccepted()) QDeclarativeItemKeyFilter::keyPressed(event, post);
-}
-
-void QDeclarativeKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
-{
- Q_D(QDeclarativeKeyNavigationAttached);
- event->ignore();
-
- if (post != m_processPost) {
- QDeclarativeItemKeyFilter::keyReleased(event, post);
- return;
- }
-
- bool mirror = false;
- switch(event->key()) {
- case Qt::Key_Left:
- if (QDeclarativeItem *parentItem = qobject_cast<QDeclarativeItem*>(parent()))
- mirror = QDeclarativeItemPrivate::get(parentItem)->effectiveLayoutMirror;
- if (mirror ? d->right : d->left)
- event->accept();
- break;
- case Qt::Key_Right:
- if (QDeclarativeItem *parentItem = qobject_cast<QDeclarativeItem*>(parent()))
- mirror = QDeclarativeItemPrivate::get(parentItem)->effectiveLayoutMirror;
- if (mirror ? d->left : d->right)
- event->accept();
- break;
- case Qt::Key_Up:
- if (d->up) {
- event->accept();
- }
- break;
- case Qt::Key_Down:
- if (d->down) {
- event->accept();
- }
- break;
- case Qt::Key_Tab:
- if (d->tab) {
- event->accept();
- }
- break;
- case Qt::Key_Backtab:
- if (d->backtab) {
- event->accept();
- }
- break;
- default:
- break;
- }
-
- if (!event->isAccepted()) QDeclarativeItemKeyFilter::keyReleased(event, post);
-}
-
-void QDeclarativeKeyNavigationAttached::setFocusNavigation(QDeclarativeItem *currentItem, const char *dir)
-{
- QDeclarativeItem *initialItem = currentItem;
- bool isNextItem = false;
- do {
- isNextItem = false;
- if (currentItem->isVisible() && currentItem->isEnabled()) {
- currentItem->setFocus(true);
- } else {
- QObject *attached =
- qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(currentItem, false);
- if (attached) {
- QDeclarativeItem *tempItem = qvariant_cast<QDeclarativeItem*>(attached->property(dir));
- if (tempItem) {
- currentItem = tempItem;
- isNextItem = true;
- }
- }
- }
- }
- while (currentItem != initialItem && isNextItem);
-}
-
-/*!
- \qmlclass LayoutMirroring QDeclarativeLayoutMirroringAttached
- \since QtQuick 1.1
- \ingroup qml-utility-elements
- \brief The LayoutMirroring attached property is used to mirror layout behavior.
-
- The LayoutMirroring attached property is used to horizontally mirror \l {anchor-layout}{Item anchors},
- \l{Using QML Positioner and Repeater Items}{positioner} elements (such as \l Row and \l Grid)
- and views (such as \l GridView and horizontal \l ListView). Mirroring is a visual change: left
- anchors become right anchors, and positioner elements like \l Grid and \l Row reverse the
- horizontal layout of child items.
-
- Mirroring is enabled for an item by setting the \l enabled property to true. By default, this
- only affects the item itself; setting the \l childrenInherit property to true propagates the mirroring
- behavior to all child elements as well. If the \c LayoutMirroring attached property has not been defined
- for an item, mirroring is not enabled.
-
- The following example shows mirroring in action. The \l Row below is specified as being anchored
- to the left of its parent. However, since mirroring has been enabled, the anchor is horizontally
- reversed and it is now anchored to the right. Also, since items in a \l Row are positioned
- from left to right by default, they are now positioned from right to left instead, as demonstrated
- by the numbering and opacity of the items:
-
- \snippet doc/src/snippets/declarative/layoutmirroring.qml 0
-
- \image layoutmirroring.png
-
- Layout mirroring is useful when it is necessary to support both left-to-right and right-to-left
- layout versions of an application to target different language areas. The \l childrenInherit
- property allows layout mirroring to be applied without manually setting layout configurations
- for every item in an application. Keep in mind, however, that mirroring does not affect any
- positioning that is defined by the \l Item \l {Item::}{x} coordinate value, so even with
- mirroring enabled, it will often be necessary to apply some layout fixes to support the
- desired layout direction. Also, it may be necessary to disable the mirroring of individual
- child items (by setting \l {enabled}{LayoutMirroring.enabled} to false for such items) if
- mirroring is not the desired behavior, or if the child item already implements mirroring in
- some custom way.
-
- See \l {QML Right-to-left User Interfaces} for further details on using \c LayoutMirroring and
- other related features to implement right-to-left support for an application.
-*/
-
-/*!
- \qmlproperty bool LayoutMirroring::enabled
-
- This property holds whether the item's layout is mirrored horizontally. Setting this to true
- horizontally reverses \l {anchor-layout}{anchor} settings such that left anchors become right,
- and right anchors become left. For \l{Using QML Positioner and Repeater Items}{positioner} elements
- (such as \l Row and \l Grid) and view elements (such as \l {GridView}{GridView} and \l {ListView}{ListView})
- this also mirrors the horizontal layout direction of the item.
-
- The default value is false.
-*/
-
-/*!
- \qmlproperty bool LayoutMirroring::childrenInherit
-
- This property holds whether the \l {enabled}{LayoutMirroring.enabled} value for this item
- is inherited by its children.
-
- The default value is false.
-*/
-
-QDeclarativeLayoutMirroringAttached::QDeclarativeLayoutMirroringAttached(QObject *parent) : QObject(parent), itemPrivate(0)
-{
- if (QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent)) {
- itemPrivate = QDeclarativeItemPrivate::get(item);
- itemPrivate->attachedLayoutDirection = this;
- } else
- qmlInfo(parent) << tr("LayoutDirection attached property only works with Items");
-}
-
-QDeclarativeLayoutMirroringAttached * QDeclarativeLayoutMirroringAttached::qmlAttachedProperties(QObject *object)
-{
- return new QDeclarativeLayoutMirroringAttached(object);
-}
-
-bool QDeclarativeLayoutMirroringAttached::enabled() const
-{
- return itemPrivate ? itemPrivate->effectiveLayoutMirror : false;
-}
-
-void QDeclarativeLayoutMirroringAttached::setEnabled(bool enabled)
-{
- if (!itemPrivate)
- return;
-
- itemPrivate->isMirrorImplicit = false;
- if (enabled != itemPrivate->effectiveLayoutMirror) {
- itemPrivate->setLayoutMirror(enabled);
- if (itemPrivate->inheritMirrorFromItem)
- itemPrivate->resolveLayoutMirror();
- }
-}
-
-void QDeclarativeLayoutMirroringAttached::resetEnabled()
-{
- if (itemPrivate && !itemPrivate->isMirrorImplicit) {
- itemPrivate->isMirrorImplicit = true;
- itemPrivate->resolveLayoutMirror();
- }
-}
-
-bool QDeclarativeLayoutMirroringAttached::childrenInherit() const
-{
- return itemPrivate ? itemPrivate->inheritMirrorFromItem : false;
-}
-
-void QDeclarativeLayoutMirroringAttached::setChildrenInherit(bool childrenInherit) {
- if (itemPrivate && childrenInherit != itemPrivate->inheritMirrorFromItem) {
- itemPrivate->inheritMirrorFromItem = childrenInherit;
- itemPrivate->resolveLayoutMirror();
- childrenInheritChanged();
- }
-}
-
-void QDeclarativeItemPrivate::resolveLayoutMirror()
-{
- Q_Q(QDeclarativeItem);
- if (QDeclarativeItem *parentItem = q->parentItem()) {
- QDeclarativeItemPrivate *parentPrivate = QDeclarativeItemPrivate::get(parentItem);
- setImplicitLayoutMirror(parentPrivate->inheritedLayoutMirror, parentPrivate->inheritMirrorFromParent);
- } else {
- setImplicitLayoutMirror(isMirrorImplicit ? false : effectiveLayoutMirror, inheritMirrorFromItem);
- }
-}
-
-void QDeclarativeItemPrivate::setImplicitLayoutMirror(bool mirror, bool inherit)
-{
- inherit = inherit || inheritMirrorFromItem;
- if (!isMirrorImplicit && inheritMirrorFromItem)
- mirror = effectiveLayoutMirror;
- if (mirror == inheritedLayoutMirror && inherit == inheritMirrorFromParent)
- return;
-
- inheritMirrorFromParent = inherit;
- inheritedLayoutMirror = inheritMirrorFromParent ? mirror : false;
-
- if (isMirrorImplicit)
- setLayoutMirror(inherit ? inheritedLayoutMirror : false);
- for (int i = 0; i < children.count(); ++i) {
- if (QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i))) {
- QDeclarativeItemPrivate *childPrivate = QDeclarativeItemPrivate::get(child);
- childPrivate->setImplicitLayoutMirror(inheritedLayoutMirror, inheritMirrorFromParent);
- }
- }
-}
-
-void QDeclarativeItemPrivate::setLayoutMirror(bool mirror)
-{
- if (mirror != effectiveLayoutMirror) {
- effectiveLayoutMirror = mirror;
- if (_anchors) {
- _anchors->d_func()->fillChanged();
- _anchors->d_func()->centerInChanged();
- _anchors->d_func()->updateHorizontalAnchors();
- emit _anchors->mirroredChanged();
- }
- mirrorChange();
- if (attachedLayoutDirection) {
- emit attachedLayoutDirection->enabledChanged();
- }
- }
-}
-
-/*!
- \qmlclass Keys QDeclarativeKeysAttached
- \ingroup qml-basic-interaction-elements
- \since 4.7
- \brief The Keys attached property provides key handling to Items.
-
- All visual primitives support key handling via the Keys
- attached property. Keys can be handled via the onPressed
- and onReleased signal properties.
-
- The signal properties have a \l KeyEvent parameter, named
- \e event which contains details of the event. If a key is
- handled \e event.accepted should be set to true to prevent the
- event from propagating up the item hierarchy.
-
- \section1 Example Usage
-
- The following example shows how the general onPressed handler can
- be used to test for a certain key; in this case, the left cursor
- key:
-
- \snippet doc/src/snippets/declarative/keys/keys-pressed.qml key item
-
- Some keys may alternatively be handled via specific signal properties,
- for example \e onSelectPressed. These handlers automatically set
- \e event.accepted to true.
-
- \snippet doc/src/snippets/declarative/keys/keys-handler.qml key item
-
- See \l{Qt::Key}{Qt.Key} for the list of keyboard codes.
-
- \section1 Key Handling Priorities
-
- The Keys attached property can be configured to handle key events
- before or after the item it is attached to. This makes it possible
- to intercept events in order to override an item's default behavior,
- or act as a fallback for keys not handled by the item.
-
- If \l priority is Keys.BeforeItem (default) the order of key event processing is:
-
- \list 1
- \o Items specified in \c forwardTo
- \o specific key handlers, e.g. onReturnPressed
- \o onKeyPress, onKeyRelease handlers
- \o Item specific key handling, e.g. TextInput key handling
- \o parent item
- \endlist
-
- If priority is Keys.AfterItem the order of key event processing is:
-
- \list 1
- \o Item specific key handling, e.g. TextInput key handling
- \o Items specified in \c forwardTo
- \o specific key handlers, e.g. onReturnPressed
- \o onKeyPress, onKeyRelease handlers
- \o parent item
- \endlist
-
- If the event is accepted during any of the above steps, key
- propagation stops.
-
- \sa KeyEvent, {KeyNavigation}{KeyNavigation attached property}
-*/
-
-/*!
- \qmlproperty bool Keys::enabled
-
- This flags enables key handling if true (default); otherwise
- no key handlers will be called.
-*/
-
-/*!
- \qmlproperty enumeration Keys::priority
-
- This property determines whether the keys are processed before
- or after the attached item's own key handling.
-
- \list
- \o Keys.BeforeItem (default) - process the key events before normal
- item key processing. If the event is accepted it will not
- be passed on to the item.
- \o Keys.AfterItem - process the key events after normal item key
- handling. If the item accepts the key event it will not be
- handled by the Keys attached property handler.
- \endlist
-*/
-
-/*!
- \qmlproperty list<Object> Keys::forwardTo
-
- This property 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). Once an item that has been
- forwarded keys accepts the event it is no longer forwarded to items later in the
- list.
-
- This example forwards key events to two lists:
- \qml
- Item {
- ListView {
- id: list1
- // ...
- }
- ListView {
- id: list2
- // ...
- }
- Keys.forwardTo: [list1, list2]
- focus: true
- }
- \endqml
-*/
-
-/*!
- \qmlsignal Keys::onPressed(KeyEvent event)
-
- This handler is called when a key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onReleased(KeyEvent event)
-
- This handler is called when a key has been released. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit0Pressed(KeyEvent event)
-
- This handler is called when the digit '0' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit1Pressed(KeyEvent event)
-
- This handler is called when the digit '1' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit2Pressed(KeyEvent event)
-
- This handler is called when the digit '2' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit3Pressed(KeyEvent event)
-
- This handler is called when the digit '3' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit4Pressed(KeyEvent event)
-
- This handler is called when the digit '4' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit5Pressed(KeyEvent event)
-
- This handler is called when the digit '5' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit6Pressed(KeyEvent event)
-
- This handler is called when the digit '6' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit7Pressed(KeyEvent event)
-
- This handler is called when the digit '7' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit8Pressed(KeyEvent event)
-
- This handler is called when the digit '8' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDigit9Pressed(KeyEvent event)
-
- This handler is called when the digit '9' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onLeftPressed(KeyEvent event)
-
- This handler is called when the Left arrow has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onRightPressed(KeyEvent event)
-
- This handler is called when the Right arrow has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onUpPressed(KeyEvent event)
-
- This handler is called when the Up arrow has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDownPressed(KeyEvent event)
-
- This handler is called when the Down arrow has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onTabPressed(KeyEvent event)
-
- This handler is called when the Tab key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onBacktabPressed(KeyEvent event)
-
- This handler is called when the Shift+Tab key combination (Backtab) has
- been pressed. The \a event parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onAsteriskPressed(KeyEvent event)
-
- This handler is called when the Asterisk '*' has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onEscapePressed(KeyEvent event)
-
- This handler is called when the Escape key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onReturnPressed(KeyEvent event)
-
- This handler is called when the Return key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onEnterPressed(KeyEvent event)
-
- This handler is called when the Enter key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onDeletePressed(KeyEvent event)
-
- This handler is called when the Delete key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onSpacePressed(KeyEvent event)
-
- This handler is called when the Space key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onBackPressed(KeyEvent event)
-
- This handler is called when the Back key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onCancelPressed(KeyEvent event)
-
- This handler is called when the Cancel key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onSelectPressed(KeyEvent event)
-
- This handler is called when the Select key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onYesPressed(KeyEvent event)
-
- This handler is called when the Yes key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onNoPressed(KeyEvent event)
-
- This handler is called when the No key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onContext1Pressed(KeyEvent event)
-
- This handler is called when the Context1 key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onContext2Pressed(KeyEvent event)
-
- This handler is called when the Context2 key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onContext3Pressed(KeyEvent event)
-
- This handler is called when the Context3 key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onContext4Pressed(KeyEvent event)
-
- This handler is called when the Context4 key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onCallPressed(KeyEvent event)
-
- This handler is called when the Call key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onHangupPressed(KeyEvent event)
-
- This handler is called when the Hangup key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onFlipPressed(KeyEvent event)
-
- This handler is called when the Flip key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onMenuPressed(KeyEvent event)
-
- This handler is called when the Menu key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onVolumeUpPressed(KeyEvent event)
-
- This handler is called when the VolumeUp key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-/*!
- \qmlsignal Keys::onVolumeDownPressed(KeyEvent event)
-
- This handler is called when the VolumeDown key has been pressed. The \a event
- parameter provides information about the event.
-*/
-
-const QDeclarativeKeysAttached::SigMap QDeclarativeKeysAttached::sigMap[] = {
- { Qt::Key_Left, "leftPressed" },
- { Qt::Key_Right, "rightPressed" },
- { Qt::Key_Up, "upPressed" },
- { Qt::Key_Down, "downPressed" },
- { Qt::Key_Tab, "tabPressed" },
- { Qt::Key_Backtab, "backtabPressed" },
- { Qt::Key_Asterisk, "asteriskPressed" },
- { Qt::Key_NumberSign, "numberSignPressed" },
- { Qt::Key_Escape, "escapePressed" },
- { Qt::Key_Return, "returnPressed" },
- { Qt::Key_Enter, "enterPressed" },
- { Qt::Key_Delete, "deletePressed" },
- { Qt::Key_Space, "spacePressed" },
- { Qt::Key_Back, "backPressed" },
- { Qt::Key_Cancel, "cancelPressed" },
- { Qt::Key_Select, "selectPressed" },
- { Qt::Key_Yes, "yesPressed" },
- { Qt::Key_No, "noPressed" },
- { Qt::Key_Context1, "context1Pressed" },
- { Qt::Key_Context2, "context2Pressed" },
- { Qt::Key_Context3, "context3Pressed" },
- { Qt::Key_Context4, "context4Pressed" },
- { Qt::Key_Call, "callPressed" },
- { Qt::Key_Hangup, "hangupPressed" },
- { Qt::Key_Flip, "flipPressed" },
- { Qt::Key_Menu, "menuPressed" },
- { Qt::Key_VolumeUp, "volumeUpPressed" },
- { Qt::Key_VolumeDown, "volumeDownPressed" },
- { 0, 0 }
-};
-
-bool QDeclarativeKeysAttachedPrivate::isConnected(const char *signalName)
-{
- return isSignalConnected(signalIndex(signalName));
-}
-
-QDeclarativeKeysAttached::QDeclarativeKeysAttached(QObject *parent)
-: QObject(*(new QDeclarativeKeysAttachedPrivate), parent),
- QDeclarativeItemKeyFilter(qobject_cast<QDeclarativeItem*>(parent))
-{
- Q_D(QDeclarativeKeysAttached);
- m_processPost = false;
- d->item = qobject_cast<QDeclarativeItem*>(parent);
-}
-
-QDeclarativeKeysAttached::~QDeclarativeKeysAttached()
-{
-}
-
-QDeclarativeKeysAttached::Priority QDeclarativeKeysAttached::priority() const
-{
- return m_processPost ? AfterItem : BeforeItem;
-}
-
-void QDeclarativeKeysAttached::setPriority(Priority order)
-{
- bool processPost = order == AfterItem;
- if (processPost != m_processPost) {
- m_processPost = processPost;
- emit priorityChanged();
- }
-}
-
-void QDeclarativeKeysAttached::componentComplete()
-{
- Q_D(QDeclarativeKeysAttached);
- if (d->item) {
- for (int ii = 0; ii < d->targets.count(); ++ii) {
- QGraphicsItem *targetItem = d->finalFocusProxy(d->targets.at(ii));
- if (targetItem && (targetItem->flags() & QGraphicsItem::ItemAcceptsInputMethod)) {
- d->item->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
- break;
- }
- }
- }
-}
-
-void QDeclarativeKeysAttached::keyPressed(QKeyEvent *event, bool post)
-{
- Q_D(QDeclarativeKeysAttached);
- if (post != m_processPost || !d->enabled || d->inPress) {
- event->ignore();
- QDeclarativeItemKeyFilter::keyPressed(event, post);
- return;
- }
-
- // first process forwards
- if (d->item && d->item->scene()) {
- d->inPress = true;
- for (int ii = 0; ii < d->targets.count(); ++ii) {
- QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
- if (i && i->isVisible()) {
- d->item->scene()->sendEvent(i, event);
- if (event->isAccepted()) {
- d->inPress = false;
- return;
- }
- }
- }
- d->inPress = false;
- }
-
- QDeclarativeKeyEvent ke(*event);
- QByteArray keySignal = keyToSignal(event->key());
- if (!keySignal.isEmpty()) {
- keySignal += "(QDeclarativeKeyEvent*)";
- if (d->isConnected(keySignal)) {
- // If we specifically handle a key then default to accepted
- ke.setAccepted(true);
- int idx = QDeclarativeKeysAttached::staticMetaObject.indexOfSignal(keySignal);
- metaObject()->method(idx).invoke(this, Qt::DirectConnection, Q_ARG(QDeclarativeKeyEvent*, &ke));
- }
- }
- if (!ke.isAccepted())
- emit pressed(&ke);
- event->setAccepted(ke.isAccepted());
-
- if (!event->isAccepted()) QDeclarativeItemKeyFilter::keyPressed(event, post);
-}
-
-void QDeclarativeKeysAttached::keyReleased(QKeyEvent *event, bool post)
-{
- Q_D(QDeclarativeKeysAttached);
- if (post != m_processPost || !d->enabled || d->inRelease) {
- event->ignore();
- QDeclarativeItemKeyFilter::keyReleased(event, post);
- return;
- }
-
- if (d->item && d->item->scene()) {
- d->inRelease = true;
- for (int ii = 0; ii < d->targets.count(); ++ii) {
- QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
- if (i && i->isVisible()) {
- d->item->scene()->sendEvent(i, event);
- if (event->isAccepted()) {
- d->inRelease = false;
- return;
- }
- }
- }
- d->inRelease = false;
- }
-
- QDeclarativeKeyEvent ke(*event);
- emit released(&ke);
- event->setAccepted(ke.isAccepted());
-
- if (!event->isAccepted()) QDeclarativeItemKeyFilter::keyReleased(event, post);
-}
-
-void QDeclarativeKeysAttached::inputMethodEvent(QInputMethodEvent *event, bool post)
-{
- Q_D(QDeclarativeKeysAttached);
- if (post == m_processPost && d->item && !d->inIM && d->item->scene()) {
- d->inIM = true;
- for (int ii = 0; ii < d->targets.count(); ++ii) {
- QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
- if (i && i->isVisible() && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod)) {
- d->item->scene()->sendEvent(i, event);
- if (event->isAccepted()) {
- d->imeItem = i;
- d->inIM = false;
- return;
- }
- }
- }
- d->inIM = false;
- }
- if (!event->isAccepted()) QDeclarativeItemKeyFilter::inputMethodEvent(event, post);
-}
-
-class QDeclarativeItemAccessor : public QGraphicsItem
-{
-public:
- QVariant doInputMethodQuery(Qt::InputMethodQuery query) const {
- return QGraphicsItem::inputMethodQuery(query);
- }
-};
-
-QVariant QDeclarativeKeysAttached::inputMethodQuery(Qt::InputMethodQuery query) const
-{
- Q_D(const QDeclarativeKeysAttached);
- if (d->item) {
- for (int ii = 0; ii < d->targets.count(); ++ii) {
- QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
- if (i && i->isVisible() && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod) && i == d->imeItem) { //### how robust is i == d->imeItem check?
- QVariant v = static_cast<QDeclarativeItemAccessor *>(i)->doInputMethodQuery(query);
- if (v.userType() == QVariant::RectF)
- v = d->item->mapRectFromItem(i, v.toRectF()); //### cost?
- return v;
- }
- }
- }
- return QDeclarativeItemKeyFilter::inputMethodQuery(query);
-}
-
-QDeclarativeKeysAttached *QDeclarativeKeysAttached::qmlAttachedProperties(QObject *obj)
-{
- return new QDeclarativeKeysAttached(obj);
-}
-
-/*!
- \class QDeclarativeItem
- \since 4.7
- \brief The QDeclarativeItem class provides the most basic of all visual items in QML.
-
- All visual items in Qt Declarative inherit from QDeclarativeItem. Although QDeclarativeItem
- has no visual appearance, it defines all the properties that are
- common across visual items - such as the x and y position, the
- width and height, \l {anchor-layout}{anchoring} and key handling.
-
- You can subclass QDeclarativeItem to provide your own custom visual item that inherits
- these features. Note that, because it does not draw anything, QDeclarativeItem sets the
- QGraphicsItem::ItemHasNoContents flag. If you subclass QDeclarativeItem to create a visual
- item, you will need to unset this flag.
-
-*/
-
-/*!
- \qmlclass Item QDeclarativeItem
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The Item is the most basic of all visual items in QML.
-
- All visual items in Qt Declarative inherit from Item. Although Item
- has no visual appearance, it defines all the properties that are
- common across visual items - such as the x and y position, the
- width and height, \l {anchor-layout}{anchoring} and key handling.
-
- Item is also useful for grouping items together.
-
- \qml
- Item {
- Image {
- source: "tile.png"
- }
- Image {
- x: 80
- width: 100
- height: 100
- source: "tile.png"
- }
- Image {
- x: 190
- width: 100
- height: 100
- fillMode: Image.Tile
- source: "tile.png"
- }
- }
- \endqml
-
-
- \section1 Key Handling
-
- Key handling is available to all Item-based visual elements via the \l {Keys}{Keys}
- attached property. The \e Keys attached property provides basic handlers such
- as \l {Keys::onPressed}{onPressed} and \l {Keys::onReleased}{onReleased},
- as well as handlers for specific keys, such as
- \l {Keys::onCancelPressed}{onCancelPressed}. The example below
- assigns \l {qmlfocus}{focus} to the item and handles
- the Left key via the general \e onPressed handler and the Select key via the
- onSelectPressed handler:
-
- \qml
- Item {
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_Left) {
- console.log("move left");
- event.accepted = true;
- }
- }
- Keys.onSelectPressed: console.log("Selected");
- }
- \endqml
-
- See the \l {Keys}{Keys} attached property for detailed documentation.
-
- \section1 Layout Mirroring
-
- Item layouts can be mirrored using the \l {LayoutMirroring}{LayoutMirroring} attached property.
-
-*/
-
-/*!
- \fn void QDeclarativeItem::childrenRectChanged(const QRectF &)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::baselineOffsetChanged(qreal)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::stateChanged(const QString &state)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::parentChanged(QDeclarativeItem *)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::smoothChanged(bool)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::clipChanged(bool)
- \internal
-*/
-
-/*! \fn void QDeclarativeItem::transformOriginChanged(TransformOrigin)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::focusChanged(bool)
- \internal
-*/
-
-/*!
- \fn void QDeclarativeItem::activeFocusChanged(bool)
- \internal
-*/
-
-// ### Must fix
-struct RegisterAnchorLineAtStartup {
- RegisterAnchorLineAtStartup() {
- qRegisterMetaType<QDeclarativeAnchorLine>("QDeclarativeAnchorLine");
- }
-};
-static RegisterAnchorLineAtStartup registerAnchorLineAtStartup;
-
-
-/*!
- \fn QDeclarativeItem::QDeclarativeItem(QDeclarativeItem *parent)
-
- Constructs a QDeclarativeItem with the given \a parent.
-*/
-QDeclarativeItem::QDeclarativeItem(QDeclarativeItem* parent)
- : QGraphicsObject(*(new QDeclarativeItemPrivate), parent, 0)
-{
- Q_D(QDeclarativeItem);
- d->init(parent);
-}
-
-/*! \internal
-*/
-QDeclarativeItem::QDeclarativeItem(QDeclarativeItemPrivate &dd, QDeclarativeItem *parent)
- : QGraphicsObject(dd, parent, 0)
-{
- Q_D(QDeclarativeItem);
- d->init(parent);
-}
-
-/*!
- Destroys the QDeclarativeItem.
-*/
-QDeclarativeItem::~QDeclarativeItem()
-{
- Q_D(QDeclarativeItem);
- for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
- QDeclarativeAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate();
- if (anchor)
- anchor->clearItem(this);
- }
- if (!d->parent || (parentItem() && !parentItem()->QGraphicsItem::d_ptr->inDestructor)) {
- for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
- QDeclarativeAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate();
- if (anchor && anchor->item && anchor->item->parentItem() != this) //child will be deleted anyway
- anchor->updateOnComplete();
- }
- }
- for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::Destroyed)
- change.listener->itemDestroyed(this);
- }
- d->changeListeners.clear();
- delete d->_anchorLines; d->_anchorLines = 0;
- delete d->_anchors; d->_anchors = 0;
- delete d->_stateGroup; d->_stateGroup = 0;
- delete d->_contents; d->_contents = 0;
-}
-
-/*!
- \qmlproperty enumeration Item::transformOrigin
- This property holds the origin point around which scale and rotation transform.
-
- Nine transform origins are available, as shown in the image below.
-
- \image declarative-transformorigin.png
-
- This example rotates an image around its bottom-right corner.
- \qml
- Image {
- source: "myimage.png"
- transformOrigin: Item.BottomRight
- rotation: 45
- }
- \endqml
-
- The default transform origin is \c Item.Center.
-
- To set an arbitrary transform origin point use the \l Scale or \l Rotation
- transform elements.
-*/
-
-/*!
- \qmlproperty Item Item::parent
- This property holds the parent of the item.
-*/
-
-/*!
- \property QDeclarativeItem::parent
- This property holds the parent of the item.
-*/
-void QDeclarativeItem::setParentItem(QDeclarativeItem *parent)
-{
- QGraphicsObject::setParentItem(parent);
-}
-
-/*!
- Returns the QDeclarativeItem parent of this item.
-*/
-QDeclarativeItem *QDeclarativeItem::parentItem() const
-{
- return qobject_cast<QDeclarativeItem *>(QGraphicsObject::parentItem());
-}
-
-/*!
- \qmlproperty real Item::childrenRect.x
- \qmlproperty real Item::childrenRect.y
- \qmlproperty real Item::childrenRect.width
- \qmlproperty real Item::childrenRect.height
-
- The childrenRect properties allow an item access to the geometry of its
- children. This property is useful if you have an item that needs to be
- sized to fit its children.
-*/
-
-
-/*!
- \qmlproperty list<Item> Item::children
- \qmlproperty list<Object> Item::resources
-
- The children property contains the list of visual children of this item.
- The resources property contains non-visual resources that you want to
- reference by name.
-
- Generally you can rely on Item's default property to handle all this for
- you, but it can come in handy in some cases.
-
- \qml
- Item {
- children: [
- Text {},
- Rectangle {}
- ]
- resources: [
- Component {
- id: myComponent
- Text {}
- }
- ]
- }
- \endqml
-*/
-
-/*!
- Returns true if construction of the QML component is complete; otherwise
- returns false.
-
- It is often desirable to delay some processing until the component is
- completed.
-
- \sa componentComplete()
-*/
-bool QDeclarativeItem::isComponentComplete() const
-{
- Q_D(const QDeclarativeItem);
- return d->componentComplete;
-}
-
-void QDeclarativeItemPrivate::data_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
-{
- if (!o)
- return;
-
- QDeclarativeItem *that = static_cast<QDeclarativeItem *>(prop->object);
-
- // This test is measurably (albeit only slightly) faster than qobject_cast<>()
- const QMetaObject *mo = o->metaObject();
- while (mo && mo != &QGraphicsObject::staticMetaObject) mo = mo->d.superdata;
-
- if (mo) {
- QGraphicsObject *graphicsObject = static_cast<QGraphicsObject *>(o);
- QDeclarativeItemPrivate *contentItemPrivate = static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(graphicsObject));
- if (contentItemPrivate->componentComplete) {
- graphicsObject->setParentItem(that);
- } else {
- contentItemPrivate->setParentItemHelper(that, /*newParentVariant=*/0, /*thisPointerVariant=*/0);
- }
- } else {
- o->setParent(that);
- }
-}
-
-static inline int children_count_helper(QDeclarativeListProperty<QObject> *prop)
-{
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(prop->object));
- return d->children.count();
-}
-
-static inline QObject *children_at_helper(QDeclarativeListProperty<QObject> *prop, int index)
-{
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(prop->object));
- if (index >= 0 && index < d->children.count())
- return d->children.at(index)->toGraphicsObject();
- else
- return 0;
-}
-
-static inline void children_clear_helper(QDeclarativeListProperty<QObject> *prop)
-{
- QDeclarativeItemPrivate *d = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(static_cast<QGraphicsObject *>(prop->object)));
- int childCount = d->children.count();
- if (d->componentComplete) {
- for (int index = 0 ;index < childCount; index++)
- d->children.at(0)->setParentItem(0);
- } else {
- for (int index = 0 ;index < childCount; index++)
- QGraphicsItemPrivate::get(d->children.at(0))->setParentItemHelper(0, /*newParentVariant=*/0, /*thisPointerVariant=*/0);
- }
-}
-
-int QDeclarativeItemPrivate::data_count(QDeclarativeListProperty<QObject> *prop)
-{
- return resources_count(prop) + children_count_helper(prop);
-}
-
-QObject *QDeclarativeItemPrivate::data_at(QDeclarativeListProperty<QObject> *prop, int i)
-{
- int resourcesCount = resources_count(prop);
- if (i < resourcesCount)
- return resources_at(prop, i);
- const int j = i - resourcesCount;
- if (j < children_count_helper(prop))
- return children_at_helper(prop, j);
- return 0;
-}
-
-void QDeclarativeItemPrivate::data_clear(QDeclarativeListProperty<QObject> *prop)
-{
- resources_clear(prop);
- children_clear_helper(prop);
-}
-
-QObject *QDeclarativeItemPrivate::resources_at(QDeclarativeListProperty<QObject> *prop, int index)
-{
- const QObjectList children = prop->object->children();
- if (index < children.count())
- return children.at(index);
- else
- return 0;
-}
-
-void QDeclarativeItemPrivate::resources_append(QDeclarativeListProperty<QObject> *prop, QObject *o)
-{
- o->setParent(prop->object);
-}
-
-int QDeclarativeItemPrivate::resources_count(QDeclarativeListProperty<QObject> *prop)
-{
- return prop->object->children().count();
-}
-
-void QDeclarativeItemPrivate::resources_clear(QDeclarativeListProperty<QObject> *prop)
-{
- const QObjectList children = prop->object->children();
- for (int index = 0; index < children.count(); index++)
- children.at(index)->setParent(0);
-}
-
-int QDeclarativeItemPrivate::transform_count(QDeclarativeListProperty<QGraphicsTransform> *list)
-{
- QGraphicsObject *object = qobject_cast<QGraphicsObject *>(list->object);
- if (object) {
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(object);
- return d->transformData ? d->transformData->graphicsTransforms.size() : 0;
- } else {
- return 0;
- }
-}
-
-void QDeclarativeItemPrivate::transform_append(QDeclarativeListProperty<QGraphicsTransform> *list, QGraphicsTransform *item)
-{
- QGraphicsObject *object = qobject_cast<QGraphicsObject *>(list->object);
- if (object && item) // QGraphicsItem applies the list in the wrong order, so we prepend.
- QGraphicsItemPrivate::get(object)->prependGraphicsTransform(item);
-}
-
-QGraphicsTransform *QDeclarativeItemPrivate::transform_at(QDeclarativeListProperty<QGraphicsTransform> *list, int idx)
-{
- QGraphicsObject *object = qobject_cast<QGraphicsObject *>(list->object);
- if (object) {
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(object);
- if (!d->transformData)
- return 0;
- return d->transformData->graphicsTransforms.at(idx);
- } else {
- return 0;
- }
-}
-
-void QDeclarativeItemPrivate::transform_clear(QDeclarativeListProperty<QGraphicsTransform> *list)
-{
- QGraphicsObject *object = qobject_cast<QGraphicsObject *>(list->object);
- if (object) {
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(object);
- if (!d->transformData)
- return;
- object->setTransformations(QList<QGraphicsTransform *>());
- }
-}
-
-void QDeclarativeItemPrivate::parentProperty(QObject *o, void *rv, QDeclarativeNotifierEndpoint *e)
-{
- QDeclarativeItem *item = static_cast<QDeclarativeItem*>(o);
- if (e)
- e->connect(&item->d_func()->parentNotifier);
- *((QDeclarativeItem **)rv) = item->parentItem();
-}
-
-/*!
- \qmlproperty list<Object> Item::data
- \default
-
- The data property allows you to freely mix visual children and resources
- in an item. If you assign a visual item to the data list it becomes
- a child and if you assign any other object type, it is added as a resource.
-
- So you can write:
- \qml
- Item {
- Text {}
- Rectangle {}
- Timer {}
- }
- \endqml
-
- instead of:
- \qml
- Item {
- children: [
- Text {},
- Rectangle {}
- ]
- resources: [
- Timer {}
- ]
- }
- \endqml
-
- data is a behind-the-scenes property: you should never need to explicitly
- specify it.
- */
-
-QDeclarativeListProperty<QObject> QDeclarativeItemPrivate::data()
-{
- return QDeclarativeListProperty<QObject>(q_func(), 0, QDeclarativeItemPrivate::data_append,
- QDeclarativeItemPrivate::data_count,
- QDeclarativeItemPrivate::data_at,
- QDeclarativeItemPrivate::data_clear
- );
-}
-
-/*!
- \property QDeclarativeItem::childrenRect
- \brief The geometry of an item's children.
-
- This property holds the (collective) position and size of the item's children.
-*/
-QRectF QDeclarativeItem::childrenRect()
-{
- Q_D(QDeclarativeItem);
- if (!d->_contents) {
- d->_contents = new QDeclarativeContents(this);
- if (d->componentComplete)
- d->_contents->complete();
- }
- return d->_contents->rectF();
-}
-
-bool QDeclarativeItem::clip() const
-{
- return flags() & ItemClipsChildrenToShape;
-}
-
-void QDeclarativeItem::setClip(bool c)
-{
- if (clip() == c)
- return;
- setFlag(ItemClipsChildrenToShape, c);
- emit clipChanged(c);
-}
-
-/*!
- \qmlproperty real Item::x
- \qmlproperty real Item::y
- \qmlproperty real Item::width
- \qmlproperty real Item::height
-
- Defines the item's position and size relative to its parent.
-
- \qml
- Item { x: 100; y: 100; width: 100; height: 100 }
- \endqml
- */
-
-/*!
- \qmlproperty real Item::z
-
- Sets the stacking order of sibling items. By default the stacking order is 0.
-
- Items with a higher stacking value are drawn on top of siblings with a
- lower stacking order. Items with the same stacking value are drawn
- bottom up in the order they appear. Items with a negative stacking
- value are drawn under their parent's content.
-
- The following example shows the various effects of stacking order.
-
- \table
- \row
- \o \image declarative-item_stacking1.png
- \o Same \c z - later children above earlier children:
- \qml
- Item {
- Rectangle {
- color: "red"
- width: 100; height: 100
- }
- Rectangle {
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- \endqml
- \row
- \o \image declarative-item_stacking2.png
- \o Higher \c z on top:
- \qml
- Item {
- Rectangle {
- z: 1
- color: "red"
- width: 100; height: 100
- }
- Rectangle {
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- \endqml
- \row
- \o \image declarative-item_stacking3.png
- \o Same \c z - children above parents:
- \qml
- Item {
- Rectangle {
- color: "red"
- width: 100; height: 100
- Rectangle {
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- }
- \endqml
- \row
- \o \image declarative-item_stacking4.png
- \o Lower \c z below:
- \qml
- Item {
- Rectangle {
- color: "red"
- width: 100; height: 100
- Rectangle {
- z: -1
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- }
- \endqml
- \endtable
- */
-
-/*!
- \qmlproperty bool Item::visible
-
- This property holds whether the item is visible. By default this is true.
-
- Setting this property directly affects the \c visible value of child
- items. When set to \c false, the \c visible values of all child items also
- become \c false. When set to \c true, the \c visible values of child items
- are returned to \c true, unless they have explicitly been set to \c false.
-
- (Because of this flow-on behavior, using the \c visible property may not
- have the intended effect if a property binding should only respond to
- explicit property changes. In such cases it may be better to use the
- \l opacity property instead.)
-
- Setting this property to \c false automatically causes \l focus to be set
- to \c false, and this item will longer receive mouse and keyboard events.
- (In contrast, setting the \l opacity to 0 does not affect the \l focus
- property and the receiving of key events.)
-
- \note This property's value is only affected by changes to this property or
- the parent's \c visible property. It does not change, for example, if this
- item moves off-screen, or if the \l opacity changes to 0.
-*/
-
-
-/*!
- This function is called to handle this item's changes in
- geometry from \a oldGeometry to \a newGeometry. If the two
- geometries are the same, it doesn't do anything.
- */
-void QDeclarativeItem::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeItem);
-
- if (d->_anchors)
- d->_anchors->d_func()->updateMe();
-
- if (transformOrigin() != QDeclarativeItem::TopLeft
- && (newGeometry.width() != oldGeometry.width() || newGeometry.height() != oldGeometry.height())) {
- if (d->transformData) {
- QPointF origin = d->computeTransformOrigin();
- if (transformOriginPoint() != origin)
- setTransformOriginPoint(origin);
- } else {
- d->transformOriginDirty = true;
- }
- }
-
- for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::Geometry)
- change.listener->itemGeometryChanged(this, newGeometry, oldGeometry);
- }
-
- if (newGeometry.width() != oldGeometry.width())
- emit widthChanged();
- if (newGeometry.height() != oldGeometry.height())
- emit heightChanged();
-}
-
-void QDeclarativeItemPrivate::removeItemChangeListener(QDeclarativeItemChangeListener *listener, ChangeTypes types)
-{
- ChangeListener change(listener, types);
- changeListeners.removeOne(change);
-}
-
-/*! \internal */
-void QDeclarativeItem::keyPressEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeItem);
- keyPressPreHandler(event);
- if (event->isAccepted())
- return;
- if (d->keyHandler)
- d->keyHandler->keyPressed(event, true);
- else
- event->ignore();
-}
-
-/*! \internal */
-void QDeclarativeItem::keyReleaseEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeItem);
- keyReleasePreHandler(event);
- if (event->isAccepted())
- return;
- if (d->keyHandler)
- d->keyHandler->keyReleased(event, true);
- else
- event->ignore();
-}
-
-/*! \internal */
-void QDeclarativeItem::inputMethodEvent(QInputMethodEvent *event)
-{
- Q_D(QDeclarativeItem);
- inputMethodPreHandler(event);
- if (event->isAccepted())
- return;
- if (d->keyHandler)
- d->keyHandler->inputMethodEvent(event, true);
- else
- event->ignore();
-}
-
-/*! \internal */
-QVariant QDeclarativeItem::inputMethodQuery(Qt::InputMethodQuery query) const
-{
- Q_D(const QDeclarativeItem);
- QVariant v;
- if (d->keyHandler)
- v = d->keyHandler->inputMethodQuery(query);
-
- if (!v.isValid())
- v = QGraphicsObject::inputMethodQuery(query);
-
- return v;
-}
-
-/*!
- \internal
- */
-void QDeclarativeItem::keyPressPreHandler(QKeyEvent *event)
-{
- Q_D(QDeclarativeItem);
- if (d->keyHandler && !d->doneEventPreHandler)
- d->keyHandler->keyPressed(event, false);
- else
- event->ignore();
- d->doneEventPreHandler = true;
-}
-
-/*!
- \internal
- */
-void QDeclarativeItem::keyReleasePreHandler(QKeyEvent *event)
-{
- Q_D(QDeclarativeItem);
- if (d->keyHandler && !d->doneEventPreHandler)
- d->keyHandler->keyReleased(event, false);
- else
- event->ignore();
- d->doneEventPreHandler = true;
-}
-
-/*!
- \internal
- */
-void QDeclarativeItem::inputMethodPreHandler(QInputMethodEvent *event)
-{
- Q_D(QDeclarativeItem);
- if (d->keyHandler && !d->doneEventPreHandler)
- d->keyHandler->inputMethodEvent(event, false);
- else
- event->ignore();
- d->doneEventPreHandler = true;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::left() const
-{
- return anchorLines()->left;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::right() const
-{
- return anchorLines()->right;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::horizontalCenter() const
-{
- return anchorLines()->hCenter;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::top() const
-{
- return anchorLines()->top;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::bottom() const
-{
- return anchorLines()->bottom;
-}
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::verticalCenter() const
-{
- return anchorLines()->vCenter;
-}
-
-
-/*!
- \internal
-*/
-QDeclarativeAnchorLine QDeclarativeItemPrivate::baseline() const
-{
- return anchorLines()->baseline;
-}
-
-/*!
- \qmlproperty AnchorLine Item::anchors.top
- \qmlproperty AnchorLine Item::anchors.bottom
- \qmlproperty AnchorLine Item::anchors.left
- \qmlproperty AnchorLine Item::anchors.right
- \qmlproperty AnchorLine Item::anchors.horizontalCenter
- \qmlproperty AnchorLine Item::anchors.verticalCenter
- \qmlproperty AnchorLine Item::anchors.baseline
-
- \qmlproperty Item Item::anchors.fill
- \qmlproperty Item Item::anchors.centerIn
-
- \qmlproperty real Item::anchors.margins
- \qmlproperty real Item::anchors.topMargin
- \qmlproperty real Item::anchors.bottomMargin
- \qmlproperty real Item::anchors.leftMargin
- \qmlproperty real Item::anchors.rightMargin
- \qmlproperty real Item::anchors.horizontalCenterOffset
- \qmlproperty real Item::anchors.verticalCenterOffset
- \qmlproperty real Item::anchors.baselineOffset
-
- \qmlproperty bool Item::anchors.mirrored
-
- Anchors provide a way to position an item by specifying its
- relationship with other items.
-
- Margins apply to top, bottom, left, right, and fill anchors.
- The \c anchors.margins property can be used to set all of the various margins at once, to the same value.
- Note that margins are anchor-specific and are not applied if an item does not
- use anchors.
-
- Offsets apply for horizontal center, vertical center, and baseline anchors.
-
- \table
- \row
- \o \image declarative-anchors_example.png
- \o Text anchored to Image, horizontally centered and vertically below, with a margin.
- \qml
- Item {
- Image {
- id: pic
- // ...
- }
- Text {
- id: label
- anchors.horizontalCenter: pic.horizontalCenter
- anchors.top: pic.bottom
- anchors.topMargin: 5
- // ...
- }
- }
- \endqml
- \row
- \o \image declarative-anchors_example2.png
- \o
- Left of Text anchored to right of Image, with a margin. The y
- property of both defaults to 0.
-
- \qml
- Item {
- Image {
- id: pic
- // ...
- }
- Text {
- id: label
- anchors.left: pic.right
- anchors.leftMargin: 5
- // ...
- }
- }
- \endqml
- \endtable
-
- \c anchors.fill provides a convenient way for one item to have the
- same geometry as another item, and is equivalent to connecting all
- four directional anchors.
-
- To clear an anchor value, set it to \c undefined.
-
- \c anchors.mirrored returns true it the layout has been \l {LayoutMirroring}{mirrored}.
-
- \note You can only anchor an item to siblings or a parent.
-
- For more information see \l {anchor-layout}{Anchor Layouts}.
-*/
-
-/*!
- \property QDeclarativeItem::baselineOffset
- \brief The position of the item's baseline in local coordinates.
-
- The baseline of a \l Text item is the imaginary line on which the text
- sits. Controls containing text usually set their baseline to the
- baseline of their text.
-
- For non-text items, a default baseline offset of 0 is used.
-*/
-qreal QDeclarativeItem::baselineOffset() const
-{
- Q_D(const QDeclarativeItem);
- if (!d->baselineOffset.isValid()) {
- return 0.0;
- } else
- return d->baselineOffset;
-}
-
-void QDeclarativeItem::setBaselineOffset(qreal offset)
-{
- Q_D(QDeclarativeItem);
- if (offset == d->baselineOffset)
- return;
-
- d->baselineOffset = offset;
-
- for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::Geometry) {
- QDeclarativeAnchorsPrivate *anchor = change.listener->anchorPrivate();
- if (anchor)
- anchor->updateVerticalAnchors();
- }
- }
- emit baselineOffsetChanged(offset);
-}
-
-/*!
- \qmlproperty real Item::rotation
- This property holds the rotation of the item in degrees clockwise.
-
- This specifies how many degrees to rotate the item around its transformOrigin.
- The default rotation is 0 degrees (i.e. not rotated at all).
-
- \table
- \row
- \o \image declarative-rotation.png
- \o
- \qml
- Rectangle {
- color: "blue"
- width: 100; height: 100
- Rectangle {
- color: "red"
- x: 25; y: 25; width: 50; height: 50
- rotation: 30
- }
- }
- \endqml
- \endtable
-
- \sa transform, Rotation
-*/
-
-/*!
- \qmlproperty real Item::scale
- This property holds the scale of the item.
-
- A scale of less than 1 means the item will be displayed smaller than
- normal, and a scale of greater than 1 means the item will be
- displayed larger than normal. A negative scale means the item will
- be mirrored.
-
- By default, items are displayed at a scale of 1 (i.e. at their
- normal size).
-
- Scaling is from the item's transformOrigin.
-
- \table
- \row
- \o \image declarative-scale.png
- \o
- \qml
- Rectangle {
- color: "blue"
- width: 100; height: 100
- Rectangle {
- color: "green"
- width: 25; height: 25
- }
- Rectangle {
- color: "red"
- x: 25; y: 25; width: 50; height: 50
- scale: 1.4
- }
- }
- \endqml
- \endtable
-
- \sa transform, Scale
-*/
-
-/*!
- \qmlproperty real Item::opacity
-
- This property holds the opacity of the item. Opacity is specified as a
- number between 0 (fully transparent) and 1 (fully opaque). The default is 1.
-
- When this property is set, the specified opacity is also applied
- individually to child items. In almost all cases this is what you want,
- but in some cases it may produce undesired results. For example in the
- second set of rectangles below, the red rectangle has specified an opacity
- of 0.5, which affects the opacity of its blue child rectangle even though
- the child has not specified an opacity.
-
- \table
- \row
- \o \image declarative-item_opacity1.png
- \o
- \qml
- Item {
- Rectangle {
- color: "red"
- width: 100; height: 100
- Rectangle {
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- }
- \endqml
- \row
- \o \image declarative-item_opacity2.png
- \o
- \qml
- Item {
- Rectangle {
- opacity: 0.5
- color: "red"
- width: 100; height: 100
- Rectangle {
- color: "blue"
- x: 50; y: 50; width: 100; height: 100
- }
- }
- }
- \endqml
- \endtable
-
- If an item's opacity is set to 0, the item will no longer receive mouse
- events, but will continue to receive key events and will retain the keyboard
- \l focus if it has been set. (In contrast, setting the \l visible property
- to \c false stops both mouse and keyboard events, and also removes focus
- from the item.)
-*/
-
-/*!
- Returns a value indicating whether mouse input should
- remain with this item exclusively.
-
- \sa setKeepMouseGrab()
- */
-bool QDeclarativeItem::keepMouseGrab() const
-{
- Q_D(const QDeclarativeItem);
- return d->keepMouse;
-}
-
-/*!
- The flag indicating whether the mouse should remain
- with this item is set to \a keep.
-
- This is useful for items that wish to grab and keep mouse
- interaction following a predefined gesture. For example,
- an item that is interested in horizontal mouse movement
- may set keepMouseGrab to true once a threshold has been
- exceeded. Once keepMouseGrab has been set to true, filtering
- items will not react to mouse events.
-
- If the item does not indicate that it wishes to retain mouse grab,
- a filtering item may steal the grab. For example, Flickable may attempt
- to steal a mouse grab if it detects that the user has begun to
- move the viewport.
-
- \sa keepMouseGrab()
- */
-void QDeclarativeItem::setKeepMouseGrab(bool keep)
-{
- Q_D(QDeclarativeItem);
- d->keepMouse = keep;
-}
-
-/*!
- \qmlmethod object Item::mapFromItem(Item item, real x, real y)
-
- Maps the point (\a x, \a y), which is in \a item's coordinate system, to
- this item's coordinate system, and returns an object with \c x and \c y
- properties matching the mapped cooordinate.
-
- If \a item is a \c null value, this maps the point from the coordinate
- system of the root QML view.
-*/
-void QDeclarativeItem::mapFromItem(QDeclarativeV8Function *args) const
-{
- if (args->Length() != 0) {
- v8::Local<v8::Value> item = (*args)[0];
- QV8Engine *engine = args->engine();
-
- QDeclarativeItem *itemObj = 0;
- if (!item->IsNull())
- itemObj = qobject_cast<QDeclarativeItem*>(engine->toQObject(item));
-
- if (!itemObj && !item->IsNull()) {
- qmlInfo(this) << "mapFromItem() given argument \"" << engine->toString(item->ToString())
- << "\" which is neither null nor an Item";
- return;
- }
-
- v8::Local<v8::Object> rv = v8::Object::New();
- args->returnValue(rv);
-
- qreal x = (args->Length() > 1)?(*args)[1]->NumberValue():0;
- qreal y = (args->Length() > 2)?(*args)[2]->NumberValue():0;
-
- QPointF p = QGraphicsItem::mapFromItem(itemObj, x, y);
-
- rv->Set(v8::String::New("x"), v8::Number::New(p.x()));
- rv->Set(v8::String::New("y"), v8::Number::New(p.y()));
- }
-}
-
-/*!
- \qmlmethod object Item::mapToItem(Item item, real x, real y)
-
- Maps the point (\a x, \a y), which is in this item's coordinate system, to
- \a item's coordinate system, and returns an object with \c x and \c y
- properties matching the mapped cooordinate.
-
- If \a item is a \c null value, this maps \a x and \a y to the coordinate
- system of the root QML view.
-*/
-void QDeclarativeItem::mapToItem(QDeclarativeV8Function *args) const
-{
- if (args->Length() != 0) {
- v8::Local<v8::Value> item = (*args)[0];
- QV8Engine *engine = args->engine();
-
- QDeclarativeItem *itemObj = 0;
- if (!item->IsNull())
- itemObj = qobject_cast<QDeclarativeItem*>(engine->toQObject(item));
-
- if (!itemObj && !item->IsNull()) {
- qmlInfo(this) << "mapToItem() given argument \"" << engine->toString(item->ToString())
- << "\" which is neither null nor an Item";
- return;
- }
-
- v8::Local<v8::Object> rv = v8::Object::New();
- args->returnValue(rv);
-
- qreal x = (args->Length() > 1)?(*args)[1]->NumberValue():0;
- qreal y = (args->Length() > 2)?(*args)[2]->NumberValue():0;
-
- QPointF p = QGraphicsItem::mapToItem(itemObj, x, y);
-
- rv->Set(v8::String::New("x"), v8::Number::New(p.x()));
- rv->Set(v8::String::New("y"), v8::Number::New(p.y()));
- }
-}
-
-/*!
- \qmlmethod Item::forceActiveFocus()
-
- Forces active focus on the item.
-
- This method sets focus on the item and makes sure that all the focus scopes
- higher in the object hierarchy are also given the focus.
-*/
-
-/*!
- Forces active focus on the item.
-
- This method sets focus on the item and makes sure that all the focus scopes
- higher in the object hierarchy are also given the focus.
-*/
-void QDeclarativeItem::forceActiveFocus()
-{
- setFocus(true);
- QGraphicsItem *parent = parentItem();
- while (parent) {
- if (parent->flags() & QGraphicsItem::ItemIsFocusScope)
- parent->setFocus(Qt::OtherFocusReason);
- parent = parent->parentItem();
- }
-}
-
-
-/*!
- \qmlmethod Item::childAt(real x, real y)
-
- Returns the visible child item at point (\a x, \a y), which is in this
- item's coordinate system, or \c null if there is no such item.
-*/
-
-/*!
- Returns the visible child item at point (\a x, \a y), which is in this
- item's coordinate system, or 0 if there is no such item.
-*/
-QDeclarativeItem *QDeclarativeItem::childAt(qreal x, qreal y) const
-{
- const QList<QGraphicsItem *> children = childItems();
- for (int i = children.count()-1; i >= 0; --i) {
- if (QDeclarativeItem *child = qobject_cast<QDeclarativeItem *>(children.at(i))) {
- if (child->isVisible() && child->x() <= x
- && child->x() + child->width() >= x
- && child->y() <= y
- && child->y() + child->height() >= y)
- return child;
- }
- }
- return 0;
-}
-
-void QDeclarativeItemPrivate::focusChanged(bool flag)
-{
- Q_Q(QDeclarativeItem);
- if (!(flags & QGraphicsItem::ItemIsFocusScope) && parent)
- emit q->activeFocusChanged(flag); //see also QDeclarativeItemPrivate::subFocusItemChange()
- emit q->focusChanged(flag);
-}
-
-QDeclarativeListProperty<QObject> QDeclarativeItemPrivate::resources()
-{
- return QDeclarativeListProperty<QObject>(q_func(), 0, QDeclarativeItemPrivate::resources_append,
- QDeclarativeItemPrivate::resources_count,
- QDeclarativeItemPrivate::resources_at,
- QDeclarativeItemPrivate::resources_clear
- );
-}
-
-/*!
- \qmlproperty list<State> Item::states
- This property holds a list of states defined by the item.
-
- \qml
- Item {
- states: [
- State {
- // ...
- },
- State {
- // ...
- }
- // ...
- ]
- }
- \endqml
-
- \sa {qmlstate}{States}
-*/
-
-QDeclarativeListProperty<QDeclarativeState> QDeclarativeItemPrivate::states()
-{
- return _states()->statesProperty();
-}
-
-/*!
- \qmlproperty list<Transition> Item::transitions
- This property holds a list of transitions defined by the item.
-
- \qml
- Item {
- transitions: [
- Transition {
- // ...
- },
- Transition {
- // ...
- }
- // ...
- ]
- }
- \endqml
-
- \sa {QML Animation and Transitions}{Transitions}
-*/
-
-
-QDeclarativeListProperty<QDeclarativeTransition> QDeclarativeItemPrivate::transitions()
-{
- return _states()->transitionsProperty();
-}
-
-/*
- \qmlproperty list<Filter> Item::filter
- This property holds a list of graphical filters to be applied to the item.
-
- \l {Filter}{Filters} include things like \l {Blur}{blurring}
- the item, or giving it a \l Reflection. Some
- filters may not be available on all canvases; if a filter is not
- available on a certain canvas, it will simply not be applied for
- that canvas (but the QML will still be considered valid).
-
- \qml
- Item {
- filter: [
- Blur {
- // ...
- },
- Reflection {
- // ...
- }
- // ...
- ]
- }
- \endqml
-*/
-
-/*!
- \qmlproperty bool Item::clip
- This property holds whether clipping is enabled. The default clip value is \c false.
-
- If clipping is enabled, an item will clip its own painting, as well
- as the painting of its children, to its bounding rectangle.
-
- Non-rectangular clipping regions are not supported for performance reasons.
-*/
-
-/*!
- \property QDeclarativeItem::clip
- This property holds whether clipping is enabled. The default clip value is \c false.
-
- If clipping is enabled, an item will clip its own painting, as well
- as the painting of its children, to its bounding rectangle. If you set
- clipping during an item's paint operation, remember to re-set it to
- prevent clipping the rest of your scene.
-
- Non-rectangular clipping regions are not supported for performance reasons.
-*/
-
-/*!
- \qmlproperty string Item::state
-
- This property holds the name of the current state of the item.
-
- This property is often used in scripts to change between states. For
- example:
-
- \js
- function toggle() {
- if (button.state == 'On')
- button.state = 'Off';
- else
- button.state = 'On';
- }
- \endjs
-
- If the item is in its base state (i.e. no explicit state has been
- set), \c state will be a blank string. Likewise, you can return an
- item to its base state by setting its current state to \c ''.
-
- \sa {qmlstates}{States}
-*/
-
-QString QDeclarativeItemPrivate::state() const
-{
- if (!_stateGroup)
- return QString();
- else
- return _stateGroup->state();
-}
-
-void QDeclarativeItemPrivate::setState(const QString &state)
-{
- _states()->setState(state);
-}
-
-/*!
- \qmlproperty list<Transform> Item::transform
- This property holds the list of transformations to apply.
-
- For more information see \l Transform.
-*/
-
-/*! \internal */
-QDeclarativeListProperty<QGraphicsTransform> QDeclarativeItem::transform()
-{
- Q_D(QDeclarativeItem);
- return QDeclarativeListProperty<QGraphicsTransform>(this, 0, d->transform_append, d->transform_count,
- d->transform_at, d->transform_clear);
-}
-
-/*!
- \internal
-
- classBegin() is called when the item is constructed, but its
- properties have not yet been set.
-
- \sa componentComplete(), isComponentComplete()
-*/
-void QDeclarativeItem::classBegin()
-{
- Q_D(QDeclarativeItem);
- d->componentComplete = false;
- if (d->_stateGroup)
- d->_stateGroup->classBegin();
- if (d->_anchors)
- d->_anchors->classBegin();
-}
-
-/*!
- \internal
-
- componentComplete() is called when all items in the component
- have been constructed. It is often desirable to delay some
- processing until the component is complete an all bindings in the
- component have been resolved.
-*/
-void QDeclarativeItem::componentComplete()
-{
- Q_D(QDeclarativeItem);
- d->componentComplete = true;
- if (d->_stateGroup)
- d->_stateGroup->componentComplete();
- if (d->_anchors) {
- d->_anchors->componentComplete();
- d->_anchors->d_func()->updateOnComplete();
- }
- if (d->keyHandler)
- d->keyHandler->componentComplete();
- if (d->_contents)
- d->_contents->complete();
-}
-
-QDeclarativeStateGroup *QDeclarativeItemPrivate::_states()
-{
- Q_Q(QDeclarativeItem);
- if (!_stateGroup) {
- _stateGroup = new QDeclarativeStateGroup;
- if (!componentComplete)
- _stateGroup->classBegin();
- QObject::connect(_stateGroup, SIGNAL(stateChanged(QString)),
- q, SIGNAL(stateChanged(QString)));
- }
-
- return _stateGroup;
-}
-
-QDeclarativeItemPrivate::AnchorLines::AnchorLines(QGraphicsObject *q)
-{
- left.item = q;
- left.anchorLine = QDeclarativeAnchorLine::Left;
- right.item = q;
- right.anchorLine = QDeclarativeAnchorLine::Right;
- hCenter.item = q;
- hCenter.anchorLine = QDeclarativeAnchorLine::HCenter;
- top.item = q;
- top.anchorLine = QDeclarativeAnchorLine::Top;
- bottom.item = q;
- bottom.anchorLine = QDeclarativeAnchorLine::Bottom;
- vCenter.item = q;
- vCenter.anchorLine = QDeclarativeAnchorLine::VCenter;
- baseline.item = q;
- baseline.anchorLine = QDeclarativeAnchorLine::Baseline;
-}
-
-QPointF QDeclarativeItemPrivate::computeTransformOrigin() const
-{
- Q_Q(const QDeclarativeItem);
-
- QRectF br = q->boundingRect();
-
- switch(origin) {
- default:
- case QDeclarativeItem::TopLeft:
- return QPointF(0, 0);
- case QDeclarativeItem::Top:
- return QPointF(br.width() / 2., 0);
- case QDeclarativeItem::TopRight:
- return QPointF(br.width(), 0);
- case QDeclarativeItem::Left:
- return QPointF(0, br.height() / 2.);
- case QDeclarativeItem::Center:
- return QPointF(br.width() / 2., br.height() / 2.);
- case QDeclarativeItem::Right:
- return QPointF(br.width(), br.height() / 2.);
- case QDeclarativeItem::BottomLeft:
- return QPointF(0, br.height());
- case QDeclarativeItem::Bottom:
- return QPointF(br.width() / 2., br.height());
- case QDeclarativeItem::BottomRight:
- return QPointF(br.width(), br.height());
- }
-}
-
-/*! \internal */
-bool QDeclarativeItem::sceneEvent(QEvent *event)
-{
- Q_D(QDeclarativeItem);
- if (event->type() == QEvent::KeyPress) {
- QKeyEvent *k = static_cast<QKeyEvent *>(event);
- if ((k->key() == Qt::Key_Tab || k->key() == Qt::Key_Backtab) &&
- !(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier))) {
- keyPressEvent(static_cast<QKeyEvent *>(event));
- if (!event->isAccepted())
- return QGraphicsItem::sceneEvent(event);
- else
- return true;
- } else {
- return QGraphicsItem::sceneEvent(event);
- }
- } else {
- bool rv = QGraphicsItem::sceneEvent(event);
-
- if (event->type() == QEvent::FocusIn ||
- event->type() == QEvent::FocusOut) {
- d->focusChanged(hasActiveFocus());
- }
- return rv;
- }
-}
-
-/*!
- \internal
-
- Note that unlike QGraphicsItems, QDeclarativeItem::itemChange() is \e not called
- during initial widget polishing. Items wishing to optimize start-up construction
- should instead consider using componentComplete().
-*/
-QVariant QDeclarativeItem::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- Q_D(QDeclarativeItem);
- switch (change) {
- case ItemParentHasChanged:
- d->resolveLayoutMirror();
- emit parentChanged(parentItem());
- d->parentNotifier.notify();
- break;
- case ItemVisibleHasChanged: {
- for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::Visibility) {
- change.listener->itemVisibilityChanged(this);
- }
- }
- }
- break;
- case ItemOpacityHasChanged: {
- for(int ii = 0; ii < d->changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::Opacity) {
- change.listener->itemOpacityChanged(this);
- }
- }
- }
- break;
- case ItemChildAddedChange:
- if (d->_contents && d->componentComplete)
- d->_contents->childAdded(qobject_cast<QDeclarativeItem*>(
- value.value<QGraphicsItem*>()));
- break;
- case ItemChildRemovedChange:
- if (d->_contents && d->componentComplete)
- d->_contents->childRemoved(qobject_cast<QDeclarativeItem*>(
- value.value<QGraphicsItem*>()));
- break;
- default:
- break;
- }
-
- return QGraphicsItem::itemChange(change, value);
-}
-
-/*! \internal */
-QRectF QDeclarativeItem::boundingRect() const
-{
- Q_D(const QDeclarativeItem);
- return QRectF(0, 0, d->mWidth, d->mHeight);
-}
-
-/*!
- \enum QDeclarativeItem::TransformOrigin
-
- Controls the point about which simple transforms like scale apply.
-
- \value TopLeft The top-left corner of the item.
- \value Top The center point of the top of the item.
- \value TopRight The top-right corner of the item.
- \value Left The left most point of the vertical middle.
- \value Center The center of the item.
- \value Right The right most point of the vertical middle.
- \value BottomLeft The bottom-left corner of the item.
- \value Bottom The center point of the bottom of the item.
- \value BottomRight The bottom-right corner of the item.
-*/
-
-/*!
- Returns the current transform origin.
-*/
-QDeclarativeItem::TransformOrigin QDeclarativeItem::transformOrigin() const
-{
- Q_D(const QDeclarativeItem);
- return d->origin;
-}
-
-/*!
- Set the transform \a origin.
-*/
-void QDeclarativeItem::setTransformOrigin(TransformOrigin origin)
-{
- Q_D(QDeclarativeItem);
- if (origin != d->origin) {
- d->origin = origin;
- if (d->transformData)
- QGraphicsItem::setTransformOriginPoint(d->computeTransformOrigin());
- else
- d->transformOriginDirty = true;
- emit transformOriginChanged(d->origin);
- }
-}
-
-void QDeclarativeItemPrivate::transformChanged()
-{
- Q_Q(QDeclarativeItem);
- if (transformOriginDirty) {
- q->QGraphicsItem::setTransformOriginPoint(computeTransformOrigin());
- transformOriginDirty = false;
- }
-}
-
-/*!
- \property QDeclarativeItem::smooth
- \brief whether the item is smoothly transformed.
-
- This property is provided purely for the purpose of optimization. Turning
- smooth transforms off is faster, but looks worse; turning smooth
- transformations on is slower, but looks better.
-
- By default smooth transformations are off.
-*/
-
-/*!
- Returns true if the item should be drawn with antialiasing and
- smooth pixmap filtering, false otherwise.
-
- The default is false.
-
- \sa setSmooth()
-*/
-bool QDeclarativeItem::smooth() const
-{
- Q_D(const QDeclarativeItem);
- return d->smooth;
-}
-
-/*!
- Sets whether the item should be drawn with antialiasing and
- smooth pixmap filtering to \a smooth.
-
- \sa smooth()
-*/
-void QDeclarativeItem::setSmooth(bool smooth)
-{
- Q_D(QDeclarativeItem);
- if (d->smooth == smooth)
- return;
- d->smooth = smooth;
- emit smoothChanged(smooth);
- update();
-}
-
-/*!
- \property QDeclarativeItem::anchors
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::left
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::right
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::horizontalCenter
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::top
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::bottom
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::verticalCenter
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::focus
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::transform
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::transformOrigin
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::activeFocus
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::baseline
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::data
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::resources
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::state
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::states
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::transformOriginPoint
- \internal
-*/
-
-/*!
- \property QDeclarativeItem::transitions
- \internal
-*/
-
-/*!
- \internal
- Return the width of the item
-*/
-qreal QDeclarativeItem::width() const
-{
- Q_D(const QDeclarativeItem);
- return d->width();
-}
-
-/*!
- \internal
- Set the width of the item
-*/
-void QDeclarativeItem::setWidth(qreal w)
-{
- Q_D(QDeclarativeItem);
- d->setWidth(w);
-}
-
-/*!
- \internal
- Reset the width of the item
-*/
-void QDeclarativeItem::resetWidth()
-{
- Q_D(QDeclarativeItem);
- d->resetWidth();
-}
-
-/*!
- \internal
- Return the width of the item
-*/
-qreal QDeclarativeItemPrivate::width() const
-{
- return mWidth;
-}
-
-/*!
- \internal
-*/
-void QDeclarativeItemPrivate::setWidth(qreal w)
-{
- Q_Q(QDeclarativeItem);
- if (qIsNaN(w))
- return;
-
- widthValid = true;
- if (mWidth == w)
- return;
-
- qreal oldWidth = mWidth;
-
- q->prepareGeometryChange();
- mWidth = w;
-
- q->geometryChanged(QRectF(q->x(), q->y(), width(), height()),
- QRectF(q->x(), q->y(), oldWidth, height()));
-}
-
-/*!
- \internal
-*/
-void QDeclarativeItemPrivate::resetWidth()
-{
- Q_Q(QDeclarativeItem);
- widthValid = false;
- q->setImplicitWidth(q->implicitWidth());
-}
-
-void QDeclarativeItemPrivate::implicitWidthChanged()
-{
- Q_Q(QDeclarativeItem);
- emit q->implicitWidthChanged();
-}
-
-qreal QDeclarativeItemPrivate::implicitWidth() const
-{
- return mImplicitWidth;
-}
-
-/*!
- Returns the width of the item that is implied by other properties that determine the content.
-*/
-qreal QDeclarativeItem::implicitWidth() const
-{
- Q_D(const QDeclarativeItem);
- return d->implicitWidth();
-}
-
-/*!
- Sets the implied width of the item to \a w.
- This is the width implied by other properties that determine the content.
-*/
-void QDeclarativeItem::setImplicitWidth(qreal w)
-{
- Q_D(QDeclarativeItem);
- bool changed = w != d->mImplicitWidth;
- d->mImplicitWidth = w;
- if (d->mWidth == w || widthValid()) {
- if (changed)
- d->implicitWidthChanged();
- return;
- }
-
- qreal oldWidth = d->mWidth;
-
- prepareGeometryChange();
- d->mWidth = w;
-
- geometryChanged(QRectF(x(), y(), width(), height()),
- QRectF(x(), y(), oldWidth, height()));
-
- if (changed)
- d->implicitWidthChanged();
-}
-
-/*!
- Returns whether the width property has been set explicitly.
-*/
-bool QDeclarativeItem::widthValid() const
-{
- Q_D(const QDeclarativeItem);
- return d->widthValid;
-}
-
-/*!
- \internal
- Return the height of the item
-*/
-qreal QDeclarativeItem::height() const
-{
- Q_D(const QDeclarativeItem);
- return d->height();
-}
-
-/*!
- \internal
- Set the height of the item
-*/
-void QDeclarativeItem::setHeight(qreal h)
-{
- Q_D(QDeclarativeItem);
- d->setHeight(h);
-}
-
-/*!
- \internal
- Reset the height of the item
-*/
-void QDeclarativeItem::resetHeight()
-{
- Q_D(QDeclarativeItem);
- d->resetHeight();
-}
-
-/*!
- \internal
-*/
-qreal QDeclarativeItemPrivate::height() const
-{
- return mHeight;
-}
-
-/*!
- \internal
-*/
-void QDeclarativeItemPrivate::setHeight(qreal h)
-{
- Q_Q(QDeclarativeItem);
- if (qIsNaN(h))
- return;
-
- heightValid = true;
- if (mHeight == h)
- return;
-
- qreal oldHeight = mHeight;
-
- q->prepareGeometryChange();
- mHeight = h;
-
- q->geometryChanged(QRectF(q->x(), q->y(), width(), height()),
- QRectF(q->x(), q->y(), width(), oldHeight));
-}
-
-/*!
- \internal
-*/
-void QDeclarativeItemPrivate::resetHeight()
-{
- Q_Q(QDeclarativeItem);
- heightValid = false;
- q->setImplicitHeight(q->implicitHeight());
-}
-
-void QDeclarativeItemPrivate::implicitHeightChanged()
-{
- Q_Q(QDeclarativeItem);
- emit q->implicitHeightChanged();
-}
-
-qreal QDeclarativeItemPrivate::implicitHeight() const
-{
- return mImplicitHeight;
-}
-
-/*!
- Returns the height of the item that is implied by other properties that determine the content.
-*/
-qreal QDeclarativeItem::implicitHeight() const
-{
- Q_D(const QDeclarativeItem);
- return d->implicitHeight();
-}
-
-/*!
- \qmlproperty real Item::implicitWidth
- \qmlproperty real Item::implicitHeight
- \since Quick 1.1
-
- Defines the natural width or height of the Item if no \l width or \l height is specified.
-
- The default implicit size for most items is 0x0, however some elements have an inherent
- implicit size which cannot be overridden, e.g. Image, Text.
-
- Setting the implicit size is useful for defining components that have a preferred size
- based on their content, for example:
-
- \qml
- // Label.qml
- import QtQuick 1.1
-
- Item {
- property alias icon: image.source
- property alias label: text.text
- implicitWidth: text.implicitWidth + image.implicitWidth
- implicitHeight: Math.max(text.implicitHeight, image.implicitHeight)
- Image { id: image }
- Text {
- id: text
- wrapMode: Text.Wrap
- anchors.left: image.right; anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- }
- }
- \endqml
-
- \bold Note: using implicitWidth of Text or TextEdit and setting the width explicitly
- incurs a performance penalty as the text must be laid out twice.
-*/
-
-
-/*!
- Sets the implied height of the item to \a h.
- This is the height implied by other properties that determine the content.
-*/
-void QDeclarativeItem::setImplicitHeight(qreal h)
-{
- Q_D(QDeclarativeItem);
- bool changed = h != d->mImplicitHeight;
- d->mImplicitHeight = h;
- if (d->mHeight == h || heightValid()) {
- if (changed)
- d->implicitHeightChanged();
- return;
- }
-
- qreal oldHeight = d->mHeight;
-
- prepareGeometryChange();
- d->mHeight = h;
-
- geometryChanged(QRectF(x(), y(), width(), height()),
- QRectF(x(), y(), width(), oldHeight));
-
- if (changed)
- d->implicitHeightChanged();
-}
-
-/*!
- Returns whether the height property has been set explicitly.
-*/
-bool QDeclarativeItem::heightValid() const
-{
- Q_D(const QDeclarativeItem);
- return d->heightValid;
-}
-
-/*! \internal */
-void QDeclarativeItem::setSize(const QSizeF &size)
-{
- Q_D(QDeclarativeItem);
- d->heightValid = true;
- d->widthValid = true;
-
- if (d->height() == size.height() && d->width() == size.width())
- return;
-
- qreal oldHeight = d->height();
- qreal oldWidth = d->width();
-
- prepareGeometryChange();
- d->setHeight(size.height());
- d->setWidth(size.width());
-
- geometryChanged(QRectF(x(), y(), width(), height()),
- QRectF(x(), y(), oldWidth, oldHeight));
-}
-
-/*!
- \qmlproperty bool Item::activeFocus
-
- This property indicates whether the item has active focus.
-
- An item with active focus will receive keyboard input,
- or is a FocusScope ancestor of the item that will receive keyboard input.
-
- Usually, activeFocus is gained by setting focus on an item and its enclosing
- FocusScopes. In the following example \c input will have activeFocus.
- \qml
- Rectangle {
- FocusScope {
- focus: true
- TextInput {
- id: input
- focus: true
- }
- }
- }
- \endqml
-
- \sa focus, {qmlfocus}{Keyboard Focus}
-*/
-
-/*! \internal */
-bool QDeclarativeItem::hasActiveFocus() const
-{
- Q_D(const QDeclarativeItem);
- return focusItem() == this ||
- (d->flags & QGraphicsItem::ItemIsFocusScope && focusItem() != 0);
-}
-
-/*!
- \qmlproperty bool Item::focus
- This property indicates whether the item has focus within the enclosing focus scope. If true, this item
- will gain active focus when the enclosing focus scope gains active focus.
- In the following example, \c input will be given active focus when \c scope gains active focus.
- \qml
- Rectangle {
- FocusScope {
- id: scope
- TextInput {
- id: input
- focus: true
- }
- }
- }
- \endqml
-
- For the purposes of this property, the scene as a whole is assumed to act like a focus scope.
- On a practical level, that means the following QML will give active focus to \c input on startup.
-
- \qml
- Rectangle {
- TextInput {
- id: input
- focus: true
- }
- }
- \endqml
-
- \sa activeFocus, {qmlfocus}{Keyboard Focus}
-*/
-
-/*! \internal */
-bool QDeclarativeItem::hasFocus() const
-{
- Q_D(const QDeclarativeItem);
- QGraphicsItem *p = d->parent;
- while (p) {
- if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
- return p->focusScopeItem() == this;
- }
- p = p->parentItem();
- }
-
- return hasActiveFocus();
-}
-
-/*! \internal */
-void QDeclarativeItem::setFocus(bool focus)
-{
- if (focus)
- QGraphicsItem::setFocus(Qt::OtherFocusReason);
- else
- QGraphicsItem::clearFocus();
-}
-
-/*!
- \internal
-*/
-void QDeclarativeItem::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *)
-{
-}
-
-/*!
- \internal
-*/
-bool QDeclarativeItem::event(QEvent *ev)
-{
- Q_D(QDeclarativeItem);
- switch (ev->type()) {
- case QEvent::KeyPress:
- case QEvent::KeyRelease:
- case QEvent::InputMethod:
- d->doneEventPreHandler = false;
- break;
- default:
- break;
- }
-
- return QGraphicsObject::event(ev);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug debug, QDeclarativeItem *item)
-{
- if (!item) {
- debug << "QDeclarativeItem(0)";
- return debug;
- }
-
- debug << item->metaObject()->className() << "(this =" << ((void*)item)
- << ", parent =" << ((void*)item->parentItem())
- << ", geometry =" << QRectF(item->pos(), QSizeF(item->width(), item->height()))
- << ", z =" << item->zValue() << ')';
- return debug;
-}
-#endif
-
-qint64 QDeclarativeItemPrivate::consistentTime = -1;
-void QDeclarativeItemPrivate::setConsistentTime(qint64 t)
-{
- consistentTime = t;
-}
-
-class QElapsedTimerConsistentTimeHack
-{
-public:
- void start() {
- t1 = QDeclarativeItemPrivate::consistentTime;
- t2 = 0;
- }
- qint64 elapsed() {
- return QDeclarativeItemPrivate::consistentTime - t1;
- }
- qint64 restart() {
- qint64 val = QDeclarativeItemPrivate::consistentTime - t1;
- t1 = QDeclarativeItemPrivate::consistentTime;
- t2 = 0;
- return val;
- }
-
-private:
- qint64 t1;
- qint64 t2;
-};
-
-void QDeclarativeItemPrivate::start(QElapsedTimer &t)
-{
- if (QDeclarativeItemPrivate::consistentTime == -1)
- t.start();
- else
- ((QElapsedTimerConsistentTimeHack*)&t)->start();
-}
-
-qint64 QDeclarativeItemPrivate::elapsed(QElapsedTimer &t)
-{
- if (QDeclarativeItemPrivate::consistentTime == -1)
- return t.elapsed();
- else
- return ((QElapsedTimerConsistentTimeHack*)&t)->elapsed();
-}
-
-qint64 QDeclarativeItemPrivate::restart(QElapsedTimer &t)
-{
- if (QDeclarativeItemPrivate::consistentTime == -1)
- return t.restart();
- else
- return ((QElapsedTimerConsistentTimeHack*)&t)->restart();
-}
-
-QT_END_NAMESPACE
-
-#include <moc_qdeclarativeitem.cpp>
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.h b/src/declarative/graphicsitems/qdeclarativeitem.h
deleted file mode 100644
index 1bb9b3de42..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitem.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEITEM_H
-#define QDECLARATIVEITEM_H
-
-#include <QtDeclarative/qdeclarative.h>
-#include <QtDeclarative/qdeclarativecomponent.h>
-
-#include <QtCore/QObject>
-#include <QtCore/QList>
-#include <QtGui/qgraphicsitem.h>
-#include <QtGui/qgraphicstransform.h>
-#include <QtGui/qfont.h>
-#include <QtGui/qaction.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeState;
-class QDeclarativeAnchorLine;
-class QDeclarativeTransition;
-class QDeclarativeKeyEvent;
-class QDeclarativeAnchors;
-class QDeclarativeItemPrivate;
-class QDeclarativeV8Function;
-class Q_DECLARATIVE_EXPORT QDeclarativeItem : public QGraphicsObject, public QDeclarativeParserStatus
-{
- Q_OBJECT
- Q_INTERFACES(QDeclarativeParserStatus)
-
- Q_PROPERTY(QDeclarativeItem * parent READ parentItem WRITE setParentItem NOTIFY parentChanged DESIGNABLE false FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeListProperty<QObject> data READ data DESIGNABLE false)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeListProperty<QObject> resources READ resources DESIGNABLE false)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeListProperty<QDeclarativeState> states READ states DESIGNABLE false)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeListProperty<QDeclarativeTransition> transitions READ transitions DESIGNABLE false)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QString state READ state WRITE setState NOTIFY stateChanged)
- Q_PROPERTY(QRectF childrenRect READ childrenRect NOTIFY childrenRectChanged DESIGNABLE false FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchors * anchors READ anchors DESIGNABLE false CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine left READ left CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine right READ right CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine horizontalCenter READ horizontalCenter CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine top READ top CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine bottom READ bottom CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine verticalCenter READ verticalCenter CONSTANT FINAL)
- Q_PRIVATE_PROPERTY(QDeclarativeItem::d_func(), QDeclarativeAnchorLine baseline READ baseline CONSTANT FINAL)
- Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged)
- Q_PROPERTY(bool clip READ clip WRITE setClip NOTIFY clipChanged) // ### move to QGI/QGO, NOTIFY
- Q_PROPERTY(bool focus READ hasFocus WRITE setFocus NOTIFY focusChanged FINAL)
- Q_PROPERTY(bool activeFocus READ hasActiveFocus NOTIFY activeFocusChanged)
- Q_PROPERTY(QDeclarativeListProperty<QGraphicsTransform> transform READ transform DESIGNABLE false FINAL)
- Q_PROPERTY(TransformOrigin transformOrigin READ transformOrigin WRITE setTransformOrigin NOTIFY transformOriginChanged)
- Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint) // transformOriginPoint is read-only for Item
- Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged)
- Q_PROPERTY(qreal implicitWidth READ implicitWidth WRITE setImplicitWidth NOTIFY implicitWidthChanged REVISION 1)
- Q_PROPERTY(qreal implicitHeight READ implicitHeight WRITE setImplicitHeight NOTIFY implicitHeightChanged REVISION 1)
-
- Q_ENUMS(TransformOrigin)
- Q_CLASSINFO("DefaultProperty", "data")
-
-public:
- enum TransformOrigin {
- TopLeft, Top, TopRight,
- Left, Center, Right,
- BottomLeft, Bottom, BottomRight
- };
-
- QDeclarativeItem(QDeclarativeItem *parent = 0);
- virtual ~QDeclarativeItem();
-
- QDeclarativeItem *parentItem() const;
- void setParentItem(QDeclarativeItem *parent);
-
- QRectF childrenRect();
-
- bool clip() const;
- void setClip(bool);
-
- qreal baselineOffset() const;
- void setBaselineOffset(qreal);
-
- QDeclarativeListProperty<QGraphicsTransform> transform();
-
- qreal width() const;
- void setWidth(qreal);
- void resetWidth();
- qreal implicitWidth() const;
-
- qreal height() const;
- void setHeight(qreal);
- void resetHeight();
- qreal implicitHeight() const;
-
- void setSize(const QSizeF &size);
-
- TransformOrigin transformOrigin() const;
- void setTransformOrigin(TransformOrigin);
-
- bool smooth() const;
- void setSmooth(bool);
-
- QRectF boundingRect() const;
- virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
-
- bool hasActiveFocus() const;
- bool hasFocus() const;
- void setFocus(bool);
-
- bool keepMouseGrab() const;
- void setKeepMouseGrab(bool);
-
- Q_INVOKABLE void mapFromItem(QDeclarativeV8Function*) const;
- Q_INVOKABLE void mapToItem(QDeclarativeV8Function*) const;
- Q_INVOKABLE void forceActiveFocus();
- Q_INVOKABLE QDeclarativeItem *childAt(qreal x, qreal y) const;
-
-Q_SIGNALS:
- void childrenRectChanged(const QRectF &);
- void baselineOffsetChanged(qreal);
- void stateChanged(const QString &);
- void focusChanged(bool);
- void activeFocusChanged(bool);
- void parentChanged(QDeclarativeItem *);
- void transformOriginChanged(TransformOrigin);
- void smoothChanged(bool);
- void clipChanged(bool);
- Q_REVISION(1) void implicitWidthChanged();
- Q_REVISION(1) void implicitHeightChanged();
-
-protected:
- bool isComponentComplete() const;
- virtual bool sceneEvent(QEvent *);
- virtual bool event(QEvent *);
- virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
-
- void setImplicitWidth(qreal);
- bool widthValid() const; // ### better name?
- void setImplicitHeight(qreal);
- bool heightValid() const; // ### better name?
-
- virtual void classBegin();
- virtual void componentComplete();
- virtual void keyPressEvent(QKeyEvent *event);
- virtual void keyReleaseEvent(QKeyEvent *event);
- virtual void inputMethodEvent(QInputMethodEvent *);
- virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
- void keyPressPreHandler(QKeyEvent *);
- void keyReleasePreHandler(QKeyEvent *);
- void inputMethodPreHandler(QInputMethodEvent *);
-
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
-
-protected:
- QDeclarativeItem(QDeclarativeItemPrivate &dd, QDeclarativeItem *parent = 0);
-
-private:
- Q_DISABLE_COPY(QDeclarativeItem)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem)
-};
-
-template<typename T>
- T qobject_cast(QGraphicsObject *o)
-{
- QObject *obj = o;
- return qobject_cast<T>(obj);
-}
-
-// ### move to QGO
-template<typename T>
-T qobject_cast(QGraphicsItem *item)
-{
- if (!item) return 0;
- QObject *o = item->toGraphicsObject();
- return qobject_cast<T>(o);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug Q_DECLARATIVE_EXPORT operator<<(QDebug debug, QDeclarativeItem *item);
-#endif
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeItem)
-QML_DECLARE_TYPE(QGraphicsObject)
-QML_DECLARE_TYPE(QGraphicsTransform)
-QML_DECLARE_TYPE(QGraphicsScale)
-QML_DECLARE_TYPE(QGraphicsRotation)
-QML_DECLARE_TYPE(QGraphicsWidget)
-QML_DECLARE_TYPE(QAction)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEITEM_H
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h
deleted file mode 100644
index 80131d137a..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitem_p.h
+++ /dev/null
@@ -1,633 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEITEM_P_H
-#define QDECLARATIVEITEM_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qdeclarativeitem.h"
-
-#include "private/qdeclarativeanchors_p.h"
-#include "private/qdeclarativeanchors_p_p.h"
-#include "private/qdeclarativeitemchangelistener_p.h"
-#include <private/qpodvector_p.h>
-
-#include <private/qdeclarativestate_p.h>
-#include <private/qdeclarativenullablevalue_p_p.h>
-#include <private/qdeclarativenotifier_p.h>
-#include <private/qdeclarativeglobal_p.h>
-
-#include <qdeclarative.h>
-#include <qdeclarativecontext.h>
-
-#include <QtCore/qlist.h>
-#include <QtCore/qdebug.h>
-
-#include <private/qgraphicsitem_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkReply;
-class QDeclarativeItemKeyFilter;
-class QDeclarativeLayoutMirroringAttached;
-
-//### merge into private?
-class QDeclarativeContents : public QObject, public QDeclarativeItemChangeListener
-{
- Q_OBJECT
-public:
- QDeclarativeContents(QDeclarativeItem *item);
- ~QDeclarativeContents();
-
- QRectF rectF() const;
-
- void childRemoved(QDeclarativeItem *item);
- void childAdded(QDeclarativeItem *item);
-
- void calcGeometry() { calcWidth(); calcHeight(); }
- void complete();
-
-Q_SIGNALS:
- void rectChanged(QRectF);
-
-protected:
- void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
- void itemDestroyed(QDeclarativeItem *item);
- //void itemVisibilityChanged(QDeclarativeItem *item)
-
-private:
- void calcHeight(QDeclarativeItem *changed = 0);
- void calcWidth(QDeclarativeItem *changed = 0);
-
- QDeclarativeItem *m_item;
- qreal m_x;
- qreal m_y;
- qreal m_width;
- qreal m_height;
-};
-
-class Q_DECLARATIVE_EXPORT QDeclarativeItemPrivate : public QGraphicsItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeItem)
-
-public:
- QDeclarativeItemPrivate()
- : _anchors(0), _contents(0),
- baselineOffset(0),
- _anchorLines(0),
- _stateGroup(0), origin(QDeclarativeItem::Center),
- widthValid(false), heightValid(false),
- componentComplete(true), keepMouse(false),
- smooth(false), transformOriginDirty(true), doneEventPreHandler(false),
- inheritedLayoutMirror(false), effectiveLayoutMirror(false), isMirrorImplicit(true),
- inheritMirrorFromParent(false), inheritMirrorFromItem(false), keyHandler(0),
- mWidth(0), mHeight(0), mImplicitWidth(0), mImplicitHeight(0), attachedLayoutDirection(0), hadSubFocusItem(false)
- {
- QGraphicsItemPrivate::acceptedMouseButtons = 0;
- isDeclarativeItem = 1;
- QGraphicsItemPrivate::flags = QGraphicsItem::GraphicsItemFlags(
- QGraphicsItem::ItemHasNoContents
- | QGraphicsItem::ItemIsFocusable
- | QGraphicsItem::ItemNegativeZStacksBehindParent);
- }
-
- void init(QDeclarativeItem *parent)
- {
- Q_Q(QDeclarativeItem);
- if (parent) {
- QDeclarative_setParent_noEvent(q, parent);
- q->setParentItem(parent);
- QDeclarativeItemPrivate *parentPrivate = QDeclarativeItemPrivate::get(parent);
- setImplicitLayoutMirror(parentPrivate->inheritedLayoutMirror, parentPrivate->inheritMirrorFromParent);
- }
- baselineOffset.invalidate();
- mouseSetsFocus = false;
- }
-
- bool isMirrored() const {
- return effectiveLayoutMirror;
- }
-
- // Private Properties
- qreal width() const;
- void setWidth(qreal);
- void resetWidth();
-
- qreal height() const;
- void setHeight(qreal);
- void resetHeight();
-
- virtual qreal implicitWidth() const;
- virtual qreal implicitHeight() const;
- virtual void implicitWidthChanged();
- virtual void implicitHeightChanged();
-
- void resolveLayoutMirror();
- void setImplicitLayoutMirror(bool mirror, bool inherit);
- void setLayoutMirror(bool mirror);
-
- QDeclarativeListProperty<QObject> data();
- QDeclarativeListProperty<QObject> resources();
-
- QDeclarativeListProperty<QDeclarativeState> states();
- QDeclarativeListProperty<QDeclarativeTransition> transitions();
-
- QString state() const;
- void setState(const QString &);
-
- QDeclarativeAnchorLine left() const;
- QDeclarativeAnchorLine right() const;
- QDeclarativeAnchorLine horizontalCenter() const;
- QDeclarativeAnchorLine top() const;
- QDeclarativeAnchorLine bottom() const;
- QDeclarativeAnchorLine verticalCenter() const;
- QDeclarativeAnchorLine baseline() const;
-
- // data property
- static void data_append(QDeclarativeListProperty<QObject> *, QObject *);
- static int data_count(QDeclarativeListProperty<QObject> *);
- static QObject *data_at(QDeclarativeListProperty<QObject> *, int);
- static void data_clear(QDeclarativeListProperty<QObject> *);
-
- // resources property
- static QObject *resources_at(QDeclarativeListProperty<QObject> *, int);
- static void resources_append(QDeclarativeListProperty<QObject> *, QObject *);
- static int resources_count(QDeclarativeListProperty<QObject> *);
- static void resources_clear(QDeclarativeListProperty<QObject> *);
-
- // transform property
- static int transform_count(QDeclarativeListProperty<QGraphicsTransform> *list);
- static void transform_append(QDeclarativeListProperty<QGraphicsTransform> *list, QGraphicsTransform *);
- static QGraphicsTransform *transform_at(QDeclarativeListProperty<QGraphicsTransform> *list, int);
- static void transform_clear(QDeclarativeListProperty<QGraphicsTransform> *list);
-
- static QDeclarativeItemPrivate* get(QDeclarativeItem *item)
- {
- return item->d_func();
- }
-
- // Accelerated property accessors
- QDeclarativeNotifier parentNotifier;
- static void parentProperty(QObject *o, void *rv, QDeclarativeNotifierEndpoint *e);
-
- QDeclarativeAnchors *anchors() {
- if (!_anchors) {
- Q_Q(QDeclarativeItem);
- _anchors = new QDeclarativeAnchors(q);
- if (!componentComplete)
- _anchors->classBegin();
- }
- return _anchors;
- }
- QDeclarativeAnchors *_anchors;
- QDeclarativeContents *_contents;
-
- QDeclarativeNullableValue<qreal> baselineOffset;
-
- struct AnchorLines {
- AnchorLines(QGraphicsObject *);
- QDeclarativeAnchorLine left;
- QDeclarativeAnchorLine right;
- QDeclarativeAnchorLine hCenter;
- QDeclarativeAnchorLine top;
- QDeclarativeAnchorLine bottom;
- QDeclarativeAnchorLine vCenter;
- QDeclarativeAnchorLine baseline;
- };
- mutable AnchorLines *_anchorLines;
- AnchorLines *anchorLines() const {
- Q_Q(const QDeclarativeItem);
- if (!_anchorLines) _anchorLines =
- new AnchorLines(const_cast<QDeclarativeItem *>(q));
- return _anchorLines;
- }
-
- enum ChangeType {
- Geometry = 0x01,
- SiblingOrder = 0x02,
- Visibility = 0x04,
- Opacity = 0x08,
- Destroyed = 0x10
- };
-
- Q_DECLARE_FLAGS(ChangeTypes, ChangeType)
-
- struct ChangeListener {
- ChangeListener(QDeclarativeItemChangeListener *l, QDeclarativeItemPrivate::ChangeTypes t) : listener(l), types(t) {}
- QDeclarativeItemChangeListener *listener;
- QDeclarativeItemPrivate::ChangeTypes types;
- bool operator==(const ChangeListener &other) const { return listener == other.listener && types == other.types; }
- };
-
- void addItemChangeListener(QDeclarativeItemChangeListener *listener, ChangeTypes types) {
- changeListeners.append(ChangeListener(listener, types));
- }
- void removeItemChangeListener(QDeclarativeItemChangeListener *, ChangeTypes types);
- QPODVector<ChangeListener,4> changeListeners;
-
- QDeclarativeStateGroup *_states();
- QDeclarativeStateGroup *_stateGroup;
-
- QDeclarativeItem::TransformOrigin origin:5;
- bool widthValid:1;
- bool heightValid:1;
- bool componentComplete:1;
- bool keepMouse:1;
- bool smooth:1;
- bool transformOriginDirty : 1;
- bool doneEventPreHandler : 1;
- bool inheritedLayoutMirror:1;
- bool effectiveLayoutMirror:1;
- bool isMirrorImplicit:1;
- bool inheritMirrorFromParent:1;
- bool inheritMirrorFromItem:1;
-
- QDeclarativeItemKeyFilter *keyHandler;
-
- qreal mWidth;
- qreal mHeight;
- qreal mImplicitWidth;
- qreal mImplicitHeight;
-
- QDeclarativeLayoutMirroringAttached* attachedLayoutDirection;
-
- bool hadSubFocusItem;
-
- QPointF computeTransformOrigin() const;
-
- virtual void setPosHelper(const QPointF &pos)
- {
- Q_Q(QDeclarativeItem);
- QRectF oldGeometry(this->pos.x(), this->pos.y(), mWidth, mHeight);
- QGraphicsItemPrivate::setPosHelper(pos);
- q->geometryChanged(QRectF(this->pos.x(), this->pos.y(), mWidth, mHeight), oldGeometry);
- }
-
- // Reimplemented from QGraphicsItemPrivate
- virtual void subFocusItemChange()
- {
- bool hasSubFocusItem = subFocusItem != 0;
- if (((flags & QGraphicsItem::ItemIsFocusScope) || !parent) && hasSubFocusItem != hadSubFocusItem)
- emit q_func()->activeFocusChanged(hasSubFocusItem);
- //see also QDeclarativeItemPrivate::focusChanged
- hadSubFocusItem = hasSubFocusItem;
- }
-
- // Reimplemented from QGraphicsItemPrivate
- virtual void focusScopeItemChange(bool isSubFocusItem)
- {
- emit q_func()->focusChanged(isSubFocusItem);
- }
-
-
- // Reimplemented from QGraphicsItemPrivate
- virtual void siblingOrderChange()
- {
- Q_Q(QDeclarativeItem);
- for(int ii = 0; ii < changeListeners.count(); ++ii) {
- const QDeclarativeItemPrivate::ChangeListener &change = changeListeners.at(ii);
- if (change.types & QDeclarativeItemPrivate::SiblingOrder) {
- change.listener->itemSiblingOrderChanged(q);
- }
- }
- }
-
- // Reimplemented from QGraphicsItemPrivate
- virtual void transformChanged();
-
- virtual void focusChanged(bool);
-
- virtual void mirrorChange() {};
-
- static qint64 consistentTime;
- static void setConsistentTime(qint64 t);
- static void start(QElapsedTimer &);
- static qint64 elapsed(QElapsedTimer &);
- static qint64 restart(QElapsedTimer &);
-};
-
-/*
- Key filters can be installed on a QDeclarativeItem, but not removed. Currently they
- are only used by attached objects (which are only destroyed on Item
- destruction), so this isn't a problem. If in future this becomes any form
- of public API, they will have to support removal too.
-*/
-class QDeclarativeItemKeyFilter
-{
-public:
- QDeclarativeItemKeyFilter(QDeclarativeItem * = 0);
- virtual ~QDeclarativeItemKeyFilter();
-
- virtual void keyPressed(QKeyEvent *event, bool post);
- virtual void keyReleased(QKeyEvent *event, bool post);
- virtual void inputMethodEvent(QInputMethodEvent *event, bool post);
- virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
- virtual void componentComplete();
-
- bool m_processPost;
-
-private:
- QDeclarativeItemKeyFilter *m_next;
-};
-
-class QDeclarativeKeyNavigationAttachedPrivate : public QObjectPrivate
-{
-public:
- QDeclarativeKeyNavigationAttachedPrivate()
- : QObjectPrivate(),
- left(0), right(0), up(0), down(0), tab(0), backtab(0),
- leftSet(false), rightSet(false), upSet(false), downSet(false),
- tabSet(false), backtabSet(false) {}
-
- QDeclarativeItem *left;
- QDeclarativeItem *right;
- QDeclarativeItem *up;
- QDeclarativeItem *down;
- QDeclarativeItem *tab;
- QDeclarativeItem *backtab;
- bool leftSet : 1;
- bool rightSet : 1;
- bool upSet : 1;
- bool downSet : 1;
- bool tabSet : 1;
- bool backtabSet : 1;
-};
-
-class QDeclarativeKeyNavigationAttached : public QObject, public QDeclarativeItemKeyFilter
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeKeyNavigationAttached)
-
- Q_PROPERTY(QDeclarativeItem *left READ left WRITE setLeft NOTIFY leftChanged)
- Q_PROPERTY(QDeclarativeItem *right READ right WRITE setRight NOTIFY rightChanged)
- Q_PROPERTY(QDeclarativeItem *up READ up WRITE setUp NOTIFY upChanged)
- Q_PROPERTY(QDeclarativeItem *down READ down WRITE setDown NOTIFY downChanged)
- Q_PROPERTY(QDeclarativeItem *tab READ tab WRITE setTab NOTIFY tabChanged)
- Q_PROPERTY(QDeclarativeItem *backtab READ backtab WRITE setBacktab NOTIFY backtabChanged)
- Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
-
- Q_ENUMS(Priority)
-
-public:
- QDeclarativeKeyNavigationAttached(QObject * = 0);
-
- QDeclarativeItem *left() const;
- void setLeft(QDeclarativeItem *);
- QDeclarativeItem *right() const;
- void setRight(QDeclarativeItem *);
- QDeclarativeItem *up() const;
- void setUp(QDeclarativeItem *);
- QDeclarativeItem *down() const;
- void setDown(QDeclarativeItem *);
- QDeclarativeItem *tab() const;
- void setTab(QDeclarativeItem *);
- QDeclarativeItem *backtab() const;
- void setBacktab(QDeclarativeItem *);
-
- enum Priority { BeforeItem, AfterItem };
- Priority priority() const;
- void setPriority(Priority);
-
- static QDeclarativeKeyNavigationAttached *qmlAttachedProperties(QObject *);
-
-Q_SIGNALS:
- void leftChanged();
- void rightChanged();
- void upChanged();
- void downChanged();
- void tabChanged();
- void backtabChanged();
- void priorityChanged();
-
-private:
- virtual void keyPressed(QKeyEvent *event, bool post);
- virtual void keyReleased(QKeyEvent *event, bool post);
- void setFocusNavigation(QDeclarativeItem *currentItem, const char *dir);
-};
-
-class QDeclarativeLayoutMirroringAttached : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(bool enabled READ enabled WRITE setEnabled RESET resetEnabled NOTIFY enabledChanged)
- Q_PROPERTY(bool childrenInherit READ childrenInherit WRITE setChildrenInherit NOTIFY childrenInheritChanged)
-
-public:
- explicit QDeclarativeLayoutMirroringAttached(QObject *parent = 0);
-
- bool enabled() const;
- void setEnabled(bool);
- void resetEnabled();
-
- bool childrenInherit() const;
- void setChildrenInherit(bool);
-
- static QDeclarativeLayoutMirroringAttached *qmlAttachedProperties(QObject *);
-Q_SIGNALS:
- void enabledChanged();
- void childrenInheritChanged();
-private:
- friend class QDeclarativeItemPrivate;
- QDeclarativeItemPrivate *itemPrivate;
-};
-
-class QDeclarativeKeysAttachedPrivate : public QObjectPrivate
-{
-public:
- QDeclarativeKeysAttachedPrivate()
- : QObjectPrivate(), inPress(false), inRelease(false)
- , inIM(false), enabled(true), imeItem(0), item(0)
- {}
-
- bool isConnected(const char *signalName);
-
- QGraphicsItem *finalFocusProxy(QGraphicsItem *item) const
- {
- QGraphicsItem *fp;
- while ((fp = item->focusProxy()))
- item = fp;
- return item;
- }
-
- //loop detection
- bool inPress:1;
- bool inRelease:1;
- bool inIM:1;
-
- bool enabled : 1;
-
- QGraphicsItem *imeItem;
- QList<QDeclarativeItem *> targets;
- QDeclarativeItem *item;
-};
-
-class QDeclarativeKeysAttached : public QObject, public QDeclarativeItemKeyFilter
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeKeysAttached)
-
- Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
- Q_PROPERTY(QDeclarativeListProperty<QDeclarativeItem> forwardTo READ forwardTo)
- Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
-
- Q_ENUMS(Priority)
-
-public:
- QDeclarativeKeysAttached(QObject *parent=0);
- ~QDeclarativeKeysAttached();
-
- bool enabled() const { Q_D(const QDeclarativeKeysAttached); return d->enabled; }
- void setEnabled(bool enabled) {
- Q_D(QDeclarativeKeysAttached);
- if (enabled != d->enabled) {
- d->enabled = enabled;
- emit enabledChanged();
- }
- }
-
- enum Priority { BeforeItem, AfterItem};
- Priority priority() const;
- void setPriority(Priority);
-
- QDeclarativeListProperty<QDeclarativeItem> forwardTo() {
- Q_D(QDeclarativeKeysAttached);
- return QDeclarativeListProperty<QDeclarativeItem>(this, d->targets);
- }
-
- virtual void componentComplete();
-
- static QDeclarativeKeysAttached *qmlAttachedProperties(QObject *);
-
-Q_SIGNALS:
- void enabledChanged();
- void priorityChanged();
- void pressed(QDeclarativeKeyEvent *event);
- void released(QDeclarativeKeyEvent *event);
- void digit0Pressed(QDeclarativeKeyEvent *event);
- void digit1Pressed(QDeclarativeKeyEvent *event);
- void digit2Pressed(QDeclarativeKeyEvent *event);
- void digit3Pressed(QDeclarativeKeyEvent *event);
- void digit4Pressed(QDeclarativeKeyEvent *event);
- void digit5Pressed(QDeclarativeKeyEvent *event);
- void digit6Pressed(QDeclarativeKeyEvent *event);
- void digit7Pressed(QDeclarativeKeyEvent *event);
- void digit8Pressed(QDeclarativeKeyEvent *event);
- void digit9Pressed(QDeclarativeKeyEvent *event);
-
- void leftPressed(QDeclarativeKeyEvent *event);
- void rightPressed(QDeclarativeKeyEvent *event);
- void upPressed(QDeclarativeKeyEvent *event);
- void downPressed(QDeclarativeKeyEvent *event);
- void tabPressed(QDeclarativeKeyEvent *event);
- void backtabPressed(QDeclarativeKeyEvent *event);
-
- void asteriskPressed(QDeclarativeKeyEvent *event);
- void numberSignPressed(QDeclarativeKeyEvent *event);
- void escapePressed(QDeclarativeKeyEvent *event);
- void returnPressed(QDeclarativeKeyEvent *event);
- void enterPressed(QDeclarativeKeyEvent *event);
- void deletePressed(QDeclarativeKeyEvent *event);
- void spacePressed(QDeclarativeKeyEvent *event);
- void backPressed(QDeclarativeKeyEvent *event);
- void cancelPressed(QDeclarativeKeyEvent *event);
- void selectPressed(QDeclarativeKeyEvent *event);
- void yesPressed(QDeclarativeKeyEvent *event);
- void noPressed(QDeclarativeKeyEvent *event);
- void context1Pressed(QDeclarativeKeyEvent *event);
- void context2Pressed(QDeclarativeKeyEvent *event);
- void context3Pressed(QDeclarativeKeyEvent *event);
- void context4Pressed(QDeclarativeKeyEvent *event);
- void callPressed(QDeclarativeKeyEvent *event);
- void hangupPressed(QDeclarativeKeyEvent *event);
- void flipPressed(QDeclarativeKeyEvent *event);
- void menuPressed(QDeclarativeKeyEvent *event);
- void volumeUpPressed(QDeclarativeKeyEvent *event);
- void volumeDownPressed(QDeclarativeKeyEvent *event);
-
-private:
- virtual void keyPressed(QKeyEvent *event, bool post);
- virtual void keyReleased(QKeyEvent *event, bool post);
- virtual void inputMethodEvent(QInputMethodEvent *, bool post);
- virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
-
- const QByteArray keyToSignal(int key) {
- QByteArray keySignal;
- if (key >= Qt::Key_0 && key <= Qt::Key_9) {
- keySignal = "digit0Pressed";
- keySignal[5] = '0' + (key - Qt::Key_0);
- } else {
- int i = 0;
- while (sigMap[i].key && sigMap[i].key != key)
- ++i;
- keySignal = sigMap[i].sig;
- }
- return keySignal;
- }
-
- struct SigMap {
- int key;
- const char *sig;
- };
-
- static const SigMap sigMap[];
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeItemPrivate::ChangeTypes);
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeKeysAttached)
-QML_DECLARE_TYPEINFO(QDeclarativeKeysAttached, QML_HAS_ATTACHED_PROPERTIES)
-QML_DECLARE_TYPE(QDeclarativeKeyNavigationAttached)
-QML_DECLARE_TYPEINFO(QDeclarativeKeyNavigationAttached, QML_HAS_ATTACHED_PROPERTIES)
-QML_DECLARE_TYPE(QDeclarativeLayoutMirroringAttached)
-QML_DECLARE_TYPEINFO(QDeclarativeLayoutMirroringAttached, QML_HAS_ATTACHED_PROPERTIES)
-
-#endif // QDECLARATIVEITEM_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeitemchangelistener_p.h b/src/declarative/graphicsitems/qdeclarativeitemchangelistener_p.h
deleted file mode 100644
index 75b127f11c..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitemchangelistener_p.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEITEMCHANGELISTENER
-#define QDECLARATIVEITEMCHANGELISTENER
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-class QRectF;
-class QDeclarativeItem;
-class QDeclarativeAnchorsPrivate;
-class QDeclarativeItemChangeListener
-{
-public:
- virtual void itemGeometryChanged(QDeclarativeItem *, const QRectF &, const QRectF &) {}
- virtual void itemSiblingOrderChanged(QDeclarativeItem *) {}
- virtual void itemVisibilityChanged(QDeclarativeItem *) {}
- virtual void itemOpacityChanged(QDeclarativeItem *) {}
- virtual void itemDestroyed(QDeclarativeItem *) {}
- virtual QDeclarativeAnchorsPrivate *anchorPrivate() { return 0; }
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEITEMCHANGELISTENER
diff --git a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp b/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
deleted file mode 100644
index 57a91c4b57..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
+++ /dev/null
@@ -1,261 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeitemsmodule_p.h"
-
-#include <QtGui/qaction.h>
-#include <QtGui/qvalidator.h>
-#include <QtGui/qgraphicseffect.h>
-
-#include "private/qdeclarativeevents_p_p.h"
-#include "private/qdeclarativescalegrid_p_p.h"
-#include "private/qdeclarativeanimatedimage_p.h"
-#include "private/qdeclarativeborderimage_p.h"
-#include "private/qdeclarativepositioners_p.h"
-#include "private/qdeclarativemousearea_p.h"
-#include "private/qdeclarativeflickable_p.h"
-#include "private/qdeclarativeflickable_p_p.h"
-#include "private/qdeclarativeflipable_p.h"
-#include "private/qdeclarativefocuspanel_p.h"
-#include "private/qdeclarativefocusscope_p.h"
-#include "private/qdeclarativegridview_p.h"
-#include "private/qdeclarativeimage_p.h"
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativelayoutitem_p.h"
-#include "private/qdeclarativelistview_p.h"
-#include "private/qdeclarativeloader_p.h"
-#include "private/qdeclarativemousearea_p.h"
-#include "private/qdeclarativepath_p.h"
-#include "private/qdeclarativepathview_p.h"
-#include "private/qdeclarativerectangle_p.h"
-#include "private/qdeclarativerepeater_p.h"
-#include "private/qdeclarativetranslate_p.h"
-#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativetextedit_p.h"
-#include "private/qdeclarativetextinput_p.h"
-#include "private/qdeclarativevisualitemmodel_p.h"
-#include "private/qdeclarativegraphicswidget_p.h"
-#ifdef QT_WEBKIT_LIB
-#include "private/qdeclarativewebview_p.h"
-#include "private/qdeclarativewebview_p_p.h"
-#endif
-#include "private/qdeclarativeanchors_p.h"
-#include "private/qdeclarativepincharea_p.h"
-
-static QDeclarativePrivate::AutoParentResult qgraphicsobject_autoParent(QObject *obj, QObject *parent)
-{
- QGraphicsObject* gobj = qobject_cast<QGraphicsObject*>(obj);
- if (!gobj)
- return QDeclarativePrivate::IncompatibleObject;
-
- QGraphicsObject* gparent = qobject_cast<QGraphicsObject*>(parent);
- if (!gparent)
- return QDeclarativePrivate::IncompatibleParent;
-
- gobj->setParentItem(gparent);
- return QDeclarativePrivate::Parented;
-}
-
-void QDeclarativeItemModule::defineModule()
-{
- QDeclarativePrivate::RegisterAutoParent autoparent = { 0, &qgraphicsobject_autoParent };
- QDeclarativePrivate::qmlregister(QDeclarativePrivate::AutoParentRegistration, &autoparent);
-#ifdef QT_NO_MOVIE
- qmlRegisterTypeNotAvailable("QtQuick",1,0,"AnimatedImage",
- qApp->translate("QDeclarativeAnimatedImage","Qt was built without support for QMovie"));
-#else
- qmlRegisterType<QDeclarativeAnimatedImage>("QtQuick",1,0,"AnimatedImage");
-#endif
- qmlRegisterType<QDeclarativeBorderImage>("QtQuick",1,0,"BorderImage");
- qmlRegisterType<QDeclarativeColumn>("QtQuick",1,0,"Column");
- qmlRegisterType<QDeclarativeDrag>("QtQuick",1,0,"Drag");
- qmlRegisterType<QDeclarativeFlickable>("QtQuick",1,0,"Flickable");
- qmlRegisterType<QDeclarativeFlipable>("QtQuick",1,0,"Flipable");
- qmlRegisterType<QDeclarativeFlow>("QtQuick",1,0,"Flow");
- qmlRegisterType<QDeclarativeFocusPanel>("QtQuick",1,0,"FocusPanel");
- qmlRegisterType<QDeclarativeFocusScope>("QtQuick",1,0,"FocusScope");
- qmlRegisterType<QDeclarativeGradient>("QtQuick",1,0,"Gradient");
- qmlRegisterType<QDeclarativeGradientStop>("QtQuick",1,0,"GradientStop");
- qmlRegisterType<QDeclarativeGrid>("QtQuick",1,0,"Grid");
- qmlRegisterType<QDeclarativeGridView>("QtQuick",1,0,"GridView");
- qmlRegisterType<QDeclarativeImage>("QtQuick",1,0,"Image");
- qmlRegisterType<QDeclarativeItem>("QtQuick",1,0,"Item");
- qmlRegisterType<QDeclarativeLayoutItem>("QtQuick",1,0,"LayoutItem");
- qmlRegisterType<QDeclarativeListView>("QtQuick",1,0,"ListView");
- qmlRegisterType<QDeclarativeLoader>("QtQuick",1,0,"Loader");
- qmlRegisterType<QDeclarativeMouseArea>("QtQuick",1,0,"MouseArea");
- qmlRegisterType<QDeclarativePath>("QtQuick",1,0,"Path");
- qmlRegisterType<QDeclarativePathAttribute>("QtQuick",1,0,"PathAttribute");
- qmlRegisterType<QDeclarativePathCubic>("QtQuick",1,0,"PathCubic");
- qmlRegisterType<QDeclarativePathLine>("QtQuick",1,0,"PathLine");
- qmlRegisterType<QDeclarativePathPercent>("QtQuick",1,0,"PathPercent");
- qmlRegisterType<QDeclarativePathQuad>("QtQuick",1,0,"PathQuad");
- qmlRegisterType<QDeclarativePathView>("QtQuick",1,0,"PathView");
-#ifndef QT_NO_VALIDATOR
- qmlRegisterType<QIntValidator>("QtQuick",1,0,"IntValidator");
- qmlRegisterType<QDoubleValidator>("QtQuick",1,0,"DoubleValidator");
- qmlRegisterType<QRegExpValidator>("QtQuick",1,0,"RegExpValidator");
-#endif
- qmlRegisterType<QDeclarativeRectangle>("QtQuick",1,0,"Rectangle");
- qmlRegisterType<QDeclarativeRepeater>("QtQuick",1,0,"Repeater");
- qmlRegisterType<QGraphicsRotation>("QtQuick",1,0,"Rotation");
- qmlRegisterType<QDeclarativeRow>("QtQuick",1,0,"Row");
- qmlRegisterType<QDeclarativeTranslate>("QtQuick",1,0,"Translate");
- qmlRegisterType<QGraphicsScale>("QtQuick",1,0,"Scale");
- qmlRegisterType<QDeclarativeText>("QtQuick",1,0,"Text");
- qmlRegisterType<QDeclarativeTextEdit>("QtQuick",1,0,"TextEdit");
-#ifndef QT_NO_LINEEDIT
- qmlRegisterType<QDeclarativeTextInput>("QtQuick",1,0,"TextInput");
-#endif
- qmlRegisterType<QDeclarativeViewSection>("QtQuick",1,0,"ViewSection");
- qmlRegisterType<QDeclarativeVisualDataModel>("QtQuick",1,0,"VisualDataModel");
- qmlRegisterType<QDeclarativeVisualItemModel>("QtQuick",1,0,"VisualItemModel");
-
- qmlRegisterType<QDeclarativeAnchors>();
- qmlRegisterType<QDeclarativeKeyEvent>();
- qmlRegisterType<QDeclarativeMouseEvent>();
- qmlRegisterType<QGraphicsObject>();
- qmlRegisterType<QGraphicsWidget>("QtQuick",1,0,"QGraphicsWidget");
- qmlRegisterExtendedType<QGraphicsWidget,QDeclarativeGraphicsWidget>("QtQuick",1,0,"QGraphicsWidget");
- qmlRegisterType<QGraphicsTransform>();
- qmlRegisterType<QDeclarativePathElement>();
- qmlRegisterType<QDeclarativeCurve>();
- qmlRegisterType<QDeclarativeScaleGrid>();
-#ifndef QT_NO_VALIDATOR
- qmlRegisterType<QValidator>();
-#endif
- qmlRegisterType<QDeclarativeVisualModel>();
-#ifndef QT_NO_ACTION
- qmlRegisterType<QAction>();
-#endif
- qmlRegisterType<QDeclarativePen>();
- qmlRegisterType<QDeclarativeFlickableVisibleArea>();
-#ifndef QT_NO_GRAPHICSEFFECT
- qmlRegisterType<QGraphicsEffect>();
-#endif
-
- qmlRegisterUncreatableType<QDeclarativeKeyNavigationAttached>("QtQuick",1,0,"KeyNavigation",QDeclarativeKeyNavigationAttached::tr("KeyNavigation is only available via attached properties"));
- qmlRegisterUncreatableType<QDeclarativeKeysAttached>("QtQuick",1,0,"Keys",QDeclarativeKeysAttached::tr("Keys is only available via attached properties"));
-
- // QtQuick 1.1 items
- qmlRegisterType<QDeclarativePinchArea>("QtQuick",1,1,"PinchArea");
- qmlRegisterType<QDeclarativePinch>("QtQuick",1,1,"Pinch");
- qmlRegisterType<QDeclarativePinchEvent>();
- qmlRegisterType<QDeclarativeItem,1>("QtQuick",1,1,"Item");
- qmlRegisterType<QDeclarativeMouseArea,1>("QtQuick",1,1,"MouseArea");
- qmlRegisterType<QDeclarativeFlickable,1>("QtQuick",1,1,"Flickable");
- qmlRegisterType<QDeclarativeListView,1>("QtQuick",1,1,"ListView");
- qmlRegisterType<QDeclarativeGridView,1>("QtQuick",1,1,"GridView");
- qmlRegisterType<QDeclarativeRow,1>("QtQuick",1,1,"Row");
- qmlRegisterType<QDeclarativeGrid,1>("QtQuick",1,1,"Grid");
- qmlRegisterType<QDeclarativeFlow,1>("QtQuick",1,1,"Flow");
- qmlRegisterType<QDeclarativeRepeater,1>("QtQuick",1,1,"Repeater");
- qmlRegisterType<QDeclarativeText,1>("QtQuick",1,1,"Text");
- qmlRegisterType<QDeclarativeTextEdit,1>("QtQuick",1,1,"TextEdit");
-#ifndef QT_NO_LINEEDIT
- qmlRegisterType<QDeclarativeTextInput,1>("QtQuick",1,1,"TextInput");
-#endif
- qmlRegisterRevision<QDeclarativeImageBase,1>("QtQuick",1,1);
- qmlRegisterRevision<QDeclarativeImplicitSizeItem,0>("QtQuick",1,0);
- qmlRegisterRevision<QDeclarativeImplicitSizeItem,1>("QtQuick",1,1);
- qmlRegisterRevision<QDeclarativeImplicitSizePaintedItem,0>("QtQuick",1,0);
- qmlRegisterRevision<QDeclarativeImplicitSizePaintedItem,1>("QtQuick",1,1);
- qmlRegisterUncreatableType<QDeclarativeLayoutMirroringAttached>("QtQuick",1,1,"LayoutMirroring", QDeclarativeLayoutMirroringAttached::tr("LayoutMirroring is only available via attached properties"));
-
-#ifndef QT_NO_IMPORT_QT47_QML
-#ifdef QT_NO_MOVIE
- qmlRegisterTypeNotAvailable("Qt",4,7,"AnimatedImage",
- qApp->translate("QDeclarativeAnimatedImage","Qt was built without support for QMovie"));
-#else
- qmlRegisterType<QDeclarativeAnimatedImage>("Qt",4,7,"AnimatedImage");
-#endif
- qmlRegisterType<QDeclarativeBorderImage>("Qt",4,7,"BorderImage");
- qmlRegisterType<QDeclarativeColumn>("Qt",4,7,"Column");
- qmlRegisterType<QDeclarativeDrag>("Qt",4,7,"Drag");
- qmlRegisterType<QDeclarativeFlickable>("Qt",4,7,"Flickable");
- qmlRegisterType<QDeclarativeFlipable>("Qt",4,7,"Flipable");
- qmlRegisterType<QDeclarativeFlow>("Qt",4,7,"Flow");
- qmlRegisterType<QDeclarativeFocusPanel>("Qt",4,7,"FocusPanel");
- qmlRegisterType<QDeclarativeFocusScope>("Qt",4,7,"FocusScope");
- qmlRegisterType<QDeclarativeGradient>("Qt",4,7,"Gradient");
- qmlRegisterType<QDeclarativeGradientStop>("Qt",4,7,"GradientStop");
- qmlRegisterType<QDeclarativeGrid>("Qt",4,7,"Grid");
- qmlRegisterType<QDeclarativeGridView>("Qt",4,7,"GridView");
- qmlRegisterType<QDeclarativeImage>("Qt",4,7,"Image");
- qmlRegisterType<QDeclarativeItem>("Qt",4,7,"Item");
- qmlRegisterType<QDeclarativeLayoutItem>("Qt",4,7,"LayoutItem");
- qmlRegisterType<QDeclarativeListView>("Qt",4,7,"ListView");
- qmlRegisterType<QDeclarativeLoader>("Qt",4,7,"Loader");
- qmlRegisterType<QDeclarativeMouseArea>("Qt",4,7,"MouseArea");
- qmlRegisterType<QDeclarativePath>("Qt",4,7,"Path");
- qmlRegisterType<QDeclarativePathAttribute>("Qt",4,7,"PathAttribute");
- qmlRegisterType<QDeclarativePathCubic>("Qt",4,7,"PathCubic");
- qmlRegisterType<QDeclarativePathLine>("Qt",4,7,"PathLine");
- qmlRegisterType<QDeclarativePathPercent>("Qt",4,7,"PathPercent");
- qmlRegisterType<QDeclarativePathQuad>("Qt",4,7,"PathQuad");
- qmlRegisterType<QDeclarativePathView>("Qt",4,7,"PathView");
-#ifndef QT_NO_VALIDATOR
- qmlRegisterType<QIntValidator>("Qt",4,7,"IntValidator");
- qmlRegisterType<QDoubleValidator>("Qt",4,7,"DoubleValidator");
- qmlRegisterType<QRegExpValidator>("Qt",4,7,"RegExpValidator");
-#endif
- qmlRegisterType<QDeclarativeRectangle>("Qt",4,7,"Rectangle");
- qmlRegisterType<QDeclarativeRepeater>("Qt",4,7,"Repeater");
- qmlRegisterType<QGraphicsRotation>("Qt",4,7,"Rotation");
- qmlRegisterType<QDeclarativeRow>("Qt",4,7,"Row");
- qmlRegisterType<QDeclarativeTranslate>("Qt",4,7,"Translate");
- qmlRegisterType<QGraphicsScale>("Qt",4,7,"Scale");
- qmlRegisterType<QDeclarativeText>("Qt",4,7,"Text");
- qmlRegisterType<QDeclarativeTextEdit>("Qt",4,7,"TextEdit");
-#ifndef QT_NO_LINEEDIT
- qmlRegisterType<QDeclarativeTextInput>("Qt",4,7,"TextInput");
-#endif
- qmlRegisterType<QDeclarativeViewSection>("Qt",4,7,"ViewSection");
- qmlRegisterType<QDeclarativeVisualDataModel>("Qt",4,7,"VisualDataModel");
- qmlRegisterType<QDeclarativeVisualItemModel>("Qt",4,7,"VisualItemModel");
-
- qmlRegisterType<QGraphicsWidget>("Qt",4,7,"QGraphicsWidget");
- qmlRegisterExtendedType<QGraphicsWidget,QDeclarativeGraphicsWidget>("Qt",4,7,"QGraphicsWidget");
-
- qmlRegisterUncreatableType<QDeclarativeKeyNavigationAttached>("Qt",4,7,"KeyNavigation",QDeclarativeKeyNavigationAttached::tr("KeyNavigation is only available via attached properties"));
- qmlRegisterUncreatableType<QDeclarativeKeysAttached>("Qt",4,7,"Keys",QDeclarativeKeysAttached::tr("Keys is only available via attached properties"));
-#endif
-}
diff --git a/src/declarative/graphicsitems/qdeclarativeitemsmodule_p.h b/src/declarative/graphicsitems/qdeclarativeitemsmodule_p.h
deleted file mode 100644
index ad60002a4f..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeitemsmodule_p.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEITEMMODULE_H
-#define QDECLARATIVEITEMMODULE_H
-
-#include <qdeclarative.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeItemModule
-{
-public:
- static void defineModule();
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEITEMMODULE_H
diff --git a/src/declarative/graphicsitems/qdeclarativelayoutitem.cpp b/src/declarative/graphicsitems/qdeclarativelayoutitem.cpp
deleted file mode 100644
index 6c66355d20..0000000000
--- a/src/declarative/graphicsitems/qdeclarativelayoutitem.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativelayoutitem_p.h"
-
-#include <QDebug>
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass LayoutItem QDeclarativeLayoutItem
- \ingroup qml-utility-elements
- \since 4.7
- \brief The LayoutItem element allows declarative UI elements to be placed inside Qt's Graphics View layouts.
-
- LayoutItem is a variant of \l Item with additional size hint properties. These properties provide the size hints
- necessary for items to work in conjunction with Qt \l{Graphics View Framework}{Graphics View} layout classes
- such as QGraphicsLinearLayout and QGraphicsGridLayout. The Qt layout mechanisms will resize the LayoutItem as appropriate,
- taking its size hints into account, and you can propagate this to the other elements in your UI via anchors and bindings.
-
- This is a QGraphicsLayoutItem subclass, and its properties merely expose the QGraphicsLayoutItem functionality to QML.
-
- The \l{declarative/cppextensions/qgraphicslayouts/layoutitem}{LayoutItem example}
- demonstrates how a LayoutItem can be used within a \l{Graphics View Framework}{Graphics View}
- scene.
-*/
-
-/*!
- \qmlproperty QSizeF LayoutItem::maximumSize
-
- The maximumSize property can be set to specify the maximum desired size of this LayoutItem
-*/
-
-/*!
- \qmlproperty QSizeF LayoutItem::minimumSize
-
- The minimumSize property can be set to specify the minimum desired size of this LayoutItem
-*/
-
-/*!
- \qmlproperty QSizeF LayoutItem::preferredSize
-
- The preferredSize property can be set to specify the preferred size of this LayoutItem
-*/
-
-QDeclarativeLayoutItem::QDeclarativeLayoutItem(QDeclarativeItem* parent)
- : QDeclarativeItem(parent), m_maximumSize(INT_MAX,INT_MAX), m_minimumSize(0,0), m_preferredSize(0,0)
-{
- setGraphicsItem(this);
-}
-
-void QDeclarativeLayoutItem::setGeometry(const QRectF & rect)
-{
- setX(rect.x());
- setY(rect.y());
- setWidth(rect.width());
- setHeight(rect.height());
-}
-
-QSizeF QDeclarativeLayoutItem::sizeHint(Qt::SizeHint w, const QSizeF &constraint) const
-{
- Q_UNUSED(constraint);
- if(w == Qt::MinimumSize){
- return m_minimumSize;
- }else if(w == Qt::MaximumSize){
- return m_maximumSize;
- }else{
- return m_preferredSize;
- }
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativelayoutitem_p.h b/src/declarative/graphicsitems/qdeclarativelayoutitem_p.h
deleted file mode 100644
index ec6fa3b50f..0000000000
--- a/src/declarative/graphicsitems/qdeclarativelayoutitem_p.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEGRAPHICSLAYOUTITEM_H
-#define QDECLARATIVEGRAPHICSLAYOUTITEM_H
-#include "qdeclarativeitem.h"
-
-#include <QGraphicsLayoutItem>
-#include <QSizeF>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeLayoutItem : public QDeclarativeItem, public QGraphicsLayoutItem
-{
- Q_OBJECT
- Q_INTERFACES(QGraphicsLayoutItem)
- Q_PROPERTY(QSizeF maximumSize READ maximumSize WRITE setMaximumSize NOTIFY maximumSizeChanged)
- Q_PROPERTY(QSizeF minimumSize READ minimumSize WRITE setMinimumSize NOTIFY minimumSizeChanged)
- Q_PROPERTY(QSizeF preferredSize READ preferredSize WRITE setPreferredSize NOTIFY preferredSizeChanged)
-public:
- QDeclarativeLayoutItem(QDeclarativeItem* parent=0);
-
- QSizeF maximumSize() const { return m_maximumSize; }
- void setMaximumSize(const QSizeF &s) { if(s==m_maximumSize) return; m_maximumSize = s; emit maximumSizeChanged(); }
-
- QSizeF minimumSize() const { return m_minimumSize; }
- void setMinimumSize(const QSizeF &s) { if(s==m_minimumSize) return; m_minimumSize = s; emit minimumSizeChanged(); }
-
- QSizeF preferredSize() const { return m_preferredSize; }
- void setPreferredSize(const QSizeF &s) { if(s==m_preferredSize) return; m_preferredSize = s; emit preferredSizeChanged(); }
-
- virtual void setGeometry(const QRectF & rect);
-protected:
- virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
-
-Q_SIGNALS:
- void maximumSizeChanged();
- void minimumSizeChanged();
- void preferredSizeChanged();
-
-private:
- QSizeF m_maximumSize;
- QSizeF m_minimumSize;
- QSizeF m_preferredSize;
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeLayoutItem)
-
-QT_END_HEADER
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
deleted file mode 100644
index 225b031530..0000000000
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ /dev/null
@@ -1,3614 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativelistview_p.h"
-
-#include "private/qdeclarativeflickable_p_p.h"
-#include "private/qdeclarativevisualitemmodel_p.h"
-
-#include "private/qdeclarativesmoothedanimation_p_p.h"
-#include <qdeclarativeexpression.h>
-#include <qdeclarativeengine.h>
-#include <qdeclarativeguard_p.h>
-#include <qdeclarativeinfo.h>
-
-#include <qlistmodelinterface_p.h>
-#include <qmath.h>
-#include <QKeyEvent>
-
-QT_BEGIN_NAMESPACE
-
-void QDeclarativeViewSection::setProperty(const QString &property)
-{
- if (property != m_property) {
- m_property = property;
- emit propertyChanged();
- }
-}
-
-void QDeclarativeViewSection::setCriteria(QDeclarativeViewSection::SectionCriteria criteria)
-{
- if (criteria != m_criteria) {
- m_criteria = criteria;
- emit criteriaChanged();
- }
-}
-
-void QDeclarativeViewSection::setDelegate(QDeclarativeComponent *delegate)
-{
- if (delegate != m_delegate) {
- m_delegate = delegate;
- emit delegateChanged();
- }
-}
-
-QString QDeclarativeViewSection::sectionString(const QString &value)
-{
- if (m_criteria == FirstCharacter)
- return value.isEmpty() ? QString() : value.at(0);
- else
- return value;
-}
-
-//----------------------------------------------------------------------------
-
-class FxListItem
-{
-public:
- FxListItem(QDeclarativeItem *i, QDeclarativeListView *v) : item(i), section(0), view(v) {
- attached = static_cast<QDeclarativeListViewAttached*>(qmlAttachedPropertiesObject<QDeclarativeListView>(item));
- if (attached)
- attached->setView(view);
- }
- ~FxListItem() {}
- qreal position() const {
- if (section) {
- if (view->orientation() == QDeclarativeListView::Vertical)
- return section->y();
- else
- return (view->effectiveLayoutDirection() == Qt::RightToLeft ? -section->width()-section->x() : section->x());
- } else {
- return itemPosition();
- }
- }
-
- qreal itemPosition() const {
- if (view->orientation() == QDeclarativeListView::Vertical)
- return item->y();
- else
- return (view->effectiveLayoutDirection() == Qt::RightToLeft ? -item->width()-item->x() : item->x());
- }
- qreal size() const {
- if (section)
- return (view->orientation() == QDeclarativeListView::Vertical ? item->height()+section->height() : item->width()+section->width());
- else
- return (view->orientation() == QDeclarativeListView::Vertical ? item->height() : item->width());
- }
- qreal itemSize() const {
- return (view->orientation() == QDeclarativeListView::Vertical ? item->height() : item->width());
- }
- qreal sectionSize() const {
- if (section)
- return (view->orientation() == QDeclarativeListView::Vertical ? section->height() : section->width());
- return 0.0;
- }
- qreal endPosition() const {
- if (view->orientation() == QDeclarativeListView::Vertical) {
- return item->y() + (item->height() >= 1.0 ? item->height() : 1) - 1;
- } else {
- return (view->effectiveLayoutDirection() == Qt::RightToLeft
- ? -item->width()-item->x() + (item->width() >= 1.0 ? item->width() : 1)
- : item->x() + (item->width() >= 1.0 ? item->width() : 1)) - 1;
- }
- }
- void setPosition(qreal pos) {
- if (view->orientation() == QDeclarativeListView::Vertical) {
- if (section) {
- section->setY(pos);
- pos += section->height();
- }
- item->setY(pos);
- } else {
- if (view->effectiveLayoutDirection() == Qt::RightToLeft) {
- if (section) {
- section->setX(-section->width()-pos);
- pos += section->width();
- }
- item->setX(-item->width()-pos);
- } else {
- if (section) {
- section->setX(pos);
- pos += section->width();
- }
- item->setX(pos);
- }
- }
- }
- void setSize(qreal size) {
- if (view->orientation() == QDeclarativeListView::Vertical)
- item->setHeight(size);
- else
- item->setWidth(size);
- }
- bool contains(qreal x, qreal y) const {
- return (x >= item->x() && x < item->x() + item->width() &&
- y >= item->y() && y < item->y() + item->height());
- }
-
- QDeclarativeItem *item;
- QDeclarativeItem *section;
- QDeclarativeListView *view;
- QDeclarativeListViewAttached *attached;
- int index;
-};
-
-//----------------------------------------------------------------------------
-
-class QDeclarativeListViewPrivate : public QDeclarativeFlickablePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeListView)
-
-public:
- QDeclarativeListViewPrivate()
- : currentItem(0), orient(QDeclarativeListView::Vertical), layoutDirection(Qt::LeftToRight)
- , visiblePos(0), visibleIndex(0)
- , averageSize(100.0), currentIndex(-1), requestedIndex(-1)
- , itemCount(0), highlightRangeStart(0), highlightRangeEnd(0)
- , highlightRangeStartValid(false), highlightRangeEndValid(false)
- , highlightComponent(0), highlight(0), trackedItem(0)
- , moveReason(Other), buffer(0), highlightPosAnimator(0), highlightSizeAnimator(0)
- , sectionCriteria(0), spacing(0.0)
- , highlightMoveSpeed(400), highlightMoveDuration(-1)
- , highlightResizeSpeed(400), highlightResizeDuration(-1), highlightRange(QDeclarativeListView::NoHighlightRange)
- , snapMode(QDeclarativeListView::NoSnap), overshootDist(0.0)
- , footerComponent(0), footer(0), headerComponent(0), header(0)
- , bufferMode(BufferBefore | BufferAfter)
- , ownModel(false), wrap(false), autoHighlight(true), haveHighlightRange(false)
- , correctFlick(false), inFlickCorrection(false), lazyRelease(false)
- , deferredRelease(false), layoutScheduled(false), currentIndexCleared(false)
- , inViewportMoved(false)
- , minExtentDirty(true), maxExtentDirty(true)
- {}
-
- void init();
- void clear();
- FxListItem *createItem(int modelIndex);
- void releaseItem(FxListItem *item);
-
- FxListItem *visibleItem(int modelIndex) const {
- if (modelIndex >= visibleIndex && modelIndex < visibleIndex + visibleItems.count()) {
- for (int i = modelIndex - visibleIndex; i < visibleItems.count(); ++i) {
- FxListItem *item = visibleItems.at(i);
- if (item->index == modelIndex)
- return item;
- }
- }
- return 0;
- }
-
- FxListItem *firstVisibleItem() const {
- const qreal pos = isRightToLeft() ? -position()-size() : position();
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxListItem *item = visibleItems.at(i);
- if (item->index != -1 && item->endPosition() > pos)
- return item;
- }
- return visibleItems.count() ? visibleItems.first() : 0;
- }
-
- FxListItem *nextVisibleItem() const {
- const qreal pos = isRightToLeft() ? -position()-size() : position();
- bool foundFirst = false;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxListItem *item = visibleItems.at(i);
- if (item->index != -1) {
- if (foundFirst)
- return item;
- else if (item->position() < pos && item->endPosition() > pos)
- foundFirst = true;
- }
- }
- return 0;
- }
-
- // Returns the item before modelIndex, if created.
- // May return an item marked for removal.
- FxListItem *itemBefore(int modelIndex) const {
- if (modelIndex < visibleIndex)
- return 0;
- int idx = 1;
- int lastIndex = -1;
- while (idx < visibleItems.count()) {
- FxListItem *item = visibleItems.at(idx);
- if (item->index != -1)
- lastIndex = item->index;
- if (item->index == modelIndex)
- return visibleItems.at(idx-1);
- ++idx;
- }
- if (lastIndex == modelIndex-1)
- return visibleItems.last();
- return 0;
- }
-
- void regenerate() {
- Q_Q(QDeclarativeListView);
- if (q->isComponentComplete()) {
- if (header) {
- if (q->scene())
- q->scene()->removeItem(header->item);
- header->item->deleteLater();
- delete header;
- header = 0;
- }
- if (footer) {
- if (q->scene())
- q->scene()->removeItem(footer->item);
- footer->item->deleteLater();
- delete footer;
- footer = 0;
- }
- updateHeader();
- updateFooter();
- clear();
- setPosition(0);
- q->refill();
- updateCurrent(currentIndex);
- }
- }
-
- void mirrorChange() {
- Q_Q(QDeclarativeListView);
- regenerate();
- emit q->effectiveLayoutDirectionChanged();
- }
-
- bool isRightToLeft() const {
- Q_Q(const QDeclarativeListView);
- return orient == QDeclarativeListView::Horizontal && q->effectiveLayoutDirection() == Qt::RightToLeft;
- }
-
- qreal position() const {
- Q_Q(const QDeclarativeListView);
- return orient == QDeclarativeListView::Vertical ? q->contentY() : q->contentX();
- }
-
- void setPosition(qreal pos) {
- Q_Q(QDeclarativeListView);
- if (orient == QDeclarativeListView::Vertical) {
- q->QDeclarativeFlickable::setContentY(pos);
- } else {
- if (isRightToLeft())
- q->QDeclarativeFlickable::setContentX(-pos-size());
- else
- q->QDeclarativeFlickable::setContentX(pos);
- }
- }
- qreal size() const {
- Q_Q(const QDeclarativeListView);
- return orient == QDeclarativeListView::Vertical ? q->height() : q->width();
- }
-
- qreal originPosition() const {
- qreal pos = 0;
- if (!visibleItems.isEmpty()) {
- pos = (*visibleItems.constBegin())->position();
- if (visibleIndex > 0)
- pos -= visibleIndex * (averageSize + spacing);
- }
- return pos;
- }
-
- qreal lastPosition() const {
- qreal pos = 0;
- if (!visibleItems.isEmpty()) {
- int invisibleCount = visibleItems.count() - visibleIndex;
- for (int i = visibleItems.count()-1; i >= 0; --i) {
- if (visibleItems.at(i)->index != -1) {
- invisibleCount = model->count() - visibleItems.at(i)->index - 1;
- break;
- }
- }
- pos = (*(--visibleItems.constEnd()))->endPosition() + invisibleCount * (averageSize + spacing);
- } else if (model && model->count()) {
- pos = model->count() * averageSize + (model->count()-1) * spacing;
- }
- return pos;
- }
-
- qreal startPosition() const {
- return isRightToLeft() ? -lastPosition()-1 : originPosition();
- }
-
- qreal endPosition() const {
- return isRightToLeft() ? -originPosition()-1 : lastPosition();
- }
-
- qreal positionAt(int modelIndex) const {
- if (FxListItem *item = visibleItem(modelIndex))
- return item->position();
- if (!visibleItems.isEmpty()) {
- if (modelIndex < visibleIndex) {
- int count = visibleIndex - modelIndex;
- qreal cs = 0;
- if (modelIndex == currentIndex && currentItem) {
- cs = currentItem->size() + spacing;
- --count;
- }
- return (*visibleItems.constBegin())->position() - count * (averageSize + spacing) - cs;
- } else {
- int idx = visibleItems.count() - 1;
- while (idx >= 0 && visibleItems.at(idx)->index == -1)
- --idx;
- if (idx < 0)
- idx = visibleIndex;
- else
- idx = visibleItems.at(idx)->index;
- int count = modelIndex - idx - 1;
-
- return (*(--visibleItems.constEnd()))->endPosition() + spacing + count * (averageSize + spacing) + 1;
- }
- }
- return 0;
- }
-
- qreal endPositionAt(int modelIndex) const {
- if (FxListItem *item = visibleItem(modelIndex))
- return item->endPosition();
- if (!visibleItems.isEmpty()) {
- if (modelIndex < visibleIndex) {
- int count = visibleIndex - modelIndex;
- return (*visibleItems.constBegin())->position() - (count - 1) * (averageSize + spacing) - spacing - 1;
- } else {
- int idx = visibleItems.count() - 1;
- while (idx >= 0 && visibleItems.at(idx)->index == -1)
- --idx;
- if (idx < 0)
- idx = visibleIndex;
- else
- idx = visibleItems.at(idx)->index;
- int count = modelIndex - idx - 1;
- return (*(--visibleItems.constEnd()))->endPosition() + count * (averageSize + spacing);
- }
- }
- return 0;
- }
-
- QString sectionAt(int modelIndex) {
- if (FxListItem *item = visibleItem(modelIndex))
- return item->attached->section();
-
- QString section;
- if (sectionCriteria) {
- QString propValue = model->stringValue(modelIndex, sectionCriteria->property());
- section = sectionCriteria->sectionString(propValue);
- }
-
- return section;
- }
-
- bool isValid() const {
- return model && model->count() && model->isValid();
- }
-
- qreal snapPosAt(qreal pos) {
- if (FxListItem *snapItem = snapItemAt(pos))
- return snapItem->position();
- if (visibleItems.count()) {
- qreal firstPos = visibleItems.first()->position();
- qreal endPos = visibleItems.last()->position();
- if (pos < firstPos) {
- return firstPos - qRound((firstPos - pos) / averageSize) * averageSize;
- } else if (pos > endPos)
- return endPos + qRound((pos - endPos) / averageSize) * averageSize;
- }
- return qRound((pos - originPosition()) / averageSize) * averageSize + originPosition();
- }
-
- FxListItem *snapItemAt(qreal pos) {
- FxListItem *snapItem = 0;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxListItem *item = visibleItems[i];
- if (item->index == -1)
- continue;
- qreal itemTop = item->position();
- if (highlight && itemTop >= pos && item->endPosition() <= pos + highlight->size() - 1)
- return item;
- if (itemTop+item->size()/2 >= pos && itemTop-item->size()/2 < pos)
- snapItem = item;
- }
- return snapItem;
- }
-
- int lastVisibleIndex() const {
- int lastIndex = -1;
- for (int i = visibleItems.count()-1; i >= 0; --i) {
- FxListItem *listItem = visibleItems.at(i);
- if (listItem->index != -1) {
- lastIndex = listItem->index;
- break;
- }
- }
- return lastIndex;
- }
-
- // map a model index to visibleItems index.
- int mapFromModel(int modelIndex) const {
- if (modelIndex < visibleIndex || modelIndex >= visibleIndex + visibleItems.count())
- return -1;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxListItem *listItem = visibleItems.at(i);
- if (listItem->index == modelIndex)
- return i;
- if (listItem->index > modelIndex)
- return -1;
- }
- return -1; // Not in visibleList
- }
-
- void updateViewport() {
- Q_Q(QDeclarativeListView);
- if (orient == QDeclarativeListView::Vertical) {
- q->setContentHeight(endPosition() - startPosition() + 1);
- } else {
- q->setContentWidth(endPosition() - startPosition() + 1);
- }
- }
-
- void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
- Q_Q(QDeclarativeListView);
- QDeclarativeFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
- if (!q->isComponentComplete())
- return;
- if (item != contentItem && (!highlight || item != highlight->item)) {
- if ((orient == QDeclarativeListView::Vertical && newGeometry.height() != oldGeometry.height())
- || (orient == QDeclarativeListView::Horizontal && newGeometry.width() != oldGeometry.width())) {
- scheduleLayout();
- }
- }
- if ((header && header->item == item) || (footer && footer->item == item)) {
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- }
- if (currentItem && currentItem->item == item)
- updateHighlight();
- if (trackedItem && trackedItem->item == item)
- q->trackedPositionChanged();
- }
-
- // for debugging only
- void checkVisible() const {
- int skip = 0;
- for (int i = 0; i < visibleItems.count(); ++i) {
- FxListItem *listItem = visibleItems.at(i);
- if (listItem->index == -1) {
- ++skip;
- } else if (listItem->index != visibleIndex + i - skip) {
- qFatal("index %d %d %d", visibleIndex, i, listItem->index);
- }
- }
- }
-
- void refill(qreal from, qreal to, bool doBuffer = false);
- void scheduleLayout();
- void layout();
- void updateUnrequestedIndexes();
- void updateUnrequestedPositions();
- void updateTrackedItem();
- void createHighlight();
- void updateHighlight();
- void createSection(FxListItem *);
- void updateSections();
- void updateCurrentSection();
- void updateCurrent(int);
- void updateAverage();
- void updateHeader();
- void updateFooter();
- void fixupPosition();
- void positionViewAtIndex(int index, int mode);
- virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
- virtual void flick(QDeclarativeFlickablePrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
-
- QDeclarativeGuard<QDeclarativeVisualModel> model;
- QVariant modelVariant;
- QList<FxListItem*> visibleItems;
- QHash<QDeclarativeItem*,int> unrequestedItems;
- FxListItem *currentItem;
- QDeclarativeListView::Orientation orient;
- Qt::LayoutDirection layoutDirection;
- qreal visiblePos;
- int visibleIndex;
- qreal averageSize;
- int currentIndex;
- int requestedIndex;
- int itemCount;
- qreal highlightRangeStart;
- qreal highlightRangeEnd;
- bool highlightRangeStartValid;
- bool highlightRangeEndValid;
- QDeclarativeComponent *highlightComponent;
- FxListItem *highlight;
- FxListItem *trackedItem;
- enum MovementReason { Other, SetIndex, Mouse };
- MovementReason moveReason;
- int buffer;
- QSmoothedAnimation *highlightPosAnimator;
- QSmoothedAnimation *highlightSizeAnimator;
- QDeclarativeViewSection *sectionCriteria;
- QString currentSection;
- static const int sectionCacheSize = 4;
- QDeclarativeItem *sectionCache[sectionCacheSize];
- qreal spacing;
- qreal highlightMoveSpeed;
- int highlightMoveDuration;
- qreal highlightResizeSpeed;
- int highlightResizeDuration;
- QDeclarativeListView::HighlightRangeMode highlightRange;
- QDeclarativeListView::SnapMode snapMode;
- qreal overshootDist;
- QDeclarativeComponent *footerComponent;
- FxListItem *footer;
- QDeclarativeComponent *headerComponent;
- FxListItem *header;
- enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
- int bufferMode;
- mutable qreal minExtent;
- mutable qreal maxExtent;
-
- bool ownModel : 1;
- bool wrap : 1;
- bool autoHighlight : 1;
- bool haveHighlightRange : 1;
- bool correctFlick : 1;
- bool inFlickCorrection : 1;
- bool lazyRelease : 1;
- bool deferredRelease : 1;
- bool layoutScheduled : 1;
- bool currentIndexCleared : 1;
- bool inViewportMoved : 1;
- mutable bool minExtentDirty : 1;
- mutable bool maxExtentDirty : 1;
-};
-
-void QDeclarativeListViewPrivate::init()
-{
- Q_Q(QDeclarativeListView);
- q->setFlag(QGraphicsItem::ItemIsFocusScope);
- addItemChangeListener(this, Geometry);
- QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped()));
- q->setFlickableDirection(QDeclarativeFlickable::VerticalFlick);
- ::memset(sectionCache, 0, sizeof(QDeclarativeItem*) * sectionCacheSize);
-}
-
-void QDeclarativeListViewPrivate::clear()
-{
- timeline.clear();
- for (int i = 0; i < visibleItems.count(); ++i)
- releaseItem(visibleItems.at(i));
- visibleItems.clear();
- for (int i = 0; i < sectionCacheSize; ++i) {
- delete sectionCache[i];
- sectionCache[i] = 0;
- }
- visiblePos = header ? header->size() : 0;
- visibleIndex = 0;
- releaseItem(currentItem);
- currentItem = 0;
- createHighlight();
- trackedItem = 0;
- minExtentDirty = true;
- maxExtentDirty = true;
- itemCount = 0;
-}
-
-FxListItem *QDeclarativeListViewPrivate::createItem(int modelIndex)
-{
- Q_Q(QDeclarativeListView);
- // create object
- requestedIndex = modelIndex;
- FxListItem *listItem = 0;
- if (QDeclarativeItem *item = model->item(modelIndex, false)) {
- listItem = new FxListItem(item, q);
- listItem->index = modelIndex;
- // initialise attached properties
- if (sectionCriteria) {
- QString propValue = model->stringValue(modelIndex, sectionCriteria->property());
- listItem->attached->m_section = sectionCriteria->sectionString(propValue);
- if (modelIndex > 0) {
- if (FxListItem *item = itemBefore(modelIndex))
- listItem->attached->m_prevSection = item->attached->section();
- else
- listItem->attached->m_prevSection = sectionAt(modelIndex-1);
- }
- if (modelIndex < model->count()-1) {
- if (FxListItem *item = visibleItem(modelIndex+1))
- listItem->attached->m_nextSection = item->attached->section();
- else
- listItem->attached->m_nextSection = sectionAt(modelIndex+1);
- }
- }
- if (model->completePending()) {
- // complete
- listItem->item->setZValue(1);
- listItem->item->setParentItem(q->contentItem());
- model->completeItem();
- } else {
- listItem->item->setParentItem(q->contentItem());
- }
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- if (sectionCriteria && sectionCriteria->delegate()) {
- if (listItem->attached->m_prevSection != listItem->attached->m_section)
- createSection(listItem);
- }
- unrequestedItems.remove(listItem->item);
- }
- requestedIndex = -1;
-
- return listItem;
-}
-
-void QDeclarativeListViewPrivate::releaseItem(FxListItem *item)
-{
- Q_Q(QDeclarativeListView);
- if (!item || !model)
- return;
- if (trackedItem == item)
- trackedItem = 0;
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item->item));
- itemPrivate->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- if (model->release(item->item) == 0) {
- // item was not destroyed, and we no longer reference it.
- unrequestedItems.insert(item->item, model->indexOf(item->item, q));
- }
- if (item->section) {
- int i = 0;
- do {
- if (!sectionCache[i]) {
- sectionCache[i] = item->section;
- sectionCache[i]->setVisible(false);
- item->section = 0;
- break;
- }
- ++i;
- } while (i < sectionCacheSize);
- delete item->section;
- }
- delete item;
-}
-
-void QDeclarativeListViewPrivate::refill(qreal from, qreal to, bool doBuffer)
-{
- Q_Q(QDeclarativeListView);
- if (!isValid() || !q->isComponentComplete())
- return;
- itemCount = model->count();
- qreal bufferFrom = from - buffer;
- qreal bufferTo = to + buffer;
- qreal fillFrom = from;
- qreal fillTo = to;
- if (doBuffer && (bufferMode & BufferAfter))
- fillTo = bufferTo;
- if (doBuffer && (bufferMode & BufferBefore))
- fillFrom = bufferFrom;
-
- bool haveValidItems = false;
- int modelIndex = visibleIndex;
- qreal itemEnd = visiblePos-1;
- if (!visibleItems.isEmpty()) {
- visiblePos = (*visibleItems.constBegin())->position();
- itemEnd = (*(--visibleItems.constEnd()))->endPosition() + spacing;
- int i = visibleItems.count() - 1;
- while (i > 0 && visibleItems.at(i)->index == -1)
- --i;
- if (visibleItems.at(i)->index != -1) {
- haveValidItems = true;
- modelIndex = visibleItems.at(i)->index + 1;
- }
- }
-
- if (haveValidItems && (fillFrom > itemEnd+averageSize+spacing
- || fillTo < visiblePos - averageSize - spacing)) {
- // We've jumped more than a page. Estimate which items are now
- // visible and fill from there.
- int count = (fillFrom - itemEnd) / (averageSize + spacing);
- for (int i = 0; i < visibleItems.count(); ++i)
- releaseItem(visibleItems.at(i));
- visibleItems.clear();
- modelIndex += count;
- if (modelIndex >= model->count()) {
- count -= modelIndex - model->count() + 1;
- modelIndex = model->count() - 1;
- } else if (modelIndex < 0) {
- count -= modelIndex;
- modelIndex = 0;
- }
- visibleIndex = modelIndex;
- visiblePos = itemEnd + count * (averageSize + spacing) + 1;
- itemEnd = visiblePos-1;
- }
-
- bool changed = false;
- FxListItem *item = 0;
- qreal pos = itemEnd + 1;
- while (modelIndex < model->count() && pos <= fillTo) {
-// qDebug() << "refill: append item" << modelIndex << "pos" << pos;
- if (!(item = createItem(modelIndex)))
- break;
- item->setPosition(pos);
- pos += item->size() + spacing;
- visibleItems.append(item);
- ++modelIndex;
- changed = true;
- if (doBuffer) // never buffer more than one item per frame
- break;
- }
- while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos-1 >= fillFrom) {
-// qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos;
- if (!(item = createItem(visibleIndex-1)))
- break;
- --visibleIndex;
- visiblePos -= item->size() + spacing;
- item->setPosition(visiblePos);
- visibleItems.prepend(item);
- changed = true;
- if (doBuffer) // never buffer more than one item per frame
- break;
- }
-
- if (!lazyRelease || !changed || deferredRelease) { // avoid destroying items in the same frame that we create
- while (visibleItems.count() > 1 && (item = visibleItems.first()) && item->endPosition() < bufferFrom) {
- if (item->attached->delayRemove())
- break;
-// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition();
- if (item->index != -1)
- visibleIndex++;
- visibleItems.removeFirst();
- releaseItem(item);
- changed = true;
- }
- while (visibleItems.count() > 1 && (item = visibleItems.last()) && item->position() > bufferTo) {
- if (item->attached->delayRemove())
- break;
-// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position();
- visibleItems.removeLast();
- releaseItem(item);
- changed = true;
- }
- deferredRelease = false;
- } else {
- deferredRelease = true;
- }
- if (changed) {
- minExtentDirty = true;
- maxExtentDirty = true;
- if (visibleItems.count())
- visiblePos = (*visibleItems.constBegin())->position();
- updateAverage();
- if (currentIndex >= 0 && currentItem && !visibleItem(currentIndex)) {
- currentItem->setPosition(positionAt(currentIndex));
- updateHighlight();
- }
-
- if (sectionCriteria)
- updateCurrentSection();
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- updateViewport();
- updateUnrequestedPositions();
- } else if (!doBuffer && buffer && bufferMode != NoBuffer) {
- refill(from, to, true);
- }
- lazyRelease = false;
-}
-
-void QDeclarativeListViewPrivate::scheduleLayout()
-{
- Q_Q(QDeclarativeListView);
- if (!layoutScheduled) {
- layoutScheduled = true;
- QCoreApplication::postEvent(q, new QEvent(QEvent::User), Qt::HighEventPriority);
- }
-}
-
-void QDeclarativeListViewPrivate::layout()
-{
- Q_Q(QDeclarativeListView);
- layoutScheduled = false;
- if (!isValid() && !visibleItems.count()) {
- clear();
- setPosition(0);
- return;
- }
- if (!visibleItems.isEmpty()) {
- bool fixedCurrent = currentItem && visibleItems.first()->item == currentItem->item;
- qreal sum = visibleItems.first()->size();
- qreal pos = visibleItems.first()->position() + visibleItems.first()->size() + spacing;
- for (int i=1; i < visibleItems.count(); ++i) {
- FxListItem *item = visibleItems.at(i);
- item->setPosition(pos);
- pos += item->size() + spacing;
- sum += item->size();
- fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item);
- }
- averageSize = qRound(sum / visibleItems.count());
- // move current item if it is not a visible item.
- if (currentIndex >= 0 && currentItem && !fixedCurrent)
- currentItem->setPosition(positionAt(currentIndex));
- }
- q->refill();
- minExtentDirty = true;
- maxExtentDirty = true;
- updateHighlight();
- if (!q->isMoving() && !q->isFlicking()) {
- fixupPosition();
- q->refill();
- }
- if (header)
- updateHeader();
- if (footer)
- updateFooter();
- updateViewport();
-}
-
-void QDeclarativeListViewPrivate::updateUnrequestedIndexes()
-{
- Q_Q(QDeclarativeListView);
- QHash<QDeclarativeItem*,int>::iterator it;
- for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it)
- *it = model->indexOf(it.key(), q);
-}
-
-void QDeclarativeListViewPrivate::updateUnrequestedPositions()
-{
- Q_Q(QDeclarativeListView);
- if (unrequestedItems.count()) {
- qreal pos = position();
- QHash<QDeclarativeItem*,int>::const_iterator it;
- for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it) {
- QDeclarativeItem *item = it.key();
- if (orient == QDeclarativeListView::Vertical) {
- if (item->y() + item->height() > pos && item->y() < pos + q->height())
- item->setY(positionAt(*it));
- } else {
- if (item->x() + item->width() > pos && item->x() < pos + q->width()) {
- if (isRightToLeft())
- item->setX(-positionAt(*it)-item->width());
- else
- item->setX(positionAt(*it));
- }
- }
- }
- }
-}
-
-void QDeclarativeListViewPrivate::updateTrackedItem()
-{
- Q_Q(QDeclarativeListView);
- FxListItem *item = currentItem;
- if (highlight)
- item = highlight;
- trackedItem = item;
- if (trackedItem)
- q->trackedPositionChanged();
-}
-
-void QDeclarativeListViewPrivate::createHighlight()
-{
- Q_Q(QDeclarativeListView);
- bool changed = false;
- if (highlight) {
- if (trackedItem == highlight)
- trackedItem = 0;
- if (highlight->item->scene())
- highlight->item->scene()->removeItem(highlight->item);
- highlight->item->deleteLater();
- delete highlight;
- highlight = 0;
- delete highlightPosAnimator;
- delete highlightSizeAnimator;
- highlightPosAnimator = 0;
- highlightSizeAnimator = 0;
- changed = true;
- }
-
- if (currentItem) {
- QDeclarativeItem *item = 0;
- if (highlightComponent) {
- QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = highlightComponent->create(highlightContext);
- if (nobj) {
- QDeclarative_setParent_noEvent(highlightContext, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete highlightContext;
- }
- } else {
- item = new QDeclarativeItem;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- highlight = new FxListItem(item, q);
- if (currentItem && autoHighlight) {
- if (orient == QDeclarativeListView::Vertical) {
- highlight->item->setHeight(currentItem->item->height());
- } else {
- highlight->item->setWidth(currentItem->item->width());
- }
- highlight->setPosition(currentItem->itemPosition());
- }
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- const QLatin1String posProp(orient == QDeclarativeListView::Vertical ? "y" : "x");
- highlightPosAnimator = new QSmoothedAnimation(q);
- highlightPosAnimator->target = QDeclarativeProperty(highlight->item, posProp);
- highlightPosAnimator->velocity = highlightMoveSpeed;
- highlightPosAnimator->userDuration = highlightMoveDuration;
- const QLatin1String sizeProp(orient == QDeclarativeListView::Vertical ? "height" : "width");
- highlightSizeAnimator = new QSmoothedAnimation(q);
- highlightSizeAnimator->velocity = highlightResizeSpeed;
- highlightSizeAnimator->userDuration = highlightResizeDuration;
- highlightSizeAnimator->target = QDeclarativeProperty(highlight->item, sizeProp);
- if (autoHighlight) {
- highlightPosAnimator->restart();
- highlightSizeAnimator->restart();
- }
- changed = true;
- }
- }
- if (changed)
- emit q->highlightItemChanged();
-}
-
-void QDeclarativeListViewPrivate::updateHighlight()
-{
- if ((!currentItem && highlight) || (currentItem && !highlight))
- createHighlight();
- if (currentItem && autoHighlight && highlight && !movingHorizontally && !movingVertically) {
- // auto-update highlight
- highlightPosAnimator->to = isRightToLeft()
- ? -currentItem->itemPosition()-currentItem->itemSize()
- : currentItem->itemPosition();
- highlightSizeAnimator->to = currentItem->itemSize();
- if (orient == QDeclarativeListView::Vertical) {
- if (highlight->item->width() == 0)
- highlight->item->setWidth(currentItem->item->width());
- } else {
- if (highlight->item->height() == 0)
- highlight->item->setHeight(currentItem->item->height());
- }
- highlightPosAnimator->restart();
- highlightSizeAnimator->restart();
- }
- updateTrackedItem();
-}
-
-void QDeclarativeListViewPrivate::createSection(FxListItem *listItem)
-{
- Q_Q(QDeclarativeListView);
- if (!sectionCriteria || !sectionCriteria->delegate())
- return;
- if (listItem->attached->m_prevSection != listItem->attached->m_section) {
- if (!listItem->section) {
- qreal pos = listItem->position();
- int i = sectionCacheSize-1;
- while (i >= 0 && !sectionCache[i])
- --i;
- if (i >= 0) {
- listItem->section = sectionCache[i];
- sectionCache[i] = 0;
- listItem->section->setVisible(true);
- QDeclarativeContext *context = QDeclarativeEngine::contextForObject(listItem->section)->parentContext();
- context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
- } else {
- QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
- context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
- QObject *nobj = sectionCriteria->delegate()->beginCreate(context);
- if (nobj) {
- QDeclarative_setParent_noEvent(context, nobj);
- listItem->section = qobject_cast<QDeclarativeItem *>(nobj);
- if (!listItem->section) {
- delete nobj;
- } else {
- listItem->section->setZValue(1);
- QDeclarative_setParent_noEvent(listItem->section, q->contentItem());
- listItem->section->setParentItem(q->contentItem());
- }
- } else {
- delete context;
- }
- sectionCriteria->delegate()->completeCreate();
- }
- listItem->setPosition(pos);
- } else {
- QDeclarativeContext *context = QDeclarativeEngine::contextForObject(listItem->section)->parentContext();
- context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
- }
- } else if (listItem->section) {
- qreal pos = listItem->position();
- int i = 0;
- do {
- if (!sectionCache[i]) {
- sectionCache[i] = listItem->section;
- sectionCache[i]->setVisible(false);
- listItem->section = 0;
- return;
- }
- ++i;
- } while (i < sectionCacheSize);
- delete listItem->section;
- listItem->section = 0;
- listItem->setPosition(pos);
- }
-}
-
-void QDeclarativeListViewPrivate::updateSections()
-{
- if (sectionCriteria && !visibleItems.isEmpty()) {
- QString prevSection;
- if (visibleIndex > 0)
- prevSection = sectionAt(visibleIndex-1);
- QDeclarativeListViewAttached *prevAtt = 0;
- int idx = -1;
- for (int i = 0; i < visibleItems.count(); ++i) {
- QDeclarativeListViewAttached *attached = visibleItems.at(i)->attached;
- attached->setPrevSection(prevSection);
- if (visibleItems.at(i)->index != -1) {
- QString propValue = model->stringValue(visibleItems.at(i)->index, sectionCriteria->property());
- attached->setSection(sectionCriteria->sectionString(propValue));
- idx = visibleItems.at(i)->index;
- }
- createSection(visibleItems.at(i));
- if (prevAtt)
- prevAtt->setNextSection(attached->section());
- prevSection = attached->section();
- prevAtt = attached;
- }
- if (prevAtt) {
- if (idx > 0 && idx < model->count()-1)
- prevAtt->setNextSection(sectionAt(idx+1));
- else
- prevAtt->setNextSection(QString());
- }
- }
-}
-
-void QDeclarativeListViewPrivate::updateCurrentSection()
-{
- Q_Q(QDeclarativeListView);
- if (!sectionCriteria || visibleItems.isEmpty()) {
- if (!currentSection.isEmpty()) {
- currentSection.clear();
- emit q->currentSectionChanged();
- }
- return;
- }
- int index = 0;
- while (index < visibleItems.count() && visibleItems.at(index)->endPosition() < position())
- ++index;
-
- QString newSection = currentSection;
- if (index < visibleItems.count())
- newSection = visibleItems.at(index)->attached->section();
- else
- newSection = visibleItems.first()->attached->section();
- if (newSection != currentSection) {
- currentSection = newSection;
- emit q->currentSectionChanged();
- }
-}
-
-void QDeclarativeListViewPrivate::updateCurrent(int modelIndex)
-{
- Q_Q(QDeclarativeListView);
- if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) {
- if (currentItem) {
- currentItem->attached->setIsCurrentItem(false);
- releaseItem(currentItem);
- currentItem = 0;
- currentIndex = modelIndex;
- emit q->currentIndexChanged();
- updateHighlight();
- } else if (currentIndex != modelIndex) {
- currentIndex = modelIndex;
- emit q->currentIndexChanged();
- }
- return;
- }
-
- if (currentItem && currentIndex == modelIndex) {
- updateHighlight();
- return;
- }
- FxListItem *oldCurrentItem = currentItem;
- currentIndex = modelIndex;
- currentItem = createItem(modelIndex);
- if (oldCurrentItem && (!currentItem || oldCurrentItem->item != currentItem->item))
- oldCurrentItem->attached->setIsCurrentItem(false);
- if (currentItem) {
- if (modelIndex == visibleIndex - 1 && visibleItems.count()) {
- // We can calculate exact postion in this case
- currentItem->setPosition(visibleItems.first()->position() - currentItem->size() - spacing);
- } else {
- // Create current item now and position as best we can.
- // Its position will be corrected when it becomes visible.
- currentItem->setPosition(positionAt(modelIndex));
- }
- currentItem->item->setFocus(true);
- currentItem->attached->setIsCurrentItem(true);
- // Avoid showing section delegate twice. We still need the section heading so that
- // currentItem positioning works correctly.
- // This is slightly sub-optimal, but section heading caching minimizes the impact.
- if (currentItem->section)
- currentItem->section->setVisible(false);
- if (visibleItems.isEmpty())
- averageSize = currentItem->size();
- }
- updateHighlight();
- emit q->currentIndexChanged();
- // Release the old current item
- releaseItem(oldCurrentItem);
-}
-
-void QDeclarativeListViewPrivate::updateAverage()
-{
- if (!visibleItems.count())
- return;
- qreal sum = 0.0;
- for (int i = 0; i < visibleItems.count(); ++i)
- sum += visibleItems.at(i)->size();
- averageSize = qRound(sum / visibleItems.count());
-}
-
-void QDeclarativeListViewPrivate::updateFooter()
-{
- Q_Q(QDeclarativeListView);
- if (!footer && footerComponent) {
- QDeclarativeItem *item = 0;
- QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = footerComponent->create(context);
- if (nobj) {
- QDeclarative_setParent_noEvent(context, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete context;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- item->setZValue(1);
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- footer = new FxListItem(item, q);
- }
- }
- if (footer) {
- if (visibleItems.count()) {
- qreal endPos = lastPosition() + 1;
- if (lastVisibleIndex() == model->count()-1) {
- footer->setPosition(endPos);
- } else {
- qreal visiblePos = position() + q->height();
- if (endPos <= visiblePos || footer->position() < endPos)
- footer->setPosition(endPos);
- }
- } else {
- footer->setPosition(visiblePos);
- }
- }
-}
-
-void QDeclarativeListViewPrivate::updateHeader()
-{
- Q_Q(QDeclarativeListView);
- if (!header && headerComponent) {
- QDeclarativeItem *item = 0;
- QDeclarativeContext *context = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = headerComponent->create(context);
- if (nobj) {
- QDeclarative_setParent_noEvent(context, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete context;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q->contentItem());
- item->setParentItem(q->contentItem());
- item->setZValue(1);
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- header = new FxListItem(item, q);
- }
- }
- if (header) {
- if (visibleItems.count()) {
- qreal startPos = originPosition();
- if (visibleIndex == 0) {
- header->setPosition(startPos - header->size());
- } else {
- if (position() <= startPos || header->position() > startPos - header->size())
- header->setPosition(startPos - header->size());
- }
- } else {
- if (itemCount == 0)
- visiblePos = header->size();
- header->setPosition(0);
- }
- }
-}
-
-void QDeclarativeListViewPrivate::fixupPosition()
-{
- if ((haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange)
- || snapMode != QDeclarativeListView::NoSnap)
- moveReason = Other;
- if (orient == QDeclarativeListView::Vertical)
- fixupY();
- else
- fixupX();
-}
-
-void QDeclarativeListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
-{
- if ((orient == QDeclarativeListView::Horizontal && &data == &vData)
- || (orient == QDeclarativeListView::Vertical && &data == &hData))
- return;
-
- correctFlick = false;
- fixupMode = moveReason == Mouse ? fixupMode : Immediate;
-
- qreal highlightStart;
- qreal highlightEnd;
- qreal viewPos;
- if (isRightToLeft()) {
- // Handle Right-To-Left exceptions
- viewPos = -position()-size();
- highlightStart = highlightRangeStartValid ? size() - highlightRangeEnd : highlightRangeStart;
- highlightEnd = highlightRangeEndValid ? size() - highlightRangeStart : highlightRangeEnd;
- } else {
- viewPos = position();
- highlightStart = highlightRangeStart;
- highlightEnd = highlightRangeEnd;
- }
-
- if (currentItem && haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange
- && moveReason != QDeclarativeListViewPrivate::SetIndex) {
- updateHighlight();
- qreal pos = currentItem->itemPosition();
- if (viewPos < pos + currentItem->itemSize() - highlightEnd)
- viewPos = pos + currentItem->itemSize() - highlightEnd;
- if (viewPos > pos - highlightStart)
- viewPos = pos - highlightStart;
- if (isRightToLeft())
- viewPos = -viewPos-size();
-
- timeline.reset(data.move);
- if (viewPos != position()) {
- if (fixupMode != Immediate) {
- timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
- data.fixingUp = true;
- } else {
- timeline.set(data.move, -viewPos);
- }
- }
- vTime = timeline.time();
- } else if (snapMode != QDeclarativeListView::NoSnap && moveReason != QDeclarativeListViewPrivate::SetIndex) {
- qreal tempPosition = isRightToLeft() ? -position()-size() : position();
- FxListItem *topItem = snapItemAt(tempPosition+highlightStart);
- FxListItem *bottomItem = snapItemAt(tempPosition+highlightEnd);
- qreal pos;
- bool isInBounds = -position() > maxExtent && -position() < minExtent;
- if (topItem && isInBounds) {
- if (topItem->index == 0 && header && tempPosition+highlightStart < header->position()+header->size()/2) {
- pos = isRightToLeft() ? - header->position() + highlightStart - size() : header->position() - highlightStart;
- } else {
- if (isRightToLeft())
- pos = qMax(qMin(-topItem->position() + highlightStart - size(), -maxExtent), -minExtent);
- else
- pos = qMax(qMin(topItem->position() - highlightStart, -maxExtent), -minExtent);
- }
- } else if (bottomItem && isInBounds) {
- if (isRightToLeft())
- pos = qMax(qMin(-bottomItem->position() + highlightStart - size(), -maxExtent), -minExtent);
- else
- pos = qMax(qMin(bottomItem->position() - highlightStart, -maxExtent), -minExtent);
- } else {
- QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
- return;
- }
-
- qreal dist = qAbs(data.move + pos);
- if (dist > 0) {
- timeline.reset(data.move);
- if (fixupMode != Immediate) {
- timeline.move(data.move, -pos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
- data.fixingUp = true;
- } else {
- timeline.set(data.move, -pos);
- }
- vTime = timeline.time();
- }
- } else {
- QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
- }
- data.inOvershoot = false;
- fixupMode = Normal;
-}
-
-void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
- QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
-{
- Q_Q(QDeclarativeListView);
-
- data.fixingUp = false;
- moveReason = Mouse;
- if ((!haveHighlightRange || highlightRange != QDeclarativeListView::StrictlyEnforceRange) && snapMode == QDeclarativeListView::NoSnap) {
- correctFlick = true;
- QDeclarativeFlickablePrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity);
- return;
- }
- qreal maxDistance = 0;
- qreal dataValue = isRightToLeft() ? -data.move.value()+size() : data.move.value();
- // -ve velocity means list is moving up/left
- if (velocity > 0) {
- if (data.move.value() < minExtent) {
- if (snapMode == QDeclarativeListView::SnapOneItem) {
- if (FxListItem *item = isRightToLeft() ? nextVisibleItem() : firstVisibleItem())
- maxDistance = qAbs(item->position() + dataValue);
- } else {
- maxDistance = qAbs(minExtent - data.move.value());
- }
- }
- if (snapMode == QDeclarativeListView::NoSnap && highlightRange != QDeclarativeListView::StrictlyEnforceRange)
- data.flickTarget = minExtent;
- } else {
- if (data.move.value() > maxExtent) {
- if (snapMode == QDeclarativeListView::SnapOneItem) {
- if (FxListItem *item = isRightToLeft() ? firstVisibleItem() : nextVisibleItem())
- maxDistance = qAbs(item->position() + dataValue);
- } else {
- maxDistance = qAbs(maxExtent - data.move.value());
- }
- }
- if (snapMode == QDeclarativeListView::NoSnap && highlightRange != QDeclarativeListView::StrictlyEnforceRange)
- data.flickTarget = maxExtent;
- }
-
- bool overShoot = boundsBehavior == QDeclarativeFlickable::DragAndOvershootBounds;
- qreal highlightStart = isRightToLeft() && highlightRangeStartValid ? size()-highlightRangeEnd : highlightRangeStart;
-
- if (maxDistance > 0 || overShoot) {
- // These modes require the list to stop exactly on an item boundary.
- // The initial flick will estimate the boundary to stop on.
- // Since list items can have variable sizes, the boundary will be
- // reevaluated and adjusted as we approach the boundary.
- qreal v = velocity;
- if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
- if (v < 0)
- v = -maxVelocity;
- else
- v = maxVelocity;
- }
- if (!flickingHorizontally && !flickingVertically) {
- // the initial flick - estimate boundary
- qreal accel = deceleration;
- qreal v2 = v * v;
- overshootDist = 0.0;
- // + averageSize/4 to encourage moving at least one item in the flick direction
- qreal dist = v2 / (accel * 2.0) + averageSize/4;
- if (maxDistance > 0)
- dist = qMin(dist, maxDistance);
- if (v > 0)
- dist = -dist;
- if ((maxDistance > 0.0 && v2 / (2.0f * maxDistance) < accel) || snapMode == QDeclarativeListView::SnapOneItem) {
- qreal distTemp = isRightToLeft() ? -dist : dist;
- data.flickTarget = -snapPosAt(-(dataValue - highlightStart) + distTemp) + highlightStart;
- data.flickTarget = isRightToLeft() ? -data.flickTarget+size() : data.flickTarget;
- if (overShoot) {
- if (data.flickTarget >= minExtent) {
- overshootDist = overShootDistance(vSize);
- data.flickTarget += overshootDist;
- } else if (data.flickTarget <= maxExtent) {
- overshootDist = overShootDistance(vSize);
- data.flickTarget -= overshootDist;
- }
- }
- qreal adjDist = -data.flickTarget + data.move.value();
- if (qAbs(adjDist) > qAbs(dist)) {
- // Prevent painfully slow flicking - adjust velocity to suit flickDeceleration
- qreal adjv2 = accel * 2.0f * qAbs(adjDist);
- if (adjv2 > v2) {
- v2 = adjv2;
- v = qSqrt(v2);
- if (dist > 0)
- v = -v;
- }
- }
- dist = adjDist;
- accel = v2 / (2.0f * qAbs(dist));
- } else if (overShoot) {
- data.flickTarget = data.move.value() - dist;
- if (data.flickTarget >= minExtent) {
- overshootDist = overShootDistance(vSize);
- data.flickTarget += overshootDist;
- } else if (data.flickTarget <= maxExtent) {
- overshootDist = overShootDistance(vSize);
- data.flickTarget -= overshootDist;
- }
- }
-
- timeline.reset(data.move);
- timeline.accel(data.move, v, accel, maxDistance + overshootDist);
- timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
- if (!flickingHorizontally && q->xflick()) {
- flickingHorizontally = true;
- emit q->flickingChanged();
- emit q->flickingHorizontallyChanged();
- emit q->flickStarted();
- }
- if (!flickingVertically && q->yflick()) {
- flickingVertically = true;
- emit q->flickingChanged();
- emit q->flickingVerticallyChanged();
- emit q->flickStarted();
- }
- correctFlick = true;
- } else {
- // reevaluate the target boundary.
- qreal newtarget = data.flickTarget;
- if (snapMode != QDeclarativeListView::NoSnap || highlightRange == QDeclarativeListView::StrictlyEnforceRange) {
- qreal tempFlickTarget = isRightToLeft() ? -data.flickTarget+size() : data.flickTarget;
- newtarget = -snapPosAt(-(tempFlickTarget - highlightStart)) + highlightStart;
- newtarget = isRightToLeft() ? -newtarget+size() : newtarget;
- }
- if (velocity < 0 && newtarget <= maxExtent)
- newtarget = maxExtent - overshootDist;
- else if (velocity > 0 && newtarget >= minExtent)
- newtarget = minExtent + overshootDist;
- if (newtarget == data.flickTarget) { // boundary unchanged - nothing to do
- if (qAbs(velocity) < MinimumFlickVelocity)
- correctFlick = false;
- return;
- }
- data.flickTarget = newtarget;
- qreal dist = -newtarget + data.move.value();
- if ((v < 0 && dist < 0) || (v > 0 && dist > 0)) {
- correctFlick = false;
- timeline.reset(data.move);
- fixup(data, minExtent, maxExtent);
- return;
- }
-
- timeline.reset(data.move);
- timeline.accelDistance(data.move, v, -dist);
- timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
- }
- } else {
- correctFlick = false;
- timeline.reset(data.move);
- fixup(data, minExtent, maxExtent);
- }
-}
-
-//----------------------------------------------------------------------------
-
-/*!
- \qmlclass ListView QDeclarativeListView
- \ingroup qml-view-elements
- \since 4.7
- \inherits Flickable
- \brief The ListView item provides a list view of items provided by a model.
-
- A ListView displays data from models created from built-in QML elements like ListModel
- and XmlListModel, or custom model classes defined in C++ that inherit from
- QAbstractListModel.
-
- A ListView has a \l model, which defines the data to be displayed, and
- a \l delegate, which defines how the data should be displayed. Items in a
- ListView are laid out horizontally or vertically. List views are inherently
- flickable because ListView inherits from \l Flickable.
-
- \section1 Example Usage
-
- The following example shows the definition of a simple list model defined
- in a file called \c ContactModel.qml:
-
- \snippet doc/src/snippets/declarative/listview/ContactModel.qml 0
-
- Another component can display this model data in a ListView, like this:
-
- \snippet doc/src/snippets/declarative/listview/listview.qml import
- \codeline
- \snippet doc/src/snippets/declarative/listview/listview.qml classdocs simple
-
- \image listview-simple.png
-
- Here, the ListView creates a \c ContactModel component for its model, and a \l Text element
- for its delegate. The view will create a new \l Text component for each item in the model. Notice
- the delegate is able to access the model's \c name and \c number data directly.
-
- An improved list view is shown below. The delegate is visually improved and is moved
- into a separate \c contactDelegate component.
-
- \snippet doc/src/snippets/declarative/listview/listview.qml classdocs advanced
- \image listview-highlight.png
-
- The currently selected item is highlighted with a blue \l Rectangle using the \l highlight property,
- and \c focus is set to \c true to enable keyboard navigation for the list view.
- The list view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
-
- Delegates are instantiated as needed and may be destroyed at any time.
- State should \e never be stored in a delegate.
-
- ListView attaches a number of properties to the root item of the delegate, for example
- \c {ListView.isCurrentItem}. In the following example, the root delegate item can access
- this attached property directly as \c ListView.isCurrentItem, while the child
- \c contactInfo object must refer to this property as \c wrapper.ListView.isCurrentItem.
-
- \snippet doc/src/snippets/declarative/listview/listview.qml isCurrentItem
-
- \note Views do not enable \e clip automatically. If the view
- is not clipped by another item or the screen, it will be necessary
- to set \e {clip: true} in order to have the out of view items clipped
- nicely.
-
- \sa {QML Data Models}, GridView, {declarative/modelviews/listview}{ListView examples}
-*/
-
-QDeclarativeListView::QDeclarativeListView(QDeclarativeItem *parent)
- : QDeclarativeFlickable(*(new QDeclarativeListViewPrivate), parent)
-{
- Q_D(QDeclarativeListView);
- d->init();
-}
-
-QDeclarativeListView::~QDeclarativeListView()
-{
- Q_D(QDeclarativeListView);
- d->clear();
- if (d->ownModel)
- delete d->model;
- delete d->header;
- delete d->footer;
-}
-
-/*!
- \qmlattachedproperty bool ListView::isCurrentItem
- This attached property is true if this delegate is the current item; otherwise false.
-
- It is attached to each instance of the delegate.
-
- This property may be used to adjust the appearance of the current item, for example:
-
- \snippet doc/src/snippets/declarative/listview/listview.qml isCurrentItem
-*/
-
-/*!
- \qmlattachedproperty ListView ListView::view
- This attached property holds the view that manages this delegate instance.
-
- It is attached to each instance of the delegate.
-*/
-
-/*!
- \qmlattachedproperty string ListView::previousSection
- This attached property holds the section of the previous element.
-
- It is attached to each instance of the delegate.
-
- The section is evaluated using the \l {ListView::section.property}{section} properties.
-*/
-
-/*!
- \qmlattachedproperty string ListView::nextSection
- This attached property holds the section of the next element.
-
- It is attached to each instance of the delegate.
-
- The section is evaluated using the \l {ListView::section.property}{section} properties.
-*/
-
-/*!
- \qmlattachedproperty string ListView::section
- This attached property holds the section of this element.
-
- It is attached to each instance of the delegate.
-
- The section is evaluated using the \l {ListView::section.property}{section} properties.
-*/
-
-/*!
- \qmlattachedproperty bool ListView::delayRemove
- This attached property holds whether the delegate may be destroyed.
-
- It is attached to each instance of the delegate.
-
- It is sometimes necessary to delay the destruction of an item
- until an animation completes.
-
- The example delegate below ensures that the animation completes before
- the item is removed from the list.
-
- \snippet doc/src/snippets/declarative/listview/listview.qml delayRemove
-*/
-
-/*!
- \qmlattachedsignal ListView::onAdd()
- This attached handler is called immediately after an item is added to the view.
-*/
-
-/*!
- \qmlattachedsignal ListView::onRemove()
- This attached handler is called immediately before an item is removed from the view.
-*/
-
-/*!
- \qmlproperty model ListView::model
- This property holds the model providing data for the list.
-
- The model provides the set of data that is used to create the items
- in the view. Models can be created directly in QML using \l ListModel, \l XmlListModel
- or \l VisualItemModel, or provided by C++ model classes. If a C++ model class is
- used, it must be a subclass of \l QAbstractItemModel or a simple list.
-
- \sa {qmlmodels}{Data Models}
-*/
-QVariant QDeclarativeListView::model() const
-{
- Q_D(const QDeclarativeListView);
- return d->modelVariant;
-}
-
-void QDeclarativeListView::setModel(const QVariant &model)
-{
- Q_D(QDeclarativeListView);
- if (d->modelVariant == model)
- return;
- if (d->model) {
- disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- disconnect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
- disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- disconnect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- disconnect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- }
- d->clear();
- QDeclarativeVisualModel *oldModel = d->model;
- d->model = 0;
- d->setPosition(0);
- d->modelVariant = model;
- QObject *object = qvariant_cast<QObject*>(model);
- QDeclarativeVisualModel *vim = 0;
- if (object && (vim = qobject_cast<QDeclarativeVisualModel *>(object))) {
- if (d->ownModel) {
- delete oldModel;
- d->ownModel = false;
- }
- d->model = vim;
- } else {
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this), this);
- d->ownModel = true;
- } else {
- d->model = oldModel;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- dataModel->setModel(model);
- }
- if (d->model) {
- d->bufferMode = QDeclarativeListViewPrivate::BufferBefore | QDeclarativeListViewPrivate::BufferAfter;
- if (isComponentComplete()) {
- updateSections();
- refill();
- if ((d->currentIndex >= d->model->count() || d->currentIndex < 0) && !d->currentIndexCleared) {
- setCurrentIndex(0);
- } else {
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->position());
- d->updateTrackedItem();
- }
- }
- d->updateViewport();
- }
- connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- connect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
- connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- connect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- connect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- emit countChanged();
- }
- emit modelChanged();
-}
-
-/*!
- \qmlproperty Component ListView::delegate
-
- The delegate provides a template defining each item instantiated by the view.
- The index is exposed as an accessible \c index property. Properties of the
- model are also available depending upon the type of \l {qmlmodels}{Data Model}.
-
- The number of elements in the delegate has a direct effect on the
- flicking performance of the view. If at all possible, place functionality
- that is not needed for the normal display of the delegate in a \l Loader which
- can load additional elements when needed.
-
- The ListView will lay out the items based on the size of the root item
- in the delegate.
-
- It is recommended that the delagate's size be a whole number to avoid sub-pixel
- alignment of items.
-
- \note Delegates are instantiated as needed and may be destroyed at any time.
- State should \e never be stored in a delegate.
-*/
-QDeclarativeComponent *QDeclarativeListView::delegate() const
-{
- Q_D(const QDeclarativeListView);
- if (d->model) {
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- return dataModel->delegate();
- }
-
- return 0;
-}
-
-void QDeclarativeListView::setDelegate(QDeclarativeComponent *delegate)
-{
- Q_D(QDeclarativeListView);
- if (delegate == this->delegate())
- return;
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this));
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model)) {
- int oldCount = dataModel->count();
- dataModel->setDelegate(delegate);
- if (isComponentComplete()) {
- for (int i = 0; i < d->visibleItems.count(); ++i)
- d->releaseItem(d->visibleItems.at(i));
- d->visibleItems.clear();
- d->releaseItem(d->currentItem);
- d->currentItem = 0;
- updateSections();
- refill();
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->position());
- d->updateTrackedItem();
- }
- d->updateViewport();
- }
- if (oldCount != dataModel->count())
- emit countChanged();
- }
- emit delegateChanged();
-}
-
-/*!
- \qmlproperty int ListView::currentIndex
- \qmlproperty Item ListView::currentItem
-
- The \c currentIndex property holds the index of the current item, and
- \c currentItem holds the current item. Setting the currentIndex to -1
- will clear the highlight and set currentItem to null.
-
- If highlightFollowsCurrentItem is \c true, setting either of these
- properties will smoothly scroll the ListView so that the current
- item becomes visible.
-
- Note that the position of the current item
- may only be approximate until it becomes visible in the view.
-*/
-int QDeclarativeListView::currentIndex() const
-{
- Q_D(const QDeclarativeListView);
- return d->currentIndex;
-}
-
-void QDeclarativeListView::setCurrentIndex(int index)
-{
- Q_D(QDeclarativeListView);
- if (d->requestedIndex >= 0) // currently creating item
- return;
- d->currentIndexCleared = (index == -1);
- if (index == d->currentIndex)
- return;
- if (isComponentComplete() && d->isValid()) {
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- d->updateCurrent(index);
- } else if (d->currentIndex != index) {
- d->currentIndex = index;
- emit currentIndexChanged();
- }
-}
-
-QDeclarativeItem *QDeclarativeListView::currentItem()
-{
- Q_D(QDeclarativeListView);
- if (!d->currentItem)
- return 0;
- return d->currentItem->item;
-}
-
-/*!
- \qmlproperty Item ListView::highlightItem
-
- This holds the highlight item created from the \l highlight component.
-
- The \c highlightItem is managed by the view unless
- \l highlightFollowsCurrentItem is set to false.
-
- \sa highlight, highlightFollowsCurrentItem
-*/
-QDeclarativeItem *QDeclarativeListView::highlightItem()
-{
- Q_D(QDeclarativeListView);
- if (!d->highlight)
- return 0;
- return d->highlight->item;
-}
-
-/*!
- \qmlproperty int ListView::count
- This property holds the number of items in the view.
-*/
-int QDeclarativeListView::count() const
-{
- Q_D(const QDeclarativeListView);
- if (d->model)
- return d->model->count();
- return 0;
-}
-
-/*!
- \qmlproperty Component ListView::highlight
- This property holds the component to use as the highlight.
-
- An instance of the highlight component is created for each list.
- The geometry of the resulting component instance is managed by the list
- so as to stay with the current item, unless the highlightFollowsCurrentItem
- property is false.
-
- \sa highlightItem, highlightFollowsCurrentItem, {declarative/modelviews/listview}{ListView examples}
-*/
-QDeclarativeComponent *QDeclarativeListView::highlight() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightComponent;
-}
-
-void QDeclarativeListView::setHighlight(QDeclarativeComponent *highlight)
-{
- Q_D(QDeclarativeListView);
- if (highlight != d->highlightComponent) {
- d->highlightComponent = highlight;
- d->createHighlight();
- if (d->currentItem)
- d->updateHighlight();
- emit highlightChanged();
- }
-}
-
-/*!
- \qmlproperty bool ListView::highlightFollowsCurrentItem
- This property holds whether the highlight is managed by the view.
-
- If this property is true (the default value), the highlight is moved smoothly
- to follow the current item. Otherwise, the
- highlight is not moved by the view, and any movement must be implemented
- by the highlight.
-
- Here is a highlight with its motion defined by a \l {SpringAnimation} item:
-
- \snippet doc/src/snippets/declarative/listview/listview.qml highlightFollowsCurrentItem
-
- Note that the highlight animation also affects the way that the view
- is scrolled. This is because the view moves to maintain the
- highlight within the preferred highlight range (or visible viewport).
-
- \sa highlight, highlightMoveSpeed
-*/
-bool QDeclarativeListView::highlightFollowsCurrentItem() const
-{
- Q_D(const QDeclarativeListView);
- return d->autoHighlight;
-}
-
-void QDeclarativeListView::setHighlightFollowsCurrentItem(bool autoHighlight)
-{
- Q_D(QDeclarativeListView);
- if (d->autoHighlight != autoHighlight) {
- d->autoHighlight = autoHighlight;
- if (autoHighlight) {
- d->updateHighlight();
- } else {
- if (d->highlightPosAnimator)
- d->highlightPosAnimator->stop();
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->stop();
- }
- emit highlightFollowsCurrentItemChanged();
- }
-}
-
-//###Possibly rename these properties, since they are very useful even without a highlight?
-/*!
- \qmlproperty real ListView::preferredHighlightBegin
- \qmlproperty real ListView::preferredHighlightEnd
- \qmlproperty enumeration ListView::highlightRangeMode
-
- These properties define the preferred range of the highlight (for the current item)
- within the view. The \c preferredHighlightBegin value must be less than the
- \c preferredHighlightEnd value.
-
- These properties affect the position of the current item when the list is scrolled.
- For example, if the currently selected item should stay in the middle of the
- list when the view is scrolled, set the \c preferredHighlightBegin and
- \c preferredHighlightEnd values to the top and bottom coordinates of where the middle
- item would be. If the \c currentItem is changed programmatically, the list will
- automatically scroll so that the current item is in the middle of the view.
- Furthermore, the behavior of the current item index will occur whether or not a
- highlight exists.
-
- Valid values for \c highlightRangeMode are:
-
- \list
- \o ListView.ApplyRange - the view attempts to maintain the highlight within the range.
- However, the highlight can move outside of the range at the ends of the list or due
- to mouse interaction.
- \o ListView.StrictlyEnforceRange - the highlight never moves outside of the range.
- The current item changes if a keyboard or mouse action would cause the highlight to move
- outside of the range.
- \o ListView.NoHighlightRange - this is the default value.
- \endlist
-*/
-qreal QDeclarativeListView::preferredHighlightBegin() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightRangeStart;
-}
-
-void QDeclarativeListView::setPreferredHighlightBegin(qreal start)
-{
- Q_D(QDeclarativeListView);
- d->highlightRangeStartValid = true;
- if (d->highlightRangeStart == start)
- return;
- d->highlightRangeStart = start;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit preferredHighlightBeginChanged();
-}
-
-void QDeclarativeListView::resetPreferredHighlightBegin()
-{
- Q_D(QDeclarativeListView);
- d->highlightRangeStartValid = false;
- if (d->highlightRangeStart == 0)
- return;
- d->highlightRangeStart = 0;
- emit preferredHighlightBeginChanged();
-}
-
-qreal QDeclarativeListView::preferredHighlightEnd() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightRangeEnd;
-}
-
-void QDeclarativeListView::setPreferredHighlightEnd(qreal end)
-{
- Q_D(QDeclarativeListView);
- d->highlightRangeEndValid = true;
- if (d->highlightRangeEnd == end)
- return;
- d->highlightRangeEnd = end;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit preferredHighlightEndChanged();
-}
-
-void QDeclarativeListView::resetPreferredHighlightEnd()
-{
- Q_D(QDeclarativeListView);
- d->highlightRangeEndValid = false;
- if (d->highlightRangeEnd == 0)
- return;
- d->highlightRangeEnd = 0;
- emit preferredHighlightEndChanged();
-}
-
-QDeclarativeListView::HighlightRangeMode QDeclarativeListView::highlightRangeMode() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightRange;
-}
-
-void QDeclarativeListView::setHighlightRangeMode(HighlightRangeMode mode)
-{
- Q_D(QDeclarativeListView);
- if (d->highlightRange == mode)
- return;
- d->highlightRange = mode;
- d->haveHighlightRange = d->highlightRange != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit highlightRangeModeChanged();
-}
-
-/*!
- \qmlproperty real ListView::spacing
-
- This property holds the spacing between items.
-
- The default value is 0.
-*/
-qreal QDeclarativeListView::spacing() const
-{
- Q_D(const QDeclarativeListView);
- return d->spacing;
-}
-
-void QDeclarativeListView::setSpacing(qreal spacing)
-{
- Q_D(QDeclarativeListView);
- if (spacing != d->spacing) {
- d->spacing = spacing;
- d->layout();
- emit spacingChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration ListView::orientation
- This property holds the orientation of the list.
-
- Possible values:
-
- \list
- \o ListView.Horizontal - Items are laid out horizontally
- \o ListView.Vertical (default) - Items are laid out vertically
- \endlist
-
- \table
- \row
- \o Horizontal orientation:
- \image ListViewHorizontal.png
-
- \row
- \o Vertical orientation:
- \image listview-highlight.png
- \endtable
-*/
-QDeclarativeListView::Orientation QDeclarativeListView::orientation() const
-{
- Q_D(const QDeclarativeListView);
- return d->orient;
-}
-
-void QDeclarativeListView::setOrientation(QDeclarativeListView::Orientation orientation)
-{
- Q_D(QDeclarativeListView);
- if (d->orient != orientation) {
- d->orient = orientation;
- if (d->orient == QDeclarativeListView::Vertical) {
- setContentWidth(-1);
- setFlickableDirection(VerticalFlick);
- setContentX(0);
- } else {
- setContentHeight(-1);
- setFlickableDirection(HorizontalFlick);
- setContentY(0);
- }
- d->regenerate();
- emit orientationChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration ListView::layoutDirection
- This property holds the layout direction of the horizontal list.
-
- Possible values:
-
- \list
- \o Qt.LeftToRight (default) - Items will be laid out from left to right.
- \o Qt.RightToLeft - Items will be laid out from right to let.
- \endlist
-
- \sa ListView::effectiveLayoutDirection
-*/
-
-Qt::LayoutDirection QDeclarativeListView::layoutDirection() const
-{
- Q_D(const QDeclarativeListView);
- return d->layoutDirection;
-}
-
-void QDeclarativeListView::setLayoutDirection(Qt::LayoutDirection layoutDirection)
-{
- Q_D(QDeclarativeListView);
- if (d->layoutDirection != layoutDirection) {
- d->layoutDirection = layoutDirection;
- d->regenerate();
- emit layoutDirectionChanged();
- emit effectiveLayoutDirectionChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration ListView::effectiveLayoutDirection
- This property holds the effective layout direction of the horizontal list.
-
- When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts,
- the visual layout direction of the horizontal list will be mirrored. However, the
- property \l {ListView::layoutDirection}{layoutDirection} will remain unchanged.
-
- \sa ListView::layoutDirection, {LayoutMirroring}{LayoutMirroring}
-*/
-
-Qt::LayoutDirection QDeclarativeListView::effectiveLayoutDirection() const
-{
- Q_D(const QDeclarativeListView);
- if (d->effectiveLayoutMirror)
- return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
- else
- return d->layoutDirection;
-}
-
-/*!
- \qmlproperty bool ListView::keyNavigationWraps
- This property holds whether the list wraps key navigation.
-
- If this is true, key navigation that would move the current item selection
- past the end of the list instead wraps around and moves the selection to
- the start of the list, and vice-versa.
-
- By default, key navigation is not wrapped.
-*/
-bool QDeclarativeListView::isWrapEnabled() const
-{
- Q_D(const QDeclarativeListView);
- return d->wrap;
-}
-
-void QDeclarativeListView::setWrapEnabled(bool wrap)
-{
- Q_D(QDeclarativeListView);
- if (d->wrap == wrap)
- return;
- d->wrap = wrap;
- emit keyNavigationWrapsChanged();
-}
-
-/*!
- \qmlproperty int ListView::cacheBuffer
- This property determines whether delegates are retained outside the
- visible area of the view.
-
- If this value is non-zero, the view keeps as many delegates
- instantiated as it can fit within the buffer specified. For example,
- if in a vertical view the delegate is 20 pixels high and \c cacheBuffer is
- set to 40, then up to 2 delegates above and 2 delegates below the visible
- area may be retained.
-
- Note that cacheBuffer is not a pixel buffer - it only maintains additional
- instantiated delegates.
-
- Setting this value can improve the smoothness of scrolling behavior at the expense
- of additional memory usage. It is not a substitute for creating efficient
- delegates; the fewer elements in a delegate, the faster a view can be
- scrolled.
-*/
-int QDeclarativeListView::cacheBuffer() const
-{
- Q_D(const QDeclarativeListView);
- return d->buffer;
-}
-
-void QDeclarativeListView::setCacheBuffer(int b)
-{
- Q_D(QDeclarativeListView);
- if (d->buffer != b) {
- d->buffer = b;
- if (isComponentComplete()) {
- d->bufferMode = QDeclarativeListViewPrivate::BufferBefore | QDeclarativeListViewPrivate::BufferAfter;
- refill();
- }
- emit cacheBufferChanged();
- }
-}
-
-/*!
- \qmlproperty string ListView::section.property
- \qmlproperty enumeration ListView::section.criteria
- \qmlproperty Component ListView::section.delegate
-
- These properties hold the expression to be evaluated for the \l section attached property.
-
- The \l section attached property enables a ListView to be visually
- separated into different parts. These properties determine how sections
- are created.
-
- \c section.property holds the name of the property that is the basis
- of each section.
-
- \c section.criteria holds the criteria for forming each section based on
- \c section.property. This value can be one of:
-
- \list
- \o ViewSection.FullString (default) - sections are created based on the
- \c section.property value.
- \o ViewSection.FirstCharacter - sections are created based on the first
- character of the \c section.property value (for example, 'A', 'B', 'C'
- sections, etc. for an address book)
- \endlist
-
- \c section.delegate holds the delegate component for each section.
-
- Each item in the list has attached properties named \c ListView.section,
- \c ListView.previousSection and \c ListView.nextSection. These may be
- used to place a section header for related items.
-
- For example, here is a ListView that displays a list of animals, separated
- into sections. Each item in the ListView is placed in a different section
- depending on the "size" property of the model item. The \c sectionHeading
- delegate component provides the light blue bar that marks the beginning of
- each section.
-
-
- \snippet examples/declarative/modelviews/listview/sections.qml 0
-
- \image qml-listview-sections-example.png
-
- \note Adding sections to a ListView does not automatically re-order the
- list items by the section criteria.
- If the model is not ordered by section, then it is possible that
- the sections created will not be unique; each boundary between
- differing sections will result in a section header being created
- even if that section exists elsewhere.
-
- \sa {declarative/modelviews/listview}{ListView examples}
-*/
-QDeclarativeViewSection *QDeclarativeListView::sectionCriteria()
-{
- Q_D(QDeclarativeListView);
- if (!d->sectionCriteria) {
- d->sectionCriteria = new QDeclarativeViewSection(this);
- connect(d->sectionCriteria, SIGNAL(propertyChanged()), this, SLOT(updateSections()));
- }
- return d->sectionCriteria;
-}
-
-/*!
- \qmlproperty string ListView::currentSection
- This property holds the section that is currently at the beginning of the view.
-*/
-QString QDeclarativeListView::currentSection() const
-{
- Q_D(const QDeclarativeListView);
- return d->currentSection;
-}
-
-/*!
- \qmlproperty real ListView::highlightMoveSpeed
- \qmlproperty int ListView::highlightMoveDuration
- \qmlproperty real ListView::highlightResizeSpeed
- \qmlproperty int ListView::highlightResizeDuration
-
- These properties hold the move and resize animation speed of the highlight delegate.
-
- \l highlightFollowsCurrentItem must be true for these properties
- to have effect.
-
- The default value for the speed properties is 400 pixels/second.
- The default value for the duration properties is -1, i.e. the
- highlight will take as much time as necessary to move at the set speed.
-
- These properties have the same characteristics as a SmoothedAnimation.
-
- \sa highlightFollowsCurrentItem
-*/
-qreal QDeclarativeListView::highlightMoveSpeed() const
-{
- Q_D(const QDeclarativeListView);\
- return d->highlightMoveSpeed;
-}
-
-void QDeclarativeListView::setHighlightMoveSpeed(qreal speed)
-{
- Q_D(QDeclarativeListView);\
- if (d->highlightMoveSpeed != speed) {
- d->highlightMoveSpeed = speed;
- if (d->highlightPosAnimator)
- d->highlightPosAnimator->velocity = d->highlightMoveSpeed;
- emit highlightMoveSpeedChanged();
- }
-}
-
-int QDeclarativeListView::highlightMoveDuration() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightMoveDuration;
-}
-
-void QDeclarativeListView::setHighlightMoveDuration(int duration)
-{
- Q_D(QDeclarativeListView);\
- if (d->highlightMoveDuration != duration) {
- d->highlightMoveDuration = duration;
- if (d->highlightPosAnimator)
- d->highlightPosAnimator->userDuration = d->highlightMoveDuration;
- emit highlightMoveDurationChanged();
- }
-}
-
-qreal QDeclarativeListView::highlightResizeSpeed() const
-{
- Q_D(const QDeclarativeListView);\
- return d->highlightResizeSpeed;
-}
-
-void QDeclarativeListView::setHighlightResizeSpeed(qreal speed)
-{
- Q_D(QDeclarativeListView);\
- if (d->highlightResizeSpeed != speed) {
- d->highlightResizeSpeed = speed;
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->velocity = d->highlightResizeSpeed;
- emit highlightResizeSpeedChanged();
- }
-}
-
-int QDeclarativeListView::highlightResizeDuration() const
-{
- Q_D(const QDeclarativeListView);
- return d->highlightResizeDuration;
-}
-
-void QDeclarativeListView::setHighlightResizeDuration(int duration)
-{
- Q_D(QDeclarativeListView);\
- if (d->highlightResizeDuration != duration) {
- d->highlightResizeDuration = duration;
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->userDuration = d->highlightResizeDuration;
- emit highlightResizeDurationChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration ListView::snapMode
-
- This property determines how the view scrolling will settle following a drag or flick.
- The possible values are:
-
- \list
- \o ListView.NoSnap (default) - the view stops anywhere within the visible area.
- \o ListView.SnapToItem - the view settles with an item aligned with the start of
- the view.
- \o ListView.SnapOneItem - the view settles no more than one item away from the first
- visible item at the time the mouse button is released. This mode is particularly
- useful for moving one page at a time.
- \endlist
-
- \c snapMode does not affect the \l currentIndex. To update the
- \l currentIndex as the list is moved, set \l highlightRangeMode
- to \c ListView.StrictlyEnforceRange.
-
- \sa highlightRangeMode
-*/
-QDeclarativeListView::SnapMode QDeclarativeListView::snapMode() const
-{
- Q_D(const QDeclarativeListView);
- return d->snapMode;
-}
-
-void QDeclarativeListView::setSnapMode(SnapMode mode)
-{
- Q_D(QDeclarativeListView);
- if (d->snapMode != mode) {
- d->snapMode = mode;
- emit snapModeChanged();
- }
-}
-
-/*!
- \qmlproperty Component ListView::footer
- This property holds the component to use as the footer.
-
- An instance of the footer component is created for each view. The
- footer is positioned at the end of the view, after any items.
-
- \sa header
-*/
-QDeclarativeComponent *QDeclarativeListView::footer() const
-{
- Q_D(const QDeclarativeListView);
- return d->footerComponent;
-}
-
-void QDeclarativeListView::setFooter(QDeclarativeComponent *footer)
-{
- Q_D(QDeclarativeListView);
- if (d->footerComponent != footer) {
- if (d->footer) {
- if (scene())
- scene()->removeItem(d->footer->item);
- d->footer->item->deleteLater();
- delete d->footer;
- d->footer = 0;
- }
- d->footerComponent = footer;
- d->minExtentDirty = true;
- d->maxExtentDirty = true;
- if (isComponentComplete()) {
- d->updateFooter();
- d->updateViewport();
- d->fixupPosition();
- }
- emit footerChanged();
- }
-}
-
-/*!
- \qmlproperty Component ListView::header
- This property holds the component to use as the header.
-
- An instance of the header component is created for each view. The
- header is positioned at the beginning of the view, before any items.
-
- \sa footer
-*/
-QDeclarativeComponent *QDeclarativeListView::header() const
-{
- Q_D(const QDeclarativeListView);
- return d->headerComponent;
-}
-
-void QDeclarativeListView::setHeader(QDeclarativeComponent *header)
-{
- Q_D(QDeclarativeListView);
- if (d->headerComponent != header) {
- if (d->header) {
- if (scene())
- scene()->removeItem(d->header->item);
- d->header->item->deleteLater();
- delete d->header;
- d->header = 0;
- }
- d->headerComponent = header;
- d->minExtentDirty = true;
- d->maxExtentDirty = true;
- if (isComponentComplete()) {
- d->updateHeader();
- d->updateFooter();
- d->updateViewport();
- d->fixupPosition();
- }
- emit headerChanged();
- }
-}
-
-void QDeclarativeListView::setContentX(qreal pos)
-{
- Q_D(QDeclarativeListView);
- // Positioning the view manually should override any current movement state
- d->moveReason = QDeclarativeListViewPrivate::Other;
- QDeclarativeFlickable::setContentX(pos);
-}
-
-void QDeclarativeListView::setContentY(qreal pos)
-{
- Q_D(QDeclarativeListView);
- // Positioning the view manually should override any current movement state
- d->moveReason = QDeclarativeListViewPrivate::Other;
- QDeclarativeFlickable::setContentY(pos);
-}
-
-bool QDeclarativeListView::event(QEvent *event)
-{
- Q_D(QDeclarativeListView);
- if (event->type() == QEvent::User) {
- d->layout();
- return true;
- }
-
- return QDeclarativeFlickable::event(event);
-}
-
-void QDeclarativeListView::viewportMoved()
-{
- Q_D(QDeclarativeListView);
- QDeclarativeFlickable::viewportMoved();
- if (!d->itemCount)
- return;
- // Recursion can occur due to refill changing the content size.
- if (d->inViewportMoved)
- return;
- d->inViewportMoved = true;
- d->lazyRelease = true;
- refill();
- if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
- d->moveReason = QDeclarativeListViewPrivate::Mouse;
- if (d->moveReason != QDeclarativeListViewPrivate::SetIndex) {
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange && d->highlight) {
- // reposition highlight
- qreal pos = d->highlight->position();
- qreal viewPos;
- qreal highlightStart;
- qreal highlightEnd;
- if (d->isRightToLeft()) {
- // Handle Right-To-Left exceptions
- viewPos = -d->position()-d->size();
- highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
- highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
- } else {
- viewPos = d->position();
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- }
- if (pos > viewPos + highlightEnd - d->highlight->size())
- pos = viewPos + highlightEnd - d->highlight->size();
- if (pos < viewPos + highlightStart)
- pos = viewPos + highlightStart;
- d->highlightPosAnimator->stop();
- d->highlight->setPosition(qRound(pos));
-
- // update current index
- if (FxListItem *snapItem = d->snapItemAt(d->highlight->position())) {
- if (snapItem->index >= 0 && snapItem->index != d->currentIndex)
- d->updateCurrent(snapItem->index);
- }
- }
- }
-
- if ((d->flickingHorizontally || d->flickingVertically) && d->correctFlick && !d->inFlickCorrection) {
- d->inFlickCorrection = true;
- // Near an end and it seems that the extent has changed?
- // Recalculate the flick so that we don't end up in an odd position.
- if (yflick() && !d->vData.inOvershoot) {
- if (d->vData.velocity > 0) {
- const qreal minY = minYExtent();
- if ((minY - d->vData.move.value() < height()/2 || d->vData.flickTarget - d->vData.move.value() < height()/2)
- && minY != d->vData.flickTarget)
- d->flickY(-d->vData.smoothVelocity.value());
- d->bufferMode = QDeclarativeListViewPrivate::BufferBefore;
- } else if (d->vData.velocity < 0) {
- const qreal maxY = maxYExtent();
- if ((d->vData.move.value() - maxY < height()/2 || d->vData.move.value() - d->vData.flickTarget < height()/2)
- && maxY != d->vData.flickTarget)
- d->flickY(-d->vData.smoothVelocity.value());
- d->bufferMode = QDeclarativeListViewPrivate::BufferAfter;
- }
- }
-
- if (xflick() && !d->hData.inOvershoot) {
- if (d->hData.velocity > 0) {
- const qreal minX = minXExtent();
- if ((minX - d->hData.move.value() < width()/2 || d->hData.flickTarget - d->hData.move.value() < width()/2)
- && minX != d->hData.flickTarget)
- d->flickX(-d->hData.smoothVelocity.value());
- d->bufferMode = d->isRightToLeft()
- ? QDeclarativeListViewPrivate::BufferAfter : QDeclarativeListViewPrivate::BufferBefore;
- } else if (d->hData.velocity < 0) {
- const qreal maxX = maxXExtent();
- if ((d->hData.move.value() - maxX < width()/2 || d->hData.move.value() - d->hData.flickTarget < width()/2)
- && maxX != d->hData.flickTarget)
- d->flickX(-d->hData.smoothVelocity.value());
- d->bufferMode = d->isRightToLeft()
- ? QDeclarativeListViewPrivate::BufferBefore : QDeclarativeListViewPrivate::BufferAfter;
- }
- }
- d->inFlickCorrection = false;
- }
- d->inViewportMoved = false;
-}
-
-qreal QDeclarativeListView::minYExtent() const
-{
- Q_D(const QDeclarativeListView);
- if (d->orient == QDeclarativeListView::Horizontal)
- return QDeclarativeFlickable::minYExtent();
- if (d->minExtentDirty) {
- d->minExtent = -d->startPosition();
- if (d->header && d->visibleItems.count())
- d->minExtent += d->header->size();
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- d->minExtent += d->highlightRangeStart;
- if (d->sectionCriteria) {
- if (d->visibleItem(0))
- d->minExtent -= d->visibleItem(0)->sectionSize();
- }
- d->minExtent = qMax(d->minExtent, -(d->endPositionAt(0) - d->highlightRangeEnd + 1));
- }
- d->minExtentDirty = false;
- }
-
- return d->minExtent;
-}
-
-qreal QDeclarativeListView::maxYExtent() const
-{
- Q_D(const QDeclarativeListView);
- if (d->orient == QDeclarativeListView::Horizontal)
- return height();
- if (d->maxExtentDirty) {
- if (!d->model || !d->model->count()) {
- d->maxExtent = d->header ? -d->header->size() : 0;
- d->maxExtent += height();
- } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- d->maxExtent = -(d->positionAt(d->model->count()-1) - d->highlightRangeStart);
- if (d->highlightRangeEnd != d->highlightRangeStart)
- d->maxExtent = qMin(d->maxExtent, -(d->endPosition() - d->highlightRangeEnd + 1));
- } else {
- d->maxExtent = -(d->endPosition() - height() + 1);
- }
- if (d->footer)
- d->maxExtent -= d->footer->size();
- qreal minY = minYExtent();
- if (d->maxExtent > minY)
- d->maxExtent = minY;
- d->maxExtentDirty = false;
- }
- return d->maxExtent;
-}
-
-qreal QDeclarativeListView::minXExtent() const
-{
- Q_D(const QDeclarativeListView);
- if (d->orient == QDeclarativeListView::Vertical)
- return QDeclarativeFlickable::minXExtent();
- if (d->minExtentDirty) {
- d->minExtent = -d->startPosition();
-
- qreal highlightStart;
- qreal highlightEnd;
- qreal endPositionFirstItem = 0;
- if (d->isRightToLeft()) {
- if (d->model && d->model->count())
- endPositionFirstItem = d->positionAt(d->model->count()-1);
- else if (d->header)
- d->minExtent += d->header->size();
- highlightStart = d->highlightRangeStartValid
- ? d->highlightRangeStart - (d->lastPosition()-endPositionFirstItem)
- : d->size() - (d->lastPosition()-endPositionFirstItem);
- highlightEnd = d->highlightRangeEndValid ? d->highlightRangeEnd : d->size();
- if (d->footer)
- d->minExtent += d->footer->size();
- qreal maxX = maxXExtent();
- if (d->minExtent < maxX)
- d->minExtent = maxX;
- } else {
- endPositionFirstItem = d->endPositionAt(0);
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- if (d->header && d->visibleItems.count())
- d->minExtent += d->header->size();
- }
- if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- d->minExtent += highlightStart;
- d->minExtent = qMax(d->minExtent, -(endPositionFirstItem - highlightEnd + 1));
- }
- d->minExtentDirty = false;
- }
-
- return d->minExtent;
-}
-
-qreal QDeclarativeListView::maxXExtent() const
-{
- Q_D(const QDeclarativeListView);
- if (d->orient == QDeclarativeListView::Vertical)
- return width();
- if (d->maxExtentDirty) {
- qreal highlightStart;
- qreal highlightEnd;
- qreal lastItemPosition = 0;
- d->maxExtent = 0;
- if (d->isRightToLeft()) {
- highlightStart = d->highlightRangeStartValid ? d->highlightRangeEnd : d->size();
- highlightEnd = d->highlightRangeEndValid ? d->highlightRangeStart : d->size();
- lastItemPosition = d->endPosition();
- } else {
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- if (d->model && d->model->count())
- lastItemPosition = d->positionAt(d->model->count()-1);
- }
- if (!d->model || !d->model->count()) {
- if (!d->isRightToLeft())
- d->maxExtent = d->header ? -d->header->size() : 0;
- d->maxExtent += width();
- } else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
- d->maxExtent = -(lastItemPosition - highlightStart);
- if (highlightEnd != highlightStart) {
- d->maxExtent = d->isRightToLeft()
- ? qMax(d->maxExtent, -(d->endPosition() - highlightEnd + 1))
- : qMin(d->maxExtent, -(d->endPosition() - highlightEnd + 1));
- }
- } else {
- d->maxExtent = -(d->endPosition() - width() + 1);
- }
- if (d->isRightToLeft()) {
- if (d->header && d->visibleItems.count())
- d->maxExtent -= d->header->size();
- } else {
- if (d->footer)
- d->maxExtent -= d->footer->size();
- qreal minX = minXExtent();
- if (d->maxExtent > minX)
- d->maxExtent = minX;
- }
- d->maxExtentDirty = false;
- }
- return d->maxExtent;
-}
-
-void QDeclarativeListView::keyPressEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeListView);
- keyPressPreHandler(event);
- if (event->isAccepted())
- return;
-
- if (d->model && d->model->count() && d->interactive) {
- if ((d->orient == QDeclarativeListView::Horizontal && !d->isRightToLeft() && event->key() == Qt::Key_Left)
- || (d->orient == QDeclarativeListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Right)
- || (d->orient == QDeclarativeListView::Vertical && event->key() == Qt::Key_Up)) {
- if (currentIndex() > 0 || (d->wrap && !event->isAutoRepeat())) {
- decrementCurrentIndex();
- event->accept();
- return;
- } else if (d->wrap) {
- event->accept();
- return;
- }
- } else if ((d->orient == QDeclarativeListView::Horizontal && !d->isRightToLeft() && event->key() == Qt::Key_Right)
- || (d->orient == QDeclarativeListView::Horizontal && d->isRightToLeft() && event->key() == Qt::Key_Left)
- || (d->orient == QDeclarativeListView::Vertical && event->key() == Qt::Key_Down)) {
- if (currentIndex() < d->model->count() - 1 || (d->wrap && !event->isAutoRepeat())) {
- incrementCurrentIndex();
- event->accept();
- return;
- } else if (d->wrap) {
- event->accept();
- return;
- }
- }
- }
- event->ignore();
- QDeclarativeFlickable::keyPressEvent(event);
-}
-
-void QDeclarativeListView::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeListView);
- d->maxExtentDirty = true;
- d->minExtentDirty = true;
- if (d->isRightToLeft() && d->orient == QDeclarativeListView::Horizontal) {
- // maintain position relative to the right edge
- int dx = newGeometry.width() - oldGeometry.width();
- setContentX(contentX() - dx);
- }
- QDeclarativeFlickable::geometryChanged(newGeometry, oldGeometry);
-}
-
-
-/*!
- \qmlmethod ListView::incrementCurrentIndex()
-
- Increments the current index. The current index will wrap
- if keyNavigationWraps is true and it is currently at the end.
- This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeListView::incrementCurrentIndex()
-{
- Q_D(QDeclarativeListView);
- int count = d->model ? d->model->count() : 0;
- if (count && (currentIndex() < count - 1 || d->wrap)) {
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- int index = currentIndex()+1;
- setCurrentIndex((index >= 0 && index < count) ? index : 0);
- }
-}
-
-/*!
- \qmlmethod ListView::decrementCurrentIndex()
-
- Decrements the current index. The current index will wrap
- if keyNavigationWraps is true and it is currently at the beginning.
- This method has no effect if the \l count is zero.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativeListView::decrementCurrentIndex()
-{
- Q_D(QDeclarativeListView);
- int count = d->model ? d->model->count() : 0;
- if (count && (currentIndex() > 0 || d->wrap)) {
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- int index = currentIndex()-1;
- setCurrentIndex((index >= 0 && index < count) ? index : count-1);
- }
-}
-
-void QDeclarativeListViewPrivate::positionViewAtIndex(int index, int mode)
-{
- Q_Q(QDeclarativeListView);
- if (!isValid())
- return;
- if (mode < QDeclarativeListView::Beginning || mode > QDeclarativeListView::Contain)
- return;
- int idx = qMax(qMin(index, model->count()-1), 0);
-
- if (layoutScheduled)
- layout();
- qreal pos = isRightToLeft() ? -position() - size() : position();
- FxListItem *item = visibleItem(idx);
- qreal maxExtent;
- if (orient == QDeclarativeListView::Vertical)
- maxExtent = -q->maxYExtent();
- else
- maxExtent = isRightToLeft() ? q->minXExtent()-size(): -q->maxXExtent();
-
- if (!item) {
- int itemPos = positionAt(idx);
- // save the currently visible items in case any of them end up visible again
- QList<FxListItem*> oldVisible = visibleItems;
- visibleItems.clear();
- visiblePos = itemPos;
- visibleIndex = idx;
- setPosition(qMin(qreal(itemPos), maxExtent));
- // now release the reference to all the old visible items.
- for (int i = 0; i < oldVisible.count(); ++i)
- releaseItem(oldVisible.at(i));
- item = visibleItem(idx);
- }
- if (item) {
- const qreal itemPos = item->position();
- switch (mode) {
- case QDeclarativeListView::Beginning:
- pos = itemPos;
- if (index < 0 && header)
- pos -= header->size();
- break;
- case QDeclarativeListView::Center:
- pos = itemPos - (size() - item->size())/2;
- break;
- case QDeclarativeListView::End:
- pos = itemPos - size() + item->size();
- if (index >= model->count() && footer)
- pos += footer->size();
- break;
- case QDeclarativeListView::Visible:
- if (itemPos > pos + size())
- pos = itemPos - size() + item->size();
- else if (item->endPosition() < pos)
- pos = itemPos;
- break;
- case QDeclarativeListView::Contain:
- if (item->endPosition() > pos + size())
- pos = itemPos - size() + item->size();
- if (itemPos < pos)
- pos = itemPos;
- }
- pos = qMin(pos, maxExtent);
- qreal minExtent;
- if (orient == QDeclarativeListView::Vertical) {
- minExtent = -q->minYExtent();
- } else {
- minExtent = isRightToLeft() ? q->maxXExtent()-size(): -q->minXExtent();
- }
- pos = qMax(pos, minExtent);
- moveReason = QDeclarativeListViewPrivate::Other;
- q->cancelFlick();
- setPosition(pos);
- if (highlight) {
- if (autoHighlight) {
- highlight->setPosition(currentItem->itemPosition());
- highlight->setSize(currentItem->itemSize());
- }
- updateHighlight();
- }
- }
- fixupPosition();
-}
-
-/*!
- \qmlmethod ListView::positionViewAtIndex(int index, PositionMode mode)
-
- Positions the view such that the \a index is at the position specified by
- \a mode:
-
- \list
- \o ListView.Beginning - position item at the top (or left for horizontal orientation) of the view.
- \o ListView.Center - position item in the center of the view.
- \o ListView.End - position item at bottom (or right for horizontal orientation) of the view.
- \o ListView.Visible - if any part of the item is visible then take no action, otherwise
- bring the item into view.
- \o ListView.Contain - ensure the entire item is visible. If the item is larger than
- the view the item is positioned at the top (or left for horizontal orientation) of the view.
- \endlist
-
- If positioning the view at \a index would cause empty space to be displayed at
- the beginning or end of the view, the view will be positioned at the boundary.
-
- It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
- at a particular index. This is unreliable since removing items from the start
- of the list does not cause all other items to be repositioned, and because
- the actual start of the view can vary based on the size of the delegates.
- The correct way to bring an item into view is with \c positionViewAtIndex.
-
- \bold Note: methods should only be called after the Component has completed. To position
- the view at startup, this method should be called by Component.onCompleted. For
- example, to position the view at the end:
-
- \code
- Component.onCompleted: positionViewAtIndex(count - 1, ListView.Beginning)
- \endcode
-*/
-void QDeclarativeListView::positionViewAtIndex(int index, int mode)
-{
- Q_D(QDeclarativeListView);
- if (!d->isValid() || index < 0 || index >= d->model->count())
- return;
- d->positionViewAtIndex(index, mode);
-}
-
-/*!
- \qmlmethod ListView::positionViewAtBeginning()
- \qmlmethod ListView::positionViewAtEnd()
- \since Quick 1.1
-
- Positions the view at the beginning or end, taking into account any header or footer.
-
- It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
- at a particular index. This is unreliable since removing items from the start
- of the list does not cause all other items to be repositioned, and because
- the actual start of the view can vary based on the size of the delegates.
-
- \bold Note: methods should only be called after the Component has completed. To position
- the view at startup, this method should be called by Component.onCompleted. For
- example, to position the view at the end on startup:
-
- \code
- Component.onCompleted: positionViewAtEnd()
- \endcode
-*/
-void QDeclarativeListView::positionViewAtBeginning()
-{
- Q_D(QDeclarativeListView);
- if (!d->isValid())
- return;
- d->positionViewAtIndex(-1, Beginning);
-}
-
-void QDeclarativeListView::positionViewAtEnd()
-{
- Q_D(QDeclarativeListView);
- if (!d->isValid())
- return;
- d->positionViewAtIndex(d->model->count(), End);
-}
-
-/*!
- \qmlmethod int ListView::indexAt(int x, int y)
-
- Returns the index of the visible item containing the point \a x, \a y in content
- coordinates. If there is no item at the point specified, or the item is
- not visible -1 is returned.
-
- If the item is outside the visible area, -1 is returned, regardless of
- whether an item will exist at that point when scrolled into view.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-int QDeclarativeListView::indexAt(qreal x, qreal y) const
-{
- Q_D(const QDeclarativeListView);
- for (int i = 0; i < d->visibleItems.count(); ++i) {
- const FxListItem *listItem = d->visibleItems.at(i);
- if(listItem->contains(x, y))
- return listItem->index;
- }
-
- return -1;
-}
-
-void QDeclarativeListView::componentComplete()
-{
- Q_D(QDeclarativeListView);
- QDeclarativeFlickable::componentComplete();
- updateSections();
- d->updateHeader();
- d->updateFooter();
- if (d->isValid()) {
- refill();
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- if (d->currentIndex < 0 && !d->currentIndexCleared)
- d->updateCurrent(0);
- else
- d->updateCurrent(d->currentIndex);
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->position());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeListViewPrivate::Other;
- d->fixupPosition();
- }
-}
-
-void QDeclarativeListView::updateSections()
-{
- Q_D(QDeclarativeListView);
- if (isComponentComplete() && d->model) {
- QList<QByteArray> roles;
- if (d->sectionCriteria && !d->sectionCriteria->property().isEmpty())
- roles << d->sectionCriteria->property().toUtf8();
- d->model->setWatchedRoles(roles);
- d->updateSections();
- if (d->itemCount)
- d->layout();
- }
-}
-
-void QDeclarativeListView::refill()
-{
- Q_D(QDeclarativeListView);
- if (d->isRightToLeft())
- d->refill(-d->position()-d->size()+1, -d->position());
- else
- d->refill(d->position(), d->position()+d->size()-1);
-}
-
-void QDeclarativeListView::trackedPositionChanged()
-{
- Q_D(QDeclarativeListView);
- if (!d->trackedItem || !d->currentItem)
- return;
- if (d->moveReason == QDeclarativeListViewPrivate::SetIndex) {
- qreal trackedPos = qCeil(d->trackedItem->position());
- qreal trackedSize = d->trackedItem->size();
- if (d->trackedItem != d->currentItem) {
- trackedPos -= d->currentItem->sectionSize();
- trackedSize += d->currentItem->sectionSize();
- }
- qreal viewPos;
- qreal highlightStart;
- qreal highlightEnd;
- if (d->isRightToLeft()) {
- viewPos = -d->position()-d->size();
- highlightStart = d->highlightRangeStartValid ? d->size()-d->highlightRangeEnd : d->highlightRangeStart;
- highlightEnd = d->highlightRangeEndValid ? d->size()-d->highlightRangeStart : d->highlightRangeEnd;
- } else {
- viewPos = d->position();
- highlightStart = d->highlightRangeStart;
- highlightEnd = d->highlightRangeEnd;
- }
- qreal pos = viewPos;
- if (d->haveHighlightRange) {
- if (d->highlightRange == StrictlyEnforceRange) {
- if (trackedPos > pos + highlightEnd - d->trackedItem->size())
- pos = trackedPos - highlightEnd + d->trackedItem->size();
- if (trackedPos < pos + highlightStart)
- pos = trackedPos - highlightStart;
- } else {
- if (trackedPos < d->startPosition() + highlightStart) {
- pos = d->startPosition();
- } else if (d->trackedItem->endPosition() > d->endPosition() - d->size() + highlightEnd) {
- pos = d->endPosition() - d->size() + 1;
- if (pos < d->startPosition())
- pos = d->startPosition();
- } else {
- if (trackedPos < viewPos + highlightStart) {
- pos = trackedPos - highlightStart;
- } else if (trackedPos > viewPos + highlightEnd - trackedSize) {
- pos = trackedPos - highlightEnd + trackedSize;
- }
- }
- }
- } else {
- if (trackedPos < viewPos && d->currentItem->position() < viewPos) {
- pos = d->currentItem->position() < trackedPos ? trackedPos : d->currentItem->position();
- } else if (d->trackedItem->endPosition() >= viewPos + d->size()
- && d->currentItem->endPosition() >= viewPos + d->size()) {
- if (d->trackedItem->endPosition() <= d->currentItem->endPosition()) {
- pos = d->trackedItem->endPosition() - d->size() + 1;
- if (trackedSize > d->size())
- pos = trackedPos;
- } else {
- pos = d->currentItem->endPosition() - d->size() + 1;
- if (d->currentItem->size() > d->size())
- pos = d->currentItem->position();
- }
- }
- }
- if (viewPos != pos) {
- cancelFlick();
- d->calcVelocity = true;
- d->setPosition(pos);
- d->calcVelocity = false;
- }
- }
-}
-
-void QDeclarativeListView::itemsInserted(int modelIndex, int count)
-{
- Q_D(QDeclarativeListView);
- if (!isComponentComplete())
- return;
- d->updateUnrequestedIndexes();
- d->moveReason = QDeclarativeListViewPrivate::Other;
-
- qreal tempPos = d->isRightToLeft() ? -d->position()-d->size() : d->position();
- int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
-
- if (index < 0) {
- int i = d->visibleItems.count() - 1;
- while (i > 0 && d->visibleItems.at(i)->index == -1)
- --i;
- if (i == 0 && d->visibleItems.first()->index == -1) {
- // there are no visible items except items marked for removal
- index = d->visibleItems.count();
- } else if (d->visibleItems.at(i)->index + 1 == modelIndex
- && d->visibleItems.at(i)->endPosition() < d->buffer+tempPos+d->size()-1) {
- // Special case of appending an item to the model.
- index = d->visibleItems.count();
- } else {
- if (modelIndex < d->visibleIndex) {
- // Insert before visible items
- d->visibleIndex += count;
- for (int i = 0; i < d->visibleItems.count(); ++i) {
- FxListItem *listItem = d->visibleItems.at(i);
- if (listItem->index != -1 && listItem->index >= modelIndex)
- listItem->index += count;
- }
- }
- if (d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem)
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- }
- d->scheduleLayout();
- d->itemCount += count;
- emit countChanged();
- return;
- }
- }
-
- // index can be the next item past the end of the visible items list (i.e. appended)
- int pos = 0;
- if (d->visibleItems.count()) {
- pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
- : d->visibleItems.last()->endPosition()+d->spacing+1;
- } else if (d->itemCount == 0 && d->header) {
- pos = d->header->size();
- }
-
- int initialPos = pos;
- int diff = 0;
- QList<FxListItem*> added;
- bool addedVisible = false;
- FxListItem *firstVisible = d->firstVisibleItem();
- if (firstVisible && pos < firstVisible->position()) {
- // Insert items before the visible item.
- int insertionIdx = index;
- int i = 0;
- int from = tempPos - d->buffer;
- for (i = count-1; i >= 0 && pos > from; --i) {
- if (!addedVisible) {
- d->scheduleLayout();
- addedVisible = true;
- }
- FxListItem *item = d->createItem(modelIndex + i);
- d->visibleItems.insert(insertionIdx, item);
- pos -= item->size() + d->spacing;
- item->setPosition(pos);
- index++;
- }
- if (i >= 0) {
- // If we didn't insert all our new items - anything
- // before the current index is not visible - remove it.
- while (insertionIdx--) {
- FxListItem *item = d->visibleItems.takeFirst();
- if (item->index != -1)
- d->visibleIndex++;
- d->releaseItem(item);
- }
- } else {
- // adjust pos of items before inserted items.
- for (int i = insertionIdx-1; i >= 0; i--) {
- FxListItem *listItem = d->visibleItems.at(i);
- listItem->setPosition(listItem->position() - (initialPos - pos));
- }
- }
- } else {
- int i = 0;
- int to = d->buffer+tempPos+d->size()-1;
- for (i = 0; i < count && pos <= to; ++i) {
- if (!addedVisible) {
- d->scheduleLayout();
- addedVisible = true;
- }
- FxListItem *item = d->createItem(modelIndex + i);
- d->visibleItems.insert(index, item);
- item->setPosition(pos);
- added.append(item);
- pos += item->size() + d->spacing;
- ++index;
- }
- if (i != count) {
- // We didn't insert all our new items, which means anything
- // beyond the current index is not visible - remove it.
- while (d->visibleItems.count() > index)
- d->releaseItem(d->visibleItems.takeLast());
- }
- diff = pos - initialPos;
- }
- if (d->itemCount && d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem) {
- d->currentItem->index = d->currentIndex;
- d->currentItem->setPosition(d->currentItem->position() + diff);
- }
- emit currentIndexChanged();
- } else if (!d->itemCount && (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared))) {
- d->updateCurrent(0);
- }
- // Update the indexes of the following visible items.
- for (; index < d->visibleItems.count(); ++index) {
- FxListItem *listItem = d->visibleItems.at(index);
- if (d->currentItem && listItem->item != d->currentItem->item)
- listItem->setPosition(listItem->position() + diff);
- if (listItem->index != -1)
- listItem->index += count;
- }
- // everything is in order now - emit add() signal
- for (int j = 0; j < added.count(); ++j)
- added.at(j)->attached->emitAdd();
-
- d->updateSections();
- d->itemCount += count;
- emit countChanged();
-}
-
-void QDeclarativeListView::itemsRemoved(int modelIndex, int count)
-{
- Q_D(QDeclarativeListView);
- if (!isComponentComplete())
- return;
- d->moveReason = QDeclarativeListViewPrivate::Other;
- d->updateUnrequestedIndexes();
- d->itemCount -= count;
-
- FxListItem *firstVisible = d->firstVisibleItem();
- int preRemovedSize = 0;
- bool removedVisible = false;
- // Remove the items from the visible list, skipping anything already marked for removal
- QList<FxListItem*>::Iterator it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxListItem *item = *it;
- if (item->index == -1 || item->index < modelIndex) {
- // already removed, or before removed items
- ++it;
- } else if (item->index >= modelIndex + count) {
- // after removed items
- item->index -= count;
- ++it;
- } else {
- // removed item
- if (!removedVisible) {
- d->scheduleLayout();
- removedVisible = true;
- }
- item->attached->emitRemove();
- if (item->attached->delayRemove()) {
- item->index = -1;
- connect(item->attached, SIGNAL(delayRemoveChanged()), this, SLOT(destroyRemoved()), Qt::QueuedConnection);
- ++it;
- } else {
- if (item == firstVisible)
- firstVisible = 0;
- if (firstVisible && item->position() < firstVisible->position())
- preRemovedSize += item->size();
- it = d->visibleItems.erase(it);
- d->releaseItem(item);
- }
- }
- }
-
- if (firstVisible && d->visibleItems.first() != firstVisible)
- d->visibleItems.first()->setPosition(d->visibleItems.first()->position() + preRemovedSize);
-
- // fix current
- if (d->currentIndex >= modelIndex + count) {
- d->currentIndex -= count;
- if (d->currentItem)
- d->currentItem->index -= count;
- emit currentIndexChanged();
- } else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
- // current item has been removed.
- d->currentItem->attached->setIsCurrentItem(false);
- d->releaseItem(d->currentItem);
- d->currentItem = 0;
- d->currentIndex = -1;
- if (d->itemCount)
- d->updateCurrent(qMin(modelIndex, d->itemCount-1));
- else
- emit currentIndexChanged();
- }
-
- // update visibleIndex
- bool haveVisibleIndex = false;
- for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
- if ((*it)->index != -1) {
- d->visibleIndex = (*it)->index;
- haveVisibleIndex = true;
- break;
- }
- }
-
- if (!haveVisibleIndex) {
- d->timeline.clear();
- if (removedVisible && d->itemCount == 0) {
- d->visibleIndex = 0;
- d->visiblePos = d->header ? d->header->size() : 0;
- d->setPosition(0);
- d->updateHeader();
- d->updateFooter();
- update();
- } else {
- if (modelIndex < d->visibleIndex)
- d->visibleIndex = modelIndex+1;
- d->visibleIndex = qMax(qMin(d->visibleIndex, d->itemCount-1), 0);
- }
- }
-
- d->updateSections();
- emit countChanged();
-}
-
-void QDeclarativeListView::destroyRemoved()
-{
- Q_D(QDeclarativeListView);
- for (QList<FxListItem*>::Iterator it = d->visibleItems.begin();
- it != d->visibleItems.end();) {
- FxListItem *listItem = *it;
- if (listItem->index == -1 && listItem->attached->delayRemove() == false) {
- d->releaseItem(listItem);
- it = d->visibleItems.erase(it);
- } else {
- ++it;
- }
- }
-
- // Correct the positioning of the items
- d->updateSections();
- d->layout();
-}
-
-void QDeclarativeListView::itemsMoved(int from, int to, int count)
-{
- Q_D(QDeclarativeListView);
- if (!isComponentComplete())
- return;
- d->updateUnrequestedIndexes();
-
- if (d->visibleItems.isEmpty()) {
- refill();
- return;
- }
-
- d->moveReason = QDeclarativeListViewPrivate::Other;
- FxListItem *firstVisible = d->firstVisibleItem();
- qreal firstItemPos = firstVisible->position();
- QHash<int,FxListItem*> moved;
- int moveBy = 0;
-
- QList<FxListItem*>::Iterator it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxListItem *item = *it;
- if (item->index >= from && item->index < from + count) {
- // take the items that are moving
- item->index += (to-from);
- moved.insert(item->index, item);
- if (item->position() < firstItemPos)
- moveBy += item->size();
- it = d->visibleItems.erase(it);
- } else {
- // move everything after the moved items.
- if (item->index > from && item->index != -1)
- item->index -= count;
- ++it;
- }
- }
-
- int remaining = count;
- int endIndex = d->visibleIndex;
- it = d->visibleItems.begin();
- while (it != d->visibleItems.end()) {
- FxListItem *item = *it;
- if (remaining && item->index >= to && item->index < to + count) {
- // place items in the target position, reusing any existing items
- FxListItem *movedItem = moved.take(item->index);
- if (!movedItem)
- movedItem = d->createItem(item->index);
- if (item->index <= firstVisible->index)
- moveBy -= movedItem->size();
- it = d->visibleItems.insert(it, movedItem);
- ++it;
- --remaining;
- } else {
- if (item->index != -1) {
- if (item->index >= to) {
- // update everything after the moved items.
- item->index += count;
- }
- endIndex = item->index;
- }
- ++it;
- }
- }
-
- // If we have moved items to the end of the visible items
- // then add any existing moved items that we have
- while (FxListItem *item = moved.take(endIndex+1)) {
- d->visibleItems.append(item);
- ++endIndex;
- }
-
- // update visibleIndex
- for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
- if ((*it)->index != -1) {
- d->visibleIndex = (*it)->index;
- break;
- }
- }
-
- // Fix current index
- if (d->currentIndex >= 0 && d->currentItem) {
- int oldCurrent = d->currentIndex;
- d->currentIndex = d->model->indexOf(d->currentItem->item, this);
- if (oldCurrent != d->currentIndex) {
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- }
- }
-
- // Whatever moved items remain are no longer visible items.
- while (moved.count()) {
- int idx = moved.begin().key();
- FxListItem *item = moved.take(idx);
- if (d->currentItem && item->item == d->currentItem->item)
- item->setPosition(d->positionAt(idx));
- d->releaseItem(item);
- }
-
- // Ensure we don't cause an ugly list scroll.
- d->visibleItems.first()->setPosition(d->visibleItems.first()->position() + moveBy);
-
- d->updateSections();
- d->layout();
-}
-
-void QDeclarativeListView::itemsChanged(int, int)
-{
- Q_D(QDeclarativeListView);
- d->updateSections();
- d->layout();
-}
-
-void QDeclarativeListView::modelReset()
-{
- Q_D(QDeclarativeListView);
- d->moveReason = QDeclarativeListViewPrivate::SetIndex;
- d->regenerate();
- if (d->highlight && d->currentItem) {
- if (d->autoHighlight)
- d->highlight->setPosition(d->currentItem->position());
- d->updateTrackedItem();
- }
- d->moveReason = QDeclarativeListViewPrivate::Other;
- emit countChanged();
-}
-
-void QDeclarativeListView::createdItem(int index, QDeclarativeItem *item)
-{
- Q_D(QDeclarativeListView);
- if (d->requestedIndex != index) {
- item->setParentItem(contentItem());
- d->unrequestedItems.insert(item, index);
- if (d->orient == QDeclarativeListView::Vertical) {
- item->setY(d->positionAt(index));
- } else {
- if (d->isRightToLeft())
- item->setX(-d->positionAt(index)-item->width());
- else
- item->setX(d->positionAt(index));
- }
- }
-}
-
-void QDeclarativeListView::destroyingItem(QDeclarativeItem *item)
-{
- Q_D(QDeclarativeListView);
- d->unrequestedItems.remove(item);
-}
-
-void QDeclarativeListView::animStopped()
-{
- Q_D(QDeclarativeListView);
- d->bufferMode = QDeclarativeListViewPrivate::NoBuffer;
- if (d->haveHighlightRange && d->highlightRange == QDeclarativeListView::StrictlyEnforceRange)
- d->updateHighlight();
-}
-
-QDeclarativeListViewAttached *QDeclarativeListView::qmlAttachedProperties(QObject *obj)
-{
- return new QDeclarativeListViewAttached(obj);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativelistview_p.h b/src/declarative/graphicsitems/qdeclarativelistview_p.h
deleted file mode 100644
index 2cd6ba7c1e..0000000000
--- a/src/declarative/graphicsitems/qdeclarativelistview_p.h
+++ /dev/null
@@ -1,372 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVELISTVIEW_H
-#define QDECLARATIVELISTVIEW_H
-
-#include "private/qdeclarativeflickable_p.h"
-#include "private/qdeclarativeguard_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class Q_AUTOTEST_EXPORT QDeclarativeViewSection : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged)
- Q_PROPERTY(SectionCriteria criteria READ criteria WRITE setCriteria NOTIFY criteriaChanged)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
- Q_ENUMS(SectionCriteria)
-public:
- QDeclarativeViewSection(QObject *parent=0) : QObject(parent), m_criteria(FullString), m_delegate(0) {}
-
- QString property() const { return m_property; }
- void setProperty(const QString &);
-
- enum SectionCriteria { FullString, FirstCharacter };
- SectionCriteria criteria() const { return m_criteria; }
- void setCriteria(SectionCriteria);
-
- QDeclarativeComponent *delegate() const { return m_delegate; }
- void setDelegate(QDeclarativeComponent *delegate);
-
- QString sectionString(const QString &value);
-
-Q_SIGNALS:
- void propertyChanged();
- void criteriaChanged();
- void delegateChanged();
-
-private:
- QString m_property;
- SectionCriteria m_criteria;
- QDeclarativeComponent *m_delegate;
-};
-
-
-class QDeclarativeVisualModel;
-class QDeclarativeListViewAttached;
-class QDeclarativeListViewPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeListView : public QDeclarativeFlickable
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeListView)
-
- Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
- Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
- Q_PROPERTY(QDeclarativeItem *currentItem READ currentItem NOTIFY currentIndexChanged)
- Q_PROPERTY(int count READ count NOTIFY countChanged)
-
- Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
- Q_PROPERTY(QDeclarativeItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
- Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem NOTIFY highlightFollowsCurrentItemChanged)
- Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged)
- Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
- Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged)
- Q_PROPERTY(int highlightResizeDuration READ highlightResizeDuration WRITE setHighlightResizeDuration NOTIFY highlightResizeDurationChanged)
-
- Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged RESET resetPreferredHighlightBegin)
- Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged RESET resetPreferredHighlightEnd)
- Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
-
- Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
- Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)
- Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
- Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1)
- Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged)
- Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
- Q_PROPERTY(QDeclarativeViewSection *section READ sectionCriteria CONSTANT)
- Q_PROPERTY(QString currentSection READ currentSection NOTIFY currentSectionChanged)
-
- Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged)
-
- Q_PROPERTY(QDeclarativeComponent *header READ header WRITE setHeader NOTIFY headerChanged)
- Q_PROPERTY(QDeclarativeComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
-
- Q_ENUMS(HighlightRangeMode)
- Q_ENUMS(Orientation)
- Q_ENUMS(SnapMode)
- Q_ENUMS(PositionMode)
- Q_CLASSINFO("DefaultProperty", "data")
-
-public:
- QDeclarativeListView(QDeclarativeItem *parent=0);
- ~QDeclarativeListView();
-
- QVariant model() const;
- void setModel(const QVariant &);
-
- QDeclarativeComponent *delegate() const;
- void setDelegate(QDeclarativeComponent *);
-
- int currentIndex() const;
- void setCurrentIndex(int idx);
-
- QDeclarativeItem *currentItem();
- QDeclarativeItem *highlightItem();
- int count() const;
-
- QDeclarativeComponent *highlight() const;
- void setHighlight(QDeclarativeComponent *highlight);
-
- bool highlightFollowsCurrentItem() const;
- void setHighlightFollowsCurrentItem(bool);
-
- enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
- HighlightRangeMode highlightRangeMode() const;
- void setHighlightRangeMode(HighlightRangeMode mode);
-
- qreal preferredHighlightBegin() const;
- void setPreferredHighlightBegin(qreal);
- void resetPreferredHighlightBegin();
-
- qreal preferredHighlightEnd() const;
- void setPreferredHighlightEnd(qreal);
- void resetPreferredHighlightEnd();
-
- qreal spacing() const;
- void setSpacing(qreal spacing);
-
- enum Orientation { Horizontal = Qt::Horizontal, Vertical = Qt::Vertical };
- Orientation orientation() const;
- void setOrientation(Orientation);
-
- Qt::LayoutDirection layoutDirection() const;
- void setLayoutDirection(Qt::LayoutDirection);
- Qt::LayoutDirection effectiveLayoutDirection() const;
-
- bool isWrapEnabled() const;
- void setWrapEnabled(bool);
-
- int cacheBuffer() const;
- void setCacheBuffer(int);
-
- QDeclarativeViewSection *sectionCriteria();
- QString currentSection() const;
-
- qreal highlightMoveSpeed() const;
- void setHighlightMoveSpeed(qreal);
-
- int highlightMoveDuration() const;
- void setHighlightMoveDuration(int);
-
- qreal highlightResizeSpeed() const;
- void setHighlightResizeSpeed(qreal);
-
- int highlightResizeDuration() const;
- void setHighlightResizeDuration(int);
-
- enum SnapMode { NoSnap, SnapToItem, SnapOneItem };
- SnapMode snapMode() const;
- void setSnapMode(SnapMode mode);
-
- QDeclarativeComponent *footer() const;
- void setFooter(QDeclarativeComponent *);
-
- QDeclarativeComponent *header() const;
- void setHeader(QDeclarativeComponent *);
-
- virtual void setContentX(qreal pos);
- virtual void setContentY(qreal pos);
-
- static QDeclarativeListViewAttached *qmlAttachedProperties(QObject *);
-
- enum PositionMode { Beginning, Center, End, Visible, Contain };
-
- Q_INVOKABLE void positionViewAtIndex(int index, int mode);
- Q_INVOKABLE int indexAt(qreal x, qreal y) const;
- Q_INVOKABLE Q_REVISION(1) void positionViewAtBeginning();
- Q_INVOKABLE Q_REVISION(1) void positionViewAtEnd();
-
-public Q_SLOTS:
- void incrementCurrentIndex();
- void decrementCurrentIndex();
-
-Q_SIGNALS:
- void countChanged();
- void spacingChanged();
- void orientationChanged();
- Q_REVISION(1) void layoutDirectionChanged();
- Q_REVISION(1) void effectiveLayoutDirectionChanged();
- void currentIndexChanged();
- void currentSectionChanged();
- void highlightMoveSpeedChanged();
- void highlightMoveDurationChanged();
- void highlightResizeSpeedChanged();
- void highlightResizeDurationChanged();
- void highlightChanged();
- void highlightItemChanged();
- void modelChanged();
- void delegateChanged();
- void highlightFollowsCurrentItemChanged();
- void preferredHighlightBeginChanged();
- void preferredHighlightEndChanged();
- void highlightRangeModeChanged();
- void keyNavigationWrapsChanged();
- void cacheBufferChanged();
- void snapModeChanged();
- void headerChanged();
- void footerChanged();
-
-protected:
- virtual bool event(QEvent *event);
- virtual void viewportMoved();
- virtual qreal minYExtent() const;
- virtual qreal maxYExtent() const;
- virtual qreal minXExtent() const;
- virtual qreal maxXExtent() const;
- virtual void keyPressEvent(QKeyEvent *);
- virtual void geometryChanged(const QRectF &newGeometry,const QRectF &oldGeometry);
- virtual void componentComplete();
-
-private Q_SLOTS:
- void updateSections();
- void refill();
- void trackedPositionChanged();
- void itemsInserted(int index, int count);
- void itemsRemoved(int index, int count);
- void itemsMoved(int from, int to, int count);
- void itemsChanged(int index, int count);
- void modelReset();
- void destroyRemoved();
- void createdItem(int index, QDeclarativeItem *item);
- void destroyingItem(QDeclarativeItem *item);
- void animStopped();
-};
-
-class QDeclarativeListViewAttached : public QObject
-{
- Q_OBJECT
-public:
- QDeclarativeListViewAttached(QObject *parent)
- : QObject(parent), m_view(0), m_isCurrent(false), m_delayRemove(false) {}
- ~QDeclarativeListViewAttached() {}
-
- Q_PROPERTY(QDeclarativeListView *view READ view NOTIFY viewChanged)
- QDeclarativeListView *view() { return m_view; }
- void setView(QDeclarativeListView *view) {
- if (view != m_view) {
- m_view = view;
- emit viewChanged();
- }
- }
-
- Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
- bool isCurrentItem() const { return m_isCurrent; }
- void setIsCurrentItem(bool c) {
- if (m_isCurrent != c) {
- m_isCurrent = c;
- emit currentItemChanged();
- }
- }
-
- Q_PROPERTY(QString previousSection READ prevSection NOTIFY prevSectionChanged)
- QString prevSection() const { return m_prevSection; }
- void setPrevSection(const QString &sect) {
- if (m_prevSection != sect) {
- m_prevSection = sect;
- emit prevSectionChanged();
- }
- }
-
- Q_PROPERTY(QString nextSection READ nextSection NOTIFY nextSectionChanged)
- QString nextSection() const { return m_nextSection; }
- void setNextSection(const QString &sect) {
- if (m_nextSection != sect) {
- m_nextSection = sect;
- emit nextSectionChanged();
- }
- }
-
- Q_PROPERTY(QString section READ section NOTIFY sectionChanged)
- QString section() const { return m_section; }
- void setSection(const QString &sect) {
- if (m_section != sect) {
- m_section = sect;
- emit sectionChanged();
- }
- }
-
- Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
- bool delayRemove() const { return m_delayRemove; }
- void setDelayRemove(bool delay) {
- if (m_delayRemove != delay) {
- m_delayRemove = delay;
- emit delayRemoveChanged();
- }
- }
-
- void emitAdd() { emit add(); }
- void emitRemove() { emit remove(); }
-
-Q_SIGNALS:
- void currentItemChanged();
- void sectionChanged();
- void prevSectionChanged();
- void nextSectionChanged();
- void delayRemoveChanged();
- void add();
- void remove();
- void viewChanged();
-
-public:
- QDeclarativeGuard<QDeclarativeListView> m_view;
- mutable QString m_section;
- QString m_prevSection;
- QString m_nextSection;
- bool m_isCurrent : 1;
- bool m_delayRemove : 1;
-};
-
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPEINFO(QDeclarativeListView, QML_HAS_ATTACHED_PROPERTIES)
-QML_DECLARE_TYPE(QDeclarativeListView)
-QML_DECLARE_TYPE(QDeclarativeViewSection)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp
deleted file mode 100644
index 603b3f0b42..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeloader.cpp
+++ /dev/null
@@ -1,597 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeloader_p_p.h"
-
-#include <qdeclarativeinfo.h>
-#include <qdeclarativeengine_p.h>
-#include <qdeclarativeglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QDeclarativeLoaderPrivate::QDeclarativeLoaderPrivate()
- : item(0), component(0), ownComponent(false), updatingSize(false),
- itemWidthValid(false), itemHeightValid(false)
-{
-}
-
-QDeclarativeLoaderPrivate::~QDeclarativeLoaderPrivate()
-{
-}
-
-void QDeclarativeLoaderPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- if (resizeItem == item) {
- if (!updatingSize && newGeometry.width() != oldGeometry.width())
- itemWidthValid = true;
- if (!updatingSize && newGeometry.height() != oldGeometry.height())
- itemHeightValid = true;
- _q_updateSize(false);
- }
- QDeclarativeItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
-}
-
-void QDeclarativeLoaderPrivate::clear()
-{
- if (ownComponent) {
- component->deleteLater();
- component = 0;
- ownComponent = false;
- }
- source = QUrl();
-
- if (item) {
- if (QDeclarativeItem *qmlItem = qobject_cast<QDeclarativeItem*>(item)) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(qmlItem));
- p->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- }
-
- // We can't delete immediately because our item may have triggered
- // the Loader to load a different item.
- if (item->scene()) {
- item->scene()->removeItem(item);
- } else {
- item->setParentItem(0);
- item->setVisible(false);
- }
- item->deleteLater();
- item = 0;
- }
-}
-
-void QDeclarativeLoaderPrivate::initResize()
-{
- Q_Q(QDeclarativeLoader);
- if (QDeclarativeItem *qmlItem = qobject_cast<QDeclarativeItem*>(item)) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(qmlItem));
- p->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- // We may override the item's size, so we need to remember
- // whether the item provided its own valid size.
- itemWidthValid = p->widthValid;
- itemHeightValid = p->heightValid;
- } else if (item && item->isWidget()) {
- QGraphicsWidget *widget = static_cast<QGraphicsWidget*>(item);
- widget->installEventFilter(q);
- }
- _q_updateSize();
-}
-
-/*!
- \qmlclass Loader QDeclarativeLoader
- \ingroup qml-utility-elements
- \since 4.7
- \inherits Item
-
- \brief The Loader item allows dynamically loading an Item-based
- subtree from a URL or Component.
-
- Loader is used to dynamically load visual QML components. It can load a
- QML file (using the \l source property) or a \l Component object (using
- the \l sourceComponent property). It is useful for delaying the creation
- of a component until it is required: for example, when a component should
- be created on demand, or when a component should not be created
- unnecessarily for performance reasons.
-
- Here is a Loader that loads "Page1.qml" as a component when the
- \l MouseArea is clicked:
-
- \snippet doc/src/snippets/declarative/loader/simple.qml 0
-
- The loaded item can be accessed using the \l item property.
-
- If the \l source or \l sourceComponent changes, any previously instantiated
- items are destroyed. Setting \l source to an empty string or setting
- \l sourceComponent to \c undefined destroys the currently loaded item,
- freeing resources and leaving the Loader empty.
-
- \section2 Loader sizing behavior
-
- Loader is like any other visual item and must be positioned and sized
- accordingly to become visible.
-
- \list
- \o If an explicit size is not specified for the Loader, the Loader
- is automatically resized to the size of the loaded item once the
- component is loaded.
- \o If the size of the Loader is specified explicitly by setting
- the width, height or by anchoring, the loaded item will be resized
- to the size of the Loader.
- \endlist
-
- In both scenarios the size of the item and the Loader are identical.
- This ensures that anchoring to the Loader is equivalent to anchoring
- to the loaded item.
-
- \table
- \row
- \o sizeloader.qml
- \o sizeitem.qml
- \row
- \o \snippet doc/src/snippets/declarative/loader/sizeloader.qml 0
- \o \snippet doc/src/snippets/declarative/loader/sizeitem.qml 0
- \row
- \o The red rectangle will be sized to the size of the root item.
- \o The red rectangle will be 50x50, centered in the root item.
- \endtable
-
-
- \section2 Receiving signals from loaded items
-
- Any signals emitted from the loaded item can be received using the
- \l Connections element. For example, the following \c application.qml
- loads \c MyItem.qml, and is able to receive the \c message signal from
- the loaded item through a \l Connections object:
-
- \table
- \row
- \o application.qml
- \o MyItem.qml
- \row
- \o \snippet doc/src/snippets/declarative/loader/connections.qml 0
- \o \snippet doc/src/snippets/declarative/loader/MyItem.qml 0
- \endtable
-
- Alternatively, since \c MyItem.qml is loaded within the scope of the
- Loader, it could also directly call any function defined in the Loader or
- its parent \l Item.
-
-
- \section2 Focus and key events
-
- Loader is a focus scope. Its \l {Item::}{focus} property must be set to
- \c true for any of its children to get the \e {active focus}. (See
- \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page}
- for more details.) Any key events received in the loaded item should likely
- also be \l {KeyEvent::}{accepted} so they are not propagated to the Loader.
-
- For example, the following \c application.qml loads \c KeyReader.qml when
- the \l MouseArea is clicked. Notice the \l {Item::}{focus} property is
- set to \c true for the Loader as well as the \l Item in the dynamically
- loaded object:
-
- \table
- \row
- \o application.qml
- \o KeyReader.qml
- \row
- \o \snippet doc/src/snippets/declarative/loader/focus.qml 0
- \o \snippet doc/src/snippets/declarative/loader/KeyReader.qml 0
- \endtable
-
- Once \c KeyReader.qml is loaded, it accepts key events and sets
- \c event.accepted to \c true so that the event is not propagated to the
- parent \l Rectangle.
-
- \sa {dynamic-object-creation}{Dynamic Object Creation}
-*/
-
-QDeclarativeLoader::QDeclarativeLoader(QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(*(new QDeclarativeLoaderPrivate), parent)
-{
- Q_D(QDeclarativeLoader);
- d->flags |= QGraphicsItem::ItemIsFocusScope;
-}
-
-QDeclarativeLoader::~QDeclarativeLoader()
-{
- Q_D(QDeclarativeLoader);
- if (d->item) {
- if (QDeclarativeItem *qmlItem = qobject_cast<QDeclarativeItem*>(d->item)) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(qmlItem));
- p->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- }
- }
-}
-
-/*!
- \qmlproperty url Loader::source
- This property holds the URL of the QML component to instantiate.
-
- Note the QML component must be an \l{Item}-based component. The loader
- cannot load non-visual components.
-
- To unload the currently loaded item, set this property to an empty string,
- or set \l sourceComponent to \c undefined. Setting \c source to a
- new URL will also cause the item created by the previous URL to be unloaded.
-
- \sa sourceComponent, status, progress
-*/
-QUrl QDeclarativeLoader::source() const
-{
- Q_D(const QDeclarativeLoader);
- return d->source;
-}
-
-void QDeclarativeLoader::setSource(const QUrl &url)
-{
- Q_D(QDeclarativeLoader);
- if (d->source == url)
- return;
-
- d->clear();
-
- d->source = url;
-
- if (d->source.isEmpty()) {
- emit sourceChanged();
- emit statusChanged();
- emit progressChanged();
- emit itemChanged();
- return;
- }
-
- d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
- d->ownComponent = true;
-
- if (isComponentComplete())
- d->load();
-}
-
-/*!
- \qmlproperty Component Loader::sourceComponent
- This property holds the \l{Component} to instantiate.
-
- \qml
- Item {
- Component {
- id: redSquare
- Rectangle { color: "red"; width: 10; height: 10 }
- }
-
- Loader { sourceComponent: redSquare }
- Loader { sourceComponent: redSquare; x: 10 }
- }
- \endqml
-
- To unload the currently loaded item, set this property to an empty string
- or \c undefined.
-
- \sa source, progress
-*/
-
-QDeclarativeComponent *QDeclarativeLoader::sourceComponent() const
-{
- Q_D(const QDeclarativeLoader);
- return d->component;
-}
-
-void QDeclarativeLoader::setSourceComponent(QDeclarativeComponent *comp)
-{
- Q_D(QDeclarativeLoader);
- if (comp == d->component)
- return;
-
- d->clear();
-
- d->component = comp;
- d->ownComponent = false;
-
- if (!d->component) {
- emit sourceChanged();
- emit statusChanged();
- emit progressChanged();
- emit itemChanged();
- return;
- }
-
- if (isComponentComplete())
- d->load();
-}
-
-void QDeclarativeLoader::resetSourceComponent()
-{
- setSourceComponent(0);
-}
-
-void QDeclarativeLoaderPrivate::load()
-{
- Q_Q(QDeclarativeLoader);
-
- if (!q->isComponentComplete() || !component)
- return;
-
- if (!component->isLoading()) {
- _q_sourceLoaded();
- } else {
- QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)),
- q, SLOT(_q_sourceLoaded()));
- QObject::connect(component, SIGNAL(progressChanged(qreal)),
- q, SIGNAL(progressChanged()));
- emit q->statusChanged();
- emit q->progressChanged();
- emit q->sourceChanged();
- emit q->itemChanged();
- }
-}
-
-void QDeclarativeLoaderPrivate::_q_sourceLoaded()
-{
- Q_Q(QDeclarativeLoader);
-
- if (component) {
- if (!component->errors().isEmpty()) {
- QDeclarativeEnginePrivate::warning(qmlEngine(q), component->errors());
- emit q->sourceChanged();
- emit q->statusChanged();
- emit q->progressChanged();
- return;
- }
-
- QDeclarativeContext *creationContext = component->creationContext();
- if (!creationContext) creationContext = qmlContext(q);
- QDeclarativeContext *ctxt = new QDeclarativeContext(creationContext);
- ctxt->setContextObject(q);
-
- QDeclarativeGuard<QDeclarativeComponent> c = component;
- QObject *obj = component->beginCreate(ctxt);
- if (component != c) {
- // component->create could trigger a change in source that causes
- // component to be set to something else. In that case we just
- // need to cleanup.
- if (c)
- c->completeCreate();
- delete obj;
- delete ctxt;
- return;
- }
- if (obj) {
- item = qobject_cast<QGraphicsObject *>(obj);
- if (item) {
- QDeclarative_setParent_noEvent(ctxt, obj);
- QDeclarative_setParent_noEvent(item, q);
- item->setParentItem(q);
-// item->setFocus(true);
- initResize();
- } else {
- qmlInfo(q) << QDeclarativeLoader::tr("Loader does not support loading non-visual elements.");
- delete obj;
- delete ctxt;
- }
- } else {
- if (!component->errors().isEmpty())
- QDeclarativeEnginePrivate::warning(qmlEngine(q), component->errors());
- delete obj;
- delete ctxt;
- source = QUrl();
- }
- component->completeCreate();
- emit q->sourceChanged();
- emit q->statusChanged();
- emit q->progressChanged();
- emit q->itemChanged();
- emit q->loaded();
- }
-}
-
-/*!
- \qmlproperty enumeration Loader::status
-
- This property holds the status of QML loading. It can be one of:
- \list
- \o Loader.Null - no QML source has been set
- \o Loader.Ready - the QML source has been loaded
- \o Loader.Loading - the QML source is currently being loaded
- \o Loader.Error - an error occurred while loading the QML source
- \endlist
-
- Use this status to provide an update or respond to the status change in some way.
- For example, you could:
-
- \list
- \o Trigger a state change:
- \qml
- State { name: 'loaded'; when: loader.status == Loader.Ready }
- \endqml
-
- \o Implement an \c onStatusChanged signal handler:
- \qml
- Loader {
- id: loader
- onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded')
- }
- \endqml
-
- \o Bind to the status value:
- \qml
- Text { text: loader.status == Loader.Ready ? 'Loaded' : 'Not loaded' }
- \endqml
- \endlist
-
- Note that if the source is a local file, the status will initially be Ready (or Error). While
- there will be no onStatusChanged signal in that case, the onLoaded will still be invoked.
-
- \sa progress
-*/
-
-QDeclarativeLoader::Status QDeclarativeLoader::status() const
-{
- Q_D(const QDeclarativeLoader);
-
- if (d->component)
- return static_cast<QDeclarativeLoader::Status>(d->component->status());
-
- if (d->item)
- return Ready;
-
- return d->source.isEmpty() ? Null : Error;
-}
-
-void QDeclarativeLoader::componentComplete()
-{
- Q_D(QDeclarativeLoader);
-
- QDeclarativeItem::componentComplete();
- d->load();
-}
-
-
-/*!
- \qmlsignal Loader::onLoaded()
-
- This handler is called when the \l status becomes \c Loader.Ready, or on successful
- initial load.
-*/
-
-
-/*!
-\qmlproperty real Loader::progress
-
-This property holds the progress of loading QML data from the network, from
-0.0 (nothing loaded) to 1.0 (finished). Most QML files are quite small, so
-this value will rapidly change from 0 to 1.
-
-\sa status
-*/
-qreal QDeclarativeLoader::progress() const
-{
- Q_D(const QDeclarativeLoader);
-
- if (d->item)
- return 1.0;
-
- if (d->component)
- return d->component->progress();
-
- return 0.0;
-}
-
-void QDeclarativeLoaderPrivate::_q_updateSize(bool loaderGeometryChanged)
-{
- Q_Q(QDeclarativeLoader);
- if (!item || updatingSize)
- return;
-
- updatingSize = true;
- if (QDeclarativeItem *qmlItem = qobject_cast<QDeclarativeItem*>(item)) {
- if (!itemWidthValid)
- q->setImplicitWidth(qmlItem->implicitWidth());
- else
- q->setImplicitWidth(qmlItem->width());
- if (loaderGeometryChanged && q->widthValid())
- qmlItem->setWidth(q->width());
- if (!itemHeightValid)
- q->setImplicitHeight(qmlItem->implicitHeight());
- else
- q->setImplicitHeight(qmlItem->height());
- if (loaderGeometryChanged && q->heightValid())
- qmlItem->setHeight(q->height());
- } else if (item && item->isWidget()) {
- QGraphicsWidget *widget = static_cast<QGraphicsWidget*>(item);
- QSizeF widgetSize = widget->size();
- q->setImplicitWidth(widgetSize.width());
- if (loaderGeometryChanged && q->widthValid())
- widgetSize.setWidth(q->width());
- q->setImplicitHeight(widgetSize.height());
- if (loaderGeometryChanged && q->heightValid())
- widgetSize.setHeight(q->height());
- if (widget->size() != widgetSize)
- widget->resize(widgetSize);
- }
- updatingSize = false;
-}
-
-/*!
- \qmlproperty Item Loader::item
- This property holds the top-level item that is currently loaded.
-*/
-QGraphicsObject *QDeclarativeLoader::item() const
-{
- Q_D(const QDeclarativeLoader);
- return d->item;
-}
-
-void QDeclarativeLoader::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeLoader);
- if (newGeometry != oldGeometry) {
- d->_q_updateSize();
- }
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-QVariant QDeclarativeLoader::itemChange(GraphicsItemChange change, const QVariant &value)
-{
- Q_D(QDeclarativeLoader);
- if (change == ItemSceneHasChanged) {
- if (d->item && d->item->isWidget()) {
- d->item->removeEventFilter(this);
- d->item->installEventFilter(this);
- }
- }
- return QDeclarativeItem::itemChange(change, value);
-}
-
-bool QDeclarativeLoader::eventFilter(QObject *watched, QEvent *e)
-{
- Q_D(QDeclarativeLoader);
- if (watched == d->item && e->type() == QEvent::GraphicsSceneResize) {
- if (d->item && d->item->isWidget())
- d->_q_updateSize(false);
- }
- return QDeclarativeItem::eventFilter(watched, e);
-}
-
-#include <moc_qdeclarativeloader_p.cpp>
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeloader_p.h b/src/declarative/graphicsitems/qdeclarativeloader_p.h
deleted file mode 100644
index 06f47e1ea1..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeloader_p.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVELOADER_H
-#define QDECLARATIVELOADER_H
-
-#include "qdeclarativeimplicitsizeitem_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeLoaderPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeLoader : public QDeclarativeImplicitSizeItem
-{
- Q_OBJECT
- Q_ENUMS(Status)
-
- Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
- Q_PROPERTY(QDeclarativeComponent *sourceComponent READ sourceComponent WRITE setSourceComponent RESET resetSourceComponent NOTIFY sourceChanged)
- Q_PROPERTY(QGraphicsObject *item READ item NOTIFY itemChanged)
- Q_PROPERTY(Status status READ status NOTIFY statusChanged)
- Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
-
-public:
- QDeclarativeLoader(QDeclarativeItem *parent=0);
- virtual ~QDeclarativeLoader();
-
- QUrl source() const;
- void setSource(const QUrl &);
-
- QDeclarativeComponent *sourceComponent() const;
- void setSourceComponent(QDeclarativeComponent *);
- void resetSourceComponent();
-
- enum Status { Null, Ready, Loading, Error };
- Status status() const;
- qreal progress() const;
-
- QGraphicsObject *item() const;
-
-Q_SIGNALS:
- void itemChanged();
- void sourceChanged();
- void statusChanged();
- void progressChanged();
- void loaded();
-
-protected:
- void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
- QVariant itemChange(GraphicsItemChange change, const QVariant &value);
- bool eventFilter(QObject *watched, QEvent *e);
- void componentComplete();
-
-private:
- Q_DISABLE_COPY(QDeclarativeLoader)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeLoader)
- Q_PRIVATE_SLOT(d_func(), void _q_sourceLoaded())
- Q_PRIVATE_SLOT(d_func(), void _q_updateSize())
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeLoader)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVELOADER_H
diff --git a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h b/src/declarative/graphicsitems/qdeclarativeloader_p_p.h
deleted file mode 100644
index 04894eeccd..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVELOADER_P_H
-#define QDECLARATIVELOADER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeloader_p.h"
-
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-#include "private/qdeclarativeitemchangelistener_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeContext;
-class QDeclarativeLoaderPrivate : public QDeclarativeImplicitSizeItemPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativeLoader)
-
-public:
- QDeclarativeLoaderPrivate();
- ~QDeclarativeLoaderPrivate();
-
- void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
- void clear();
- void initResize();
- void load();
-
- QUrl source;
- QGraphicsObject *item;
- QDeclarativeComponent *component;
- bool ownComponent : 1;
- bool updatingSize: 1;
- bool itemWidthValid : 1;
- bool itemHeightValid : 1;
-
- void _q_sourceLoaded();
- void _q_updateSize(bool loaderGeometryChanged = true);
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVELOADER_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
deleted file mode 100644
index 18f008a870..0000000000
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ /dev/null
@@ -1,988 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativemousearea_p.h"
-#include "private/qdeclarativemousearea_p_p.h"
-
-#include "private/qdeclarativeevents_p_p.h"
-
-#include <QGraphicsSceneMouseEvent>
-
-#include <float.h>
-
-QT_BEGIN_NAMESPACE
-static const int PressAndHoldDelay = 800;
-
-QDeclarativeDrag::QDeclarativeDrag(QObject *parent)
-: QObject(parent), _target(0), _axis(XandYAxis), _xmin(-FLT_MAX), _xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX),
-_active(false), _filterChildren(false)
-{
-}
-
-QDeclarativeDrag::~QDeclarativeDrag()
-{
-}
-
-QGraphicsObject *QDeclarativeDrag::target() const
-{
- return _target;
-}
-
-void QDeclarativeDrag::setTarget(QGraphicsObject *t)
-{
- if (_target == t)
- return;
- _target = t;
- emit targetChanged();
-}
-
-void QDeclarativeDrag::resetTarget()
-{
- if (!_target)
- return;
- _target = 0;
- emit targetChanged();
-}
-
-QDeclarativeDrag::Axis QDeclarativeDrag::axis() const
-{
- return _axis;
-}
-
-void QDeclarativeDrag::setAxis(QDeclarativeDrag::Axis a)
-{
- if (_axis == a)
- return;
- _axis = a;
- emit axisChanged();
-}
-
-qreal QDeclarativeDrag::xmin() const
-{
- return _xmin;
-}
-
-void QDeclarativeDrag::setXmin(qreal m)
-{
- if (_xmin == m)
- return;
- _xmin = m;
- emit minimumXChanged();
-}
-
-qreal QDeclarativeDrag::xmax() const
-{
- return _xmax;
-}
-
-void QDeclarativeDrag::setXmax(qreal m)
-{
- if (_xmax == m)
- return;
- _xmax = m;
- emit maximumXChanged();
-}
-
-qreal QDeclarativeDrag::ymin() const
-{
- return _ymin;
-}
-
-void QDeclarativeDrag::setYmin(qreal m)
-{
- if (_ymin == m)
- return;
- _ymin = m;
- emit minimumYChanged();
-}
-
-qreal QDeclarativeDrag::ymax() const
-{
- return _ymax;
-}
-
-void QDeclarativeDrag::setYmax(qreal m)
-{
- if (_ymax == m)
- return;
- _ymax = m;
- emit maximumYChanged();
-}
-
-bool QDeclarativeDrag::active() const
-{
- return _active;
-}
-
-void QDeclarativeDrag::setActive(bool drag)
-{
- if (_active == drag)
- return;
- _active = drag;
- emit activeChanged();
-}
-
-bool QDeclarativeDrag::filterChildren() const
-{
- return _filterChildren;
-}
-
-void QDeclarativeDrag::setFilterChildren(bool filter)
-{
- if (_filterChildren == filter)
- return;
- _filterChildren = filter;
- emit filterChildrenChanged();
-}
-
-QDeclarativeMouseAreaPrivate::~QDeclarativeMouseAreaPrivate()
-{
- delete drag;
-}
-
-/*!
- \qmlclass MouseArea QDeclarativeMouseArea
- \ingroup qml-basic-interaction-elements
- \since 4.7
- \brief The MouseArea item enables simple mouse handling.
- \inherits Item
-
- A MouseArea is an invisible item that is typically used in conjunction with
- a visible item in order to provide mouse handling for that item.
- By effectively acting as a proxy, the logic for mouse handling can be
- contained within a MouseArea item.
-
- For basic key handling, see the \l{Keys}{Keys attached property}.
-
- The \l enabled property is used to enable and disable mouse handling for
- the proxied item. When disabled, the mouse area becomes transparent to
- mouse events.
-
- The \l pressed read-only property indicates whether or not the user is
- holding down a mouse button over the mouse area. This property is often
- used in bindings between properties in a user interface. The containsMouse
- read-only property indicates the presence of the mouse cursor over the
- mouse area but, by default, only when a mouse button is held down; see below
- for further details.
-
- Information about the mouse position and button clicks are provided via
- signals for which event handler properties are defined. The most commonly
- used involved handling mouse presses and clicks: onClicked, onDoubleClicked,
- onPressed, onReleased and onPressAndHold.
-
- By default, MouseArea items only report mouse clicks and not changes to the
- position of the mouse cursor. Setting the hoverEnabled property ensures that
- handlers defined for onPositionChanged, onEntered and onExited are used and
- that the containsMouse property is updated even when no mouse buttons are
- pressed.
-
- \section1 Example Usage
-
- \div {class="float-right"}
- \inlineimage qml-mousearea-snippet.png
- \enddiv
-
- The following example uses a MouseArea in a \l Rectangle that changes
- the \l Rectangle color to red when clicked:
-
- \snippet doc/src/snippets/declarative/mousearea/mousearea.qml import
- \codeline
- \snippet doc/src/snippets/declarative/mousearea/mousearea.qml intro
-
- \clearfloat
- Many MouseArea signals pass a \l{MouseEvent}{mouse} parameter that contains
- additional information about the mouse event, such as the position, button,
- and any key modifiers.
-
- Here is an extension of the previous example that produces a different
- color when the area is right clicked:
-
- \snippet doc/src/snippets/declarative/mousearea/mousearea.qml intro-extended
-
- \sa MouseEvent, {declarative/touchinteraction/mousearea}{MouseArea example}
-*/
-
-/*!
- \qmlsignal MouseArea::onEntered()
-
- This handler is called when the mouse enters the mouse area.
-
- By default the onEntered handler is only called while a button is
- pressed. Setting hoverEnabled to true enables handling of
- onEntered when no mouse button is pressed.
-
- \sa hoverEnabled
-*/
-
-/*!
- \qmlsignal MouseArea::onExited()
-
- This handler is called when the mouse exists the mouse area.
-
- By default the onExited handler is only called while a button is
- pressed. Setting hoverEnabled to true enables handling of
- onExited when no mouse button is pressed.
-
- \sa hoverEnabled
-*/
-
-/*!
- \qmlsignal MouseArea::onPositionChanged(MouseEvent mouse)
-
- This handler is called when the mouse position changes.
-
- The \l {MouseEvent}{mouse} parameter provides information about the mouse, including the x and y
- position, and any buttons currently pressed.
-
- The \e accepted property of the MouseEvent parameter is ignored in this handler.
-
- By default the onPositionChanged handler is only called while a button is
- pressed. Setting hoverEnabled to true enables handling of
- onPositionChanged when no mouse button is pressed.
-*/
-
-/*!
- \qmlsignal MouseArea::onClicked(MouseEvent mouse)
-
- This handler is called when there is a click. A click is defined as a press followed by a release,
- both inside the MouseArea (pressing, moving outside the MouseArea, and then moving back inside and
- releasing is also considered a click).
-
- The \l {MouseEvent}{mouse} parameter provides information about the click, including the x and y
- position of the release of the click, and whether the click was held.
-
- The \e accepted property of the MouseEvent parameter is ignored in this handler.
-*/
-
-/*!
- \qmlsignal MouseArea::onPressed(MouseEvent mouse)
-
- This handler is called when there is a press.
- The \l {MouseEvent}{mouse} parameter provides information about the press, including the x and y
- position and which button was pressed.
-
- The \e accepted property of the MouseEvent parameter determines whether this MouseArea
- will handle the press and all future mouse events until release. The default is to accept
- the event and not allow other MouseArea beneath this one to handle the event. If \e accepted
- is set to false, no further events will be sent to this MouseArea until the button is next
- pressed.
-*/
-
-/*!
- \qmlsignal MouseArea::onReleased(MouseEvent mouse)
-
- This handler is called when there is a release.
- The \l {MouseEvent}{mouse} parameter provides information about the click, including the x and y
- position of the release of the click, and whether the click was held.
-
- The \e accepted property of the MouseEvent parameter is ignored in this handler.
-
- \sa onCanceled
-*/
-
-/*!
- \qmlsignal MouseArea::onPressAndHold(MouseEvent mouse)
-
- This handler is called when there is a long press (currently 800ms).
- The \l {MouseEvent}{mouse} parameter provides information about the press, including the x and y
- position of the press, and which button is pressed.
-
- The \e accepted property of the MouseEvent parameter is ignored in this handler.
-*/
-
-/*!
- \qmlsignal MouseArea::onDoubleClicked(MouseEvent mouse)
-
- This handler is called when there is a double-click (a press followed by a release followed by a press).
- The \l {MouseEvent}{mouse} parameter provides information about the click, including the x and y
- position of the release of the click, and whether the click was held.
-
- If the \e accepted property of the \l {MouseEvent}{mouse} parameter is set to false
- in the handler, the onPressed/onReleased/onClicked handlers will be called for the second
- click; otherwise they are suppressed. The accepted property defaults to true.
-*/
-
-/*!
- \qmlsignal MouseArea::onCanceled()
-
- This handler is called when mouse events have been canceled, either because an event was not accepted, or
- because another element stole the mouse event handling.
-
- This signal is for advanced use: it is useful when there is more than one MouseArea
- that is handling input, or when there is a MouseArea inside a \l Flickable. In the latter
- case, if you execute some logic on the pressed signal and then start dragging, the
- \l Flickable will steal the mouse handling from the MouseArea. In these cases, to reset
- the logic when the MouseArea has lost the mouse handling to the \l Flickable,
- \c onCanceled should be used in addition to onReleased.
-*/
-
-QDeclarativeMouseArea::QDeclarativeMouseArea(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeMouseAreaPrivate), parent)
-{
- Q_D(QDeclarativeMouseArea);
- d->init();
-}
-
-QDeclarativeMouseArea::~QDeclarativeMouseArea()
-{
-}
-
-/*!
- \qmlproperty real MouseArea::mouseX
- \qmlproperty real MouseArea::mouseY
- These properties hold the coordinates of the mouse cursor.
-
- If the hoverEnabled property is false then these properties will only be valid
- while a button is pressed, and will remain valid as long as the button is held
- down even if the mouse is moved outside the area.
-
- By default, this property is false.
-
- If hoverEnabled is true then these properties will be valid when:
- \list
- \i no button is pressed, but the mouse is within the MouseArea (containsMouse is true).
- \i a button is pressed and held, even if it has since moved out of the area.
- \endlist
-
- The coordinates are relative to the MouseArea.
-*/
-qreal QDeclarativeMouseArea::mouseX() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->lastPos.x();
-}
-
-qreal QDeclarativeMouseArea::mouseY() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->lastPos.y();
-}
-
-/*!
- \qmlproperty bool MouseArea::enabled
- This property holds whether the item accepts mouse events.
-
- By default, this property is true.
-*/
-bool QDeclarativeMouseArea::isEnabled() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->absorb;
-}
-
-void QDeclarativeMouseArea::setEnabled(bool a)
-{
- Q_D(QDeclarativeMouseArea);
- if (a != d->absorb) {
- d->absorb = a;
- emit enabledChanged();
- }
-}
-
-/*!
- \qmlproperty bool MouseArea::preventStealing
- \since Quick 1.1
- This property holds whether the mouse events may be stolen from this
- MouseArea.
-
- If a MouseArea is placed within an item that filters child mouse
- events, such as Flickable, the mouse
- events may be stolen from the MouseArea if a gesture is recognized
- by the parent element, e.g. a flick gesture. If preventStealing is
- set to true, no element will steal the mouse events.
-
- Note that setting preventStealing to true once an element has started
- stealing events will have no effect until the next press event.
-
- By default this property is false.
-*/
-bool QDeclarativeMouseArea::preventStealing() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->preventStealing;
-}
-
-void QDeclarativeMouseArea::setPreventStealing(bool prevent)
-{
- Q_D(QDeclarativeMouseArea);
- if (prevent != d->preventStealing) {
- d->preventStealing = prevent;
- setKeepMouseGrab(d->preventStealing && d->absorb);
- emit preventStealingChanged();
- }
-}
-
-/*!
- \qmlproperty MouseButtons MouseArea::pressedButtons
- This property holds the mouse buttons currently pressed.
-
- It contains a bitwise combination of:
- \list
- \o Qt.LeftButton
- \o Qt.RightButton
- \o Qt.MiddleButton
- \endlist
-
- The code below displays "right" when the right mouse buttons is pressed:
-
- \snippet doc/src/snippets/declarative/mousearea/mousearea.qml mousebuttons
-
- \sa acceptedButtons
-*/
-Qt::MouseButtons QDeclarativeMouseArea::pressedButtons() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->lastButtons;
-}
-
-void QDeclarativeMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- d->moved = false;
- d->stealMouse = d->preventStealing;
- if (!d->absorb)
- QDeclarativeItem::mousePressEvent(event);
- else {
- d->longPress = false;
- d->saveEvent(event);
- if (d->drag) {
- d->dragX = drag()->axis() & QDeclarativeDrag::XAxis;
- d->dragY = drag()->axis() & QDeclarativeDrag::YAxis;
- }
- if (d->drag)
- d->drag->setActive(false);
- setHovered(true);
- d->startScene = event->scenePos();
- // we should only start timer if pressAndHold is connected to.
- if (d->isPressAndHoldConnected())
- d->pressAndHoldTimer.start(PressAndHoldDelay, this);
- setKeepMouseGrab(d->stealMouse);
- event->setAccepted(setPressed(true));
- }
-}
-
-void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb) {
- QDeclarativeItem::mouseMoveEvent(event);
- return;
- }
-
- d->saveEvent(event);
-
- // ### we should skip this if these signals aren't used
- // ### can GV handle this for us?
- bool contains = boundingRect().contains(d->lastPos);
- if (d->hovered && !contains)
- setHovered(false);
- else if (!d->hovered && contains)
- setHovered(true);
-
- if (d->drag && d->drag->target()) {
- if (!d->moved) {
- d->startX = drag()->target()->x();
- d->startY = drag()->target()->y();
- }
-
- QPointF startLocalPos;
- QPointF curLocalPos;
- if (drag()->target()->parentItem()) {
- startLocalPos = drag()->target()->parentItem()->mapFromScene(d->startScene);
- curLocalPos = drag()->target()->parentItem()->mapFromScene(event->scenePos());
- } else {
- startLocalPos = d->startScene;
- curLocalPos = event->scenePos();
- }
-
- const int dragThreshold = QApplication::startDragDistance();
- qreal dx = qAbs(curLocalPos.x() - startLocalPos.x());
- qreal dy = qAbs(curLocalPos.y() - startLocalPos.y());
-
- if (keepMouseGrab() && d->stealMouse)
- d->drag->setActive(true);
-
- if (d->dragX && d->drag->active()) {
- qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX;
- if (x < drag()->xmin())
- x = drag()->xmin();
- else if (x > drag()->xmax())
- x = drag()->xmax();
- drag()->target()->setX(x);
- }
- if (d->dragY && d->drag->active()) {
- qreal y = (curLocalPos.y() - startLocalPos.y()) + d->startY;
- if (y < drag()->ymin())
- y = drag()->ymin();
- else if (y > drag()->ymax())
- y = drag()->ymax();
- drag()->target()->setY(y);
- }
-
- if (!keepMouseGrab()) {
- if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
- || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
- || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
- setKeepMouseGrab(true);
- d->stealMouse = true;
- }
- }
-
- d->moved = true;
- }
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
- emit mousePositionChanged(&me);
- me.setX(d->lastPos.x());
- me.setY(d->lastPos.y());
- emit positionChanged(&me);
-}
-
-
-void QDeclarativeMouseArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- d->stealMouse = false;
- if (!d->absorb) {
- QDeclarativeItem::mouseReleaseEvent(event);
- } else {
- d->saveEvent(event);
- setPressed(false);
- if (d->drag)
- d->drag->setActive(false);
- // If we don't accept hover, we need to reset containsMouse.
- if (!acceptHoverEvents())
- setHovered(false);
- QGraphicsScene *s = scene();
- if (s && s->mouseGrabberItem() == this)
- ungrabMouse();
- setKeepMouseGrab(false);
- }
- d->doubleClick = false;
-}
-
-void QDeclarativeMouseArea::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb) {
- QDeclarativeItem::mouseDoubleClickEvent(event);
- } else {
- if (d->isDoubleClickConnected())
- d->doubleClick = true;
- d->saveEvent(event);
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false);
- me.setAccepted(d->isDoubleClickConnected());
- emit this->doubleClicked(&me);
- QDeclarativeItem::mouseDoubleClickEvent(event);
- }
-}
-
-void QDeclarativeMouseArea::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb)
- QDeclarativeItem::hoverEnterEvent(event);
- else {
- d->lastPos = event->pos();
- setHovered(true);
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
- emit mousePositionChanged(&me);
- }
-}
-
-void QDeclarativeMouseArea::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb) {
- QDeclarativeItem::hoverMoveEvent(event);
- } else {
- d->lastPos = event->pos();
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
- emit mousePositionChanged(&me);
- me.setX(d->lastPos.x());
- me.setY(d->lastPos.y());
- emit positionChanged(&me);
- }
-}
-
-void QDeclarativeMouseArea::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb)
- QDeclarativeItem::hoverLeaveEvent(event);
- else
- setHovered(false);
-}
-
-#ifndef QT_NO_CONTEXTMENU
-void QDeclarativeMouseArea::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
-{
- bool acceptsContextMenuButton;
-#if defined(Q_OS_SYMBIAN)
- // In Symbian a Long Tap on the screen will trigger. See QSymbianControl::HandleLongTapEventL().
- acceptsContextMenuButton = acceptedButtons() & Qt::LeftButton;
-#elif defined(Q_WS_WINCE)
- // ### WinCE can trigger context menu event with a gesture in the left button or a
- // click with the right button. Since we have no way here to differentiate them when
- // event happens, accepting either of the them will block the event.
- acceptsContextMenuButton = acceptedButtons() & (Qt::LeftButton | Qt::RightButton);
-#else
- acceptsContextMenuButton = acceptedButtons() & Qt::RightButton;
-#endif
-
- if (isEnabled() && event->reason() == QGraphicsSceneContextMenuEvent::Mouse
- && acceptsContextMenuButton) {
- // Do not let the context menu event propagate to items behind.
- return;
- }
-
- QDeclarativeItem::contextMenuEvent(event);
-}
-#endif // QT_NO_CONTEXTMENU
-
-bool QDeclarativeMouseArea::sceneEvent(QEvent *event)
-{
- bool rv = QDeclarativeItem::sceneEvent(event);
- if (event->type() == QEvent::UngrabMouse) {
- Q_D(QDeclarativeMouseArea);
- if (d->pressed) {
- // if our mouse grab has been removed (probably by Flickable), fix our
- // state
- d->pressed = false;
- d->stealMouse = false;
- setKeepMouseGrab(false);
- emit canceled();
- emit pressedChanged();
- if (d->hovered) {
- d->hovered = false;
- emit hoveredChanged();
- }
- }
- }
- return rv;
-}
-
-bool QDeclarativeMouseArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- QGraphicsSceneMouseEvent mouseEvent(event->type());
- QRectF myRect = mapToScene(QRectF(0, 0, width(), height())).boundingRect();
-
- QGraphicsScene *s = scene();
- QDeclarativeItem *grabber = s ? qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem()) : 0;
- bool stealThisEvent = d->stealMouse;
- if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
- mouseEvent.setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
- }
- }
- mouseEvent.setScenePos(event->scenePos());
- mouseEvent.setLastScenePos(event->lastScenePos());
- mouseEvent.setPos(mapFromScene(event->scenePos()));
- mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
-
- switch(mouseEvent.type()) {
- case QEvent::GraphicsSceneMouseMove:
- mouseMoveEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMousePress:
- mousePressEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMouseRelease:
- mouseReleaseEvent(&mouseEvent);
- break;
- default:
- break;
- }
- grabber = qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem());
- if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
- grabMouse();
-
- return stealThisEvent;
- }
- if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
- if (d->pressed) {
- d->pressed = false;
- d->stealMouse = false;
- if (s && s->mouseGrabberItem() == this)
- ungrabMouse();
- emit canceled();
- emit pressedChanged();
- if (d->hovered) {
- d->hovered = false;
- emit hoveredChanged();
- }
- }
- }
- return false;
-}
-
-bool QDeclarativeMouseArea::sceneEventFilter(QGraphicsItem *i, QEvent *e)
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->absorb || !isVisible() || !d->drag || !d->drag->filterChildren())
- return QDeclarativeItem::sceneEventFilter(i, e);
- switch (e->type()) {
- case QEvent::GraphicsSceneMousePress:
- case QEvent::GraphicsSceneMouseMove:
- case QEvent::GraphicsSceneMouseRelease:
- return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
- default:
- break;
- }
-
- return QDeclarativeItem::sceneEventFilter(i, e);
-}
-
-void QDeclarativeMouseArea::timerEvent(QTimerEvent *event)
-{
- Q_D(QDeclarativeMouseArea);
- if (event->timerId() == d->pressAndHoldTimer.timerId()) {
- d->pressAndHoldTimer.stop();
- bool dragged = d->drag && d->drag->active();
- if (d->pressed && dragged == false && d->hovered == true) {
- d->longPress = true;
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
- emit pressAndHold(&me);
- }
- }
-}
-
-void QDeclarativeMouseArea::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeMouseArea);
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-
- if (d->lastScenePos.isNull)
- d->lastScenePos = mapToScene(d->lastPos);
- else if (newGeometry.x() != oldGeometry.x() || newGeometry.y() != oldGeometry.y())
- d->lastPos = mapFromScene(d->lastScenePos);
-}
-
-QVariant QDeclarativeMouseArea::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- Q_D(QDeclarativeMouseArea);
- switch (change) {
- case ItemVisibleHasChanged:
- if (acceptHoverEvents() && d->hovered != (isVisible() && isUnderMouse()))
- setHovered(!d->hovered);
- break;
- default:
- break;
- }
-
- return QDeclarativeItem::itemChange(change, value);
-}
-
-/*!
- \qmlproperty bool MouseArea::hoverEnabled
- This property holds whether hover events are handled.
-
- By default, mouse events are only handled in response to a button event, or when a button is
- pressed. Hover enables handling of all mouse events even when no mouse button is
- pressed.
-
- This property affects the containsMouse property and the onEntered, onExited and
- onPositionChanged signals.
-*/
-bool QDeclarativeMouseArea::hoverEnabled() const
-{
- return acceptHoverEvents();
-}
-
-void QDeclarativeMouseArea::setHoverEnabled(bool h)
-{
- Q_D(QDeclarativeMouseArea);
- if (h == acceptHoverEvents())
- return;
-
- setAcceptHoverEvents(h);
- emit hoverEnabledChanged();
- if (d->hovered != isUnderMouse())
- setHovered(!d->hovered);
-}
-
-/*!
- \qmlproperty bool MouseArea::containsMouse
- This property holds whether the mouse is currently inside the mouse area.
-
- \warning This property is not updated if the area moves under the mouse: \e containsMouse will not change.
- In addition, if hoverEnabled is false, containsMouse will only be valid when the mouse is pressed.
-*/
-bool QDeclarativeMouseArea::hovered() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->hovered;
-}
-
-/*!
- \qmlproperty bool MouseArea::pressed
- This property holds whether the mouse area is currently pressed.
-*/
-bool QDeclarativeMouseArea::pressed() const
-{
- Q_D(const QDeclarativeMouseArea);
- return d->pressed;
-}
-
-void QDeclarativeMouseArea::setHovered(bool h)
-{
- Q_D(QDeclarativeMouseArea);
- if (d->hovered != h) {
- d->hovered = h;
- emit hoveredChanged();
- d->hovered ? emit entered() : emit exited();
- }
-}
-
-/*!
- \qmlproperty Qt::MouseButtons MouseArea::acceptedButtons
- This property holds the mouse buttons that the mouse area reacts to.
-
- The available buttons are:
- \list
- \o Qt.LeftButton
- \o Qt.RightButton
- \o Qt.MiddleButton
- \endlist
-
- To accept more than one button the flags can be combined with the
- "|" (or) operator:
-
- \code
- MouseArea { acceptedButtons: Qt.LeftButton | Qt.RightButton }
- \endcode
-
- The default value is \c Qt.LeftButton.
-*/
-Qt::MouseButtons QDeclarativeMouseArea::acceptedButtons() const
-{
- return acceptedMouseButtons();
-}
-
-void QDeclarativeMouseArea::setAcceptedButtons(Qt::MouseButtons buttons)
-{
- if (buttons != acceptedMouseButtons()) {
- setAcceptedMouseButtons(buttons);
- emit acceptedButtonsChanged();
- }
-}
-
-bool QDeclarativeMouseArea::setPressed(bool p)
-{
- Q_D(QDeclarativeMouseArea);
- bool dragged = d->drag && d->drag->active();
- bool isclick = d->pressed == true && p == false && dragged == false && d->hovered == true;
-
- if (d->pressed != p) {
- d->pressed = p;
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress);
- if (d->pressed) {
- if (!d->doubleClick)
- emit pressed(&me);
- me.setX(d->lastPos.x());
- me.setY(d->lastPos.y());
- emit mousePositionChanged(&me);
- emit pressedChanged();
- } else {
- emit released(&me);
- me.setX(d->lastPos.x());
- me.setY(d->lastPos.y());
- emit pressedChanged();
- if (isclick && !d->longPress && !d->doubleClick)
- emit clicked(&me);
- }
-
- return me.isAccepted();
- }
- return false;
-}
-
-QDeclarativeDrag *QDeclarativeMouseArea::drag()
-{
- Q_D(QDeclarativeMouseArea);
- if (!d->drag)
- d->drag = new QDeclarativeDrag;
- return d->drag;
-}
-
-/*!
- \qmlproperty Item MouseArea::drag.target
- \qmlproperty bool MouseArea::drag.active
- \qmlproperty enumeration MouseArea::drag.axis
- \qmlproperty real MouseArea::drag.minimumX
- \qmlproperty real MouseArea::drag.maximumX
- \qmlproperty real MouseArea::drag.minimumY
- \qmlproperty real MouseArea::drag.maximumY
- \qmlproperty bool MouseArea::drag.filterChildren
-
- \c drag provides a convenient way to make an item draggable.
-
- \list
- \i \c drag.target specifies the id of the item to drag.
- \i \c drag.active specifies if the target item is currently being dragged.
- \i \c drag.axis specifies whether dragging can be done horizontally (\c Drag.XAxis), vertically (\c Drag.YAxis), or both (\c Drag.XandYAxis)
- \i \c drag.minimum and \c drag.maximum limit how far the target can be dragged along the corresponding axes.
- \endlist
-
- The following example displays a \l Rectangle that can be dragged along the X-axis. The opacity
- of the rectangle is reduced when it is dragged to the right.
-
- \snippet doc/src/snippets/declarative/mousearea/mousearea.qml drag
-
- \note Items cannot be dragged if they are anchored for the requested
- \c drag.axis. For example, if \c anchors.left or \c anchors.right was set
- for \c rect in the above example, it cannot be dragged along the X-axis.
- This can be avoided by settng the anchor value to \c undefined in
- an \l onPressed handler.
-
- If \c drag.filterChildren is set to true, a drag can override descendant MouseAreas. This
- enables a parent MouseArea to handle drags, for example, while descendants handle clicks:
-
- \snippet doc/src/snippets/declarative/mousearea/mouseareadragfilter.qml dragfilter
-
-*/
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p.h
deleted file mode 100644
index f6f970b4bb..0000000000
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEMOUSEAREA_H
-#define QDECLARATIVEMOUSEAREA_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class Q_AUTOTEST_EXPORT QDeclarativeDrag : public QObject
-{
- Q_OBJECT
-
- Q_ENUMS(Axis)
- Q_PROPERTY(QGraphicsObject *target READ target WRITE setTarget NOTIFY targetChanged RESET resetTarget)
- Q_PROPERTY(Axis axis READ axis WRITE setAxis NOTIFY axisChanged)
- Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged)
- Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged)
- Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged)
- Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged)
- Q_PROPERTY(bool active READ active NOTIFY activeChanged)
- Q_PROPERTY(bool filterChildren READ filterChildren WRITE setFilterChildren NOTIFY filterChildrenChanged)
- //### consider drag and drop
-
-public:
- QDeclarativeDrag(QObject *parent=0);
- ~QDeclarativeDrag();
-
- QGraphicsObject *target() const;
- void setTarget(QGraphicsObject *);
- void resetTarget();
-
- enum Axis { XAxis=0x01, YAxis=0x02, XandYAxis=0x03 };
- Axis axis() const;
- void setAxis(Axis);
-
- qreal xmin() const;
- void setXmin(qreal);
- qreal xmax() const;
- void setXmax(qreal);
- qreal ymin() const;
- void setYmin(qreal);
- qreal ymax() const;
- void setYmax(qreal);
-
- bool active() const;
- void setActive(bool);
-
- bool filterChildren() const;
- void setFilterChildren(bool);
-
-Q_SIGNALS:
- void targetChanged();
- void axisChanged();
- void minimumXChanged();
- void maximumXChanged();
- void minimumYChanged();
- void maximumYChanged();
- void activeChanged();
- void filterChildrenChanged();
-
-private:
- QGraphicsObject *_target;
- Axis _axis;
- qreal _xmin;
- qreal _xmax;
- qreal _ymin;
- qreal _ymax;
- bool _active : 1;
- bool _filterChildren: 1;
- Q_DISABLE_COPY(QDeclarativeDrag)
-};
-
-class QDeclarativeMouseEvent;
-class QDeclarativeMouseAreaPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeMouseArea : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(qreal mouseX READ mouseX NOTIFY mousePositionChanged)
- Q_PROPERTY(qreal mouseY READ mouseY NOTIFY mousePositionChanged)
- Q_PROPERTY(bool containsMouse READ hovered NOTIFY hoveredChanged)
- Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
- Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
- Q_PROPERTY(Qt::MouseButtons pressedButtons READ pressedButtons NOTIFY pressedChanged)
- Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
- Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
- Q_PROPERTY(QDeclarativeDrag *drag READ drag CONSTANT) //### add flicking to QDeclarativeDrag or add a QDeclarativeFlick ???
- Q_PROPERTY(bool preventStealing READ preventStealing WRITE setPreventStealing NOTIFY preventStealingChanged REVISION 1)
-
-public:
- QDeclarativeMouseArea(QDeclarativeItem *parent=0);
- ~QDeclarativeMouseArea();
-
- qreal mouseX() const;
- qreal mouseY() const;
-
- bool isEnabled() const;
- void setEnabled(bool);
-
- bool hovered() const;
- bool pressed() const;
-
- Qt::MouseButtons pressedButtons() const;
-
- Qt::MouseButtons acceptedButtons() const;
- void setAcceptedButtons(Qt::MouseButtons buttons);
-
- bool hoverEnabled() const;
- void setHoverEnabled(bool h);
-
- QDeclarativeDrag *drag();
-
- bool preventStealing() const;
- void setPreventStealing(bool prevent);
-
-Q_SIGNALS:
- void hoveredChanged();
- void pressedChanged();
- void enabledChanged();
- void acceptedButtonsChanged();
- void hoverEnabledChanged();
- void positionChanged(QDeclarativeMouseEvent *mouse);
- void mousePositionChanged(QDeclarativeMouseEvent *mouse);
- Q_REVISION(1) void preventStealingChanged();
-
- void pressed(QDeclarativeMouseEvent *mouse);
- void pressAndHold(QDeclarativeMouseEvent *mouse);
- void released(QDeclarativeMouseEvent *mouse);
- void clicked(QDeclarativeMouseEvent *mouse);
- void doubleClicked(QDeclarativeMouseEvent *mouse);
- void entered();
- void exited();
- void canceled();
-
-protected:
- void setHovered(bool);
- bool setPressed(bool);
-
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
- void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
- void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
-#ifndef QT_NO_CONTEXTMENU
- void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
-#endif // QT_NO_CONTEXTMENU
- bool sceneEvent(QEvent *);
- bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
- bool sceneEventFilter(QGraphicsItem *i, QEvent *e);
- void timerEvent(QTimerEvent *event);
-
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
- virtual QVariant itemChange(GraphicsItemChange change, const QVariant& value);
-
-private:
- void handlePress();
- void handleRelease();
-
-private:
- Q_DISABLE_COPY(QDeclarativeMouseArea)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeMouseArea)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeDrag)
-QML_DECLARE_TYPE(QDeclarativeMouseArea)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEMOUSEAREA_H
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
deleted file mode 100644
index f6ea00dcf0..0000000000
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEMOUSEREGION_P_H
-#define QDECLARATIVEMOUSEREGION_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeitem_p.h"
-
-#include <qdatetime.h>
-#include <qbasictimer.h>
-#include <qgraphicssceneevent.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeMouseAreaPrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeMouseArea)
-
-public:
- QDeclarativeMouseAreaPrivate()
- : absorb(true), hovered(false), pressed(false), longPress(false),
- moved(false), stealMouse(false), doubleClick(false), preventStealing(false), drag(0)
- {
- }
-
- ~QDeclarativeMouseAreaPrivate();
-
- void init()
- {
- Q_Q(QDeclarativeMouseArea);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFiltersChildEvents(true);
- }
-
- void saveEvent(QGraphicsSceneMouseEvent *event) {
- lastPos = event->pos();
- lastScenePos = event->scenePos();
- lastButton = event->button();
- lastButtons = event->buttons();
- lastModifiers = event->modifiers();
- }
-
- bool isPressAndHoldConnected() {
- Q_Q(QDeclarativeMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QDeclarativeMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
- }
-
- bool isDoubleClickConnected() {
- Q_Q(QDeclarativeMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("doubleClicked(QDeclarativeMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
- }
-
- bool absorb : 1;
- bool hovered : 1;
- bool pressed : 1;
- bool longPress : 1;
- bool moved : 1;
- bool dragX : 1;
- bool dragY : 1;
- bool stealMouse : 1;
- bool doubleClick : 1;
- bool preventStealing : 1;
- QDeclarativeDrag *drag;
- QPointF startScene;
- qreal startX;
- qreal startY;
- QPointF lastPos;
- QDeclarativeNullableValue<QPointF> lastScenePos;
- Qt::MouseButton lastButton;
- Qt::MouseButtons lastButtons;
- Qt::KeyboardModifiers lastModifiers;
- QBasicTimer pressAndHoldTimer;
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEMOUSEREGION_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativepainteditem.cpp b/src/declarative/graphicsitems/qdeclarativepainteditem.cpp
deleted file mode 100644
index d2f9141023..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepainteditem.cpp
+++ /dev/null
@@ -1,497 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativepainteditem_p.h"
-#include "private/qdeclarativepainteditem_p_p.h"
-
-#include <QDebug>
-#include <QPen>
-#include <QEvent>
-#include <QApplication>
-#include <QGraphicsSceneMouseEvent>
-#include <QPainter>
-#include <QPaintEngine>
-#include <qmath.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QDeclarativePaintedItem
- \brief The QDeclarativePaintedItem class is an abstract base class for QDeclarativeView items that want cached painting.
- \internal
-
- This is a convenience class for implementing items that cache their painting.
- The contents of the item are cached behind the scenes.
- The dirtyCache() function should be called if the contents change to
- ensure the cache is refreshed the next time painting occurs.
-
- To subclass QDeclarativePaintedItem, you must reimplement drawContents() to draw
- the contents of the item.
-*/
-
-/*!
- \fn void QDeclarativePaintedItem::drawContents(QPainter *painter, const QRect &rect)
-
- This function is called when the cache needs to be refreshed. When
- sub-classing QDeclarativePaintedItem this function should be implemented so as to
- paint the contents of the item using the given \a painter for the
- area of the contents specified by \a rect.
-*/
-
-/*!
- \property QDeclarativePaintedItem::contentsSize
- \brief The size of the contents
-
- The contents size is the size of the item in regards to how it is painted
- using the drawContents() function. This is distinct from the size of the
- item in regards to height() and width().
-*/
-
-// XXX bug in WebKit - can call repaintRequested and other cache-changing functions from within render!
-static int inpaint=0;
-static int inpaint_clearcache=0;
-
-extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
-
-/*!
- Marks areas of the cache that intersect with the given \a rect as dirty and
- in need of being refreshed.
-
- \sa clearCache()
-*/
-void QDeclarativePaintedItem::dirtyCache(const QRect& rect)
-{
- Q_D(QDeclarativePaintedItem);
- QRect srect(qCeil(rect.x()*d->contentsScale),
- qCeil(rect.y()*d->contentsScale),
- qCeil(rect.width()*d->contentsScale),
- qCeil(rect.height()*d->contentsScale));
- for (int i=0; i < d->imagecache.count(); ) {
- QDeclarativePaintedItemPrivate::ImageCacheItem *c = d->imagecache[i];
- QRect isect = (c->area & srect) | c->dirty;
- if (isect == c->area && !inpaint) {
- delete d->imagecache.takeAt(i);
- } else {
- c->dirty = isect;
- ++i;
- }
- }
-}
-
-/*!
- Marks the entirety of the contents cache as dirty.
-
- \sa dirtyCache()
-*/
-void QDeclarativePaintedItem::clearCache()
-{
- if (inpaint) {
- inpaint_clearcache=1;
- return;
- }
- Q_D(QDeclarativePaintedItem);
- qDeleteAll(d->imagecache);
- d->imagecache.clear();
-}
-
-/*!
- Returns the size of the contents.
-
- \sa setContentsSize()
-*/
-QSize QDeclarativePaintedItem::contentsSize() const
-{
- Q_D(const QDeclarativePaintedItem);
- return d->contentsSize;
-}
-
-/*!
- Sets the size of the contents to the given \a size.
-
- \sa contentsSize()
-*/
-void QDeclarativePaintedItem::setContentsSize(const QSize &size)
-{
- Q_D(QDeclarativePaintedItem);
- if (d->contentsSize == size) return;
- prepareGeometryChange();
- d->contentsSize = size;
- clearCache();
- update();
- emit contentsSizeChanged();
-}
-
-qreal QDeclarativePaintedItem::contentsScale() const
-{
- Q_D(const QDeclarativePaintedItem);
- return d->contentsScale;
-}
-
-void QDeclarativePaintedItem::setContentsScale(qreal scale)
-{
- Q_D(QDeclarativePaintedItem);
- if (d->contentsScale == scale) return;
- d->contentsScale = scale;
- clearCache();
- update();
- emit contentsScaleChanged();
-}
-
-
-/*!
- Constructs a new QDeclarativePaintedItem with the given \a parent.
-*/
-QDeclarativePaintedItem::QDeclarativePaintedItem(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativePaintedItemPrivate), parent)
-{
-}
-
-/*!
- \internal
- Constructs a new QDeclarativePaintedItem with the given \a parent and
- initialized private data member \a dd.
-*/
-QDeclarativePaintedItem::QDeclarativePaintedItem(QDeclarativePaintedItemPrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeItem(dd, parent)
-{
-}
-
-/*!
- Destroys the image item.
-*/
-QDeclarativePaintedItem::~QDeclarativePaintedItem()
-{
- clearCache();
-}
-
-void QDeclarativePaintedItem::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- if (newGeometry.width() != oldGeometry.width() ||
- newGeometry.height() != oldGeometry.height())
- clearCache();
-
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-QVariant QDeclarativePaintedItem::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- if (change == ItemVisibleHasChanged)
- clearCache();
-
- return QDeclarativeItem::itemChange(change, value);
-}
-
-void QDeclarativePaintedItem::setCacheFrozen(bool frozen)
-{
- Q_D(QDeclarativePaintedItem);
- if (d->cachefrozen == frozen)
- return;
- d->cachefrozen = frozen;
- // XXX clear cache?
-}
-
-QRectF QDeclarativePaintedItem::boundingRect() const
-{
- Q_D(const QDeclarativePaintedItem);
- qreal w = d->mWidth;
- QSizeF sz = d->contentsSize * d->contentsScale;
- if (w < sz.width())
- w = sz.width();
- qreal h = d->mHeight;
- if (h < sz.height())
- h = sz.height();
- return QRectF(0.0,0.0,w,h);
-}
-
-/*!
- \internal
-*/
-void QDeclarativePaintedItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
-{
- Q_D(QDeclarativePaintedItem);
- const QRect content = boundingRect().toRect();
- if (content.width() <= 0 || content.height() <= 0)
- return;
-
- ++inpaint;
-
- const QTransform &x = p->deviceTransform();
- QTransform xinv = x.inverted();
- QRegion effectiveClip;
- QRegion sysClip = p->paintEngine()->systemClip();
- if (xinv.type() <= QTransform::TxScale && sysClip.numRects() < 5) {
- // simple transform, region gets no more complicated...
- effectiveClip = xinv.map(sysClip);
- } else {
- // do not make complicated regions...
- effectiveClip = xinv.mapRect(sysClip.boundingRect());
- }
-
- QRegion topaint = p->clipRegion();
- if (topaint.isEmpty()) {
- if (effectiveClip.isEmpty())
- topaint = QRect(0,0,p->device()->width(),p->device()->height());
- else
- topaint = effectiveClip;
- } else if (!effectiveClip.isEmpty()) {
- topaint &= effectiveClip;
- }
-
- topaint &= content;
- QRegion uncached(content);
- p->setRenderHints(QPainter::SmoothPixmapTransform, d->smooth);
-
- int cachesize=0;
- for (int i=0; i<d->imagecache.count(); ++i) {
- QRect area = d->imagecache[i]->area;
- if (topaint.contains(area)) {
- QRectF target(area.x(), area.y(), area.width(), area.height());
- if (!d->cachefrozen) {
- if (!d->imagecache[i]->dirty.isNull() && topaint.contains(d->imagecache[i]->dirty)) {
-#ifdef Q_WS_MAC
- bool oldSmooth = qt_applefontsmoothing_enabled;
- qt_applefontsmoothing_enabled = false;
-#endif
- QPainter qp(&d->imagecache[i]->image);
-#ifdef Q_WS_MAC
- qt_applefontsmoothing_enabled = oldSmooth;
-#endif
- qp.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, d->smoothCache);
- qp.translate(-area.x(), -area.y());
- qp.scale(d->contentsScale,d->contentsScale);
- QRect clip = d->imagecache[i]->dirty;
- QRect sclip(qFloor(clip.x()/d->contentsScale),
- qFloor(clip.y()/d->contentsScale),
- qCeil(clip.width()/d->contentsScale+clip.x()/d->contentsScale-qFloor(clip.x()/d->contentsScale)),
- qCeil(clip.height()/d->contentsScale+clip.y()/d->contentsScale-qFloor(clip.y()/d->contentsScale)));
- qp.setClipRect(sclip);
- if (d->fillColor.isValid()){
- if(d->fillColor.alpha() < 255){
- // ### Might not work outside of raster paintengine
- QPainter::CompositionMode prev = qp.compositionMode();
- qp.setCompositionMode(QPainter::CompositionMode_Source);
- qp.fillRect(sclip,d->fillColor);
- qp.setCompositionMode(prev);
- }else{
- qp.fillRect(sclip,d->fillColor);
- }
- }
- drawContents(&qp, sclip);
- d->imagecache[i]->dirty = QRect();
- }
- }
- p->drawPixmap(target.toRect(), d->imagecache[i]->image);
- topaint -= area;
- d->imagecache[i]->age=0;
- } else {
- d->imagecache[i]->age++;
- }
- cachesize += area.width()*area.height();
- uncached -= area;
- }
-
- if (!topaint.isEmpty()) {
- if (!d->cachefrozen) {
- // Find a sensible larger area, otherwise will paint lots of tiny images.
- QRect biggerrect = topaint.boundingRect().adjusted(-64,-64,128,128);
- cachesize += biggerrect.width() * biggerrect.height();
- while (d->imagecache.count() && cachesize > d->max_imagecache_size) {
- 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();
- uncached += d->imagecache[oldest]->area;
- delete d->imagecache.takeAt(oldest);
- }
- const QRegion bigger = QRegion(biggerrect) & uncached;
- const QVector<QRect> rects = bigger.rects();
- for (int i = 0; i < rects.count(); ++i) {
- const QRect &r = rects.at(i);
- QPixmap img(r.size());
- if (d->fillColor.isValid())
- img.fill(d->fillColor);
- {
-#ifdef Q_WS_MAC
- bool oldSmooth = qt_applefontsmoothing_enabled;
- qt_applefontsmoothing_enabled = false;
-#endif
- QPainter qp(&img);
-#ifdef Q_WS_MAC
- qt_applefontsmoothing_enabled = oldSmooth;
-#endif
- qp.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, d->smoothCache);
-
- qp.translate(-r.x(),-r.y());
- qp.scale(d->contentsScale,d->contentsScale);
- QRect sclip(qFloor(r.x()/d->contentsScale),
- qFloor(r.y()/d->contentsScale),
- qCeil(r.width()/d->contentsScale+r.x()/d->contentsScale-qFloor(r.x()/d->contentsScale)),
- qCeil(r.height()/d->contentsScale+r.y()/d->contentsScale-qFloor(r.y()/d->contentsScale)));
- drawContents(&qp, sclip);
- }
- QDeclarativePaintedItemPrivate::ImageCacheItem *newitem = new QDeclarativePaintedItemPrivate::ImageCacheItem;
- newitem->area = r;
- newitem->image = img;
- d->imagecache.append(newitem);
- p->drawPixmap(r, newitem->image);
- }
- } else {
- const QVector<QRect> rects = uncached.rects();
- for (int i = 0; i < rects.count(); ++i)
- p->fillRect(rects.at(i), Qt::lightGray);
- }
- }
-
- if (inpaint_clearcache) {
- clearCache();
- inpaint_clearcache = 0;
- }
-
- --inpaint;
-}
-
-/*!
- \qmlproperty int PaintedItem::pixelCacheSize
-
- 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 QDeclarativePaintedItem::pixelCacheSize
-
- 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 QDeclarativePaintedItem.
-*/
-int QDeclarativePaintedItem::pixelCacheSize() const
-{
- Q_D(const QDeclarativePaintedItem);
- return d->max_imagecache_size;
-}
-
-void QDeclarativePaintedItem::setPixelCacheSize(int pixels)
-{
- Q_D(QDeclarativePaintedItem);
- 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();
- delete d->imagecache.takeAt(oldest);
- }
- }
- d->max_imagecache_size = pixels;
-}
-
-
-
-/*!
- \property QDeclarativePaintedItem::fillColor
-
- The color to be used to fill the item prior to calling drawContents().
- By default, this is Qt::transparent.
-
- Performance improvements can be achieved if subclasses call this with either an
- invalid color (QColor()), or an appropriate solid color.
-*/
-void QDeclarativePaintedItem::setFillColor(const QColor& c)
-{
- Q_D(QDeclarativePaintedItem);
- if (d->fillColor == c)
- return;
- d->fillColor = c;
- emit fillColorChanged();
- update();
-}
-
-QColor QDeclarativePaintedItem::fillColor() const
-{
- Q_D(const QDeclarativePaintedItem);
- return d->fillColor;
-}
-
-/*!
- \qmlproperty bool PaintedItem::smoothCache
-
- Controls whether the cached tiles of which the item is composed are
- rendered smoothly when they are generated.
-
- This is in addition toe Item::smooth, which controls the smooth painting of
- the already-painted cached tiles under transformation.
-*/
-bool QDeclarativePaintedItem::smoothCache() const
-{
- Q_D(const QDeclarativePaintedItem);
- return d->smoothCache;
-}
-
-void QDeclarativePaintedItem::setSmoothCache(bool on)
-{
- Q_D(QDeclarativePaintedItem);
- if (d->smoothCache != on) {
- d->smoothCache = on;
- clearCache();
- }
-}
-
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativepainteditem_p.h b/src/declarative/graphicsitems/qdeclarativepainteditem_p.h
deleted file mode 100644
index 6a0b7449d6..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepainteditem_p.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGEITEM_H
-#define QDECLARATIVEIMAGEITEM_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativePaintedItemPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativePaintedItem : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(QSize contentsSize READ contentsSize WRITE setContentsSize NOTIFY contentsSizeChanged)
- Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor NOTIFY fillColorChanged)
- Q_PROPERTY(int pixelCacheSize READ pixelCacheSize WRITE setPixelCacheSize)
- Q_PROPERTY(bool smoothCache READ smoothCache WRITE setSmoothCache)
- Q_PROPERTY(qreal contentsScale READ contentsScale WRITE setContentsScale NOTIFY contentsScaleChanged)
-
-
-public:
- QDeclarativePaintedItem(QDeclarativeItem *parent=0);
- ~QDeclarativePaintedItem();
-
- QSize contentsSize() const;
- void setContentsSize(const QSize &);
-
- qreal contentsScale() const;
- void setContentsScale(qreal);
-
- int pixelCacheSize() const;
- void setPixelCacheSize(int pixels);
-
- bool smoothCache() const;
- void setSmoothCache(bool on);
-
- QColor fillColor() const;
- void setFillColor(const QColor&);
-
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
-
-protected:
- QDeclarativePaintedItem(QDeclarativePaintedItemPrivate &dd, QDeclarativeItem *parent);
-
- virtual void drawContents(QPainter *p, const QRect &) = 0;
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
- virtual QVariant itemChange(GraphicsItemChange change,
- const QVariant &value);
-
- void setCacheFrozen(bool);
- QRectF boundingRect() const;
-
-Q_SIGNALS:
- void fillColorChanged();
- void contentsSizeChanged();
- void contentsScaleChanged();
-
-protected Q_SLOTS:
- void dirtyCache(const QRect &);
- void clearCache();
-
-private:
- Q_DISABLE_COPY(QDeclarativePaintedItem)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativePaintedItem)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativePaintedItem)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativepainteditem_p_p.h b/src/declarative/graphicsitems/qdeclarativepainteditem_p_p.h
deleted file mode 100644
index c2eef4a0e1..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepainteditem_p_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEIMAGEITEM_P_H
-#define QDECLARATIVEIMAGEITEM_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeitem_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativePaintedItemPrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativePaintedItem)
-
-public:
- QDeclarativePaintedItemPrivate()
- : max_imagecache_size(100000), contentsScale(1.0), fillColor(Qt::transparent), cachefrozen(false), smoothCache(true)
- {
- }
-
- struct ImageCacheItem {
- ImageCacheItem() : age(0) {}
- ~ImageCacheItem() { }
- int age;
- QRect area;
- QRect dirty; // one dirty area (allows optimization of common cases)
- QPixmap image;
- };
-
- QList<ImageCacheItem*> imagecache;
-
- int max_imagecache_size;
- QSize contentsSize;
- qreal contentsScale;
- QColor fillColor;
- bool cachefrozen;
- bool smoothCache;
-};
-
-QT_END_NAMESPACE
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
deleted file mode 100644
index 94f128dca8..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ /dev/null
@@ -1,1729 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativepathview_p.h"
-#include "private/qdeclarativepathview_p_p.h"
-
-#include <qdeclarativestate_p.h>
-#include <qdeclarativeopenmetaobject_p.h>
-#include <QDebug>
-#include <QEvent>
-#include <qlistmodelinterface_p.h>
-#include <QGraphicsSceneEvent>
-
-#include <qmath.h>
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-inline qreal qmlMod(qreal x, qreal y)
-{
-#ifdef QT_USE_MATH_H_FLOATS
- if(sizeof(qreal) == sizeof(float))
- return fmodf(float(x), float(y));
- else
-#endif
- return fmod(x, y);
-}
-
-static QDeclarativeOpenMetaObjectType *qPathViewAttachedType = 0;
-
-QDeclarativePathViewAttached::QDeclarativePathViewAttached(QObject *parent)
-: QObject(parent), m_percent(-1), m_view(0), m_onPath(false), m_isCurrent(false)
-{
- if (qPathViewAttachedType) {
- m_metaobject = new QDeclarativeOpenMetaObject(this, qPathViewAttachedType);
- m_metaobject->setCached(true);
- } else {
- m_metaobject = new QDeclarativeOpenMetaObject(this);
- }
-}
-
-QDeclarativePathViewAttached::~QDeclarativePathViewAttached()
-{
-}
-
-QVariant QDeclarativePathViewAttached::value(const QByteArray &name) const
-{
- return m_metaobject->value(name);
-}
-void QDeclarativePathViewAttached::setValue(const QByteArray &name, const QVariant &val)
-{
- m_metaobject->setValue(name, val);
-}
-
-
-void QDeclarativePathViewPrivate::init()
-{
- Q_Q(QDeclarativePathView);
- offset = 0;
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFlag(QGraphicsItem::ItemIsFocusScope);
- q->setFiltersChildEvents(true);
- q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked()));
- lastPosTime.invalidate();
- static int timelineCompletedIdx = -1;
- static int movementEndingIdx = -1;
- if (timelineCompletedIdx == -1) {
- timelineCompletedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("completed()");
- movementEndingIdx = QDeclarativePathView::staticMetaObject.indexOfSlot("movementEnding()");
- }
- QMetaObject::connect(&tl, timelineCompletedIdx,
- q, movementEndingIdx, Qt::DirectConnection);
-}
-
-QDeclarativeItem *QDeclarativePathViewPrivate::getItem(int modelIndex)
-{
- Q_Q(QDeclarativePathView);
- requestedIndex = modelIndex;
- QDeclarativeItem *item = model->item(modelIndex, false);
- if (item) {
- if (!attType) {
- // pre-create one metatype to share with all attached objects
- attType = new QDeclarativeOpenMetaObjectType(&QDeclarativePathViewAttached::staticMetaObject, qmlEngine(q));
- foreach(const QString &attr, path->attributes())
- attType->createProperty(attr.toUtf8());
- }
- qPathViewAttachedType = attType;
- QDeclarativePathViewAttached *att = static_cast<QDeclarativePathViewAttached *>(qmlAttachedPropertiesObject<QDeclarativePathView>(item));
- qPathViewAttachedType = 0;
- if (att) {
- att->m_view = q;
- att->setOnPath(true);
- }
- item->setParentItem(q);
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- }
- requestedIndex = -1;
- return item;
-}
-
-void QDeclarativePathViewPrivate::releaseItem(QDeclarativeItem *item)
-{
- if (!item || !model)
- return;
- QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
- itemPrivate->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- if (model->release(item) == 0) {
- // item was not destroyed, and we no longer reference it.
- if (QDeclarativePathViewAttached *att = attached(item))
- att->setOnPath(false);
- }
-}
-
-QDeclarativePathViewAttached *QDeclarativePathViewPrivate::attached(QDeclarativeItem *item)
-{
- return static_cast<QDeclarativePathViewAttached *>(qmlAttachedPropertiesObject<QDeclarativePathView>(item, false));
-}
-
-void QDeclarativePathViewPrivate::clear()
-{
- for (int i=0; i<items.count(); i++){
- QDeclarativeItem *p = items[i];
- releaseItem(p);
- }
- items.clear();
-}
-
-void QDeclarativePathViewPrivate::updateMappedRange()
-{
- if (model && pathItems != -1 && pathItems < modelCount)
- mappedRange = qreal(pathItems)/modelCount;
- else
- mappedRange = 1.0;
-}
-
-qreal QDeclarativePathViewPrivate::positionOfIndex(qreal index) const
-{
- qreal pos = -1.0;
-
- if (model && index >= 0 && index < modelCount) {
- qreal start = 0.0;
- if (haveHighlightRange && highlightRangeMode != QDeclarativePathView::NoHighlightRange)
- start = highlightRangeStart;
- qreal globalPos = index + offset;
- globalPos = qmlMod(globalPos, qreal(modelCount)) / modelCount;
- if (pathItems != -1 && pathItems < modelCount) {
- globalPos += start * mappedRange;
- globalPos = qmlMod(globalPos, 1.0);
- if (globalPos < mappedRange)
- pos = globalPos / mappedRange;
- } else {
- pos = qmlMod(globalPos + start, 1.0);
- }
- }
-
- return pos;
-}
-
-void QDeclarativePathViewPrivate::createHighlight()
-{
- Q_Q(QDeclarativePathView);
- if (!q->isComponentComplete())
- return;
-
- bool changed = false;
- if (highlightItem) {
- if (highlightItem->scene())
- highlightItem->scene()->removeItem(highlightItem);
- highlightItem->deleteLater();
- highlightItem = 0;
- changed = true;
- }
-
- QDeclarativeItem *item = 0;
- if (highlightComponent) {
- QDeclarativeContext *highlightContext = new QDeclarativeContext(qmlContext(q));
- QObject *nobj = highlightComponent->create(highlightContext);
- if (nobj) {
- QDeclarative_setParent_noEvent(highlightContext, nobj);
- item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item)
- delete nobj;
- } else {
- delete highlightContext;
- }
- } else {
- item = new QDeclarativeItem;
- }
- if (item) {
- QDeclarative_setParent_noEvent(item, q);
- item->setParentItem(q);
- highlightItem = item;
- changed = true;
- }
- if (changed)
- emit q->highlightItemChanged();
-}
-
-void QDeclarativePathViewPrivate::updateHighlight()
-{
- Q_Q(QDeclarativePathView);
- if (!q->isComponentComplete() || !isValid())
- return;
- if (highlightItem) {
- if (haveHighlightRange && highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange) {
- updateItem(highlightItem, highlightRangeStart);
- } else {
- qreal target = currentIndex;
-
- offsetAdj = 0.0;
- tl.reset(moveHighlight);
- moveHighlight.setValue(highlightPosition);
-
- const int duration = highlightMoveDuration;
-
- if (target - highlightPosition > modelCount/2) {
- highlightUp = false;
- qreal distance = modelCount - target + highlightPosition;
- tl.move(moveHighlight, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * highlightPosition / distance));
- tl.set(moveHighlight, modelCount-0.01);
- tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * (modelCount-target) / distance));
- } else if (target - highlightPosition <= -modelCount/2) {
- highlightUp = true;
- qreal distance = modelCount - highlightPosition + target;
- tl.move(moveHighlight, modelCount-0.01, QEasingCurve(QEasingCurve::InQuad), int(duration * (modelCount-highlightPosition) / distance));
- tl.set(moveHighlight, 0.0);
- tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * target / distance));
- } else {
- highlightUp = highlightPosition - target < 0;
- tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::InOutQuad), duration);
- }
- }
- }
-}
-
-void QDeclarativePathViewPrivate::setHighlightPosition(qreal pos)
-{
- if (pos != highlightPosition) {
- qreal start = 0.0;
- qreal end = 1.0;
- if (haveHighlightRange && highlightRangeMode != QDeclarativePathView::NoHighlightRange) {
- start = highlightRangeStart;
- end = highlightRangeEnd;
- }
-
- qreal range = qreal(modelCount);
- // calc normalized position of highlight relative to offset
- qreal relativeHighlight = qmlMod(pos + offset, range) / range;
-
- if (!highlightUp && relativeHighlight > end * mappedRange) {
- qreal diff = 1.0 - relativeHighlight;
- setOffset(offset + diff * range);
- } else if (highlightUp && relativeHighlight >= (end - start) * mappedRange) {
- qreal diff = relativeHighlight - (end - start) * mappedRange;
- setOffset(offset - diff * range - 0.00001);
- }
-
- highlightPosition = pos;
- qreal pathPos = positionOfIndex(pos);
- updateItem(highlightItem, pathPos);
- if (QDeclarativePathViewAttached *att = attached(highlightItem))
- att->setOnPath(pathPos != -1.0);
- }
-}
-
-void QDeclarativePathView::pathUpdated()
-{
- Q_D(QDeclarativePathView);
- QList<QDeclarativeItem*>::iterator it = d->items.begin();
- while (it != d->items.end()) {
- QDeclarativeItem *item = *it;
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->m_percent = -1;
- ++it;
- }
- refill();
-}
-
-void QDeclarativePathViewPrivate::updateItem(QDeclarativeItem *item, qreal percent)
-{
- if (QDeclarativePathViewAttached *att = attached(item)) {
- if (qFuzzyCompare(att->m_percent, percent))
- return;
- att->m_percent = percent;
- foreach(const QString &attr, path->attributes())
- att->setValue(attr.toUtf8(), path->attributeAt(attr, percent));
- }
- QPointF pf = path->pointAt(percent);
- item->setX(qRound(pf.x() - item->width()/2));
- item->setY(qRound(pf.y() - item->height()/2));
-}
-
-void QDeclarativePathViewPrivate::regenerate()
-{
- Q_Q(QDeclarativePathView);
- if (!q->isComponentComplete())
- return;
-
- clear();
-
- if (!isValid())
- return;
-
- firstIndex = -1;
- updateMappedRange();
- q->refill();
-}
-
-/*!
- \qmlclass PathView QDeclarativePathView
- \ingroup qml-view-elements
- \since 4.7
- \brief The PathView element lays out model-provided items on a path.
- \inherits Item
-
- A PathView displays data from models created from built-in QML elements like ListModel
- and XmlListModel, or custom model classes defined in C++ that inherit from
- QAbstractListModel.
-
- The view has a \l model, which defines the data to be displayed, and
- a \l delegate, which defines how the data should be displayed.
- The \l delegate is instantiated for each item on the \l path.
- The items may be flicked to move them along the path.
-
- For example, if there is a simple list model defined in a file \c ContactModel.qml like this:
-
- \snippet doc/src/snippets/declarative/pathview/ContactModel.qml 0
-
- This data can be represented as a PathView, like this:
-
- \snippet doc/src/snippets/declarative/pathview/pathview.qml 0
-
- \image pathview.gif
-
- (Note the above example uses PathAttribute to scale and modify the
- opacity of the items as they rotate. This additional code can be seen in the
- PathAttribute documentation.)
-
- PathView does not automatically handle keyboard navigation. This is because
- the keys to use for navigation will depend upon the shape of the path. Navigation
- can be added quite simply by setting \c focus to \c true and calling
- \l decrementCurrentIndex() or \l incrementCurrentIndex(), for example to navigate
- using the left and right arrow keys:
-
- \qml
- PathView {
- // ...
- focus: true
- Keys.onLeftPressed: decrementCurrentIndex()
- Keys.onRightPressed: incrementCurrentIndex()
- }
- \endqml
-
- The path view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
-
- Delegates are instantiated as needed and may be destroyed at any time.
- State should \e never be stored in a delegate.
-
- PathView attaches a number of properties to the root item of the delegate, for example
- \c {PathView.isCurrentItem}. In the following example, the root delegate item can access
- this attached property directly as \c PathView.isCurrentItem, while the child
- \c nameText object must refer to this property as \c wrapper.PathView.isCurrentItem.
-
- \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
-
- \bold Note that views do not enable \e clip automatically. If the view
- is not clipped by another item or the screen, it will be necessary
- to set \e {clip: true} in order to have the out of view items clipped
- nicely.
-
- \sa Path, {declarative/modelviews/pathview}{PathView example}
-*/
-
-QDeclarativePathView::QDeclarativePathView(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativePathViewPrivate), parent)
-{
- Q_D(QDeclarativePathView);
- d->init();
-}
-
-QDeclarativePathView::~QDeclarativePathView()
-{
- Q_D(QDeclarativePathView);
- d->clear();
- if (d->attType)
- d->attType->release();
- if (d->ownModel)
- delete d->model;
-}
-
-/*!
- \qmlattachedproperty PathView PathView::view
- This attached property holds the view that manages this delegate instance.
-
- It is attached to each instance of the delegate.
-*/
-
-/*!
- \qmlattachedproperty bool PathView::onPath
- This attached property holds whether the item is currently on the path.
-
- If a pathItemCount has been set, it is possible that some items may
- be instantiated, but not considered to be currently on the path.
- Usually, these items would be set invisible, for example:
-
- \qml
- Component {
- Rectangle {
- visible: PathView.onPath
- // ...
- }
- }
- \endqml
-
- It is attached to each instance of the delegate.
-*/
-
-/*!
- \qmlattachedproperty bool PathView::isCurrentItem
- This attached property is true if this delegate is the current item; otherwise false.
-
- It is attached to each instance of the delegate.
-
- This property may be used to adjust the appearance of the current item.
-
- \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
-*/
-
-/*!
- \qmlproperty model PathView::model
- This property holds the model providing data for the view.
-
- The model provides a set of data that is used to create the items for the view.
- For large or dynamic datasets the model is usually provided by a C++ model object.
- Models can also be created directly in QML, using the ListModel element.
-
- \sa {qmlmodels}{Data Models}
-*/
-QVariant QDeclarativePathView::model() const
-{
- Q_D(const QDeclarativePathView);
- return d->modelVariant;
-}
-
-void QDeclarativePathView::setModel(const QVariant &model)
-{
- Q_D(QDeclarativePathView);
- if (d->modelVariant == model)
- return;
-
- if (d->model) {
- disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- disconnect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- for (int i=0; i<d->items.count(); i++){
- QDeclarativeItem *p = d->items[i];
- d->model->release(p);
- }
- d->items.clear();
- }
-
- d->modelVariant = model;
- QObject *object = qvariant_cast<QObject*>(model);
- QDeclarativeVisualModel *vim = 0;
- if (object && (vim = qobject_cast<QDeclarativeVisualModel *>(object))) {
- if (d->ownModel) {
- delete d->model;
- d->ownModel = false;
- }
- d->model = vim;
- } else {
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this), this);
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- dataModel->setModel(model);
- }
- d->modelCount = 0;
- if (d->model) {
- connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- connect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- d->modelCount = d->model->count();
- if (d->model->count())
- d->offset = qmlMod(d->offset, qreal(d->model->count()));
- if (d->offset < 0)
- d->offset = d->model->count() + d->offset;
-}
- d->regenerate();
- d->fixOffset();
- emit countChanged();
- emit modelChanged();
-}
-
-/*!
- \qmlproperty int PathView::count
- This property holds the number of items in the model.
-*/
-int QDeclarativePathView::count() const
-{
- Q_D(const QDeclarativePathView);
- return d->model ? d->modelCount : 0;
-}
-
-/*!
- \qmlproperty Path PathView::path
- This property holds the path used to lay out the items.
- For more information see the \l Path documentation.
-*/
-QDeclarativePath *QDeclarativePathView::path() const
-{
- Q_D(const QDeclarativePathView);
- return d->path;
-}
-
-void QDeclarativePathView::setPath(QDeclarativePath *path)
-{
- Q_D(QDeclarativePathView);
- if (d->path == path)
- return;
- if (d->path)
- disconnect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated()));
- d->path = path;
- connect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated()));
- if (d->isValid() && isComponentComplete()) {
- d->clear();
- if (d->attType) {
- d->attType->release();
- d->attType = 0;
- }
- d->regenerate();
- }
- emit pathChanged();
-}
-
-/*!
- \qmlproperty int PathView::currentIndex
- This property holds the index of the current item.
-*/
-int QDeclarativePathView::currentIndex() const
-{
- Q_D(const QDeclarativePathView);
- return d->currentIndex;
-}
-
-void QDeclarativePathView::setCurrentIndex(int idx)
-{
- Q_D(QDeclarativePathView);
- if (d->model && d->modelCount)
- idx = qAbs(idx % d->modelCount);
- if (d->model && idx != d->currentIndex) {
- if (d->modelCount) {
- int itemIndex = (d->currentIndex - d->firstIndex + d->modelCount) % d->modelCount;
- if (itemIndex < d->items.count()) {
- if (QDeclarativeItem *item = d->items.at(itemIndex)) {
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->setIsCurrentItem(false);
- }
- }
- }
- d->currentItem = 0;
- d->moveReason = QDeclarativePathViewPrivate::SetIndex;
- d->currentIndex = idx;
- if (d->modelCount) {
- if (d->haveHighlightRange && d->highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange)
- d->snapToCurrent();
- int itemIndex = (idx - d->firstIndex + d->modelCount) % d->modelCount;
- if (itemIndex < d->items.count()) {
- d->currentItem = d->items.at(itemIndex);
- d->currentItem->setFocus(true);
- if (QDeclarativePathViewAttached *att = d->attached(d->currentItem))
- att->setIsCurrentItem(true);
- }
- d->currentItemOffset = d->positionOfIndex(d->currentIndex);
- d->updateHighlight();
- }
- emit currentIndexChanged();
- }
-}
-
-/*!
- \qmlmethod PathView::incrementCurrentIndex()
-
- Increments the current index.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativePathView::incrementCurrentIndex()
-{
- Q_D(QDeclarativePathView);
- d->moveDirection = QDeclarativePathViewPrivate::Positive;
- setCurrentIndex(currentIndex()+1);
-}
-
-
-/*!
- \qmlmethod PathView::decrementCurrentIndex()
-
- Decrements the current index.
-
- \bold Note: methods should only be called after the Component has completed.
-*/
-void QDeclarativePathView::decrementCurrentIndex()
-{
- Q_D(QDeclarativePathView);
- if (d->model && d->modelCount) {
- int idx = currentIndex()-1;
- if (idx < 0)
- idx = d->modelCount - 1;
- d->moveDirection = QDeclarativePathViewPrivate::Negative;
- setCurrentIndex(idx);
- }
-}
-
-/*!
- \qmlproperty real PathView::offset
-
- The offset specifies how far along the path the items are from their initial positions.
- This is a real number that ranges from 0.0 to the count of items in the model.
-*/
-qreal QDeclarativePathView::offset() const
-{
- Q_D(const QDeclarativePathView);
- return d->offset;
-}
-
-void QDeclarativePathView::setOffset(qreal offset)
-{
- Q_D(QDeclarativePathView);
- d->setOffset(offset);
- d->updateCurrent();
-}
-
-void QDeclarativePathViewPrivate::setOffset(qreal o)
-{
- Q_Q(QDeclarativePathView);
- if (offset != o) {
- if (isValid() && q->isComponentComplete()) {
- offset = qmlMod(o, qreal(modelCount));
- if (offset < 0)
- offset += qreal(modelCount);
- q->refill();
- } else {
- offset = o;
- }
- emit q->offsetChanged();
- }
-}
-
-void QDeclarativePathViewPrivate::setAdjustedOffset(qreal o)
-{
- setOffset(o+offsetAdj);
-}
-
-/*!
- \qmlproperty Component PathView::highlight
- This property holds the component to use as the highlight.
-
- An instance of the highlight component will be created for each view.
- The geometry of the resultant component instance will be managed by the view
- so as to stay with the current item.
-
- The below example demonstrates how to make a simple highlight. Note the use
- of the \l{PathView::onPath}{PathView.onPath} attached property to ensure that
- the highlight is hidden when flicked away from the path.
-
- \qml
- Component {
- Rectangle {
- visible: PathView.onPath
- // ...
- }
- }
- \endqml
-
- \sa highlightItem, highlightRangeMode
-*/
-
-QDeclarativeComponent *QDeclarativePathView::highlight() const
-{
- Q_D(const QDeclarativePathView);
- return d->highlightComponent;
-}
-
-void QDeclarativePathView::setHighlight(QDeclarativeComponent *highlight)
-{
- Q_D(QDeclarativePathView);
- if (highlight != d->highlightComponent) {
- d->highlightComponent = highlight;
- d->createHighlight();
- d->updateHighlight();
- emit highlightChanged();
- }
-}
-
-/*!
- \qmlproperty Item PathView::highlightItem
-
- \c highlightItem holds the highlight item, which was created
- from the \l highlight component.
-
- \sa highlight
-*/
-QDeclarativeItem *QDeclarativePathView::highlightItem()
-{
- Q_D(const QDeclarativePathView);
- return d->highlightItem;
-}
-/*!
- \qmlproperty real PathView::preferredHighlightBegin
- \qmlproperty real PathView::preferredHighlightEnd
- \qmlproperty enumeration PathView::highlightRangeMode
-
- These properties set the preferred range of the highlight (current item)
- within the view. The preferred values must be in the range 0.0-1.0.
-
- If highlightRangeMode is set to \e PathView.NoHighlightRange
-
- If highlightRangeMode is set to \e PathView.ApplyRange the view will
- attempt to maintain the highlight within the range, however
- the highlight can move outside of the range at the ends of the path
- or due to a mouse interaction.
-
- If highlightRangeMode is set to \e PathView.StrictlyEnforceRange the highlight will never
- move outside of the range. This means that the current item will change
- if a keyboard or mouse action would cause the highlight to move
- outside of the range.
-
- Note that this is the correct way to influence where the
- current item ends up when the view moves. For example, if you want the
- currently selected item to be in the middle of the path, then set the
- highlight range to be 0.5,0.5 and highlightRangeMode to PathView.StrictlyEnforceRange.
- Then, when the path scrolls,
- the currently selected item will be the item at that position. This also applies to
- when the currently selected item changes - it will scroll to within the preferred
- highlight range. Furthermore, the behaviour of the current item index will occur
- whether or not a highlight exists.
-
- The default value is \e PathView.StrictlyEnforceRange.
-
- Note that a valid range requires preferredHighlightEnd to be greater
- than or equal to preferredHighlightBegin.
-*/
-qreal QDeclarativePathView::preferredHighlightBegin() const
-{
- Q_D(const QDeclarativePathView);
- return d->highlightRangeStart;
-}
-
-void QDeclarativePathView::setPreferredHighlightBegin(qreal start)
-{
- Q_D(QDeclarativePathView);
- if (d->highlightRangeStart == start || start < 0 || start > 1.0)
- return;
- d->highlightRangeStart = start;
- d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- refill();
- emit preferredHighlightBeginChanged();
-}
-
-qreal QDeclarativePathView::preferredHighlightEnd() const
-{
- Q_D(const QDeclarativePathView);
- return d->highlightRangeEnd;
-}
-
-void QDeclarativePathView::setPreferredHighlightEnd(qreal end)
-{
- Q_D(QDeclarativePathView);
- if (d->highlightRangeEnd == end || end < 0 || end > 1.0)
- return;
- d->highlightRangeEnd = end;
- d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- refill();
- emit preferredHighlightEndChanged();
-}
-
-QDeclarativePathView::HighlightRangeMode QDeclarativePathView::highlightRangeMode() const
-{
- Q_D(const QDeclarativePathView);
- return d->highlightRangeMode;
-}
-
-void QDeclarativePathView::setHighlightRangeMode(HighlightRangeMode mode)
-{
- Q_D(QDeclarativePathView);
- if (d->highlightRangeMode == mode)
- return;
- d->highlightRangeMode = mode;
- d->haveHighlightRange = d->highlightRangeMode != NoHighlightRange && d->highlightRangeStart <= d->highlightRangeEnd;
- emit highlightRangeModeChanged();
-}
-
-
-/*!
- \qmlproperty int PathView::highlightMoveDuration
- This property holds the move animation duration of the highlight delegate.
-
- If the highlightRangeMode is StrictlyEnforceRange then this property
- determines the speed that the items move along the path.
-
- The default value for the duration is 300ms.
-*/
-int QDeclarativePathView::highlightMoveDuration() const
-{
- Q_D(const QDeclarativePathView);
- return d->highlightMoveDuration;
-}
-
-void QDeclarativePathView::setHighlightMoveDuration(int duration)
-{
- Q_D(QDeclarativePathView);
- if (d->highlightMoveDuration == duration)
- return;
- d->highlightMoveDuration = duration;
- emit highlightMoveDurationChanged();
-}
-
-/*!
- \qmlproperty real PathView::dragMargin
- This property holds the maximum distance from the path that initiate mouse dragging.
-
- By default the path can only be dragged by clicking on an item. If
- dragMargin is greater than zero, a drag can be initiated by clicking
- within dragMargin pixels of the path.
-*/
-qreal QDeclarativePathView::dragMargin() const
-{
- Q_D(const QDeclarativePathView);
- return d->dragMargin;
-}
-
-void QDeclarativePathView::setDragMargin(qreal dragMargin)
-{
- Q_D(QDeclarativePathView);
- if (d->dragMargin == dragMargin)
- return;
- d->dragMargin = dragMargin;
- emit dragMarginChanged();
-}
-
-/*!
- \qmlproperty real PathView::flickDeceleration
- This property holds the rate at which a flick will decelerate.
-
- The default is 100.
-*/
-qreal QDeclarativePathView::flickDeceleration() const
-{
- Q_D(const QDeclarativePathView);
- return d->deceleration;
-}
-
-void QDeclarativePathView::setFlickDeceleration(qreal dec)
-{
- Q_D(QDeclarativePathView);
- if (d->deceleration == dec)
- return;
- d->deceleration = dec;
- emit flickDecelerationChanged();
-}
-
-/*!
- \qmlproperty bool PathView::interactive
-
- A user cannot drag or flick a PathView that is not interactive.
-
- This property is useful for temporarily disabling flicking. This allows
- special interaction with PathView's children.
-*/
-bool QDeclarativePathView::isInteractive() const
-{
- Q_D(const QDeclarativePathView);
- return d->interactive;
-}
-
-void QDeclarativePathView::setInteractive(bool interactive)
-{
- Q_D(QDeclarativePathView);
- if (interactive != d->interactive) {
- d->interactive = interactive;
- if (!interactive)
- d->tl.clear();
- emit interactiveChanged();
- }
-}
-
-/*!
- \qmlproperty bool PathView::moving
-
- This property holds whether the view is currently moving
- due to the user either dragging or flicking the view.
-*/
-bool QDeclarativePathView::isMoving() const
-{
- Q_D(const QDeclarativePathView);
- return d->moving;
-}
-
-/*!
- \qmlproperty bool PathView::flicking
-
- This property holds whether the view is currently moving
- due to the user flicking the view.
-*/
-bool QDeclarativePathView::isFlicking() const
-{
- Q_D(const QDeclarativePathView);
- return d->flicking;
-}
-
-/*!
- \qmlsignal PathView::onMovementStarted()
-
- This handler is called when the view begins moving due to user
- interaction.
-*/
-
-/*!
- \qmlsignal PathView::onMovementEnded()
-
- This handler is called when the view stops moving due to user
- interaction. If a flick was generated, this handler will
- be triggered once the flick stops. If a flick was not
- generated, the handler will be triggered when the
- user stops dragging - i.e. a mouse or touch release.
-*/
-
-/*!
- \qmlsignal PathView::onFlickStarted()
-
- This handler is called when the view is flicked. A flick
- starts from the point that the mouse or touch is released,
- while still in motion.
-*/
-
-/*!
- \qmlsignal PathView::onFlickEnded()
-
- This handler is called when the view stops moving due to a flick.
-*/
-
-/*!
- \qmlproperty Component PathView::delegate
-
- The delegate provides a template defining each item instantiated by the view.
- The index is exposed as an accessible \c index property. Properties of the
- model are also available depending upon the type of \l {qmlmodels}{Data Model}.
-
- The number of elements in the delegate has a direct effect on the
- flicking performance of the view when pathItemCount is specified. If at all possible, place functionality
- that is not needed for the normal display of the delegate in a \l Loader which
- can load additional elements when needed.
-
- Note that the PathView will layout the items based on the size of the root
- item in the delegate.
-
- Here is an example delegate:
- \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
-*/
-QDeclarativeComponent *QDeclarativePathView::delegate() const
-{
- Q_D(const QDeclarativePathView);
- if (d->model) {
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- return dataModel->delegate();
- }
-
- return 0;
-}
-
-void QDeclarativePathView::setDelegate(QDeclarativeComponent *delegate)
-{
- Q_D(QDeclarativePathView);
- if (delegate == this->delegate())
- return;
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this));
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model)) {
- int oldCount = dataModel->count();
- dataModel->setDelegate(delegate);
- d->modelCount = dataModel->count();
- d->regenerate();
- if (oldCount != dataModel->count())
- emit countChanged();
- emit delegateChanged();
- }
-}
-
-/*!
- \qmlproperty int PathView::pathItemCount
- This property holds the number of items visible on the path at any one time.
-*/
-int QDeclarativePathView::pathItemCount() const
-{
- Q_D(const QDeclarativePathView);
- return d->pathItems;
-}
-
-void QDeclarativePathView::setPathItemCount(int i)
-{
- Q_D(QDeclarativePathView);
- if (i == d->pathItems)
- return;
- if (i < 1)
- i = 1;
- d->pathItems = i;
- d->updateMappedRange();
- if (d->isValid() && isComponentComplete()) {
- d->regenerate();
- }
- emit pathItemCountChanged();
-}
-
-QPointF QDeclarativePathViewPrivate::pointNear(const QPointF &point, qreal *nearPercent) const
-{
- //XXX maybe do recursively at increasing resolution.
- qreal mindist = 1e10; // big number
- QPointF nearPoint = path->pointAt(0);
- qreal nearPc = 0;
- for (qreal i=1; i < 1000; i++) {
- QPointF pt = path->pointAt(i/1000.0);
- QPointF diff = pt - point;
- qreal dist = diff.x()*diff.x() + diff.y()*diff.y();
- if (dist < mindist) {
- nearPoint = pt;
- nearPc = i;
- mindist = dist;
- }
- }
-
- if (nearPercent)
- *nearPercent = nearPc / 1000.0;
-
- return nearPoint;
-}
-
-void QDeclarativePathView::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePathView);
- if (d->interactive) {
- d->handleMousePressEvent(event);
- event->accept();
- } else {
- QDeclarativeItem::mousePressEvent(event);
- }
-}
-
-void QDeclarativePathViewPrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativePathView);
- if (!interactive || !items.count())
- return;
- QPointF scenePoint = q->mapToScene(event->pos());
- int idx = 0;
- for (; idx < items.count(); ++idx) {
- QRectF rect = items.at(idx)->boundingRect();
- rect = items.at(idx)->mapToScene(rect).boundingRect();
- if (rect.contains(scenePoint))
- break;
- }
- if (idx == items.count() && dragMargin == 0.) // didn't click on an item
- return;
-
- startPoint = pointNear(event->pos(), &startPc);
- if (idx == items.count()) {
- qreal distance = qAbs(event->pos().x() - startPoint.x()) + qAbs(event->pos().y() - startPoint.y());
- if (distance > dragMargin)
- return;
- }
-
- if (tl.isActive() && flicking)
- stealMouse = true; // If we've been flicked then steal the click.
- else
- stealMouse = false;
-
- lastElapsed = 0;
- lastDist = 0;
- QDeclarativeItemPrivate::start(lastPosTime);
- tl.clear();
-}
-
-void QDeclarativePathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePathView);
- if (d->interactive) {
- d->handleMouseMoveEvent(event);
- if (d->stealMouse)
- setKeepMouseGrab(true);
- event->accept();
- } else {
- QDeclarativeItem::mouseMoveEvent(event);
- }
-}
-
-void QDeclarativePathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_Q(QDeclarativePathView);
- if (!interactive || !lastPosTime.isValid())
- return;
-
- qreal newPc;
- QPointF pathPoint = pointNear(event->pos(), &newPc);
- if (!stealMouse) {
- QPointF delta = pathPoint - startPoint;
- if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) {
- stealMouse = true;
- startPc = newPc;
- }
- }
-
- if (stealMouse) {
- moveReason = QDeclarativePathViewPrivate::Mouse;
- qreal diff = (newPc - startPc)*modelCount*mappedRange;
- if (diff) {
- q->setOffset(offset + diff);
-
- if (diff > modelCount/2)
- diff -= modelCount;
- else if (diff < -modelCount/2)
- diff += modelCount;
-
- lastElapsed = QDeclarativeItemPrivate::restart(lastPosTime);
- lastDist = diff;
- startPc = newPc;
- }
- if (!moving) {
- moving = true;
- emit q->movingChanged();
- emit q->movementStarted();
- }
- }
-}
-
-void QDeclarativePathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePathView);
- if (d->interactive) {
- d->handleMouseReleaseEvent(event);
- event->accept();
- ungrabMouse();
- } else {
- QDeclarativeItem::mouseReleaseEvent(event);
- }
-}
-
-void QDeclarativePathViewPrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *)
-{
- Q_Q(QDeclarativePathView);
- stealMouse = false;
- q->setKeepMouseGrab(false);
- if (!interactive || !lastPosTime.isValid())
- return;
-
- qreal elapsed = qreal(lastElapsed + QDeclarativeItemPrivate::elapsed(lastPosTime)) / 1000.;
- qreal velocity = elapsed > 0. ? lastDist / elapsed : 0;
- if (model && modelCount && qAbs(velocity) > 1.) {
- qreal count = pathItems == -1 ? modelCount : pathItems;
- if (qAbs(velocity) > count * 2) // limit velocity
- velocity = (velocity > 0 ? count : -count) * 2;
- // Calculate the distance to be travelled
- qreal v2 = velocity*velocity;
- qreal accel = deceleration/10;
- // + 0.25 to encourage moving at least one item in the flick direction
- qreal dist = qMin(qreal(modelCount-1), qreal(v2 / (accel * 2.0) + 0.25));
- if (haveHighlightRange && highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange) {
- // round to nearest item.
- if (velocity > 0.)
- dist = qRound(dist + offset) - offset;
- else
- dist = qRound(dist - offset) + offset;
- // Calculate accel required to stop on item boundary
- if (dist <= 0.) {
- dist = 0.;
- accel = 0.;
- } else {
- accel = v2 / (2.0f * qAbs(dist));
- }
- }
- offsetAdj = 0.0;
- moveOffset.setValue(offset);
- tl.accel(moveOffset, velocity, accel, dist);
- tl.callback(QDeclarativeTimeLineCallback(&moveOffset, fixOffsetCallback, this));
- if (!flicking) {
- flicking = true;
- emit q->flickingChanged();
- emit q->flickStarted();
- }
- } else {
- fixOffset();
- }
-
- lastPosTime.invalidate();
- if (!tl.isActive())
- q->movementEnding();
-}
-
-bool QDeclarativePathView::sendMouseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePathView);
- QGraphicsSceneMouseEvent mouseEvent(event->type());
- QRectF myRect = mapToScene(QRectF(0, 0, width(), height())).boundingRect();
- QGraphicsScene *s = scene();
- QDeclarativeItem *grabber = s ? qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem()) : 0;
- bool stealThisEvent = d->stealMouse;
- if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
- mouseEvent.setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
- }
- }
- mouseEvent.setScenePos(event->scenePos());
- mouseEvent.setLastScenePos(event->lastScenePos());
- mouseEvent.setPos(mapFromScene(event->scenePos()));
- mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
-
- switch(mouseEvent.type()) {
- case QEvent::GraphicsSceneMouseMove:
- d->handleMouseMoveEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMousePress:
- d->handleMousePressEvent(&mouseEvent);
- stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above
- break;
- case QEvent::GraphicsSceneMouseRelease:
- d->handleMouseReleaseEvent(&mouseEvent);
- break;
- default:
- break;
- }
- grabber = qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem());
- if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
- grabMouse();
-
- return d->stealMouse;
- } else if (d->lastPosTime.isValid()) {
- d->lastPosTime.invalidate();
- }
- if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease)
- d->stealMouse = false;
- return false;
-}
-
-bool QDeclarativePathView::sceneEventFilter(QGraphicsItem *i, QEvent *e)
-{
- Q_D(QDeclarativePathView);
- if (!isVisible() || !d->interactive)
- return QDeclarativeItem::sceneEventFilter(i, e);
-
- switch (e->type()) {
- case QEvent::GraphicsSceneMousePress:
- case QEvent::GraphicsSceneMouseMove:
- case QEvent::GraphicsSceneMouseRelease:
- return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
- default:
- break;
- }
-
- return QDeclarativeItem::sceneEventFilter(i, e);
-}
-
-bool QDeclarativePathView::event(QEvent *event)
-{
- if (event->type() == QEvent::User) {
- refill();
- return true;
- }
-
- return QDeclarativeItem::event(event);
-}
-
-void QDeclarativePathView::componentComplete()
-{
- Q_D(QDeclarativePathView);
- QDeclarativeItem::componentComplete();
- d->createHighlight();
- // It is possible that a refill has already happended to to Path
- // bindings being handled in the componentComplete(). If so
- // don't do it again.
- if (d->items.count() == 0 && d->model) {
- d->modelCount = d->model->count();
- d->regenerate();
- }
- d->updateHighlight();
-}
-
-void QDeclarativePathView::refill()
-{
- Q_D(QDeclarativePathView);
- if (!d->isValid() || !isComponentComplete())
- return;
-
- d->layoutScheduled = false;
- bool currentVisible = false;
-
- // first move existing items and remove items off path
- int idx = d->firstIndex;
- QList<QDeclarativeItem*>::iterator it = d->items.begin();
- while (it != d->items.end()) {
- qreal pos = d->positionOfIndex(idx);
- QDeclarativeItem *item = *it;
- if (pos >= 0.0) {
- d->updateItem(item, pos);
- if (idx == d->currentIndex) {
- currentVisible = true;
- d->currentItemOffset = pos;
- }
- ++it;
- } else {
-// qDebug() << "release";
- d->updateItem(item, 1.0);
- d->releaseItem(item);
- if (it == d->items.begin()) {
- if (++d->firstIndex >= d->modelCount)
- d->firstIndex = 0;
- }
- it = d->items.erase(it);
- }
- ++idx;
- if (idx >= d->modelCount)
- idx = 0;
- }
- if (!d->items.count())
- d->firstIndex = -1;
-
- if (d->modelCount) {
- // add items to beginning and end
- int count = d->pathItems == -1 ? d->modelCount : qMin(d->pathItems, d->modelCount);
- if (d->items.count() < count) {
- int idx = qRound(d->modelCount - d->offset) % d->modelCount;
- qreal startPos = 0.0;
- if (d->haveHighlightRange && d->highlightRangeMode != QDeclarativePathView::NoHighlightRange)
- startPos = d->highlightRangeStart;
- if (d->firstIndex >= 0) {
- startPos = d->positionOfIndex(d->firstIndex);
- idx = (d->firstIndex + d->items.count()) % d->modelCount;
- }
- qreal pos = d->positionOfIndex(idx);
- while ((pos > startPos || !d->items.count()) && d->items.count() < count) {
- // qDebug() << "append" << idx;
- QDeclarativeItem *item = d->getItem(idx);
- if (d->model->completePending())
- item->setZValue(idx+1);
- if (d->currentIndex == idx) {
- item->setFocus(true);
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->setIsCurrentItem(true);
- currentVisible = true;
- d->currentItemOffset = pos;
- d->currentItem = item;
- }
- if (d->items.count() == 0)
- d->firstIndex = idx;
- d->items.append(item);
- d->updateItem(item, pos);
- if (d->model->completePending())
- d->model->completeItem();
- ++idx;
- if (idx >= d->modelCount)
- idx = 0;
- pos = d->positionOfIndex(idx);
- }
-
- idx = d->firstIndex - 1;
- if (idx < 0)
- idx = d->modelCount - 1;
- pos = d->positionOfIndex(idx);
- while (pos >= 0.0 && pos < startPos) {
- // qDebug() << "prepend" << idx;
- QDeclarativeItem *item = d->getItem(idx);
- if (d->model->completePending())
- item->setZValue(idx+1);
- if (d->currentIndex == idx) {
- item->setFocus(true);
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->setIsCurrentItem(true);
- currentVisible = true;
- d->currentItemOffset = pos;
- d->currentItem = item;
- }
- d->items.prepend(item);
- d->updateItem(item, pos);
- if (d->model->completePending())
- d->model->completeItem();
- d->firstIndex = idx;
- idx = d->firstIndex - 1;
- if (idx < 0)
- idx = d->modelCount - 1;
- pos = d->positionOfIndex(idx);
- }
- }
- }
-
- if (!currentVisible)
- d->currentItemOffset = 1.0;
-
- if (d->highlightItem && d->haveHighlightRange && d->highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange) {
- d->updateItem(d->highlightItem, d->highlightRangeStart);
- if (QDeclarativePathViewAttached *att = d->attached(d->highlightItem))
- att->setOnPath(true);
- } else if (d->highlightItem && d->moveReason != QDeclarativePathViewPrivate::SetIndex) {
- d->updateItem(d->highlightItem, d->currentItemOffset);
- if (QDeclarativePathViewAttached *att = d->attached(d->highlightItem))
- att->setOnPath(currentVisible);
- }
- while (d->itemCache.count())
- d->releaseItem(d->itemCache.takeLast());
-}
-
-void QDeclarativePathView::itemsInserted(int modelIndex, int count)
-{
- //XXX support animated insertion
- Q_D(QDeclarativePathView);
- if (!d->isValid() || !isComponentComplete())
- return;
-
- if (d->modelCount) {
- d->itemCache += d->items;
- d->items.clear();
- if (modelIndex <= d->currentIndex) {
- d->currentIndex += count;
- emit currentIndexChanged();
- } else if (d->offset != 0) {
- d->offset += count;
- d->offsetAdj += count;
- }
- }
- d->modelCount += count;
- if (d->flicking || d->moving) {
- d->regenerate();
- d->updateCurrent();
- } else {
- d->firstIndex = -1;
- d->updateMappedRange();
- d->scheduleLayout();
- }
- emit countChanged();
-}
-
-void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
-{
- //XXX support animated removal
- Q_D(QDeclarativePathView);
- if (!d->model || !d->modelCount || !d->model->isValid() || !d->path || !isComponentComplete())
- return;
-
- // fix current
- bool currentChanged = false;
- if (d->currentIndex >= modelIndex + count) {
- d->currentIndex -= count;
- currentChanged = true;
- } else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
- // current item has been removed.
- d->currentIndex = qMin(modelIndex, d->modelCount-count-1);
- if (d->currentItem) {
- if (QDeclarativePathViewAttached *att = d->attached(d->currentItem))
- att->setIsCurrentItem(true);
- }
- currentChanged = true;
- }
-
- d->itemCache += d->items;
- d->items.clear();
-
- bool changedOffset = false;
- if (modelIndex > d->currentIndex) {
- if (d->offset >= count) {
- changedOffset = true;
- d->offset -= count;
- d->offsetAdj -= count;
- }
- }
-
- d->modelCount -= count;
- if (!d->modelCount) {
- while (d->itemCache.count())
- d->releaseItem(d->itemCache.takeLast());
- d->offset = 0;
- changedOffset = true;
- d->tl.reset(d->moveOffset);
- update();
- } else {
- d->regenerate();
- d->updateCurrent();
- if (!d->flicking && !d->moving && d->haveHighlightRange && d->highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange)
- d->snapToCurrent();
- }
- if (changedOffset)
- emit offsetChanged();
- if (currentChanged)
- emit currentIndexChanged();
- emit countChanged();
-}
-
-void QDeclarativePathView::itemsMoved(int /*from*/, int /*to*/, int /*count*/)
-{
- Q_D(QDeclarativePathView);
- if (!d->isValid() || !isComponentComplete())
- return;
-
- QList<QDeclarativeItem *> removedItems = d->items;
- d->items.clear();
- d->regenerate();
- while (removedItems.count())
- d->releaseItem(removedItems.takeLast());
-
- // Fix current index
- if (d->currentIndex >= 0 && d->currentItem) {
- int oldCurrent = d->currentIndex;
- d->currentIndex = d->model->indexOf(d->currentItem, this);
- if (oldCurrent != d->currentIndex)
- emit currentIndexChanged();
- }
- d->updateCurrent();
-}
-
-void QDeclarativePathView::modelReset()
-{
- Q_D(QDeclarativePathView);
- d->modelCount = d->model->count();
- d->regenerate();
- emit countChanged();
-}
-
-void QDeclarativePathView::createdItem(int index, QDeclarativeItem *item)
-{
- Q_D(QDeclarativePathView);
- if (d->requestedIndex != index) {
- if (!d->attType) {
- // pre-create one metatype to share with all attached objects
- d->attType = new QDeclarativeOpenMetaObjectType(&QDeclarativePathViewAttached::staticMetaObject, qmlEngine(this));
- foreach(const QString &attr, d->path->attributes())
- d->attType->createProperty(attr.toUtf8());
- }
- qPathViewAttachedType = d->attType;
- QDeclarativePathViewAttached *att = static_cast<QDeclarativePathViewAttached *>(qmlAttachedPropertiesObject<QDeclarativePathView>(item));
- qPathViewAttachedType = 0;
- if (att) {
- att->m_view = this;
- att->setOnPath(false);
- }
- item->setParentItem(this);
- d->updateItem(item, index < d->firstIndex ? 0.0 : 1.0);
- }
-}
-
-void QDeclarativePathView::destroyingItem(QDeclarativeItem *item)
-{
- Q_UNUSED(item);
-}
-
-void QDeclarativePathView::ticked()
-{
- Q_D(QDeclarativePathView);
- d->updateCurrent();
-}
-
-void QDeclarativePathView::movementEnding()
-{
- Q_D(QDeclarativePathView);
- if (d->flicking) {
- d->flicking = false;
- emit flickingChanged();
- emit flickEnded();
- }
- if (d->moving && !d->stealMouse) {
- d->moving = false;
- emit movingChanged();
- emit movementEnded();
- }
-}
-
-// find the item closest to the snap position
-int QDeclarativePathViewPrivate::calcCurrentIndex()
-{
- int current = -1;
- if (modelCount && model && items.count()) {
- offset = qmlMod(offset, modelCount);
- if (offset < 0)
- offset += modelCount;
- current = qRound(qAbs(qmlMod(modelCount - offset, modelCount)));
- current = current % modelCount;
- }
-
- return current;
-}
-
-void QDeclarativePathViewPrivate::updateCurrent()
-{
- Q_Q(QDeclarativePathView);
- if (moveReason != Mouse)
- return;
- if (!modelCount || !haveHighlightRange || highlightRangeMode != QDeclarativePathView::StrictlyEnforceRange)
- return;
-
- int idx = calcCurrentIndex();
- if (model && idx != currentIndex) {
- int itemIndex = (currentIndex - firstIndex + modelCount) % modelCount;
- if (itemIndex < items.count()) {
- if (QDeclarativeItem *item = items.at(itemIndex)) {
- if (QDeclarativePathViewAttached *att = attached(item))
- att->setIsCurrentItem(false);
- }
- }
- currentIndex = idx;
- currentItem = 0;
- itemIndex = (idx - firstIndex + modelCount) % modelCount;
- if (itemIndex < items.count()) {
- currentItem = items.at(itemIndex);
- currentItem->setFocus(true);
- if (QDeclarativePathViewAttached *att = attached(currentItem))
- att->setIsCurrentItem(true);
- }
- emit q->currentIndexChanged();
- }
-}
-
-void QDeclarativePathViewPrivate::fixOffsetCallback(void *d)
-{
- ((QDeclarativePathViewPrivate *)d)->fixOffset();
-}
-
-void QDeclarativePathViewPrivate::fixOffset()
-{
- Q_Q(QDeclarativePathView);
- if (model && items.count()) {
- if (haveHighlightRange && highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange) {
- int curr = calcCurrentIndex();
- if (curr != currentIndex)
- q->setCurrentIndex(curr);
- else
- snapToCurrent();
- }
- }
-}
-
-void QDeclarativePathViewPrivate::snapToCurrent()
-{
- if (!model || modelCount <= 0)
- return;
-
- qreal targetOffset = qmlMod(modelCount - currentIndex, modelCount);
-
- moveReason = Other;
- offsetAdj = 0.0;
- tl.reset(moveOffset);
- moveOffset.setValue(offset);
-
- const int duration = highlightMoveDuration;
-
- if (moveDirection == Positive || (moveDirection == Shortest && targetOffset - offset > modelCount/2)) {
- qreal distance = modelCount - targetOffset + offset;
- if (targetOffset > moveOffset) {
- tl.move(moveOffset, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * offset / distance));
- tl.set(moveOffset, modelCount);
- tl.move(moveOffset, targetOffset, QEasingCurve(offset == 0.0 ? QEasingCurve::InOutQuad : QEasingCurve::OutQuad), int(duration * (modelCount-targetOffset) / distance));
- } else {
- tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
- }
- } else if (moveDirection == Negative || targetOffset - offset <= -modelCount/2) {
- qreal distance = modelCount - offset + targetOffset;
- if (targetOffset < moveOffset) {
- tl.move(moveOffset, modelCount, QEasingCurve(targetOffset == 0 ? QEasingCurve::InOutQuad : QEasingCurve::InQuad), int(duration * (modelCount-offset) / distance));
- tl.set(moveOffset, 0.0);
- tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * targetOffset / distance));
- } else {
- tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
- }
- } else {
- tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
- }
- moveDirection = Shortest;
-}
-
-QDeclarativePathViewAttached *QDeclarativePathView::qmlAttachedProperties(QObject *obj)
-{
- return new QDeclarativePathViewAttached(obj);
-}
-
-QT_END_NAMESPACE
-
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p.h
deleted file mode 100644
index f63f6400c7..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepathview_p.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEPATHVIEW_H
-#define QDECLARATIVEPATHVIEW_H
-
-#include "qdeclarativeitem.h"
-#include "private/qdeclarativepath_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativePathViewPrivate;
-class QDeclarativePathViewAttached;
-class Q_AUTOTEST_EXPORT QDeclarativePathView : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
- Q_PROPERTY(QDeclarativePath *path READ path WRITE setPath NOTIFY pathChanged)
- Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
- Q_PROPERTY(qreal offset READ offset WRITE setOffset NOTIFY offsetChanged)
-
- Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
- Q_PROPERTY(QDeclarativeItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
-
- Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged)
- Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged)
- Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
- Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
-
- Q_PROPERTY(qreal dragMargin READ dragMargin WRITE setDragMargin NOTIFY dragMarginChanged)
- Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
- Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
-
- Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
- Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
-
- Q_PROPERTY(int count READ count NOTIFY countChanged)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
- Q_PROPERTY(int pathItemCount READ pathItemCount WRITE setPathItemCount NOTIFY pathItemCountChanged)
-
- Q_ENUMS(HighlightRangeMode)
-
-public:
- QDeclarativePathView(QDeclarativeItem *parent=0);
- virtual ~QDeclarativePathView();
-
- QVariant model() const;
- void setModel(const QVariant &);
-
- QDeclarativePath *path() const;
- void setPath(QDeclarativePath *);
-
- int currentIndex() const;
- void setCurrentIndex(int idx);
-
- qreal offset() const;
- void setOffset(qreal offset);
-
- QDeclarativeComponent *highlight() const;
- void setHighlight(QDeclarativeComponent *highlight);
- QDeclarativeItem *highlightItem();
-
- enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
- HighlightRangeMode highlightRangeMode() const;
- void setHighlightRangeMode(HighlightRangeMode mode);
-
- qreal preferredHighlightBegin() const;
- void setPreferredHighlightBegin(qreal);
-
- qreal preferredHighlightEnd() const;
- void setPreferredHighlightEnd(qreal);
-
- int highlightMoveDuration() const;
- void setHighlightMoveDuration(int);
-
- qreal dragMargin() const;
- void setDragMargin(qreal margin);
-
- qreal flickDeceleration() const;
- void setFlickDeceleration(qreal dec);
-
- bool isInteractive() const;
- void setInteractive(bool);
-
- bool isMoving() const;
- bool isFlicking() const;
-
- int count() const;
-
- QDeclarativeComponent *delegate() const;
- void setDelegate(QDeclarativeComponent *);
-
- int pathItemCount() const;
- void setPathItemCount(int);
-
- static QDeclarativePathViewAttached *qmlAttachedProperties(QObject *);
-
-public Q_SLOTS:
- void incrementCurrentIndex();
- void decrementCurrentIndex();
-
-Q_SIGNALS:
- void currentIndexChanged();
- void offsetChanged();
- void modelChanged();
- void countChanged();
- void pathChanged();
- void preferredHighlightBeginChanged();
- void preferredHighlightEndChanged();
- void highlightRangeModeChanged();
- void dragMarginChanged();
- void snapPositionChanged();
- void delegateChanged();
- void pathItemCountChanged();
- void flickDecelerationChanged();
- void interactiveChanged();
- void movingChanged();
- void flickingChanged();
- void highlightChanged();
- void highlightItemChanged();
- void highlightMoveDurationChanged();
- void movementStarted();
- void movementEnded();
- void flickStarted();
- void flickEnded();
-
-protected:
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
- bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
- bool sceneEventFilter(QGraphicsItem *, QEvent *);
- bool event(QEvent *event);
- void componentComplete();
-
-private Q_SLOTS:
- void refill();
- void ticked();
- void movementEnding();
- void itemsInserted(int index, int count);
- void itemsRemoved(int index, int count);
- void itemsMoved(int,int,int);
- void modelReset();
- void createdItem(int index, QDeclarativeItem *item);
- void destroyingItem(QDeclarativeItem *item);
- void pathUpdated();
-
-private:
- friend class QDeclarativePathViewAttached;
- Q_DISABLE_COPY(QDeclarativePathView)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativePathView)
-};
-
-class QDeclarativeOpenMetaObject;
-class QDeclarativePathViewAttached : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(QDeclarativePathView *view READ view CONSTANT)
- Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
- Q_PROPERTY(bool onPath READ isOnPath NOTIFY pathChanged)
-
-public:
- QDeclarativePathViewAttached(QObject *parent);
- ~QDeclarativePathViewAttached();
-
- QDeclarativePathView *view() { return m_view; }
-
- bool isCurrentItem() const { return m_isCurrent; }
- void setIsCurrentItem(bool c) {
- if (m_isCurrent != c) {
- m_isCurrent = c;
- emit currentItemChanged();
- }
- }
-
- QVariant value(const QByteArray &name) const;
- void setValue(const QByteArray &name, const QVariant &val);
-
- bool isOnPath() const { return m_onPath; }
- void setOnPath(bool on) {
- if (on != m_onPath) {
- m_onPath = on;
- emit pathChanged();
- }
- }
- qreal m_percent;
-
-Q_SIGNALS:
- void currentItemChanged();
- void pathChanged();
-
-private:
- friend class QDeclarativePathViewPrivate;
- friend class QDeclarativePathView;
- QDeclarativePathView *m_view;
- QDeclarativeOpenMetaObject *m_metaobject;
- bool m_onPath : 1;
- bool m_isCurrent : 1;
-};
-
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativePathView)
-QML_DECLARE_TYPEINFO(QDeclarativePathView, QML_HAS_ATTACHED_PROPERTIES)
-QT_END_HEADER
-
-#endif // QDECLARATIVEPATHVIEW_H
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
deleted file mode 100644
index 3a7b712e8c..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEPATHVIEW_P_H
-#define QDECLARATIVEPATHVIEW_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativepathview_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-#include "private/qdeclarativevisualitemmodel_p.h"
-
-#include <qdeclarative.h>
-#include <qdeclarativeanimation_p_p.h>
-#include <qdeclarativeguard_p.h>
-
-#include <qdatetime.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeOpenMetaObjectType;
-class QDeclarativePathViewAttached;
-class QDeclarativePathViewPrivate : public QDeclarativeItemPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativePathView)
-
-public:
- QDeclarativePathViewPrivate()
- : path(0), currentIndex(0), currentItemOffset(0.0), startPc(0), lastDist(0)
- , lastElapsed(0), offset(0.0), offsetAdj(0.0), mappedRange(1.0)
- , stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true)
- , autoHighlight(true), highlightUp(false), layoutScheduled(false)
- , moving(false), flicking(false)
- , dragMargin(0), deceleration(100)
- , moveOffset(this, &QDeclarativePathViewPrivate::setAdjustedOffset)
- , firstIndex(-1), pathItems(-1), requestedIndex(-1)
- , moveReason(Other), moveDirection(Shortest), attType(0), highlightComponent(0), highlightItem(0)
- , moveHighlight(this, &QDeclarativePathViewPrivate::setHighlightPosition)
- , highlightPosition(0)
- , highlightRangeStart(0), highlightRangeEnd(0)
- , highlightRangeMode(QDeclarativePathView::StrictlyEnforceRange)
- , highlightMoveDuration(300), modelCount(0)
- {
- }
-
- void init();
-
- void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
- if ((newGeometry.size() != oldGeometry.size())
- && (!highlightItem || item != highlightItem)) {
- if (QDeclarativePathViewAttached *att = attached(item))
- att->m_percent = -1;
- scheduleLayout();
- }
- }
-
- void scheduleLayout() {
- Q_Q(QDeclarativePathView);
- if (!layoutScheduled) {
- layoutScheduled = true;
- QCoreApplication::postEvent(q, new QEvent(QEvent::User), Qt::HighEventPriority);
- }
- }
-
- QDeclarativeItem *getItem(int modelIndex);
- void releaseItem(QDeclarativeItem *item);
- QDeclarativePathViewAttached *attached(QDeclarativeItem *item);
- void clear();
- void updateMappedRange();
- qreal positionOfIndex(qreal index) const;
- void createHighlight();
- void updateHighlight();
- void setHighlightPosition(qreal pos);
- bool isValid() const {
- return model && model->count() > 0 && model->isValid() && path;
- }
-
- void handleMousePressEvent(QGraphicsSceneMouseEvent *event);
- void handleMouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void handleMouseReleaseEvent(QGraphicsSceneMouseEvent *);
-
- int calcCurrentIndex();
- void updateCurrent();
- static void fixOffsetCallback(void*);
- void fixOffset();
- void setOffset(qreal offset);
- void setAdjustedOffset(qreal offset);
- void regenerate();
- void updateItem(QDeclarativeItem *, qreal);
- void snapToCurrent();
- QPointF pointNear(const QPointF &point, qreal *nearPercent=0) const;
-
- QDeclarativePath *path;
- int currentIndex;
- QDeclarativeGuard<QDeclarativeItem> currentItem;
- qreal currentItemOffset;
- qreal startPc;
- QPointF startPoint;
- qreal lastDist;
- int lastElapsed;
- qreal offset;
- qreal offsetAdj;
- qreal mappedRange;
- bool stealMouse : 1;
- bool ownModel : 1;
- bool interactive : 1;
- bool haveHighlightRange : 1;
- bool autoHighlight : 1;
- bool highlightUp : 1;
- bool layoutScheduled : 1;
- bool moving : 1;
- bool flicking : 1;
- QElapsedTimer lastPosTime;
- QPointF lastPos;
- qreal dragMargin;
- qreal deceleration;
- QDeclarativeTimeLine tl;
- QDeclarativeTimeLineValueProxy<QDeclarativePathViewPrivate> moveOffset;
- int firstIndex;
- int pathItems;
- int requestedIndex;
- QList<QDeclarativeItem *> items;
- QList<QDeclarativeItem *> itemCache;
- QDeclarativeGuard<QDeclarativeVisualModel> model;
- QVariant modelVariant;
- enum MovementReason { Other, SetIndex, Mouse };
- MovementReason moveReason;
- enum MovementDirection { Shortest, Negative, Positive };
- MovementDirection moveDirection;
- QDeclarativeOpenMetaObjectType *attType;
- QDeclarativeComponent *highlightComponent;
- QDeclarativeItem *highlightItem;
- QDeclarativeTimeLineValueProxy<QDeclarativePathViewPrivate> moveHighlight;
- qreal highlightPosition;
- qreal highlightRangeStart;
- qreal highlightRangeEnd;
- QDeclarativePathView::HighlightRangeMode highlightRangeMode;
- int highlightMoveDuration;
- int modelCount;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea.cpp b/src/declarative/graphicsitems/qdeclarativepincharea.cpp
deleted file mode 100644
index 0e14ff1792..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepincharea.cpp
+++ /dev/null
@@ -1,607 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativepincharea_p.h"
-#include "qdeclarativepincharea_p_p.h"
-
-#include <QApplication>
-#include <QGraphicsScene>
-
-#include <float.h>
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-
-/*!
- \qmlclass PinchEvent QDeclarativePinchEvent
- \ingroup qml-event-elements
- \brief The PinchEvent object provides information about a pinch event.
-
- \bold {The PinchEvent element was added in QtQuick 1.1}
-
- The \c center, \c startCenter, \c previousCenter properties provide the center position between the two touch points.
-
- The \c scale and \c previousScale properties provide the scale factor.
-
- The \c angle, \c previousAngle and \c rotation properties provide the angle between the two points and the amount of rotation.
-
- The \c point1, \c point2, \c startPoint1, \c startPoint2 properties provide the positions of the touch points.
-
- The \c accepted property may be set to false in the \c onPinchStarted handler if the gesture should not
- be handled.
-
- \sa PinchArea
-*/
-
-/*!
- \qmlproperty QPointF PinchEvent::center
- \qmlproperty QPointF PinchEvent::startCenter
- \qmlproperty QPointF PinchEvent::previousCenter
-
- These properties hold the position of the center point between the two touch points.
-
- \list
- \o \c center is the current center point
- \o \c previousCenter is the center point of the previous event.
- \o \c startCenter is the center point when the gesture began
- \endlist
-*/
-
-/*!
- \qmlproperty real PinchEvent::scale
- \qmlproperty real PinchEvent::previousScale
-
- These properties hold the scale factor determined by the change in distance between the two touch points.
-
- \list
- \o \c scale is the current scale factor.
- \o \c previousScale is the scale factor of the previous event.
- \endlist
-
- When a pinch gesture is started, the scale is 1.0.
-*/
-
-/*!
- \qmlproperty real PinchEvent::angle
- \qmlproperty real PinchEvent::previousAngle
- \qmlproperty real PinchEvent::rotation
-
- These properties hold the angle between the two touch points.
-
- \list
- \o \c angle is the current angle between the two points in the range -180 to 180.
- \o \c previousAngle is the angle of the previous event.
- \o \c rotation is the total rotation since the pinch gesture started.
- \endlist
-
- When a pinch gesture is started, the rotation is 0.0.
-*/
-
-/*!
- \qmlproperty QPointF PinchEvent::point1
- \qmlproperty QPointF PinchEvent::startPoint1
- \qmlproperty QPointF PinchEvent::point2
- \qmlproperty QPointF PinchEvent::startPoint2
-
- These properties provide the actual touch points generating the pinch.
-
- \list
- \o \c point1 and \c point2 hold the current positions of the points.
- \o \c startPoint1 and \c startPoint2 hold the positions of the points when the second point was touched.
- \endlist
-*/
-
-/*!
- \qmlproperty bool PinchEvent::accepted
-
- Setting this property to false in the \c PinchArea::onPinchStarted handler
- will result in no further pinch events being generated, and the gesture
- ignored.
-*/
-
-/*!
- \qmlproperty int PinchEvent::pointCount
-
- Holds the number of points currently touched. The PinchArea will not react
- until two touch points have initited a gesture, but will remain active until
- all touch points have been released.
-*/
-
-QDeclarativePinch::QDeclarativePinch()
- : m_target(0), m_minScale(1.0), m_maxScale(1.0)
- , m_minRotation(0.0), m_maxRotation(0.0)
- , m_axis(NoDrag), m_xmin(-FLT_MAX), m_xmax(FLT_MAX)
- , m_ymin(-FLT_MAX), m_ymax(FLT_MAX), m_active(false)
-{
-}
-
-QDeclarativePinchAreaPrivate::~QDeclarativePinchAreaPrivate()
-{
- delete pinch;
-}
-
-/*!
- \qmlclass PinchArea QDeclarativePinchArea
- \brief The PinchArea item enables simple pinch gesture handling.
- \inherits Item
-
- \bold {The PinchArea element was added in QtQuick 1.1}
-
- A PinchArea is an invisible item that is typically used in conjunction with
- a visible item in order to provide pinch gesture handling for that item.
-
- The \l enabled property is used to enable and disable pinch handling for
- the proxied item. When disabled, the pinch area becomes transparent to
- mouse/touch events.
-
- PinchArea can be used in two ways:
-
- \list
- \o setting a \c pinch.target to provide automatic interaction with an element
- \o using the onPinchStarted, onPinchUpdated and onPinchFinished handlers
- \endlist
-
- \sa PinchEvent
-*/
-
-/*!
- \qmlsignal PinchArea::onPinchStarted()
-
- This handler is called when the pinch area detects that a pinch gesture has started.
-
- The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
- including the scale, center and angle of the pinch.
-
- To ignore this gesture set the \c pinch.accepted property to false. The gesture
- will be cancelled and no further events will be sent.
-*/
-
-/*!
- \qmlsignal PinchArea::onPinchUpdated()
-
- This handler is called when the pinch area detects that a pinch gesture has changed.
-
- The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
- including the scale, center and angle of the pinch.
-*/
-
-/*!
- \qmlsignal PinchArea::onPinchFinished()
-
- This handler is called when the pinch area detects that a pinch gesture has finished.
-
- The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
- including the scale, center and angle of the pinch.
-*/
-
-
-/*!
- \qmlproperty Item PinchArea::pinch.target
- \qmlproperty bool PinchArea::pinch.active
- \qmlproperty real PinchArea::pinch.minimumScale
- \qmlproperty real PinchArea::pinch.maximumScale
- \qmlproperty real PinchArea::pinch.minimumRotation
- \qmlproperty real PinchArea::pinch.maximumRotation
- \qmlproperty enumeration PinchArea::pinch.dragAxis
- \qmlproperty real PinchArea::pinch.minimumX
- \qmlproperty real PinchArea::pinch.maximumX
- \qmlproperty real PinchArea::pinch.minimumY
- \qmlproperty real PinchArea::pinch.maximumY
-
- \c pinch provides a convenient way to make an item react to pinch gestures.
-
- \list
- \i \c pinch.target specifies the id of the item to drag.
- \i \c pinch.active specifies if the target item is currently being dragged.
- \i \c pinch.minimumScale and \c pinch.maximumScale limit the range of the Item::scale property.
- \i \c pinch.minimumRotation and \c pinch.maximumRotation limit the range of the Item::rotation property.
- \i \c pinch.dragAxis specifies whether dragging in not allowed (\c Pinch.NoDrag), can be done horizontally (\c Pinch.XAxis), vertically (\c Pinch.YAxis), or both (\c Pinch.XandYAxis)
- \i \c pinch.minimum and \c pinch.maximum limit how far the target can be dragged along the corresponding axes.
- \endlist
-*/
-
-QDeclarativePinchArea::QDeclarativePinchArea(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativePinchAreaPrivate), parent)
-{
- Q_D(QDeclarativePinchArea);
- d->init();
-}
-
-QDeclarativePinchArea::~QDeclarativePinchArea()
-{
-}
-
-/*!
- \qmlproperty bool PinchArea::enabled
- This property holds whether the item accepts pinch gestures.
-
- This property defaults to true.
-*/
-bool QDeclarativePinchArea::isEnabled() const
-{
- Q_D(const QDeclarativePinchArea);
- return d->absorb;
-}
-
-void QDeclarativePinchArea::setEnabled(bool a)
-{
- Q_D(QDeclarativePinchArea);
- if (a != d->absorb) {
- d->absorb = a;
- emit enabledChanged();
- }
-}
-
-bool QDeclarativePinchArea::event(QEvent *event)
-{
- Q_D(QDeclarativePinchArea);
- if (!d->absorb || !isVisible())
- return QDeclarativeItem::event(event);
- switch (event->type()) {
- case QEvent::TouchBegin:
- case QEvent::TouchUpdate: {
- QTouchEvent *touch = static_cast<QTouchEvent*>(event);
- d->touchPoints.clear();
- for (int i = 0; i < touch->touchPoints().count(); ++i) {
- if (!(touch->touchPoints().at(i).state() & Qt::TouchPointReleased)) {
- d->touchPoints << touch->touchPoints().at(i);
- }
- }
- updatePinch();
- }
- return true;
- case QEvent::TouchEnd:
- d->touchPoints.clear();
- updatePinch();
- break;
- default:
- return QDeclarativeItem::event(event);
- }
-
- return QDeclarativeItem::event(event);
-}
-
-void QDeclarativePinchArea::updatePinch()
-{
- Q_D(QDeclarativePinchArea);
- if (d->touchPoints.count() == 0) {
- if (d->inPinch) {
- d->stealMouse = false;
- setKeepMouseGrab(false);
- d->inPinch = false;
- QPointF pinchCenter = mapFromScene(d->sceneLastCenter);
- QDeclarativePinchEvent pe(pinchCenter, d->pinchLastScale, d->pinchLastAngle, d->pinchRotation);
- pe.setStartCenter(d->pinchStartCenter);
- pe.setPreviousCenter(pinchCenter);
- pe.setPreviousAngle(d->pinchLastAngle);
- pe.setPreviousScale(d->pinchLastScale);
- pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
- pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
- pe.setPoint1(mapFromScene(d->lastPoint1));
- pe.setPoint2(mapFromScene(d->lastPoint2));
- emit pinchFinished(&pe);
- d->pinchStartDist = 0;
- d->pinchActivated = false;
- if (d->pinch && d->pinch->target())
- d->pinch->setActive(false);
- }
- return;
- }
- QTouchEvent::TouchPoint touchPoint1 = d->touchPoints.at(0);
- QTouchEvent::TouchPoint touchPoint2 = d->touchPoints.at(d->touchPoints. count() >= 2 ? 1 : 0);
- if (d->touchPoints.count() == 2
- && (touchPoint1.state() & Qt::TouchPointPressed || touchPoint2.state() & Qt::TouchPointPressed)) {
- d->id1 = touchPoint1.id();
- d->sceneStartPoint1 = touchPoint1.scenePos();
- d->sceneStartPoint2 = touchPoint2.scenePos();
- d->inPinch = false;
- d->pinchRejected = false;
- d->pinchActivated = true;
- } else if (d->pinchActivated && !d->pinchRejected) {
- const int dragThreshold = QApplication::startDragDistance();
- QPointF p1 = touchPoint1.scenePos();
- QPointF p2 = touchPoint2.scenePos();
- qreal dx = p1.x() - p2.x();
- qreal dy = p1.y() - p2.y();
- qreal dist = sqrt(dx*dx + dy*dy);
- QPointF sceneCenter = (p1 + p2)/2;
- qreal angle = QLineF(p1, p2).angle();
- if (d->touchPoints.count() == 1) {
- // If we only have one point then just move the center
- if (d->id1 == touchPoint1.id())
- sceneCenter = d->sceneLastCenter + touchPoint1.scenePos() - d->lastPoint1;
- else
- sceneCenter = d->sceneLastCenter + touchPoint2.scenePos() - d->lastPoint2;
- angle = d->pinchLastAngle;
- }
- d->id1 = touchPoint1.id();
- if (angle > 180)
- angle -= 360;
- if (!d->inPinch) {
- if (d->touchPoints.count() >= 2
- && (qAbs(p1.x()-d->sceneStartPoint1.x()) > dragThreshold
- || qAbs(p1.y()-d->sceneStartPoint1.y()) > dragThreshold
- || qAbs(p2.x()-d->sceneStartPoint2.x()) > dragThreshold
- || qAbs(p2.y()-d->sceneStartPoint2.y()) > dragThreshold)) {
- d->sceneStartCenter = sceneCenter;
- d->sceneLastCenter = sceneCenter;
- d->pinchStartCenter = mapFromScene(sceneCenter);
- d->pinchStartDist = dist;
- d->pinchStartAngle = angle;
- d->pinchLastScale = 1.0;
- d->pinchLastAngle = angle;
- d->pinchRotation = 0.0;
- d->lastPoint1 = p1;
- d->lastPoint2 = p2;
- QDeclarativePinchEvent pe(d->pinchStartCenter, 1.0, angle, 0.0);
- pe.setStartCenter(d->pinchStartCenter);
- pe.setPreviousCenter(d->pinchStartCenter);
- pe.setPreviousAngle(d->pinchLastAngle);
- pe.setPreviousScale(d->pinchLastScale);
- pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
- pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
- pe.setPoint1(mapFromScene(d->lastPoint1));
- pe.setPoint2(mapFromScene(d->lastPoint2));
- pe.setPointCount(d->touchPoints.count());
- emit pinchStarted(&pe);
- if (pe.accepted()) {
- d->inPinch = true;
- d->stealMouse = true;
- QGraphicsScene *s = scene();
- if (s && s->mouseGrabberItem() != this)
- grabMouse();
- setKeepMouseGrab(true);
- if (d->pinch && d->pinch->target()) {
- d->pinchStartPos = pinch()->target()->pos();
- d->pinchStartScale = d->pinch->target()->scale();
- d->pinchStartRotation = d->pinch->target()->rotation();
- d->pinch->setActive(true);
- }
- } else {
- d->pinchRejected = true;
- }
- }
- } else if (d->pinchStartDist > 0) {
- qreal scale = dist ? dist / d->pinchStartDist : d->pinchLastScale;
- qreal da = d->pinchLastAngle - angle;
- if (da > 180)
- da -= 360;
- else if (da < -180)
- da += 360;
- d->pinchRotation += da;
- QPointF pinchCenter = mapFromScene(sceneCenter);
- QDeclarativePinchEvent pe(pinchCenter, scale, angle, d->pinchRotation);
- pe.setStartCenter(d->pinchStartCenter);
- pe.setPreviousCenter(mapFromScene(d->sceneLastCenter));
- pe.setPreviousAngle(d->pinchLastAngle);
- pe.setPreviousScale(d->pinchLastScale);
- pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
- pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
- pe.setPoint1(touchPoint1.pos());
- pe.setPoint2(touchPoint2.pos());
- pe.setPointCount(d->touchPoints.count());
- d->pinchLastScale = scale;
- d->sceneLastCenter = sceneCenter;
- d->pinchLastAngle = angle;
- d->lastPoint1 = touchPoint1.scenePos();
- d->lastPoint2 = touchPoint2.scenePos();
- emit pinchUpdated(&pe);
- if (d->pinch && d->pinch->target()) {
- qreal s = d->pinchStartScale * scale;
- s = qMin(qMax(pinch()->minimumScale(),s), pinch()->maximumScale());
- pinch()->target()->setScale(s);
- QPointF pos = sceneCenter - d->sceneStartCenter + d->pinchStartPos;
- if (pinch()->axis() & QDeclarativePinch::XAxis) {
- qreal x = pos.x();
- if (x < pinch()->xmin())
- x = pinch()->xmin();
- else if (x > pinch()->xmax())
- x = pinch()->xmax();
- pinch()->target()->setX(x);
- }
- if (pinch()->axis() & QDeclarativePinch::YAxis) {
- qreal y = pos.y();
- if (y < pinch()->ymin())
- y = pinch()->ymin();
- else if (y > pinch()->ymax())
- y = pinch()->ymax();
- pinch()->target()->setY(y);
- }
- if (d->pinchStartRotation >= pinch()->minimumRotation()
- && d->pinchStartRotation <= pinch()->maximumRotation()) {
- qreal r = d->pinchRotation + d->pinchStartRotation;
- r = qMin(qMax(pinch()->minimumRotation(),r), pinch()->maximumRotation());
- pinch()->target()->setRotation(r);
- }
- }
- }
- }
-}
-
-void QDeclarativePinchArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePinchArea);
- d->stealMouse = false;
- if (!d->absorb)
- QDeclarativeItem::mousePressEvent(event);
- else {
- setKeepMouseGrab(false);
- event->setAccepted(true);
- }
-}
-
-void QDeclarativePinchArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePinchArea);
- if (!d->absorb) {
- QDeclarativeItem::mouseMoveEvent(event);
- return;
- }
-}
-
-void QDeclarativePinchArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePinchArea);
- d->stealMouse = false;
- if (!d->absorb) {
- QDeclarativeItem::mouseReleaseEvent(event);
- } else {
- QGraphicsScene *s = scene();
- if (s && s->mouseGrabberItem() == this)
- ungrabMouse();
- setKeepMouseGrab(false);
- }
-}
-
-bool QDeclarativePinchArea::sceneEvent(QEvent *event)
-{
- bool rv = QDeclarativeItem::sceneEvent(event);
- if (event->type() == QEvent::UngrabMouse) {
- setKeepMouseGrab(false);
- }
- return rv;
-}
-
-bool QDeclarativePinchArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativePinchArea);
- QGraphicsSceneMouseEvent mouseEvent(event->type());
- QRectF myRect = mapToScene(QRectF(0, 0, width(), height())).boundingRect();
-
- QGraphicsScene *s = scene();
- QDeclarativeItem *grabber = s ? qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem()) : 0;
- bool stealThisEvent = d->stealMouse;
- if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
- mouseEvent.setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
- }
- }
- mouseEvent.setScenePos(event->scenePos());
- mouseEvent.setLastScenePos(event->lastScenePos());
- mouseEvent.setPos(mapFromScene(event->scenePos()));
- mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
-
- switch(mouseEvent.type()) {
- case QEvent::GraphicsSceneMouseMove:
- mouseMoveEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMousePress:
- mousePressEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMouseRelease:
- mouseReleaseEvent(&mouseEvent);
- break;
- default:
- break;
- }
- grabber = qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem());
- if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
- grabMouse();
-
- return stealThisEvent;
- }
- if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
- d->stealMouse = false;
- if (s && s->mouseGrabberItem() == this)
- ungrabMouse();
- setKeepMouseGrab(false);
- }
- return false;
-}
-
-bool QDeclarativePinchArea::sceneEventFilter(QGraphicsItem *i, QEvent *e)
-{
- Q_D(QDeclarativePinchArea);
- if (!d->absorb || !isVisible())
- return QDeclarativeItem::sceneEventFilter(i, e);
- switch (e->type()) {
- case QEvent::GraphicsSceneMousePress:
- case QEvent::GraphicsSceneMouseMove:
- case QEvent::GraphicsSceneMouseRelease:
- return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
- break;
- case QEvent::TouchBegin:
- case QEvent::TouchUpdate: {
- QTouchEvent *touch = static_cast<QTouchEvent*>(e);
- d->touchPoints.clear();
- for (int i = 0; i < touch->touchPoints().count(); ++i)
- if (!(touch->touchPoints().at(i).state() & Qt::TouchPointReleased))
- d->touchPoints << touch->touchPoints().at(i);
- updatePinch();
- }
- return d->inPinch;
- case QEvent::TouchEnd:
- d->touchPoints.clear();
- updatePinch();
- break;
- default:
- break;
- }
-
- return QDeclarativeItem::sceneEventFilter(i, e);
-}
-
-void QDeclarativePinchArea::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-QVariant QDeclarativePinchArea::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- return QDeclarativeItem::itemChange(change, value);
-}
-
-QDeclarativePinch *QDeclarativePinchArea::pinch()
-{
- Q_D(QDeclarativePinchArea);
- if (!d->pinch)
- d->pinch = new QDeclarativePinch;
- return d->pinch;
-}
-
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p.h
deleted file mode 100644
index 357c060520..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepincharea_p.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEPINCHAREA_H
-#define QDECLARATIVEPINCHAREA_H
-
-#include <qdeclarativeitem.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class Q_AUTOTEST_EXPORT QDeclarativePinch : public QObject
-{
- Q_OBJECT
-
- Q_ENUMS(Axis)
- Q_PROPERTY(QGraphicsObject *target READ target WRITE setTarget RESET resetTarget)
- Q_PROPERTY(qreal minimumScale READ minimumScale WRITE setMinimumScale NOTIFY minimumScaleChanged)
- Q_PROPERTY(qreal maximumScale READ maximumScale WRITE setMaximumScale NOTIFY maximumScaleChanged)
- Q_PROPERTY(qreal minimumRotation READ minimumRotation WRITE setMinimumRotation NOTIFY minimumRotationChanged)
- Q_PROPERTY(qreal maximumRotation READ maximumRotation WRITE setMaximumRotation NOTIFY maximumRotationChanged)
- Q_PROPERTY(Axis dragAxis READ axis WRITE setAxis NOTIFY dragAxisChanged)
- Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged)
- Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged)
- Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged)
- Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged)
- Q_PROPERTY(bool active READ active NOTIFY activeChanged)
-
-public:
- QDeclarativePinch();
-
- QGraphicsObject *target() const { return m_target; }
- void setTarget(QGraphicsObject *target) {
- if (target == m_target)
- return;
- m_target = target;
- emit targetChanged();
- }
- void resetTarget() {
- if (!m_target)
- return;
- m_target = 0;
- emit targetChanged();
- }
-
- qreal minimumScale() const { return m_minScale; }
- void setMinimumScale(qreal s) {
- if (s == m_minScale)
- return;
- m_minScale = s;
- emit minimumScaleChanged();
- }
- qreal maximumScale() const { return m_maxScale; }
- void setMaximumScale(qreal s) {
- if (s == m_maxScale)
- return;
- m_maxScale = s;
- emit maximumScaleChanged();
- }
-
- qreal minimumRotation() const { return m_minRotation; }
- void setMinimumRotation(qreal r) {
- if (r == m_minRotation)
- return;
- m_minRotation = r;
- emit minimumRotationChanged();
- }
- qreal maximumRotation() const { return m_maxRotation; }
- void setMaximumRotation(qreal r) {
- if (r == m_maxRotation)
- return;
- m_maxRotation = r;
- emit maximumRotationChanged();
- }
-
- enum Axis { NoDrag=0x00, XAxis=0x01, YAxis=0x02, XandYAxis=0x03 };
- Axis axis() const { return m_axis; }
- void setAxis(Axis a) {
- if (a == m_axis)
- return;
- m_axis = a;
- emit dragAxisChanged();
- }
-
- qreal xmin() const { return m_xmin; }
- void setXmin(qreal x) {
- if (x == m_xmin)
- return;
- m_xmin = x;
- emit minimumXChanged();
- }
- qreal xmax() const { return m_xmax; }
- void setXmax(qreal x) {
- if (x == m_xmax)
- return;
- m_xmax = x;
- emit maximumXChanged();
- }
- qreal ymin() const { return m_ymin; }
- void setYmin(qreal y) {
- if (y == m_ymin)
- return;
- m_ymin = y;
- emit minimumYChanged();
- }
- qreal ymax() const { return m_ymax; }
- void setYmax(qreal y) {
- if (y == m_ymax)
- return;
- m_ymax = y;
- emit maximumYChanged();
- }
-
- bool active() const { return m_active; }
- void setActive(bool a) {
- if (a == m_active)
- return;
- m_active = a;
- emit activeChanged();
- }
-
-signals:
- void targetChanged();
- void minimumScaleChanged();
- void maximumScaleChanged();
- void minimumRotationChanged();
- void maximumRotationChanged();
- void dragAxisChanged();
- void minimumXChanged();
- void maximumXChanged();
- void minimumYChanged();
- void maximumYChanged();
- void activeChanged();
-
-private:
- QGraphicsObject *m_target;
- qreal m_minScale;
- qreal m_maxScale;
- qreal m_minRotation;
- qreal m_maxRotation;
- Axis m_axis;
- qreal m_xmin;
- qreal m_xmax;
- qreal m_ymin;
- qreal m_ymax;
- bool m_active;
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativePinchEvent : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(QPointF center READ center)
- Q_PROPERTY(QPointF startCenter READ startCenter)
- Q_PROPERTY(QPointF previousCenter READ previousCenter)
- Q_PROPERTY(qreal scale READ scale)
- Q_PROPERTY(qreal previousScale READ previousScale)
- Q_PROPERTY(qreal angle READ angle)
- Q_PROPERTY(qreal previousAngle READ previousAngle)
- Q_PROPERTY(qreal rotation READ rotation)
- Q_PROPERTY(QPointF point1 READ point1)
- Q_PROPERTY(QPointF startPoint1 READ startPoint1)
- Q_PROPERTY(QPointF point2 READ point2)
- Q_PROPERTY(QPointF startPoint2 READ startPoint2)
- Q_PROPERTY(int pointCount READ pointCount)
- Q_PROPERTY(bool accepted READ accepted WRITE setAccepted)
-
-public:
- QDeclarativePinchEvent(QPointF c, qreal s, qreal a, qreal r)
- : QObject(), m_center(c), m_scale(s), m_angle(a), m_rotation(r)
- , m_pointCount(0), m_accepted(true) {}
-
- QPointF center() const { return m_center; }
- QPointF startCenter() const { return m_startCenter; }
- void setStartCenter(QPointF c) { m_startCenter = c; }
- QPointF previousCenter() const { return m_lastCenter; }
- void setPreviousCenter(QPointF c) { m_lastCenter = c; }
- qreal scale() const { return m_scale; }
- qreal previousScale() const { return m_lastScale; }
- void setPreviousScale(qreal s) { m_lastScale = s; }
- qreal angle() const { return m_angle; }
- qreal previousAngle() const { return m_lastAngle; }
- void setPreviousAngle(qreal a) { m_lastAngle = a; }
- qreal rotation() const { return m_rotation; }
- QPointF point1() const { return m_point1; }
- void setPoint1(QPointF p) { m_point1 = p; }
- QPointF startPoint1() const { return m_startPoint1; }
- void setStartPoint1(QPointF p) { m_startPoint1 = p; }
- QPointF point2() const { return m_point2; }
- void setPoint2(QPointF p) { m_point2 = p; }
- QPointF startPoint2() const { return m_startPoint2; }
- void setStartPoint2(QPointF p) { m_startPoint2 = p; }
- int pointCount() const { return m_pointCount; }
- void setPointCount(int count) { m_pointCount = count; }
-
- bool accepted() const { return m_accepted; }
- void setAccepted(bool a) { m_accepted = a; }
-
-private:
- QPointF m_center;
- QPointF m_startCenter;
- QPointF m_lastCenter;
- qreal m_scale;
- qreal m_lastScale;
- qreal m_angle;
- qreal m_lastAngle;
- qreal m_rotation;
- QPointF m_point1;
- QPointF m_point2;
- QPointF m_startPoint1;
- QPointF m_startPoint2;
- int m_pointCount;
- bool m_accepted;
-};
-
-
-class QDeclarativeMouseEvent;
-class QDeclarativePinchAreaPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativePinchArea : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
- Q_PROPERTY(QDeclarativePinch *pinch READ pinch CONSTANT)
-
-public:
- QDeclarativePinchArea(QDeclarativeItem *parent=0);
- ~QDeclarativePinchArea();
-
- bool isEnabled() const;
- void setEnabled(bool);
-
- QDeclarativePinch *pinch();
-
-Q_SIGNALS:
- void enabledChanged();
- void pinchStarted(QDeclarativePinchEvent *pinch);
- void pinchUpdated(QDeclarativePinchEvent *pinch);
- void pinchFinished(QDeclarativePinchEvent *pinch);
-
-protected:
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- bool sceneEvent(QEvent *);
- bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
- bool sceneEventFilter(QGraphicsItem *i, QEvent *e);
- bool event(QEvent *);
-
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
- virtual QVariant itemChange(GraphicsItemChange change, const QVariant& value);
-
-private:
- void updatePinch();
- void handlePress();
- void handleRelease();
-
-private:
- Q_DISABLE_COPY(QDeclarativePinchArea)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativePinchArea)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativePinch)
-QML_DECLARE_TYPE(QDeclarativePinchEvent)
-QML_DECLARE_TYPE(QDeclarativePinchArea)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEPINCHAREA_H
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
deleted file mode 100644
index a01859cdf9..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEPINCHAREA_P_H
-#define QDECLARATIVEPINCHAREA_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qdatetime.h>
-#include <qbasictimer.h>
-#include <qevent.h>
-#include <qgraphicssceneevent.h>
-#include "qdeclarativeitem_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativePinch;
-class QDeclarativePinchAreaPrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativePinchArea)
-public:
- QDeclarativePinchAreaPrivate()
- : absorb(true), stealMouse(false), inPinch(false)
- , pinchRejected(false), pinchActivated(false)
- , pinch(0), pinchStartDist(0), pinchStartScale(1.0)
- , pinchLastScale(1.0), pinchStartRotation(0.0), pinchStartAngle(0.0)
- , pinchLastAngle(0.0), pinchRotation(0.0)
- {
- }
-
- ~QDeclarativePinchAreaPrivate();
-
- void init()
- {
- Q_Q(QDeclarativePinchArea);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setAcceptTouchEvents(true);
- q->setFiltersChildEvents(true);
- }
-
- bool absorb : 1;
- bool stealMouse : 1;
- bool inPinch : 1;
- bool pinchRejected : 1;
- bool pinchActivated : 1;
- QDeclarativePinch *pinch;
- QPointF sceneStartPoint1;
- QPointF sceneStartPoint2;
- QPointF lastPoint1;
- QPointF lastPoint2;
- qreal pinchStartDist;
- qreal pinchStartScale;
- qreal pinchLastScale;
- qreal pinchStartRotation;
- qreal pinchStartAngle;
- qreal pinchLastAngle;
- qreal pinchRotation;
- QPointF sceneStartCenter;
- QPointF pinchStartCenter;
- QPointF sceneLastCenter;
- QPointF pinchStartPos;
- QList<QTouchEvent::TouchPoint> touchPoints;
- int id1;
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEPINCHAREA_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners.cpp b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
deleted file mode 100644
index 3d9e51032d..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepositioners.cpp
+++ /dev/null
@@ -1,1392 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativepositioners_p.h"
-#include "private/qdeclarativepositioners_p_p.h"
-
-#include <qdeclarative.h>
-#include <qdeclarativestate_p.h>
-#include <qdeclarativestategroup_p.h>
-#include <qdeclarativestateoperations_p.h>
-#include <qdeclarativeinfo.h>
-#include <QtCore/qmath.h>
-
-#include <QDebug>
-#include <QCoreApplication>
-
-QT_BEGIN_NAMESPACE
-
-static const QDeclarativeItemPrivate::ChangeTypes watchedChanges
- = QDeclarativeItemPrivate::Geometry
- | QDeclarativeItemPrivate::SiblingOrder
- | QDeclarativeItemPrivate::Visibility
- | QDeclarativeItemPrivate::Opacity
- | QDeclarativeItemPrivate::Destroyed;
-
-void QDeclarativeBasePositionerPrivate::watchChanges(QGraphicsObject *other)
-{
- if (QGraphicsItemPrivate::get(other)->isDeclarativeItem) {
- QDeclarativeItemPrivate *otherPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(other));
- otherPrivate->addItemChangeListener(this, watchedChanges);
- } else {
- Q_Q(QDeclarativeBasePositioner);
- QObject::connect(other, SIGNAL(widthChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::connect(other, SIGNAL(heightChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::connect(other, SIGNAL(opacityChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::connect(other, SIGNAL(visibleChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- }
-}
-
-void QDeclarativeBasePositionerPrivate::unwatchChanges(QGraphicsObject* other)
-{
- if (QGraphicsItemPrivate::get(other)->isDeclarativeItem) {
- QDeclarativeItemPrivate *otherPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(other));
- otherPrivate->removeItemChangeListener(this, watchedChanges);
- } else {
- Q_Q(QDeclarativeBasePositioner);
- QObject::disconnect(other, SIGNAL(widthChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::disconnect(other, SIGNAL(heightChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::disconnect(other, SIGNAL(opacityChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- QObject::disconnect(other, SIGNAL(visibleChanged()), q, SLOT(graphicsWidgetGeometryChanged()));
- }
-}
-
-void QDeclarativeBasePositioner::graphicsWidgetGeometryChanged()
-{
- prePositioning();
-}
-
-/*!
- \internal
- \class QDeclarativeBasePositioner
- \brief The QDeclarativeBasePositioner class provides a base for QDeclarativeGraphics layouts.
-
- To create a QDeclarativeGraphics Positioner, simply subclass QDeclarativeBasePositioner and implement
- doLayout(), which is automatically called when the layout might need
- updating. In doLayout() use the setX and setY functions from QDeclarativeBasePositioner, and the
- base class will apply the positions along with the appropriate transitions. The items to
- position are provided in order as the protected member positionedItems.
-
- You also need to set a PositionerType, to declare whether you are positioning the x, y or both
- for the child items. Depending on the chosen type, only x or y changes will be applied.
-
- Note that the subclass is responsible for adding the spacing in between items.
-*/
-QDeclarativeBasePositioner::QDeclarativeBasePositioner(PositionerType at, QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(*(new QDeclarativeBasePositionerPrivate), parent)
-{
- Q_D(QDeclarativeBasePositioner);
- d->init(at);
-}
-
-QDeclarativeBasePositioner::QDeclarativeBasePositioner(QDeclarativeBasePositionerPrivate &dd, PositionerType at, QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(dd, parent)
-{
- Q_D(QDeclarativeBasePositioner);
- d->init(at);
-}
-
-QDeclarativeBasePositioner::~QDeclarativeBasePositioner()
-{
- Q_D(QDeclarativeBasePositioner);
- for (int i = 0; i < positionedItems.count(); ++i)
- d->unwatchChanges(positionedItems.at(i).item);
- positionedItems.clear();
-}
-
-int QDeclarativeBasePositioner::spacing() const
-{
- Q_D(const QDeclarativeBasePositioner);
- return d->spacing;
-}
-
-void QDeclarativeBasePositioner::setSpacing(int s)
-{
- Q_D(QDeclarativeBasePositioner);
- if (s==d->spacing)
- return;
- d->spacing = s;
- prePositioning();
- emit spacingChanged();
-}
-
-QDeclarativeTransition *QDeclarativeBasePositioner::move() const
-{
- Q_D(const QDeclarativeBasePositioner);
- return d->moveTransition;
-}
-
-void QDeclarativeBasePositioner::setMove(QDeclarativeTransition *mt)
-{
- Q_D(QDeclarativeBasePositioner);
- if (mt == d->moveTransition)
- return;
- d->moveTransition = mt;
- emit moveChanged();
-}
-
-QDeclarativeTransition *QDeclarativeBasePositioner::add() const
-{
- Q_D(const QDeclarativeBasePositioner);
- return d->addTransition;
-}
-
-void QDeclarativeBasePositioner::setAdd(QDeclarativeTransition *add)
-{
- Q_D(QDeclarativeBasePositioner);
- if (add == d->addTransition)
- return;
-
- d->addTransition = add;
- emit addChanged();
-}
-
-void QDeclarativeBasePositioner::componentComplete()
-{
- Q_D(QDeclarativeBasePositioner);
- QDeclarativeItem::componentComplete();
- positionedItems.reserve(d->QGraphicsItemPrivate::children.count());
- prePositioning();
- reportConflictingAnchors();
-}
-
-QVariant QDeclarativeBasePositioner::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- Q_D(QDeclarativeBasePositioner);
- if (change == ItemChildAddedChange){
- QGraphicsItem* item = value.value<QGraphicsItem*>();
- QGraphicsObject* child = 0;
- if(item)
- child = item->toGraphicsObject();
- if (child)
- prePositioning();
- } else if (change == ItemChildRemovedChange) {
- QGraphicsItem* item = value.value<QGraphicsItem*>();
- QGraphicsObject* child = 0;
- if(item)
- child = item->toGraphicsObject();
- if (child) {
- QDeclarativeBasePositioner::PositionedItem posItem(child);
- int idx = positionedItems.find(posItem);
- if (idx >= 0) {
- d->unwatchChanges(child);
- positionedItems.remove(idx);
- }
- prePositioning();
- }
- }
- return QDeclarativeItem::itemChange(change, value);
-}
-
-void QDeclarativeBasePositioner::prePositioning()
-{
- Q_D(QDeclarativeBasePositioner);
- if (!isComponentComplete())
- return;
-
- if (d->doingPositioning)
- return;
-
- d->queuedPositioning = false;
- d->doingPositioning = true;
- //Need to order children by creation order modified by stacking order
- QList<QGraphicsItem *> children = d->QGraphicsItemPrivate::children;
- qSort(children.begin(), children.end(), d->insertionOrder);
-
- QPODVector<PositionedItem,8> oldItems;
- positionedItems.copyAndClear(oldItems);
- for (int ii = 0; ii < children.count(); ++ii) {
- QGraphicsObject *child = children.at(ii)->toGraphicsObject();
- if (!child)
- continue;
- QGraphicsItemPrivate *childPrivate = static_cast<QGraphicsItemPrivate*>(QGraphicsItemPrivate::get(child));
- PositionedItem *item = 0;
- PositionedItem posItem(child);
- int wIdx = oldItems.find(posItem);
- if (wIdx < 0) {
- d->watchChanges(child);
- positionedItems.append(posItem);
- item = &positionedItems[positionedItems.count()-1];
- item->isNew = true;
- if (child->opacity() <= 0.0 || childPrivate->explicitlyHidden || !childPrivate->width() || !childPrivate->height())
- item->isVisible = false;
- } else {
- item = &oldItems[wIdx];
- // Items are only omitted from positioning if they are explicitly hidden
- // i.e. their positioning is not affected if an ancestor is hidden.
- if (child->opacity() <= 0.0 || childPrivate->explicitlyHidden || !childPrivate->width() || !childPrivate->height()) {
- item->isVisible = false;
- } else if (!item->isVisible) {
- item->isVisible = true;
- item->isNew = true;
- } else {
- item->isNew = false;
- }
- positionedItems.append(*item);
- }
- }
- QSizeF contentSize;
- doPositioning(&contentSize);
- if(d->addTransition || d->moveTransition)
- finishApplyTransitions();
- d->doingPositioning = false;
- //Set implicit size to the size of its children
- setImplicitHeight(contentSize.height());
- setImplicitWidth(contentSize.width());
-}
-
-void QDeclarativeBasePositioner::positionX(int x, const PositionedItem &target)
-{
- Q_D(QDeclarativeBasePositioner);
- if(d->type == Horizontal || d->type == Both){
- if (target.isNew) {
- if (!d->addTransition)
- target.item->setX(x);
- else
- d->addActions << QDeclarativeAction(target.item, QLatin1String("x"), QVariant(x));
- } else if (x != target.item->x()) {
- if (!d->moveTransition)
- target.item->setX(x);
- else
- d->moveActions << QDeclarativeAction(target.item, QLatin1String("x"), QVariant(x));
- }
- }
-}
-
-void QDeclarativeBasePositioner::positionY(int y, const PositionedItem &target)
-{
- Q_D(QDeclarativeBasePositioner);
- if(d->type == Vertical || d->type == Both){
- if (target.isNew) {
- if (!d->addTransition)
- target.item->setY(y);
- else
- d->addActions << QDeclarativeAction(target.item, QLatin1String("y"), QVariant(y));
- } else if (y != target.item->y()) {
- if (!d->moveTransition)
- target.item->setY(y);
- else
- d->moveActions << QDeclarativeAction(target.item, QLatin1String("y"), QVariant(y));
- }
- }
-}
-
-void QDeclarativeBasePositioner::finishApplyTransitions()
-{
- Q_D(QDeclarativeBasePositioner);
- // Note that if a transition is not set the transition manager will
- // apply the changes directly, in the case add/move aren't set
- d->addTransitionManager.transition(d->addActions, d->addTransition);
- d->moveTransitionManager.transition(d->moveActions, d->moveTransition);
- d->addActions.clear();
- d->moveActions.clear();
-}
-
-/*!
- \qmlclass Column QDeclarativeColumn
- \ingroup qml-positioning-elements
- \since 4.7
- \brief The Column item arranges its children vertically.
- \inherits Item
-
- The Column item positions its child items so that they are vertically
- aligned and not overlapping.
-
- Spacing between items can be added using the \l spacing property.
- Transitions can be used for cases where items managed by a Column are
- added or moved. These are stored in the \l add and \l move properties
- respectively.
-
- See \l{Using QML Positioner and Repeater Items} for more details about this item and other
- related items.
-
- \section1 Example Usage
-
- The following example positions differently shaped rectangles using a Column
- item.
-
- \image verticalpositioner_example.png
-
- \snippet doc/src/snippets/declarative/column/vertical-positioner.qml document
-
- \section1 Using Transitions
-
- Transitions can be used to animate items that are added to, moved within,
- or removed from a Column item. The \l add and \l move properties can be set to
- the transitions that will be applied when items are added to, removed from,
- or re-positioned within a Column item.
-
- The use of transitions with positioners is described in more detail in the
- \l{Using QML Positioner and Repeater Items#Using Transitions}{Using QML
- Positioner and Repeater Items} document.
-
- \image verticalpositioner_transition.gif
-
- \qml
- Column {
- spacing: 2
- add: Transition {
- // Define an animation for adding a new item...
- }
- move: Transition {
- // Define an animation for moving items within the column...
- }
- // ...
- }
- \endqml
-
- \section1 Limitations
-
- Note that the positioner assumes that the x and y positions of its children
- will not change. If you manually change the x or y properties in script, bind
- the x or y properties, use anchors on a child of a positioner, or have the
- height of a child depend on the position of a child, then the
- positioner may exhibit strange behavior. If you need to perform any of these
- actions, consider positioning the items without the use of a Column.
-
- Items with a width or height of 0 will not be positioned.
-
- \sa Row, Grid, Flow, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty Transition Column::add
-
- This property holds the transition to be applied when adding an
- item to the positioner. The transition will only be applied to the
- added item(s). Positioner transitions will only affect the
- position (x, y) of items.
-
- For a positioner, adding an item can mean that either the object
- has been created or reparented, and thus is now a child or the
- positioner, or that the object has had its opacity increased from
- zero, and thus is now visible.
-
- \sa move
-*/
-/*!
- \qmlproperty Transition Column::move
-
- This property holds the transition to apply when moving an item
- within the positioner. Positioner transitions will only affect
- the position (x, y) of items.
-
- This transition can be performed when other items are added or removed
- from the positioner, or when items resize themselves.
-
- \image positioner-move.gif
-
- \qml
- Column {
- move: Transition {
- NumberAnimation {
- properties: "y"
- duration: 1000
- }
- }
- }
- \endqml
-
- \sa add, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty int Column::spacing
-
- The spacing is the amount in pixels left empty between adjacent
- items. The default spacing is 0.
-
- \sa Grid::spacing
-*/
-QDeclarativeColumn::QDeclarativeColumn(QDeclarativeItem *parent)
-: QDeclarativeBasePositioner(Vertical, parent)
-{
-}
-
-void QDeclarativeColumn::doPositioning(QSizeF *contentSize)
-{
- int voffset = 0;
-
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (!child.item || !child.isVisible)
- continue;
-
- if(child.item->y() != voffset)
- positionY(voffset, child);
-
- contentSize->setWidth(qMax(contentSize->width(), QGraphicsItemPrivate::get(child.item)->width()));
-
- voffset += QGraphicsItemPrivate::get(child.item)->height();
- voffset += spacing();
- }
-
- contentSize->setHeight(voffset - spacing());
-}
-
-void QDeclarativeColumn::reportConflictingAnchors()
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (child.item && QGraphicsItemPrivate::get(child.item)->isDeclarativeItem) {
- QDeclarativeAnchors *anchors = QDeclarativeItemPrivate::get(static_cast<QDeclarativeItem *>(child.item))->_anchors;
- if (anchors) {
- QDeclarativeAnchors::Anchors usedAnchors = anchors->usedAnchors();
- if (usedAnchors & QDeclarativeAnchors::TopAnchor ||
- usedAnchors & QDeclarativeAnchors::BottomAnchor ||
- usedAnchors & QDeclarativeAnchors::VCenterAnchor ||
- anchors->fill() || anchors->centerIn()) {
- d->anchorConflict = true;
- break;
- }
- }
- }
- }
- if (d->anchorConflict) {
- qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column";
- }
-}
-
-/*!
- \qmlclass Row QDeclarativeRow
- \ingroup qml-positioning-elements
- \since 4.7
- \brief The Row item arranges its children horizontally.
- \inherits Item
-
- The Row item positions its child items so that they are horizontally
- aligned and not overlapping.
-
- Use \l spacing to set the spacing between items in a Row, and use the
- \l add and \l move properties to set the transitions that should be applied
- when items are added to, removed from, or re-positioned within the Row.
-
- See \l{Using QML Positioner and Repeater Items} for more details about this item and other
- related items.
-
- \section1 Example Usage
-
- The following example lays out differently shaped rectangles using a Row.
-
- \image horizontalpositioner_example.png
-
- \snippet doc/src/snippets/declarative/row/row.qml document
-
- \section1 Using Transitions
-
- Transitions can be used to animate items that are added to, moved within,
- or removed from a Grid item. The \l add and \l move properties can be set to
- the transitions that will be applied when items are added to, removed from,
- or re-positioned within a Row item.
-
- \section1 Limitations
-
- Note that the positioner assumes that the x and y positions of its children
- will not change. If you manually change the x or y properties in script, bind
- the x or y properties, use anchors on a child of a positioner, or have the
- width of a child depend on the position of a child, then the
- positioner may exhibit strange behaviour. If you need to perform any of these
- actions, consider positioning the items without the use of a Row.
-
- Items with a width or height of 0 will not be positioned.
-
- \sa Column, Grid, Flow, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty Transition Row::add
-
- This property holds the transition to be applied when adding an
- item to the positioner. The transition will only be applied to the
- added item(s). Positioner transitions will only affect the
- position (x, y) of items.
-
- For a positioner, adding an item can mean that either the object
- has been created or reparented, and thus is now a child or the
- positioner, or that the object has had its opacity increased from
- zero, and thus is now visible.
-
- \sa move
-*/
-/*!
- \qmlproperty Transition Row::move
-
- This property holds the transition to be applied when moving an
- item within the positioner. Positioner transitions will only affect
- the position (x, y) of items.
-
- This transition can be performed when other items are added or removed
- from the positioner, or when items resize themselves.
-
- \qml
- Row {
- id: positioner
- move: Transition {
- NumberAnimation {
- properties: "x"
- duration: 1000
- }
- }
- }
- \endqml
-
- \sa add, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty int Row::spacing
-
- The spacing is the amount in pixels left empty between adjacent
- items. The default spacing is 0.
-
- \sa Grid::spacing
-*/
-QDeclarativeRow::QDeclarativeRow(QDeclarativeItem *parent)
-: QDeclarativeBasePositioner(Horizontal, parent)
-{
-}
-
-/*!
- \qmlproperty enumeration Row::layoutDirection
- \since Quick 1.1
-
- This property holds the layoutDirection of the row.
-
- Possible values:
-
- \list
- \o Qt.LeftToRight (default) - Items are laid out from left to right. If the width of the row is explicitly set,
- the left anchor remains to the left of the row.
- \o Qt.RightToLeft - Items are laid out from right to left. If the width of the row is explicitly set,
- the right anchor remains to the right of the row.
- \endlist
-
- \sa Grid::layoutDirection, Flow::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}
-*/
-Qt::LayoutDirection QDeclarativeRow::layoutDirection() const
-{
- return QDeclarativeBasePositionerPrivate::getLayoutDirection(this);
-}
-
-void QDeclarativeRow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate* >(QDeclarativeBasePositionerPrivate::get(this));
- if (d->layoutDirection != layoutDirection) {
- d->layoutDirection = layoutDirection;
- // For RTL layout the positioning changes when the width changes.
- if (d->layoutDirection == Qt::RightToLeft)
- d->addItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- else
- d->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- prePositioning();
- emit layoutDirectionChanged();
- emit effectiveLayoutDirectionChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Row::effectiveLayoutDirection
- This property holds the effective layout direction of the row positioner.
-
- When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts,
- the visual layout direction of the row positioner will be mirrored. However, the
- property \l {Row::layoutDirection}{layoutDirection} will remain unchanged.
-
- \sa Row::layoutDirection, {LayoutMirroring}{LayoutMirroring}
-*/
-
-Qt::LayoutDirection QDeclarativeRow::effectiveLayoutDirection() const
-{
- return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this);
-}
-
-void QDeclarativeRow::doPositioning(QSizeF *contentSize)
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- int hoffset = 0;
-
- QList<int> hoffsets;
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (!child.item || !child.isVisible)
- continue;
-
- if(d->isLeftToRight()){
- if(child.item->x() != hoffset)
- positionX(hoffset, child);
- }else{
- hoffsets << hoffset;
- }
-
- contentSize->setHeight(qMax(contentSize->height(), QGraphicsItemPrivate::get(child.item)->height()));
-
- hoffset += QGraphicsItemPrivate::get(child.item)->width();
- hoffset += spacing();
- }
-
- contentSize->setWidth(hoffset - spacing());
-
- if(d->isLeftToRight())
- return;
-
- //Right to Left layout
- int end = 0;
- if(!widthValid())
- end = contentSize->width();
- else
- end = width();
-
- int acc = 0;
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (!child.item || !child.isVisible)
- continue;
- hoffset = end - hoffsets[acc++] - QGraphicsItemPrivate::get(child.item)->width();
- if(child.item->x() != hoffset)
- positionX(hoffset, child);
- }
-}
-
-void QDeclarativeRow::reportConflictingAnchors()
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (child.item && QGraphicsItemPrivate::get(child.item)->isDeclarativeItem) {
- QDeclarativeAnchors *anchors = QDeclarativeItemPrivate::get(static_cast<QDeclarativeItem *>(child.item))->_anchors;
- if (anchors) {
- QDeclarativeAnchors::Anchors usedAnchors = anchors->usedAnchors();
- if (usedAnchors & QDeclarativeAnchors::LeftAnchor ||
- usedAnchors & QDeclarativeAnchors::RightAnchor ||
- usedAnchors & QDeclarativeAnchors::HCenterAnchor ||
- anchors->fill() || anchors->centerIn()) {
- d->anchorConflict = true;
- break;
- }
- }
- }
- }
- if (d->anchorConflict)
- qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row";
-}
-
-/*!
- \qmlclass Grid QDeclarativeGrid
- \ingroup qml-positioning-elements
- \since 4.7
- \brief The Grid item positions its children in a grid.
- \inherits Item
-
- The Grid item positions its child items so that they are
- aligned in a grid and are not overlapping.
-
- The grid positioner calculates a grid of rectangular cells of sufficient
- size to hold all items, placing the items in the cells, from left to right
- and top to bottom. Each item is positioned in the top-left corner of its
- cell with position (0, 0).
-
- A Grid defaults to four columns, and as many rows as are necessary to
- fit all child items. The number of rows and columns can be constrained
- by setting the \l rows and \l columns properties.
-
- Spacing can be added between child items by setting the \l spacing
- property. The amount of spacing applied will be the same in the
- horizontal and vertical directions.
-
- See \l{Using QML Positioner and Repeater Items} for more details about this item and other
- related items.
-
- \section1 Example Usage
-
- The following example demonstrates this.
-
- \image gridLayout_example.png
-
- \snippet doc/src/snippets/declarative/grid/grid.qml document
-
- \section1 Using Transitions
-
- Transitions can be used to animate items that are added to, moved within,
- or removed from a Grid item. The \l add and \l move properties can be set to
- the transitions that will be applied when items are added to, removed from,
- or re-positioned within a Grid item.
-
- \section1 Limitations
-
- Note that the positioner assumes that the x and y positions of its children
- will not change. If you manually change the x or y properties in script, bind
- the x or y properties, use anchors on a child of a positioner, or have the
- width or height of a child depend on the position of a child, then the
- positioner may exhibit strange behaviour. If you need to perform any of these
- actions, consider positioning the items without the use of a Grid.
-
- Items with a width or height of 0 will not be positioned.
-
- \sa Flow, Row, Column, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty Transition Grid::add
-
- This property holds the transition to be applied when adding an
- item to the positioner. The transition will only be applied to the
- added item(s). Positioner transitions will only affect the
- position (x, y) of items.
-
- For a positioner, adding an item can mean that either the object
- has been created or reparented, and thus is now a child or the
- positioner, or that the object has had its opacity increased from
- zero, and thus is now visible.
-
- \sa move
-*/
-/*!
- \qmlproperty Transition Grid::move
-
- This property holds the transition to be applied when moving an
- item within the positioner. Positioner transitions will only affect
- the position (x, y) of items.
-
- This transition can be performed when other items are added or removed
- from the positioner, or when items resize themselves.
-
- \qml
- Grid {
- move: Transition {
- NumberAnimation {
- properties: "x,y"
- duration: 1000
- }
- }
- }
- \endqml
-
- \sa add, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty int Grid::spacing
-
- The spacing is the amount in pixels left empty between adjacent
- items. The default spacing is 0.
-
- The below example places a Grid containing a red, a blue and a
- green rectangle on a gray background. The area the grid positioner
- occupies is colored white. The positioner on the left has the
- no spacing (the default), and the positioner on the right has
- a spacing of 6.
-
- \inlineimage qml-grid-no-spacing.png
- \inlineimage qml-grid-spacing.png
-
- \sa rows, columns
-*/
-QDeclarativeGrid::QDeclarativeGrid(QDeclarativeItem *parent) :
- QDeclarativeBasePositioner(Both, parent), m_rows(-1), m_columns(-1), m_flow(LeftToRight)
-{
-}
-
-/*!
- \qmlproperty int Grid::columns
-
- This property holds the number of columns in the grid. The default
- number of columns is 4.
-
- If the grid does not have enough items to fill the specified
- number of columns, some columns will be of zero width.
-*/
-
-/*!
- \qmlproperty int Grid::rows
- This property holds the number of rows in the grid.
-
- If the grid does not have enough items to fill the specified
- number of rows, some rows will be of zero width.
-*/
-
-void QDeclarativeGrid::setColumns(const int columns)
-{
- if (columns == m_columns)
- return;
- m_columns = columns;
- prePositioning();
- emit columnsChanged();
-}
-
-void QDeclarativeGrid::setRows(const int rows)
-{
- if (rows == m_rows)
- return;
- m_rows = rows;
- prePositioning();
- emit rowsChanged();
-}
-
-/*!
- \qmlproperty enumeration Grid::flow
- This property holds the flow of the layout.
-
- Possible values are:
-
- \list
- \o Grid.LeftToRight (default) - Items are positioned next to
- each other in the \l layoutDirection, then wrapped to the next line.
- \o Grid.TopToBottom - Items are positioned next to each
- other from top to bottom, then wrapped to the next column.
- \endlist
-*/
-QDeclarativeGrid::Flow QDeclarativeGrid::flow() const
-{
- return m_flow;
-}
-
-void QDeclarativeGrid::setFlow(Flow flow)
-{
- if (m_flow != flow) {
- m_flow = flow;
- prePositioning();
- emit flowChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Grid::layoutDirection
- \since Quick 1.1
-
- This property holds the layout direction of the layout.
-
- Possible values are:
-
- \list
- \o Qt.LeftToRight (default) - Items are positioned from the top to bottom,
- and left to right. The flow direction is dependent on the
- \l Grid::flow property.
- \o Qt.RightToLeft - Items are positioned from the top to bottom,
- and right to left. The flow direction is dependent on the
- \l Grid::flow property.
- \endlist
-
- \sa Flow::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}
-*/
-Qt::LayoutDirection QDeclarativeGrid::layoutDirection() const
-{
- return QDeclarativeBasePositionerPrivate::getLayoutDirection(this);
-}
-
-void QDeclarativeGrid::setLayoutDirection(Qt::LayoutDirection layoutDirection)
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- if (d->layoutDirection != layoutDirection) {
- d->layoutDirection = layoutDirection;
- // For RTL layout the positioning changes when the width changes.
- if (d->layoutDirection == Qt::RightToLeft)
- d->addItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- else
- d->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- prePositioning();
- emit layoutDirectionChanged();
- emit effectiveLayoutDirectionChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Grid::effectiveLayoutDirection
- This property holds the effective layout direction of the grid positioner.
-
- When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts,
- the visual layout direction of the grid positioner will be mirrored. However, the
- property \l {Grid::layoutDirection}{layoutDirection} will remain unchanged.
-
- \sa Grid::layoutDirection, {LayoutMirroring}{LayoutMirroring}
-*/
-
-Qt::LayoutDirection QDeclarativeGrid::effectiveLayoutDirection() const
-{
- return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this);
-}
-
-void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- int c = m_columns;
- int r = m_rows;
- //Is allocating the extra QPODVector too much overhead?
- QPODVector<PositionedItem, 8> visibleItems;//we aren't concerned with invisible items
- visibleItems.reserve(positionedItems.count());
- for(int i=0; i<positionedItems.count(); i++)
- if(positionedItems[i].item && positionedItems[i].isVisible)
- visibleItems.append(positionedItems[i]);
-
- int numVisible = visibleItems.count();
- if (m_columns <= 0 && m_rows <= 0){
- c = 4;
- r = (numVisible+3)/4;
- } else if (m_rows <= 0){
- r = (numVisible+(m_columns-1))/m_columns;
- } else if (m_columns <= 0){
- c = (numVisible+(m_rows-1))/m_rows;
- }
-
- if(r==0 || c==0)
- return; //Nothing to do
-
- QList<int> maxColWidth;
- QList<int> maxRowHeight;
- int childIndex =0;
- if (m_flow == LeftToRight) {
- 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 == visibleItems.count())
- break;
-
- const PositionedItem &child = visibleItems.at(childIndex++);
- QGraphicsItemPrivate *childPrivate = QGraphicsItemPrivate::get(child.item);
- if (childPrivate->width() > maxColWidth[j])
- maxColWidth[j] = childPrivate->width();
- if (childPrivate->height() > maxRowHeight[i])
- maxRowHeight[i] = childPrivate->height();
- }
- }
- } else {
- for (int j=0; j < c; j++){
- for (int i=0; i < r; i++){
- if (j==0)
- maxRowHeight << 0;
- if (i==0)
- maxColWidth << 0;
-
- if (childIndex == visibleItems.count())
- break;
-
- const PositionedItem &child = visibleItems.at(childIndex++);
- QGraphicsItemPrivate *childPrivate = QGraphicsItemPrivate::get(child.item);
- if (childPrivate->width() > maxColWidth[j])
- maxColWidth[j] = childPrivate->width();
- if (childPrivate->height() > maxRowHeight[i])
- maxRowHeight[i] = childPrivate->height();
- }
- }
- }
-
- int widthSum = 0;
- for(int j=0; j < maxColWidth.size(); j++){
- if(j)
- widthSum += spacing();
- widthSum += maxColWidth[j];
- }
-
- int heightSum = 0;
- for(int i=0; i < maxRowHeight.size(); i++){
- if(i)
- heightSum += spacing();
- heightSum += maxRowHeight[i];
- }
-
- contentSize->setHeight(heightSum);
- contentSize->setWidth(widthSum);
-
- int end = 0;
- if(widthValid())
- end = width();
- else
- end = widthSum;
-
- int xoffset=0;
- if(!d->isLeftToRight())
- xoffset=end;
- int yoffset=0;
- int curRow =0;
- int curCol =0;
- for (int i = 0; i < visibleItems.count(); ++i) {
- const PositionedItem &child = visibleItems.at(i);
- int childXOffset = xoffset;
- if(!d->isLeftToRight())
- childXOffset -= QGraphicsItemPrivate::get(child.item)->width();
- if((child.item->x()!=childXOffset)||(child.item->y()!=yoffset)){
- positionX(childXOffset, child);
- positionY(yoffset, child);
- }
-
- if (m_flow == LeftToRight) {
- if(d->isLeftToRight())
- xoffset+=maxColWidth[curCol]+spacing();
- else
- xoffset-=maxColWidth[curCol]+spacing();
- curCol++;
- curCol%=c;
- if (!curCol){
- yoffset+=maxRowHeight[curRow]+spacing();
- if(d->isLeftToRight())
- xoffset=0;
- else
- xoffset=end;
- curRow++;
- if (curRow>=r)
- break;
- }
- } else {
- yoffset+=maxRowHeight[curRow]+spacing();
- curRow++;
- curRow%=r;
- if (!curRow){
- if(d->isLeftToRight())
- xoffset+=maxColWidth[curCol]+spacing();
- else
- xoffset-=maxColWidth[curCol]+spacing();
- yoffset=0;
- curCol++;
- if (curCol>=c)
- break;
- }
- }
- }
-}
-
-void QDeclarativeGrid::reportConflictingAnchors()
-{
- QDeclarativeBasePositionerPrivate *d = static_cast<QDeclarativeBasePositionerPrivate*>(QDeclarativeBasePositionerPrivate::get(this));
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (child.item && QGraphicsItemPrivate::get(child.item)->isDeclarativeItem) {
- QDeclarativeAnchors *anchors = QDeclarativeItemPrivate::get(static_cast<QDeclarativeItem *>(child.item))->_anchors;
- if (anchors && (anchors->usedAnchors() || anchors->fill() || anchors->centerIn())) {
- d->anchorConflict = true;
- break;
- }
- }
- }
- if (d->anchorConflict)
- qmlInfo(this) << "Cannot specify anchors for items inside Grid";
-}
-
-/*!
- \qmlclass Flow QDeclarativeFlow
- \ingroup qml-positioning-elements
- \since 4.7
- \brief The Flow item arranges its children side by side, wrapping as necessary.
- \inherits Item
-
- The Flow item positions its child items like words on a page, wrapping them
- to create rows or columns of items that do not overlap.
-
- Spacing between items can be added using the \l spacing property.
- Transitions can be used for cases where items managed by a Column are
- added or moved. These are stored in the \l add and \l move properties
- respectively.
-
- See \l{Using QML Positioner and Repeater Items} for more details about this item and other
- related items.
-
- \section1 Example Usage
-
- The following example positions \l Text items within a parent item using
- a Flow item.
-
- \image qml-flow-snippet.png
-
- \snippet doc/src/snippets/declarative/flow.qml flow item
-
- \section1 Using Transitions
-
- Transitions can be used to animate items that are added to, moved within,
- or removed from a Flow item. The \l add and \l move properties can be set to
- the transitions that will be applied when items are added to, removed from,
- or re-positioned within a Flow item.
-
- The use of transitions with positioners is described in more detail in the
- \l{Using QML Positioner and Repeater Items#Using Transitions}{Using QML
- Positioner and Repeater Items} document.
-
- \section1 Limitations
-
- Note that the positioner assumes that the x and y positions of its children
- will not change. If you manually change the x or y properties in script, bind
- the x or y properties, use anchors on a child of a positioner, or have the
- width or height of a child depend on the position of a child, then the
- positioner may exhibit strange behaviour. If you need to perform any of these
- actions, consider positioning the items without the use of a Flow.
-
- Items with a width or height of 0 will not be positioned.
-
- \sa Column, Row, Grid, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty Transition Flow::add
-
- This property holds the transition to be applied when adding an
- item to the positioner. The transition will only be applied to the
- added item(s). Positioner transitions will only affect the
- position (x, y) of items.
-
- For a positioner, adding an item can mean that either the object
- has been created or reparented, and thus is now a child or the
- positioner, or that the object has had its opacity increased from
- zero, and thus is now visible.
-
- \sa move
-*/
-/*!
- \qmlproperty Transition Flow::move
-
- This property holds the transition to be applied when moving an
- item within the positioner. Positioner transitions will only affect
- the position (x, y) of items.
-
- This transition can be performed when other items are added or removed
- from the positioner, or when items resize themselves.
-
- \qml
- Flow {
- id: positioner
- move: Transition {
- NumberAnimation {
- properties: "x,y"
- ease: "easeOutBounce"
- }
- }
- }
- \endqml
-
- \sa add, {declarative/positioners}{Positioners example}
-*/
-/*!
- \qmlproperty int Flow::spacing
-
- spacing is the amount in pixels left empty between each adjacent
- item, and defaults to 0.
-
- \sa Grid::spacing
-*/
-
-class QDeclarativeFlowPrivate : public QDeclarativeBasePositionerPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeFlow)
-
-public:
- QDeclarativeFlowPrivate()
- : QDeclarativeBasePositionerPrivate(), flow(QDeclarativeFlow::LeftToRight)
- {}
-
- QDeclarativeFlow::Flow flow;
-};
-
-QDeclarativeFlow::QDeclarativeFlow(QDeclarativeItem *parent)
-: QDeclarativeBasePositioner(*(new QDeclarativeFlowPrivate), Both, parent)
-{
- Q_D(QDeclarativeFlow);
- // Flow layout requires relayout if its own size changes too.
- d->addItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
-}
-
-/*!
- \qmlproperty enumeration Flow::flow
- This property holds the flow of the layout.
-
- Possible values are:
-
- \list
- \o Flow.LeftToRight (default) - Items are positioned next to
- to each other according to the \l layoutDirection until the width of the Flow
- is exceeded, then wrapped to the next line.
- \o Flow.TopToBottom - Items are positioned next to each
- other from top to bottom until the height of the Flow is exceeded,
- then wrapped to the next column.
- \endlist
-*/
-QDeclarativeFlow::Flow QDeclarativeFlow::flow() const
-{
- Q_D(const QDeclarativeFlow);
- return d->flow;
-}
-
-void QDeclarativeFlow::setFlow(Flow flow)
-{
- Q_D(QDeclarativeFlow);
- if (d->flow != flow) {
- d->flow = flow;
- prePositioning();
- emit flowChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Flow::layoutDirection
- \since Quick 1.1
-
- This property holds the layout direction of the layout.
-
- Possible values are:
-
- \list
- \o Qt.LeftToRight (default) - Items are positioned from the top to bottom,
- and left to right. The flow direction is dependent on the
- \l Flow::flow property.
- \o Qt.RightToLeft - Items are positioned from the top to bottom,
- and right to left. The flow direction is dependent on the
- \l Flow::flow property.
- \endlist
-
- \sa Grid::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}
-*/
-
-Qt::LayoutDirection QDeclarativeFlow::layoutDirection() const
-{
- Q_D(const QDeclarativeFlow);
- return d->layoutDirection;
-}
-
-void QDeclarativeFlow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
-{
- Q_D(QDeclarativeFlow);
- if (d->layoutDirection != layoutDirection) {
- d->layoutDirection = layoutDirection;
- prePositioning();
- emit layoutDirectionChanged();
- emit effectiveLayoutDirectionChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Flow::effectiveLayoutDirection
- This property holds the effective layout direction of the flow positioner.
-
- When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts,
- the visual layout direction of the grid positioner will be mirrored. However, the
- property \l {Flow::layoutDirection}{layoutDirection} will remain unchanged.
-
- \sa Flow::layoutDirection, {LayoutMirroring}{LayoutMirroring}
-*/
-
-Qt::LayoutDirection QDeclarativeFlow::effectiveLayoutDirection() const
-{
- return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this);
-}
-
-void QDeclarativeFlow::doPositioning(QSizeF *contentSize)
-{
- Q_D(QDeclarativeFlow);
-
- int hoffset = 0;
- int voffset = 0;
- int linemax = 0;
- QList<int> hoffsets;
-
- for (int i = 0; i < positionedItems.count(); ++i) {
- const PositionedItem &child = positionedItems.at(i);
- if (!child.item || !child.isVisible)
- continue;
-
- QGraphicsItemPrivate *childPrivate = QGraphicsItemPrivate::get(child.item);
- if (d->flow == LeftToRight) {
- if (widthValid() && hoffset && hoffset + childPrivate->width() > width()) {
- hoffset = 0;
- voffset += linemax + spacing();
- linemax = 0;
- }
- } else {
- if (heightValid() && voffset && voffset + childPrivate->height() > height()) {
- voffset = 0;
- hoffset += linemax + spacing();
- linemax = 0;
- }
- }
-
- if(d->isLeftToRight()){
- if(child.item->x() != hoffset)
- positionX(hoffset, child);
- }else{
- hoffsets << hoffset;
- }
- if(child.item->y() != voffset)
- positionY(voffset, child);
-
- contentSize->setWidth(qMax(contentSize->width(), hoffset + childPrivate->width()));
- contentSize->setHeight(qMax(contentSize->height(), voffset + childPrivate->height()));
-
- if (d->flow == LeftToRight) {
- hoffset += childPrivate->width();
- hoffset += spacing();
- linemax = qMax(linemax, qCeil(childPrivate->height()));
- } else {
- voffset += childPrivate->height();
- voffset += spacing();
- linemax = qMax(linemax, qCeil(childPrivate->width()));
- }
- }
-
- if(d->isLeftToRight())
- return;
-
- int end;
- if(widthValid())
- end = width();
- else
- end = contentSize->width();
- int acc = 0;
- for (int i = 0; i < positionedItems.count(); ++i) {
- const PositionedItem &child = positionedItems.at(i);
- if (!child.item || !child.isVisible)
- continue;
- hoffset = end - hoffsets[acc++] - QGraphicsItemPrivate::get(child.item)->width();
- if(child.item->x() != hoffset)
- positionX(hoffset, child);
- }
-}
-
-void QDeclarativeFlow::reportConflictingAnchors()
-{
- Q_D(QDeclarativeFlow);
- for (int ii = 0; ii < positionedItems.count(); ++ii) {
- const PositionedItem &child = positionedItems.at(ii);
- if (child.item && QGraphicsItemPrivate::get(child.item)->isDeclarativeItem) {
- QDeclarativeAnchors *anchors = QDeclarativeItemPrivate::get(static_cast<QDeclarativeItem *>(child.item))->_anchors;
- if (anchors && (anchors->usedAnchors() || anchors->fill() || anchors->centerIn())) {
- d->anchorConflict = true;
- break;
- }
- }
- }
- if (d->anchorConflict)
- qmlInfo(this) << "Cannot specify anchors for items inside Flow";
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p.h
deleted file mode 100644
index 3d62a8838f..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepositioners_p.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVELAYOUTS_H
-#define QDECLARATIVELAYOUTS_H
-
-#include "qdeclarativeimplicitsizeitem_p.h"
-
-#include <private/qdeclarativestate_p.h>
-#include <private/qpodvector_p.h>
-
-#include <QtCore/QObject>
-#include <QtCore/QString>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-class QDeclarativeBasePositionerPrivate;
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeBasePositioner : public QDeclarativeImplicitSizeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(int spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
- Q_PROPERTY(QDeclarativeTransition *move READ move WRITE setMove NOTIFY moveChanged)
- Q_PROPERTY(QDeclarativeTransition *add READ add WRITE setAdd NOTIFY addChanged)
-public:
- enum PositionerType { None = 0x0, Horizontal = 0x1, Vertical = 0x2, Both = 0x3 };
- QDeclarativeBasePositioner(PositionerType, QDeclarativeItem *parent);
- ~QDeclarativeBasePositioner();
-
- int spacing() const;
- void setSpacing(int);
-
- QDeclarativeTransition *move() const;
- void setMove(QDeclarativeTransition *);
-
- QDeclarativeTransition *add() const;
- void setAdd(QDeclarativeTransition *);
-
-protected:
- QDeclarativeBasePositioner(QDeclarativeBasePositionerPrivate &dd, PositionerType at, QDeclarativeItem *parent);
- virtual void componentComplete();
- virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
- void finishApplyTransitions();
-
-Q_SIGNALS:
- void spacingChanged();
- void moveChanged();
- void addChanged();
-
-protected Q_SLOTS:
- void prePositioning();
- void graphicsWidgetGeometryChanged();
-
-protected:
- virtual void doPositioning(QSizeF *contentSize)=0;
- virtual void reportConflictingAnchors()=0;
- class PositionedItem {
- public :
- PositionedItem(QGraphicsObject *i) : item(i), isNew(false), isVisible(true) {}
- bool operator==(const PositionedItem &other) const { return other.item == item; }
- QGraphicsObject *item;
- bool isNew;
- bool isVisible;
- };
-
- QPODVector<PositionedItem,8> positionedItems;
- void positionX(int,const PositionedItem &target);
- void positionY(int,const PositionedItem &target);
-
-private:
- Q_DISABLE_COPY(QDeclarativeBasePositioner)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeBasePositioner)
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativeColumn : public QDeclarativeBasePositioner
-{
- Q_OBJECT
-public:
- QDeclarativeColumn(QDeclarativeItem *parent=0);
-protected:
- virtual void doPositioning(QSizeF *contentSize);
- virtual void reportConflictingAnchors();
-private:
- Q_DISABLE_COPY(QDeclarativeColumn)
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativeRow: public QDeclarativeBasePositioner
-{
- Q_OBJECT
- Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
- Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1)
-public:
- QDeclarativeRow(QDeclarativeItem *parent=0);
-
- Qt::LayoutDirection layoutDirection() const;
- void setLayoutDirection (Qt::LayoutDirection);
- Qt::LayoutDirection effectiveLayoutDirection() const;
-
-Q_SIGNALS:
- Q_REVISION(1) void layoutDirectionChanged();
- Q_REVISION(1) void effectiveLayoutDirectionChanged();
-
-protected:
- virtual void doPositioning(QSizeF *contentSize);
- virtual void reportConflictingAnchors();
-private:
- Q_DISABLE_COPY(QDeclarativeRow)
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativeGrid : public QDeclarativeBasePositioner
-{
- Q_OBJECT
- Q_PROPERTY(int rows READ rows WRITE setRows NOTIFY rowsChanged)
- Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged)
- Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
- Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
- Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1)
-public:
- QDeclarativeGrid(QDeclarativeItem *parent=0);
-
- int rows() const {return m_rows;}
- void setRows(const int rows);
-
- int columns() const {return m_columns;}
- void setColumns(const int columns);
-
- Q_ENUMS(Flow)
- enum Flow { LeftToRight, TopToBottom };
- Flow flow() const;
- void setFlow(Flow);
-
- Qt::LayoutDirection layoutDirection() const;
- void setLayoutDirection (Qt::LayoutDirection);
- Qt::LayoutDirection effectiveLayoutDirection() const;
-
-Q_SIGNALS:
- void rowsChanged();
- void columnsChanged();
- void flowChanged();
- Q_REVISION(1) void layoutDirectionChanged();
- Q_REVISION(1) void effectiveLayoutDirectionChanged();
-
-protected:
- virtual void doPositioning(QSizeF *contentSize);
- virtual void reportConflictingAnchors();
-
-private:
- int m_rows;
- int m_columns;
- Flow m_flow;
- Q_DISABLE_COPY(QDeclarativeGrid)
-};
-
-class QDeclarativeFlowPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeFlow: public QDeclarativeBasePositioner
-{
- Q_OBJECT
- Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
- Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
- Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1)
-public:
- QDeclarativeFlow(QDeclarativeItem *parent=0);
-
- Q_ENUMS(Flow)
- enum Flow { LeftToRight, TopToBottom };
- Flow flow() const;
- void setFlow(Flow);
-
- Qt::LayoutDirection layoutDirection() const;
- void setLayoutDirection (Qt::LayoutDirection);
- Qt::LayoutDirection effectiveLayoutDirection() const;
-Q_SIGNALS:
- void flowChanged();
- Q_REVISION(1) void layoutDirectionChanged();
- Q_REVISION(1) void effectiveLayoutDirectionChanged();
-
-protected:
- virtual void doPositioning(QSizeF *contentSize);
- virtual void reportConflictingAnchors();
-protected:
- QDeclarativeFlow(QDeclarativeFlowPrivate &dd, QDeclarativeItem *parent);
-private:
- Q_DISABLE_COPY(QDeclarativeFlow)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeFlow)
-};
-
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeColumn)
-QML_DECLARE_TYPE(QDeclarativeRow)
-QML_DECLARE_TYPE(QDeclarativeGrid)
-QML_DECLARE_TYPE(QDeclarativeFlow)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h
deleted file mode 100644
index 752cc02e0e..0000000000
--- a/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVELAYOUTS_P_H
-#define QDECLARATIVELAYOUTS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativepositioners_p.h"
-
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-
-#include <qdeclarativestate_p.h>
-#include <qdeclarativetransitionmanager_p_p.h>
-#include <qdeclarativestateoperations_p.h>
-
-#include <QtCore/QObject>
-#include <QtCore/QString>
-#include <QtCore/QTimer>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-class QDeclarativeBasePositionerPrivate : public QDeclarativeImplicitSizeItemPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativeBasePositioner)
-
-public:
- QDeclarativeBasePositionerPrivate()
- : spacing(0), type(QDeclarativeBasePositioner::None)
- , moveTransition(0), addTransition(0), queuedPositioning(false)
- , doingPositioning(false), anchorConflict(false), layoutDirection(Qt::LeftToRight)
- {
- }
-
- void init(QDeclarativeBasePositioner::PositionerType at)
- {
- type = at;
- }
-
- int spacing;
-
- QDeclarativeBasePositioner::PositionerType type;
- QDeclarativeTransition *moveTransition;
- QDeclarativeTransition *addTransition;
- QDeclarativeStateOperation::ActionList addActions;
- QDeclarativeStateOperation::ActionList moveActions;
- QDeclarativeTransitionManager addTransitionManager;
- QDeclarativeTransitionManager moveTransitionManager;
-
- void watchChanges(QGraphicsObject *other);
- void unwatchChanges(QGraphicsObject* other);
- bool queuedPositioning : 1;
- bool doingPositioning : 1;
- bool anchorConflict : 1;
-
- Qt::LayoutDirection layoutDirection;
-
-
- void schedulePositioning()
- {
- Q_Q(QDeclarativeBasePositioner);
- if(!queuedPositioning){
- QTimer::singleShot(0,q,SLOT(prePositioning()));
- queuedPositioning = true;
- }
- }
-
- void mirrorChange() {
- Q_Q(QDeclarativeBasePositioner);
- if (type != QDeclarativeBasePositioner::Vertical)
- q->prePositioning();
- }
- bool isLeftToRight() const {
- if (type == QDeclarativeBasePositioner::Vertical)
- return true;
- else
- return effectiveLayoutMirror ? layoutDirection == Qt::RightToLeft : layoutDirection == Qt::LeftToRight;
- }
-
- virtual void itemSiblingOrderChanged(QDeclarativeItem* other)
- {
- Q_UNUSED(other);
- //Delay is due to many children often being reordered at once
- //And we only want to reposition them all once
- schedulePositioning();
- }
-
- void itemGeometryChanged(QDeclarativeItem *, const QRectF &newGeometry, const QRectF &oldGeometry)
- {
- Q_Q(QDeclarativeBasePositioner);
- if (newGeometry.size() != oldGeometry.size())
- q->prePositioning();
- }
-
- virtual void itemVisibilityChanged(QDeclarativeItem *)
- {
- schedulePositioning();
- }
- virtual void itemOpacityChanged(QDeclarativeItem *)
- {
- Q_Q(QDeclarativeBasePositioner);
- q->prePositioning();
- }
-
- void itemDestroyed(QDeclarativeItem *item)
- {
- Q_Q(QDeclarativeBasePositioner);
- q->positionedItems.removeOne(QDeclarativeBasePositioner::PositionedItem(item));
- }
-
- static Qt::LayoutDirection getLayoutDirection(const QDeclarativeBasePositioner *positioner)
- {
- return positioner->d_func()->layoutDirection;
- }
-
- static Qt::LayoutDirection getEffectiveLayoutDirection(const QDeclarativeBasePositioner *positioner)
- {
- if (positioner->d_func()->effectiveLayoutMirror)
- return positioner->d_func()->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft;
- else
- return positioner->d_func()->layoutDirection;
- }
-};
-
-QT_END_NAMESPACE
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
deleted file mode 100644
index 18f11f3e38..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ /dev/null
@@ -1,587 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativerectangle_p.h"
-#include "private/qdeclarativerectangle_p_p.h"
-
-#include <QPainter>
-#include <QStringBuilder>
-#include <QtCore/qmath.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \internal
- \class QDeclarativePen
- \brief The QDeclarativePen class provides a pen used for drawing rectangle borders on a QDeclarativeView.
-
- By default, the pen is invalid and nothing is drawn. You must either set a color (then the default
- width is 1) or a width (then the default color is black).
-
- A width of 1 indicates is a single-pixel line on the border of the item being painted.
-
- Example:
- \qml
- Rectangle {
- border.width: 2
- border.color: "red"
- }
- \endqml
-*/
-
-void QDeclarativePen::setColor(const QColor &c)
-{
- _color = c;
- _valid = (_color.alpha() && _width >= 1) ? true : false;
- emit penChanged();
-}
-
-void QDeclarativePen::setWidth(int w)
-{
- if (_width == w && _valid)
- return;
-
- _width = w;
- _valid = (_color.alpha() && _width >= 1) ? true : false;
- emit penChanged();
-}
-
-
-/*!
- \qmlclass GradientStop QDeclarativeGradientStop
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The GradientStop item defines the color at a position in a Gradient.
-
- \sa Gradient
-*/
-
-/*!
- \qmlproperty real GradientStop::position
- \qmlproperty color GradientStop::color
-
- The position and color properties describe the color used at a given
- position in a gradient, as represented by a gradient stop.
-
- The default position is 0.0; the default color is black.
-
- \sa Gradient
-*/
-
-void QDeclarativeGradientStop::updateGradient()
-{
- if (QDeclarativeGradient *grad = qobject_cast<QDeclarativeGradient*>(parent()))
- grad->doUpdate();
-}
-
-/*!
- \qmlclass Gradient QDeclarativeGradient
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The Gradient item defines a gradient fill.
-
- A gradient is defined by two or more colors, which will be blended seamlessly.
-
- The colors are specified as a set of GradientStop child items, each of
- which defines a position on the gradient from 0.0 to 1.0 and a color.
- The position of each GradientStop is defined by setting its
- \l{GradientStop::}{position} property; its color is defined using its
- \l{GradientStop::}{color} property.
-
- A gradient without any gradient stops is rendered as a solid white fill.
-
- Note that this item is not a visual representation of a gradient. To display a
- gradient, use a visual element (like \l Rectangle) which supports the use
- of gradients.
-
- \section1 Example Usage
-
- \div {class="float-right"}
- \inlineimage qml-gradient.png
- \enddiv
-
- The following example declares a \l Rectangle item with a gradient starting
- with red, blending to yellow at one third of the height of the rectangle,
- and ending with green:
-
- \snippet doc/src/snippets/declarative/gradient.qml code
-
- \clearfloat
- \section1 Performance and Limitations
-
- Calculating gradients can be computationally expensive compared to the use
- of solid color fills or images. Consider using gradients for static items
- in a user interface.
-
- In Qt 4.7, only vertical, linear gradients can be applied to items. If you
- need to apply different orientations of gradients, a combination of rotation
- and clipping will need to be applied to the relevant items. This can
- introduce additional performance requirements for your application.
-
- The use of animations involving gradient stops may not give the desired
- result. An alternative way to animate gradients is to use pre-generated
- images or SVG drawings containing gradients.
-
- \sa GradientStop
-*/
-
-/*!
- \qmlproperty list<GradientStop> Gradient::stops
- This property holds the gradient stops describing the gradient.
-
- By default, this property contains an empty list.
-
- To set the gradient stops, define them as children of the Gradient element.
-*/
-
-const QGradient *QDeclarativeGradient::gradient() const
-{
- if (!m_gradient && !m_stops.isEmpty()) {
- m_gradient = new QLinearGradient(0,0,0,1.0);
- for (int i = 0; i < m_stops.count(); ++i) {
- const QDeclarativeGradientStop *stop = m_stops.at(i);
- m_gradient->setCoordinateMode(QGradient::ObjectBoundingMode);
- m_gradient->setColorAt(stop->position(), stop->color());
- }
- }
-
- return m_gradient;
-}
-
-void QDeclarativeGradient::doUpdate()
-{
- delete m_gradient;
- m_gradient = 0;
- emit updated();
-}
-
-
-/*!
- \qmlclass Rectangle QDeclarativeRectangle
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The Rectangle item provides a filled rectangle with an optional border.
- \inherits Item
-
- Rectangle items are used to fill areas with solid color or gradients, and are
- often used to hold other items.
-
- \section1 Appearance
-
- Each Rectangle item is painted using either a solid fill color, specified using
- the \l color property, or a gradient, defined using a Gradient element and set
- using the \l gradient property. If both a color and a gradient are specified,
- the gradient is used.
-
- You can add an optional border to a rectangle with its own color and thickness
- by settting the \l border.color and \l border.width properties.
-
- You can also create rounded rectangles using the \l radius property. Since this
- introduces curved edges to the corners of a rectangle, it may be appropriate to
- set the \l smooth property to improve its appearance.
-
- \section1 Example Usage
-
- \div {class="float-right"}
- \inlineimage declarative-rect.png
- \enddiv
-
- The following example shows the effects of some of the common properties on a
- Rectangle item, which in this case is used to create a square:
-
- \snippet doc/src/snippets/declarative/rectangle/rectangle.qml document
-
- \clearfloat
- \section1 Performance
-
- Using the \l smooth property improves the appearance of a rounded rectangle at
- the cost of rendering performance. You should consider unsetting this property
- for rectangles in motion, and only set it when they are stationary.
-
- \sa Image
-*/
-
-int QDeclarativeRectanglePrivate::doUpdateSlotIdx = -1;
-
-QDeclarativeRectangle::QDeclarativeRectangle(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeRectanglePrivate), parent)
-{
-}
-
-void QDeclarativeRectangle::doUpdate()
-{
- Q_D(QDeclarativeRectangle);
- d->rectImage = QPixmap();
- const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
- d->setPaintMargin((pw+1)/2);
- update();
-}
-
-/*!
- \qmlproperty int Rectangle::border.width
- \qmlproperty color Rectangle::border.color
-
- The width and color used to draw the border of the rectangle.
-
- A width of 1 creates a thin line. For no line, use a width of 0 or a transparent color.
-
- \note The width of the rectangle's border does not affect the geometry of the
- rectangle itself or its position relative to other items if anchors are used.
-
- If \c border.width is an odd number, the rectangle is painted at a half-pixel offset to retain
- border smoothness. Also, the border is rendered evenly on either side of the
- rectangle's boundaries, and the spare pixel is rendered to the right and below the
- rectangle (as documented for QRect rendering). This can cause unintended effects if
- \c border.width is 1 and the rectangle is \l{Item::clip}{clipped} by a parent item:
-
- \div {class="float-right"}
- \inlineimage rect-border-width.png
- \enddiv
-
- \snippet doc/src/snippets/declarative/rectangle/rect-border-width.qml 0
-
- \clearfloat
- Here, the innermost rectangle's border is clipped on the bottom and right edges by its
- parent. To avoid this, the border width can be set to two instead of one.
-*/
-QDeclarativePen *QDeclarativeRectangle::border()
-{
- Q_D(QDeclarativeRectangle);
- return d->getPen();
-}
-
-/*!
- \qmlproperty Gradient Rectangle::gradient
-
- The gradient to use to fill the rectangle.
-
- This property allows for the construction of simple vertical gradients.
- Other gradients may by formed by adding rotation to the rectangle.
-
- \div {class="float-left"}
- \inlineimage declarative-rect_gradient.png
- \enddiv
-
- \snippet doc/src/snippets/declarative/rectangle/rectangle-gradient.qml rectangles
- \clearfloat
-
- If both a gradient and a color are specified, the gradient will be used.
-
- \sa Gradient, color
-*/
-QDeclarativeGradient *QDeclarativeRectangle::gradient() const
-{
- Q_D(const QDeclarativeRectangle);
- return d->gradient;
-}
-
-void QDeclarativeRectangle::setGradient(QDeclarativeGradient *gradient)
-{
- Q_D(QDeclarativeRectangle);
- if (d->gradient == gradient)
- return;
- static int updatedSignalIdx = -1;
- if (updatedSignalIdx < 0)
- updatedSignalIdx = QDeclarativeGradient::staticMetaObject.indexOfSignal("updated()");
- if (d->doUpdateSlotIdx < 0)
- d->doUpdateSlotIdx = QDeclarativeRectangle::staticMetaObject.indexOfSlot("doUpdate()");
- if (d->gradient)
- QMetaObject::disconnect(d->gradient, updatedSignalIdx, this, d->doUpdateSlotIdx);
- d->gradient = gradient;
- if (d->gradient)
- QMetaObject::connect(d->gradient, updatedSignalIdx, this, d->doUpdateSlotIdx);
- update();
-}
-
-
-/*!
- \qmlproperty real Rectangle::radius
- This property holds the corner radius used to draw a rounded rectangle.
-
- If radius is non-zero, the rectangle will be painted as a rounded rectangle, otherwise it will be
- painted as a normal rectangle. The same radius is used by all 4 corners; there is currently
- no way to specify different radii for different corners.
-*/
-qreal QDeclarativeRectangle::radius() const
-{
- Q_D(const QDeclarativeRectangle);
- return d->radius;
-}
-
-void QDeclarativeRectangle::setRadius(qreal radius)
-{
- Q_D(QDeclarativeRectangle);
- if (d->radius == radius)
- return;
-
- d->radius = radius;
- d->rectImage = QPixmap();
- update();
- emit radiusChanged();
-}
-
-/*!
- \qmlproperty color Rectangle::color
- This property holds the color used to fill the rectangle.
-
- The default color is white.
-
- \div {class="float-right"}
- \inlineimage rect-color.png
- \enddiv
-
- The following example shows rectangles with colors specified
- using hexadecimal and named color notation:
-
- \snippet doc/src/snippets/declarative/rectangle/rectangle-colors.qml rectangles
-
- \clearfloat
- If both a gradient and a color are specified, the gradient will be used.
-
- \sa gradient
-*/
-QColor QDeclarativeRectangle::color() const
-{
- Q_D(const QDeclarativeRectangle);
- return d->color;
-}
-
-void QDeclarativeRectangle::setColor(const QColor &c)
-{
- Q_D(QDeclarativeRectangle);
- if (d->color == c)
- return;
-
- d->color = c;
- d->rectImage = QPixmap();
- update();
- emit colorChanged();
-}
-
-void QDeclarativeRectangle::generateRoundedRect()
-{
- Q_D(QDeclarativeRectangle);
- if (d->rectImage.isNull()) {
- const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
- const int radius = qCeil(d->radius); //ensure odd numbered width/height so we get 1-pixel center
-
- QString key = QLatin1String("q_") % QString::number(pw) % d->color.name() % QString::number(d->color.alpha(), 16) % QLatin1Char('_') % QString::number(radius);
- if (d->pen && d->pen->isValid())
- key += d->pen->color().name() % QString::number(d->pen->color().alpha(), 16);
-
- if (!QPixmapCache::find(key, &d->rectImage)) {
- d->rectImage = QPixmap(radius*2 + 3 + pw*2, radius*2 + 3 + pw*2);
- d->rectImage.fill(Qt::transparent);
- QPainter p(&(d->rectImage));
- p.setRenderHint(QPainter::Antialiasing);
- if (d->pen && d->pen->isValid()) {
- QPen pn(QColor(d->pen->color()), d->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, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)), d->radius, d->radius);
- else
- p.drawRoundedRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw), d->radius, d->radius);
-
- // end painting before inserting pixmap
- // to pixmap cache to avoid a deep copy
- p.end();
- QPixmapCache::insert(key, d->rectImage);
- }
- }
-}
-
-void QDeclarativeRectangle::generateBorderedRect()
-{
- Q_D(QDeclarativeRectangle);
- if (d->rectImage.isNull()) {
- const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
-
- QString key = QLatin1String("q_") % QString::number(pw) % d->color.name() % QString::number(d->color.alpha(), 16);
- if (d->pen && d->pen->isValid())
- key += d->pen->color().name() % QString::number(d->pen->color().alpha(), 16);
-
- if (!QPixmapCache::find(key, &d->rectImage)) {
- // Adding 5 here makes qDrawBorderPixmap() paint correctly with smooth: true
- // See QTBUG-7999 and QTBUG-10765 for more details.
- d->rectImage = QPixmap(pw*2 + 5, pw*2 + 5);
- d->rectImage.fill(Qt::transparent);
- QPainter p(&(d->rectImage));
- p.setRenderHint(QPainter::Antialiasing);
- if (d->pen && d->pen->isValid()) {
- QPen pn(QColor(d->pen->color()), d->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, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)));
- else
- p.drawRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw));
-
- // end painting before inserting pixmap
- // to pixmap cache to avoid a deep copy
- p.end();
- QPixmapCache::insert(key, d->rectImage);
- }
- }
-}
-
-void QDeclarativeRectangle::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
-{
- Q_D(QDeclarativeRectangle);
- if (width() <= 0 || height() <= 0)
- return;
- if (d->radius > 0 || (d->pen && d->pen->isValid())
- || (d->gradient && d->gradient->gradient()) ) {
- drawRect(*p);
- }
- else {
- bool oldAA = p->testRenderHint(QPainter::Antialiasing);
- if (d->smooth)
- p->setRenderHints(QPainter::Antialiasing, true);
- p->fillRect(QRectF(0, 0, width(), height()), d->color);
- if (d->smooth)
- p->setRenderHint(QPainter::Antialiasing, oldAA);
- }
-}
-
-void QDeclarativeRectangle::drawRect(QPainter &p)
-{
- Q_D(QDeclarativeRectangle);
- if ((d->gradient && d->gradient->gradient())
- || d->radius > width()/2 || d->radius > height()/2
- || width() < 3 || height() < 3) {
- // XXX This path is still slower than the image path
- // Image path won't work for gradients or invalid radius though
- bool oldAA = p.testRenderHint(QPainter::Antialiasing);
- if (d->smooth)
- p.setRenderHint(QPainter::Antialiasing);
- if (d->pen && d->pen->isValid()) {
- QPen pn(QColor(d->pen->color()), d->pen->width());
- pn.setJoinStyle(Qt::MiterJoin);
- p.setPen(pn);
- } else {
- p.setPen(Qt::NoPen);
- }
- if (d->gradient && d->gradient->gradient())
- p.setBrush(*d->gradient->gradient());
- else
- p.setBrush(d->color);
- const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
- QRectF rect;
- if (pw%2)
- rect = QRectF(0.5, 0.5, width()-1, height()-1);
- else
- rect = QRectF(0, 0, width(), height());
- qreal radius = d->radius;
- if (radius > width()/2 || radius > height()/2)
- radius = qMin(width()/2, height()/2);
- if (radius > 0.)
- p.drawRoundedRect(rect, radius, radius);
- else
- p.drawRect(rect);
- if (d->smooth)
- p.setRenderHint(QPainter::Antialiasing, oldAA);
- } else {
- bool oldAA = p.testRenderHint(QPainter::Antialiasing);
- bool oldSmooth = p.testRenderHint(QPainter::SmoothPixmapTransform);
- if (d->smooth)
- p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
-
- const int pw = d->pen && d->pen->isValid() ? (d->pen->width()+1)/2*2 : 0;
-
- if (d->radius > 0)
- generateRoundedRect();
- else
- generateBorderedRect();
-
- int xOffset = (d->rectImage.width()-1)/2;
- int yOffset = (d->rectImage.height()-1)/2;
- Q_ASSERT(d->rectImage.width() == 2*xOffset + 1);
- Q_ASSERT(d->rectImage.height() == 2*yOffset + 1);
-
- // check whether we've eliminated the center completely
- if (2*xOffset > width()+pw)
- xOffset = (width()+pw)/2;
- if (2*yOffset > height()+pw)
- yOffset = (height()+pw)/2;
-
- QMargins margins(xOffset, yOffset, xOffset, yOffset);
- QTileRules rules(Qt::StretchTile, Qt::StretchTile);
- //NOTE: even though our item may have qreal-based width and height, qDrawBorderPixmap only supports QRects
- qDrawBorderPixmap(&p, QRect(-pw/2, -pw/2, width()+pw, height()+pw), margins, d->rectImage, d->rectImage.rect(), margins, rules);
-
- if (d->smooth) {
- p.setRenderHint(QPainter::Antialiasing, oldAA);
- p.setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
- }
- }
-}
-
-/*!
- \qmlproperty bool Rectangle::smooth
-
- Set this property if you want the item to be smoothly scaled or
- transformed. Smooth filtering gives better visual quality, but is slower. If
- the item is displayed at its natural size, this property has no visual or
- performance effect.
-
- \note Generally scaling artifacts are only visible if the item is stationary on
- the screen. A common pattern when animating an item is to disable smooth
- filtering at the beginning of the animation and reenable it at the conclusion.
-
- \image rect-smooth.png
- On this image, smooth is turned off on the top half and on on the bottom half.
-*/
-
-QRectF QDeclarativeRectangle::boundingRect() const
-{
- Q_D(const QDeclarativeRectangle);
- return QRectF(-d->paintmargin, -d->paintmargin, d->width()+d->paintmargin*2, d->height()+d->paintmargin*2);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle_p.h b/src/declarative/graphicsitems/qdeclarativerectangle_p.h
deleted file mode 100644
index 8a5ab87853..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerectangle_p.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVERECT_H
-#define QDECLARATIVERECT_H
-
-#include "qdeclarativeitem.h"
-
-#include <QtGui/qbrush.h>
-
-#include <private/qdeclarativeglobal_p.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativePen : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(int width READ width WRITE setWidth NOTIFY penChanged)
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY penChanged)
-public:
- QDeclarativePen(QObject *parent=0)
- : QObject(parent), _width(1), _color("#000000"), _valid(false)
- {}
-
- int width() const { return _width; }
- void setWidth(int w);
-
- QColor color() const { return _color; }
- void setColor(const QColor &c);
-
- bool isValid() { return _valid; }
-
-Q_SIGNALS:
- void penChanged();
-
-private:
- int _width;
- QColor _color;
- bool _valid;
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativeGradientStop : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(qreal position READ position WRITE setPosition)
- Q_PROPERTY(QColor color READ color WRITE setColor)
-
-public:
- QDeclarativeGradientStop(QObject *parent=0) : QObject(parent) {}
-
- qreal position() const { return m_position; }
- void setPosition(qreal position) { m_position = position; updateGradient(); }
-
- QColor color() const { return m_color; }
- void setColor(const QColor &color) { m_color = color; updateGradient(); }
-
-private:
- void updateGradient();
-
-private:
- qreal m_position;
- QColor m_color;
-};
-
-class Q_AUTOTEST_EXPORT QDeclarativeGradient : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(QDeclarativeListProperty<QDeclarativeGradientStop> stops READ stops)
- Q_CLASSINFO("DefaultProperty", "stops")
-
-public:
- QDeclarativeGradient(QObject *parent=0) : QObject(parent), m_gradient(0) {}
- ~QDeclarativeGradient() { delete m_gradient; }
-
- QDeclarativeListProperty<QDeclarativeGradientStop> stops() { return QDeclarativeListProperty<QDeclarativeGradientStop>(this, m_stops); }
-
- const QGradient *gradient() const;
-
-Q_SIGNALS:
- void updated();
-
-private:
- void doUpdate();
-
-private:
- QList<QDeclarativeGradientStop *> m_stops;
- mutable QGradient *m_gradient;
- friend class QDeclarativeGradientStop;
-};
-
-class QDeclarativeRectanglePrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeRectangle : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
- Q_PROPERTY(QDeclarativeGradient *gradient READ gradient WRITE setGradient)
- Q_PROPERTY(QDeclarativePen * border READ border CONSTANT)
- Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged)
-public:
- QDeclarativeRectangle(QDeclarativeItem *parent=0);
-
- QColor color() const;
- void setColor(const QColor &);
-
- QDeclarativePen *border();
-
- QDeclarativeGradient *gradient() const;
- void setGradient(QDeclarativeGradient *gradient);
-
- qreal radius() const;
- void setRadius(qreal radius);
-
- QRectF boundingRect() const;
-
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
-
-Q_SIGNALS:
- void colorChanged();
- void radiusChanged();
-
-private Q_SLOTS:
- void doUpdate();
-
-private:
- void generateRoundedRect();
- void generateBorderedRect();
- void drawRect(QPainter &painter);
-
-private:
- Q_DISABLE_COPY(QDeclarativeRectangle)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeRectangle)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativePen)
-QML_DECLARE_TYPE(QDeclarativeGradientStop)
-QML_DECLARE_TYPE(QDeclarativeGradient)
-QML_DECLARE_TYPE(QDeclarativeRectangle)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVERECT_H
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle_p_p.h b/src/declarative/graphicsitems/qdeclarativerectangle_p_p.h
deleted file mode 100644
index 209fd8ae05..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerectangle_p_p.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVERECT_P_H
-#define QDECLARATIVERECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativeitem_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeGradient;
-class QDeclarativeRectangle;
-class QDeclarativeRectanglePrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeRectangle)
-
-public:
- QDeclarativeRectanglePrivate() :
- color(Qt::white), gradient(0), pen(0), radius(0), paintmargin(0)
- {
- QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
- }
-
- ~QDeclarativeRectanglePrivate()
- {
- delete pen;
- }
-
- QColor color;
- QDeclarativeGradient *gradient;
- QDeclarativePen *pen;
- qreal radius;
- qreal paintmargin;
- QPixmap rectImage;
- static int doUpdateSlotIdx;
-
- QDeclarativePen *getPen() {
- if (!pen) {
- Q_Q(QDeclarativeRectangle);
- pen = new QDeclarativePen;
- static int penChangedSignalIdx = -1;
- if (penChangedSignalIdx < 0)
- penChangedSignalIdx = QDeclarativePen::staticMetaObject.indexOfSignal("penChanged()");
- if (doUpdateSlotIdx < 0)
- doUpdateSlotIdx = QDeclarativeRectangle::staticMetaObject.indexOfSlot("doUpdate()");
- QMetaObject::connect(pen, penChangedSignalIdx, q, doUpdateSlotIdx);
- }
- return pen;
- }
-
- void setPaintMargin(qreal margin)
- {
- Q_Q(QDeclarativeRectangle);
- if (margin == paintmargin)
- return;
- q->prepareGeometryChange();
- paintmargin = margin;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVERECT_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater.cpp b/src/declarative/graphicsitems/qdeclarativerepeater.cpp
deleted file mode 100644
index 813c255300..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerepeater.cpp
+++ /dev/null
@@ -1,447 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativerepeater_p.h"
-#include "private/qdeclarativerepeater_p_p.h"
-
-#include "private/qdeclarativevisualitemmodel_p.h"
-#include <private/qdeclarativeglobal_p.h>
-#include <qdeclarativelistaccessor_p.h>
-
-#include <qlistmodelinterface_p.h>
-
-QT_BEGIN_NAMESPACE
-QDeclarativeRepeaterPrivate::QDeclarativeRepeaterPrivate()
-: model(0), ownModel(false)
-{
-}
-
-QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate()
-{
- if (ownModel)
- delete model;
-}
-
-/*!
- \qmlclass Repeater QDeclarativeRepeater
- \ingroup qml-utility-elements
- \since 4.7
- \inherits Item
-
- \brief The Repeater element allows you to repeat an Item-based component using a model.
-
- The Repeater element is used to create a large number of
- similar items. Like other view elements, a Repeater has a \l model and a \l delegate:
- for each entry in the model, the delegate is instantiated
- in a context seeded with data from the model. A Repeater item is usually
- enclosed in a positioner element such as \l Row or \l Column to visually
- position the multiple delegate items created by the Repeater.
-
- The following Repeater creates three instances of a \l Rectangle item within
- a \l Row:
-
- \snippet doc/src/snippets/declarative/repeaters/repeater.qml import
- \codeline
- \snippet doc/src/snippets/declarative/repeaters/repeater.qml simple
-
- \image repeater-simple.png
-
- A Repeater's \l model can be any of the supported \l {qmlmodels}{data models}.
- Additionally, like delegates for other views, a Repeater delegate can access
- its index within the repeater, as well as the model data relevant to the
- delegate. See the \l delegate property documentation for details.
-
- Items instantiated by the Repeater are inserted, in order, as
- children of the Repeater's parent. The insertion starts immediately after
- the repeater's position in its parent stacking list. This allows
- a Repeater to be used inside a layout. For example, the following Repeater's
- items are stacked between a red rectangle and a blue rectangle:
-
- \snippet doc/src/snippets/declarative/repeaters/repeater.qml layout
-
- \image repeater.png
-
-
- \note A Repeater item owns all items it instantiates. Removing or dynamically destroying
- an item created by a Repeater results in unpredictable behavior.
-
-
- \section2 Considerations when using Repeater
-
- The Repeater element creates all of its delegate items when the repeater is first
- created. This can be inefficient if there are a large number of delegate items and
- not all of the items are required to be visible at the same time. If this is the case,
- consider using other view elements like ListView (which only creates delegate items
- when they are scrolled into view) or use the \l {Dynamic Object Creation} methods to
- create items as they are required.
-
- Also, note that Repeater is \l {Item}-based, and can only repeat \l {Item}-derived objects.
- For example, it cannot be used to repeat QtObjects:
- \badcode
- Item {
- //XXX does not work! Can't repeat QtObject as it doesn't derive from Item.
- Repeater {
- model: 10
- QtObject {}
- }
- }
- \endcode
- */
-
-/*!
- \qmlsignal Repeater::onItemAdded(int index, Item item)
- \since Quick 1.1
-
- This handler is called when an item is added to the repeater. The \a index
- parameter holds the index at which the item has been inserted within the
- repeater, and the \a item parameter holds the \l Item that has been added.
-*/
-
-/*!
- \qmlsignal Repeater::onItemRemoved(int index, Item item)
- \since Quick 1.1
-
- This handler is called when an item is removed from the repeater. The \a index
- parameter holds the index at which the item was removed from the repeater,
- and the \a item parameter holds the \l Item that was removed.
-
- Do not keep a reference to \a item if it was created by this repeater, as
- in these cases it will be deleted shortly after the handler is called.
-*/
-
-QDeclarativeRepeater::QDeclarativeRepeater(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeRepeaterPrivate), parent)
-{
-}
-
-QDeclarativeRepeater::~QDeclarativeRepeater()
-{
-}
-
-/*!
- \qmlproperty any Repeater::model
-
- The model providing data for the repeater.
-
- This property can be set to any of the supported \l {qmlmodels}{data models}:
-
- \list
- \o A number that indicates the number of delegates to be created by the repeater
- \o A model (e.g. a ListModel item, or a QAbstractItemModel subclass)
- \o A string list
- \o An object list
- \endlist
-
- The type of model affects the properties that are exposed to the \l delegate.
-
- \sa {qmlmodels}{Data Models}
-*/
-QVariant QDeclarativeRepeater::model() const
-{
- Q_D(const QDeclarativeRepeater);
- return d->dataSource;
-}
-
-void QDeclarativeRepeater::setModel(const QVariant &model)
-{
- Q_D(QDeclarativeRepeater);
- if (d->dataSource == model)
- return;
-
- clear();
- if (d->model) {
- disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- /*
- disconnect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- disconnect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- */
- }
- d->dataSource = model;
- QObject *object = qvariant_cast<QObject*>(model);
- QDeclarativeVisualModel *vim = 0;
- if (object && (vim = qobject_cast<QDeclarativeVisualModel *>(object))) {
- if (d->ownModel) {
- delete d->model;
- d->ownModel = false;
- }
- d->model = vim;
- } else {
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this), this);
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- dataModel->setModel(model);
- }
- if (d->model) {
- connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
- connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
- connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
- connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
- /*
- connect(d->model, SIGNAL(createdItem(int,QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- connect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
- */
- regenerate();
- }
- emit modelChanged();
- emit countChanged();
-}
-
-/*!
- \qmlproperty Component Repeater::delegate
- \default
-
- The delegate provides a template defining each item instantiated by the repeater.
-
- Delegates are exposed to a read-only \c index property that indicates the index
- of the delegate within the repeater. For example, the following \l Text delegate
- displays the index of each repeated item:
-
- \table
- \row
- \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml index
- \o \image repeater-index.png
- \endtable
-
- If the \l model is a \l{QStringList-based model}{string list} or
- \l{QObjectList-based model}{object list}, the delegate is also exposed to
- a read-only \c modelData property that holds the string or object data. For
- example:
-
- \table
- \row
- \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml modeldata
- \o \image repeater-modeldata.png
- \endtable
-
- If the \l model is a model object (such as a \l ListModel) the delegate
- can access all model roles as named properties, in the same way that delegates
- do for view classes like ListView.
-
- \sa {QML Data Models}
- */
-QDeclarativeComponent *QDeclarativeRepeater::delegate() const
-{
- Q_D(const QDeclarativeRepeater);
- if (d->model) {
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- return dataModel->delegate();
- }
-
- return 0;
-}
-
-void QDeclarativeRepeater::setDelegate(QDeclarativeComponent *delegate)
-{
- Q_D(QDeclarativeRepeater);
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
- if (delegate == dataModel->delegate())
- return;
-
- if (!d->ownModel) {
- d->model = new QDeclarativeVisualDataModel(qmlContext(this));
- d->ownModel = true;
- }
- if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model)) {
- dataModel->setDelegate(delegate);
- regenerate();
- emit delegateChanged();
- }
-}
-
-/*!
- \qmlproperty int Repeater::count
-
- This property holds the number of items in the repeater.
-*/
-int QDeclarativeRepeater::count() const
-{
- Q_D(const QDeclarativeRepeater);
- if (d->model)
- return d->model->count();
- return 0;
-}
-
-/*!
- \qmlmethod Item Repeater::itemAt(index)
- \since Quick 1.1
-
- Returns the \l Item that has been created at the given \a index, or \c null
- if no item exists at \a index.
-*/
-QDeclarativeItem *QDeclarativeRepeater::itemAt(int index) const
-{
- Q_D(const QDeclarativeRepeater);
- if (index >= 0 && index < d->deletables.count())
- return d->deletables[index];
- return 0;
-
-}
-
-void QDeclarativeRepeater::componentComplete()
-{
- QDeclarativeItem::componentComplete();
- regenerate();
-}
-
-QVariant QDeclarativeRepeater::itemChange(GraphicsItemChange change,
- const QVariant &value)
-{
- QVariant rv = QDeclarativeItem::itemChange(change, value);
- if (change == ItemParentHasChanged) {
- regenerate();
- }
-
- return rv;
-}
-
-void QDeclarativeRepeater::clear()
-{
- Q_D(QDeclarativeRepeater);
- bool complete = isComponentComplete();
-
- if (d->model) {
- while (d->deletables.count() > 0) {
- QDeclarativeItem *item = d->deletables.takeLast();
- if (complete)
- emit itemRemoved(d->deletables.count()-1, item);
- d->model->release(item);
- }
- }
- d->deletables.clear();
-}
-
-void QDeclarativeRepeater::regenerate()
-{
- Q_D(QDeclarativeRepeater);
- if (!isComponentComplete())
- return;
-
- clear();
-
- if (!d->model || !d->model->count() || !d->model->isValid() || !parentItem() || !isComponentComplete())
- return;
-
- for (int ii = 0; ii < count(); ++ii) {
- QDeclarativeItem *item = d->model->item(ii);
- if (item) {
- QDeclarative_setParent_noEvent(item, parentItem());
- item->setParentItem(parentItem());
- item->stackBefore(this);
- d->deletables << item;
- emit itemAdded(ii, item);
- }
- }
-}
-
-void QDeclarativeRepeater::itemsInserted(int index, int count)
-{
- Q_D(QDeclarativeRepeater);
- if (!isComponentComplete())
- return;
- for (int i = 0; i < count; ++i) {
- int modelIndex = index + i;
- QDeclarativeItem *item = d->model->item(modelIndex);
- if (item) {
- QDeclarative_setParent_noEvent(item, parentItem());
- item->setParentItem(parentItem());
- if (modelIndex < d->deletables.count())
- item->stackBefore(d->deletables.at(modelIndex));
- else
- item->stackBefore(this);
- d->deletables.insert(modelIndex, item);
- emit itemAdded(modelIndex, item);
- }
- }
- emit countChanged();
-}
-
-void QDeclarativeRepeater::itemsRemoved(int index, int count)
-{
- Q_D(QDeclarativeRepeater);
- if (!isComponentComplete() || count <= 0)
- return;
- while (count--) {
- QDeclarativeItem *item = d->deletables.takeAt(index);
- emit itemRemoved(index, item);
- if (item)
- d->model->release(item);
- else
- break;
- }
- emit countChanged();
-}
-
-void QDeclarativeRepeater::itemsMoved(int from, int to, int count)
-{
- Q_D(QDeclarativeRepeater);
- if (!isComponentComplete() || count <= 0)
- return;
- if (from + count > d->deletables.count()) {
- regenerate();
- return;
- }
- QList<QDeclarativeItem*> removed;
- int removedCount = count;
- while (removedCount--)
- removed << d->deletables.takeAt(from);
- for (int i = 0; i < count; ++i)
- d->deletables.insert(to + i, removed.at(i));
- d->deletables.last()->stackBefore(this);
- for (int i = d->model->count()-1; i > 0; --i) {
- QDeclarativeItem *item = d->deletables.at(i-1);
- item->stackBefore(d->deletables.at(i));
- }
-}
-
-void QDeclarativeRepeater::modelReset()
-{
- if (!isComponentComplete())
- return;
- regenerate();
- emit countChanged();
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater_p.h b/src/declarative/graphicsitems/qdeclarativerepeater_p.h
deleted file mode 100644
index f6a2179c26..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerepeater_p.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEREPEATER_H
-#define QDECLARATIVEREPEATER_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeRepeaterPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeRepeater : public QDeclarativeItem
-{
- Q_OBJECT
-
- Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
- Q_PROPERTY(int count READ count NOTIFY countChanged)
- Q_CLASSINFO("DefaultProperty", "delegate")
-
-public:
- QDeclarativeRepeater(QDeclarativeItem *parent=0);
- virtual ~QDeclarativeRepeater();
-
- QVariant model() const;
- void setModel(const QVariant &);
-
- QDeclarativeComponent *delegate() const;
- void setDelegate(QDeclarativeComponent *);
-
- int count() const;
-
- Q_INVOKABLE Q_REVISION(1) QDeclarativeItem *itemAt(int index) const;
-
-Q_SIGNALS:
- void modelChanged();
- void delegateChanged();
- void countChanged();
-
- Q_REVISION(1) void itemAdded(int index, QDeclarativeItem *item);
- Q_REVISION(1) void itemRemoved(int index, QDeclarativeItem *item);
-
-private:
- void clear();
- void regenerate();
-
-protected:
- virtual void componentComplete();
- QVariant itemChange(GraphicsItemChange change, const QVariant &value);
-
-private Q_SLOTS:
- void itemsInserted(int,int);
- void itemsRemoved(int,int);
- void itemsMoved(int,int,int);
- void modelReset();
-
-private:
- Q_DISABLE_COPY(QDeclarativeRepeater)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeRepeater)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeRepeater)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEREPEATER_H
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater_p_p.h b/src/declarative/graphicsitems/qdeclarativerepeater_p_p.h
deleted file mode 100644
index ce1edc8ccf..0000000000
--- a/src/declarative/graphicsitems/qdeclarativerepeater_p_p.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEREPEATER_P_H
-#define QDECLARATIVEREPEATER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qdeclarativerepeater_p.h"
-
-#include "private/qdeclarativeitem_p.h"
-
-#include <QPointer>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeContext;
-class QDeclarativeVisualModel;
-class QDeclarativeRepeaterPrivate : public QDeclarativeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeRepeater)
-
-public:
- QDeclarativeRepeaterPrivate();
- ~QDeclarativeRepeaterPrivate();
-
- QDeclarativeVisualModel *model;
- QVariant dataSource;
- bool ownModel;
-
- QList<QPointer<QDeclarativeItem> > deletables;
-};
-
-QT_END_NAMESPACE
-#endif // QDECLARATIVEREPEATER_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp b/src/declarative/graphicsitems/qdeclarativescalegrid.cpp
deleted file mode 100644
index 996e6a22a7..0000000000
--- a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativescalegrid_p_p.h"
-
-#include <qdeclarative.h>
-
-#include <QBuffer>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-/*!
- \internal
- \class QDeclarativeScaleGrid
- \brief The QDeclarativeScaleGrid class allows you to specify a 3x3 grid to use in scaling an image.
-*/
-
-QDeclarativeScaleGrid::QDeclarativeScaleGrid(QObject *parent) : QObject(parent), _left(0), _top(0), _right(0), _bottom(0)
-{
-}
-
-QDeclarativeScaleGrid::~QDeclarativeScaleGrid()
-{
-}
-
-bool QDeclarativeScaleGrid::isNull() const
-{
- return !_left && !_top && !_right && !_bottom;
-}
-
-void QDeclarativeScaleGrid::setLeft(int pos)
-{
- if (_left != pos) {
- _left = pos;
- emit borderChanged();
- }
-}
-
-void QDeclarativeScaleGrid::setTop(int pos)
-{
- if (_top != pos) {
- _top = pos;
- emit borderChanged();
- }
-}
-
-void QDeclarativeScaleGrid::setRight(int pos)
-{
- if (_right != pos) {
- _right = pos;
- emit borderChanged();
- }
-}
-
-void QDeclarativeScaleGrid::setBottom(int pos)
-{
- if (_bottom != pos) {
- _bottom = pos;
- emit borderChanged();
- }
-}
-
-QDeclarativeGridScaledImage::QDeclarativeGridScaledImage()
-: _l(-1), _r(-1), _t(-1), _b(-1),
- _h(QDeclarativeBorderImage::Stretch), _v(QDeclarativeBorderImage::Stretch)
-{
-}
-
-QDeclarativeGridScaledImage::QDeclarativeGridScaledImage(const QDeclarativeGridScaledImage &o)
-: _l(o._l), _r(o._r), _t(o._t), _b(o._b), _h(o._h), _v(o._v), _pix(o._pix)
-{
-}
-
-QDeclarativeGridScaledImage &QDeclarativeGridScaledImage::operator=(const QDeclarativeGridScaledImage &o)
-{
- _l = o._l;
- _r = o._r;
- _t = o._t;
- _b = o._b;
- _h = o._h;
- _v = o._v;
- _pix = o._pix;
- return *this;
-}
-
-QDeclarativeGridScaledImage::QDeclarativeGridScaledImage(QIODevice *data)
-: _l(-1), _r(-1), _t(-1), _b(-1), _h(QDeclarativeBorderImage::Stretch), _v(QDeclarativeBorderImage::Stretch)
-{
- int l = -1;
- int r = -1;
- int t = -1;
- int b = -1;
- QString imgFile;
-
- QByteArray raw;
- while(raw = data->readLine(), !raw.isEmpty()) {
- QString line = QString::fromUtf8(raw.trimmed());
- if (line.isEmpty() || line.startsWith(QLatin1Char('#')))
- continue;
-
- int colonId = line.indexOf(QLatin1Char(':'));
- if (colonId <= 0)
- return;
- QStringList list;
- list.append(line.left(colonId).trimmed());
- list.append(line.mid(colonId+1).trimmed());
-
- if (list[0] == QLatin1String("border.left"))
- l = list[1].toInt();
- else if (list[0] == QLatin1String("border.right"))
- r = list[1].toInt();
- else if (list[0] == QLatin1String("border.top"))
- t = list[1].toInt();
- else if (list[0] == QLatin1String("border.bottom"))
- b = list[1].toInt();
- else if (list[0] == QLatin1String("source"))
- imgFile = list[1];
- else if (list[0] == QLatin1String("horizontalTileRule"))
- _h = stringToRule(list[1]);
- else if (list[0] == QLatin1String("verticalTileRule"))
- _v = stringToRule(list[1]);
- }
-
- if (l < 0 || r < 0 || t < 0 || b < 0 || imgFile.isEmpty())
- return;
-
- _l = l; _r = r; _t = t; _b = b;
-
- _pix = imgFile;
-}
-
-QDeclarativeBorderImage::TileMode QDeclarativeGridScaledImage::stringToRule(const QString &s)
-{
- if (s == QLatin1String("Stretch"))
- return QDeclarativeBorderImage::Stretch;
- if (s == QLatin1String("Repeat"))
- return QDeclarativeBorderImage::Repeat;
- if (s == QLatin1String("Round"))
- return QDeclarativeBorderImage::Round;
-
- qWarning("QDeclarativeGridScaledImage: Invalid tile rule specified. Using Stretch.");
- return QDeclarativeBorderImage::Stretch;
-}
-
-bool QDeclarativeGridScaledImage::isValid() const
-{
- return _l >= 0;
-}
-
-int QDeclarativeGridScaledImage::gridLeft() const
-{
- return _l;
-}
-
-int QDeclarativeGridScaledImage::gridRight() const
-{
- return _r;
-}
-
-int QDeclarativeGridScaledImage::gridTop() const
-{
- return _t;
-}
-
-int QDeclarativeGridScaledImage::gridBottom() const
-{
- return _b;
-}
-
-QString QDeclarativeGridScaledImage::pixmapUrl() const
-{
- return _pix;
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativescalegrid_p_p.h b/src/declarative/graphicsitems/qdeclarativescalegrid_p_p.h
deleted file mode 100644
index ffb8540222..0000000000
--- a/src/declarative/graphicsitems/qdeclarativescalegrid_p_p.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVESCALEGRID_H
-#define QDECLARATIVESCALEGRID_H
-
-#include <qdeclarative.h>
-
-#include <QtCore/QString>
-#include <QtCore/QObject>
-
-#include <private/qdeclarativeborderimage_p.h>
-#include <private/qdeclarativepixmapcache_p.h>
-#include <private/qdeclarativeglobal_p.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeScaleGrid : public QObject
-{
- Q_OBJECT
- Q_ENUMS(TileRule)
-
- Q_PROPERTY(int left READ left WRITE setLeft NOTIFY borderChanged)
- Q_PROPERTY(int top READ top WRITE setTop NOTIFY borderChanged)
- Q_PROPERTY(int right READ right WRITE setRight NOTIFY borderChanged)
- Q_PROPERTY(int bottom READ bottom WRITE setBottom NOTIFY borderChanged)
-
-public:
- QDeclarativeScaleGrid(QObject *parent=0);
- ~QDeclarativeScaleGrid();
-
- bool isNull() const;
-
- int left() const { return _left; }
- void setLeft(int);
-
- int top() const { return _top; }
- void setTop(int);
-
- int right() const { return _right; }
- void setRight(int);
-
- int bottom() const { return _bottom; }
- void setBottom(int);
-
-Q_SIGNALS:
- void borderChanged();
-
-private:
- int _left;
- int _top;
- int _right;
- int _bottom;
-};
-
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeGridScaledImage
-{
-public:
- QDeclarativeGridScaledImage();
- QDeclarativeGridScaledImage(const QDeclarativeGridScaledImage &);
- QDeclarativeGridScaledImage(QIODevice*);
- QDeclarativeGridScaledImage &operator=(const QDeclarativeGridScaledImage &);
- bool isValid() const;
- int gridLeft() const;
- int gridRight() const;
- int gridTop() const;
- int gridBottom() const;
- QDeclarativeBorderImage::TileMode horizontalTileRule() const { return _h; }
- QDeclarativeBorderImage::TileMode verticalTileRule() const { return _v; }
-
- QString pixmapUrl() const;
-
-private:
- static QDeclarativeBorderImage::TileMode stringToRule(const QString &);
-
-private:
- int _l;
- int _r;
- int _t;
- int _b;
- QDeclarativeBorderImage::TileMode _h;
- QDeclarativeBorderImage::TileMode _v;
- QString _pix;
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeScaleGrid)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVESCALEGRID_H
diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
deleted file mode 100644
index 96bd792c01..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ /dev/null
@@ -1,1640 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativetext_p_p.h"
-#include <qdeclarativestyledtext_p.h>
-#include <qdeclarativeinfo.h>
-#include <qdeclarativepixmapcache_p.h>
-
-#include <QSet>
-#include <QTextLayout>
-#include <QTextLine>
-#include <QTextDocument>
-#include <QGraphicsSceneMouseEvent>
-#include <QPainter>
-#include <QAbstractTextDocumentLayout>
-#include <qmath.h>
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
-
-class QTextDocumentWithImageResources : public QTextDocument {
- Q_OBJECT
-
-public:
- QTextDocumentWithImageResources(QDeclarativeText *parent);
- virtual ~QTextDocumentWithImageResources();
-
- void setText(const QString &);
- int resourcesLoading() const { return outstanding; }
-
-protected:
- QVariant loadResource(int type, const QUrl &name);
-
-private slots:
- void requestFinished();
-
-private:
- QHash<QUrl, QDeclarativePixmap *> m_resources;
-
- int outstanding;
- static QSet<QUrl> errors;
-};
-
-DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE);
-
-QString QDeclarativeTextPrivate::elideChar = QString(0x2026);
-
-QDeclarativeTextPrivate::QDeclarativeTextPrivate()
-: color((QRgb)0), style(QDeclarativeText::Normal), hAlign(QDeclarativeText::AlignLeft),
- vAlign(QDeclarativeText::AlignTop), elideMode(QDeclarativeText::ElideNone),
- format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap), lineHeight(1),
- lineHeightMode(QDeclarativeText::ProportionalHeight), lineCount(1), truncated(false), maximumLineCount(INT_MAX),
- maximumLineCountValid(false), imageCacheDirty(true), updateOnComponentComplete(true), richText(false), singleline(false),
- cacheAllTextAsImage(true), internalWidthUpdate(false), requireImplicitWidth(false), hAlignImplicit(true),
- rightToLeftText(false), layoutTextElided(false), naturalWidth(0), doc(0)
-{
- cacheAllTextAsImage = enableImageCache();
- QGraphicsItemPrivate::acceptedMouseButtons = Qt::LeftButton;
- QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
-}
-
-QTextDocumentWithImageResources::QTextDocumentWithImageResources(QDeclarativeText *parent)
-: QTextDocument(parent), outstanding(0)
-{
-}
-
-QTextDocumentWithImageResources::~QTextDocumentWithImageResources()
-{
- if (!m_resources.isEmpty())
- qDeleteAll(m_resources);
-}
-
-QVariant QTextDocumentWithImageResources::loadResource(int type, const QUrl &name)
-{
- QDeclarativeContext *context = qmlContext(parent());
- QUrl url = context->resolvedUrl(name);
-
- if (type == QTextDocument::ImageResource) {
- QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url);
-
- if (iter == m_resources.end()) {
- QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url);
- iter = m_resources.insert(name, p);
-
- if (p->isLoading()) {
- p->connectFinished(this, SLOT(requestFinished()));
- outstanding++;
- }
- }
-
- QDeclarativePixmap *p = *iter;
- if (p->isReady()) {
- return p->pixmap();
- } else if (p->isError()) {
- if (!errors.contains(url)) {
- errors.insert(url);
- qmlInfo(parent()) << p->error();
- }
- }
- }
-
- return QTextDocument::loadResource(type,url); // The *resolved* URL
-}
-
-void QTextDocumentWithImageResources::requestFinished()
-{
- outstanding--;
- if (outstanding == 0) {
- QDeclarativeText *textItem = static_cast<QDeclarativeText*>(parent());
- QString text = textItem->text();
-#ifndef QT_NO_TEXTHTMLPARSER
- setHtml(text);
-#else
- setPlainText(text);
-#endif
- QDeclarativeTextPrivate *d = QDeclarativeTextPrivate::get(textItem);
- d->updateLayout();
- }
-}
-
-void QTextDocumentWithImageResources::setText(const QString &text)
-{
- if (!m_resources.isEmpty()) {
- qDeleteAll(m_resources);
- m_resources.clear();
- outstanding = 0;
- }
-
-#ifndef QT_NO_TEXTHTMLPARSER
- setHtml(text);
-#else
- setPlainText(text);
-#endif
-}
-
-QSet<QUrl> QTextDocumentWithImageResources::errors;
-
-QDeclarativeTextPrivate::~QDeclarativeTextPrivate()
-{
-}
-
-qreal QDeclarativeTextPrivate::implicitWidth() const
-{
- if (!requireImplicitWidth) {
- // We don't calculate implicitWidth unless it is required.
- // We need to force a size update now to ensure implicitWidth is calculated
- QDeclarativeTextPrivate *me = const_cast<QDeclarativeTextPrivate*>(this);
- me->requireImplicitWidth = true;
- me->updateSize();
- }
- return mImplicitWidth;
-}
-
-void QDeclarativeTextPrivate::updateLayout()
-{
- Q_Q(QDeclarativeText);
- if (!q->isComponentComplete()) {
- updateOnComponentComplete = true;
- return;
- }
-
- layoutTextElided = false;
- // Setup instance of QTextLayout for all cases other than richtext
- if (!richText) {
- layout.clearLayout();
- layout.setFont(font);
- if (format != QDeclarativeText::StyledText) {
- QString tmp = text;
- tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
- singleline = !tmp.contains(QChar::LineSeparator);
- if (singleline && !maximumLineCountValid && elideMode != QDeclarativeText::ElideNone && q->widthValid()) {
- QFontMetrics fm(font);
- tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width());
- if (tmp != text) {
- layoutTextElided = true;
- if (!truncated) {
- truncated = true;
- emit q->truncatedChanged();
- }
- }
- }
- layout.setText(tmp);
- } else {
- singleline = false;
- QDeclarativeStyledText::parse(text, layout);
- }
- }
-
- updateSize();
-}
-
-void QDeclarativeTextPrivate::updateSize()
-{
- Q_Q(QDeclarativeText);
-
- if (!q->isComponentComplete()) {
- updateOnComponentComplete = true;
- return;
- }
-
- if (!requireImplicitWidth) {
- emit q->implicitWidthChanged();
- // if the implicitWidth is used, then updateSize() has already been called (recursively)
- if (requireImplicitWidth)
- return;
- }
-
- invalidateImageCache();
-
- QFontMetrics fm(font);
- if (text.isEmpty()) {
- q->setImplicitWidth(0);
- q->setImplicitHeight(fm.height());
- paintedSize = QSize(0, fm.height());
- emit q->paintedSizeChanged();
- q->update();
- return;
- }
-
- int dy = q->height();
- QSize size(0, 0);
-
- //setup instance of QTextLayout for all cases other than richtext
- if (!richText) {
- QRect textRect = setupTextLayout();
- if (layedOutTextRect.size() != textRect.size())
- q->prepareGeometryChange();
- layedOutTextRect = textRect;
- size = textRect.size();
- dy -= size.height();
- } else {
- singleline = false; // richtext can't elide or be optimized for single-line case
- ensureDoc();
- doc->setDefaultFont(font);
-
- QDeclarativeText::HAlignment horizontalAlignment = q->effectiveHAlign();
- if (rightToLeftText) {
- if (horizontalAlignment == QDeclarativeText::AlignLeft)
- horizontalAlignment = QDeclarativeText::AlignRight;
- else if (horizontalAlignment == QDeclarativeText::AlignRight)
- horizontalAlignment = QDeclarativeText::AlignLeft;
- }
- QTextOption option;
- option.setAlignment((Qt::Alignment)int(horizontalAlignment | vAlign));
- option.setWrapMode(QTextOption::WrapMode(wrapMode));
- doc->setDefaultTextOption(option);
- if (requireImplicitWidth && q->widthValid()) {
- doc->setTextWidth(-1);
- naturalWidth = doc->idealWidth();
- }
- if (wrapMode != QDeclarativeText::NoWrap && q->widthValid())
- doc->setTextWidth(q->width());
- else
- doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
- dy -= (int)doc->size().height();
- QSize dsize = doc->size().toSize();
- if (dsize != layedOutTextRect.size()) {
- q->prepareGeometryChange();
- layedOutTextRect = QRect(QPoint(0,0), dsize);
- }
- size = QSize(int(doc->idealWidth()),dsize.height());
- }
- int yoff = 0;
-
- if (q->heightValid()) {
- if (vAlign == QDeclarativeText::AlignBottom)
- yoff = dy;
- else if (vAlign == QDeclarativeText::AlignVCenter)
- yoff = dy/2;
- }
- q->setBaselineOffset(fm.ascent() + yoff);
-
- //### need to comfirm cost of always setting these for richText
- internalWidthUpdate = true;
- if (!q->widthValid())
- q->setImplicitWidth(size.width());
- else if (requireImplicitWidth)
- q->setImplicitWidth(naturalWidth);
- internalWidthUpdate = false;
- q->setImplicitHeight(size.height());
- if (paintedSize != size) {
- paintedSize = size;
- emit q->paintedSizeChanged();
- }
- q->update();
-}
-
-/*!
- Lays out the QDeclarativeTextPrivate::layout QTextLayout in the constraints of the QDeclarativeText.
-
- Returns the size of the final text. This can be used to position the text vertically (the text is
- already absolutely positioned horizontally).
-*/
-QRect QDeclarativeTextPrivate::setupTextLayout()
-{
- // ### text layout handling should be profiled and optimized as needed
- // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine);
- Q_Q(QDeclarativeText);
- layout.setCacheEnabled(true);
-
- qreal lineWidth = 0;
- int visibleCount = 0;
-
- //set manual width
- if (q->widthValid())
- lineWidth = q->width();
-
- QTextOption textOption = layout.textOption();
- textOption.setAlignment(Qt::Alignment(q->effectiveHAlign()));
- textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
- layout.setTextOption(textOption);
-
- bool elideText = false;
- bool truncate = false;
-
- QFontMetrics fm(layout.font());
- elidePos = QPointF();
-
- if (requireImplicitWidth && q->widthValid()) {
- // requires an extra layout
- QString elidedText;
- if (layoutTextElided) {
- // We have provided elided text to the layout, but we must calculate unelided width.
- elidedText = layout.text();
- layout.setText(text);
- }
- layout.beginLayout();
- forever {
- QTextLine line = layout.createLine();
- if (!line.isValid())
- break;
- }
- layout.endLayout();
- QRectF br;
- for (int i = 0; i < layout.lineCount(); ++i) {
- QTextLine line = layout.lineAt(i);
- br = br.united(line.naturalTextRect());
- }
- naturalWidth = br.width();
- if (layoutTextElided)
- layout.setText(elidedText);
- }
-
- if (maximumLineCountValid) {
- layout.beginLayout();
- if (!lineWidth)
- lineWidth = INT_MAX;
- int linesLeft = maximumLineCount;
- int visibleTextLength = 0;
- while (linesLeft > 0) {
- QTextLine line = layout.createLine();
- if (!line.isValid())
- break;
-
- visibleCount++;
- if (lineWidth)
- line.setLineWidth(lineWidth);
- visibleTextLength += line.textLength();
-
- if (--linesLeft == 0) {
- if (visibleTextLength < text.length()) {
- truncate = true;
- if (elideMode==QDeclarativeText::ElideRight && q->widthValid()) {
- qreal elideWidth = fm.width(elideChar);
- // Need to correct for alignment
- line.setLineWidth(lineWidth-elideWidth);
- if (layout.text().mid(line.textStart(), line.textLength()).isRightToLeft()) {
- line.setPosition(QPointF(line.position().x() + elideWidth, line.position().y()));
- elidePos.setX(line.naturalTextRect().left() - elideWidth);
- } else {
- elidePos.setX(line.naturalTextRect().right());
- }
- elideText = true;
- }
- }
- }
- }
- layout.endLayout();
-
- //Update truncated
- if (truncated != truncate) {
- truncated = truncate;
- emit q->truncatedChanged();
- }
- } else {
- layout.beginLayout();
- forever {
- QTextLine line = layout.createLine();
- if (!line.isValid())
- break;
- visibleCount++;
- if (lineWidth)
- line.setLineWidth(lineWidth);
- }
- layout.endLayout();
- }
-
- qreal height = 0;
- QRectF br;
- for (int i = 0; i < layout.lineCount(); ++i) {
- QTextLine line = layout.lineAt(i);
- // set line spacing
- line.setPosition(QPointF(line.position().x(), height));
- if (elideText && i == layout.lineCount()-1) {
- elidePos.setY(height + fm.ascent());
- br = br.united(QRectF(elidePos, QSizeF(fm.width(elideChar), fm.ascent())));
- }
- br = br.united(line.naturalTextRect());
- height += (lineHeightMode == QDeclarativeText::FixedHeight) ? lineHeight : line.height() * lineHeight;
- }
- br.setHeight(height);
-
- if (!q->widthValid())
- naturalWidth = br.width();
-
- //Update the number of visible lines
- if (lineCount != visibleCount) {
- lineCount = visibleCount;
- emit q->lineCountChanged();
- }
-
- return QRect(qRound(br.x()), qRound(br.y()), qCeil(br.width()), qCeil(br.height()));
-}
-
-/*!
- Returns a painted version of the QDeclarativeTextPrivate::layout QTextLayout.
- If \a drawStyle is true, the style color overrides all colors in the document.
-*/
-QPixmap QDeclarativeTextPrivate::textLayoutImage(bool drawStyle)
-{
- //do layout
- QSize size = layedOutTextRect.size();
- //paint text
- QPixmap img(size);
- if (!size.isEmpty()) {
- img.fill(Qt::transparent);
-#ifdef Q_WS_MAC
- bool oldSmooth = qt_applefontsmoothing_enabled;
- qt_applefontsmoothing_enabled = false;
-#endif
- QPainter p(&img);
-#ifdef Q_WS_MAC
- qt_applefontsmoothing_enabled = oldSmooth;
-#endif
- drawTextLayout(&p, QPointF(-layedOutTextRect.x(),0), drawStyle);
- }
- return img;
-}
-
-/*!
- Paints the QDeclarativeTextPrivate::layout QTextLayout into \a painter at \a pos. If
- \a drawStyle is true, the style color overrides all colors in the document.
-*/
-void QDeclarativeTextPrivate::drawTextLayout(QPainter *painter, const QPointF &pos, bool drawStyle)
-{
- if (drawStyle)
- painter->setPen(styleColor);
- else
- painter->setPen(color);
- painter->setFont(font);
- layout.draw(painter, pos);
- if (!elidePos.isNull())
- painter->drawText(pos + elidePos, elideChar);
-}
-
-/*!
- Returns a painted version of the QDeclarativeTextPrivate::doc QTextDocument.
- If \a drawStyle is true, the style color overrides all colors in the document.
-*/
-QPixmap QDeclarativeTextPrivate::textDocumentImage(bool drawStyle)
-{
- QSize size = doc->size().toSize();
-
- //paint text
- QPixmap img(size);
- img.fill(Qt::transparent);
-#ifdef Q_WS_MAC
- bool oldSmooth = qt_applefontsmoothing_enabled;
- qt_applefontsmoothing_enabled = false;
-#endif
- QPainter p(&img);
-#ifdef Q_WS_MAC
- qt_applefontsmoothing_enabled = oldSmooth;
-#endif
-
- QAbstractTextDocumentLayout::PaintContext context;
-
- QTextOption oldOption(doc->defaultTextOption());
- if (drawStyle) {
- context.palette.setColor(QPalette::Text, styleColor);
- QTextOption colorOption(doc->defaultTextOption());
- colorOption.setFlags(QTextOption::SuppressColors);
- doc->setDefaultTextOption(colorOption);
- } else {
- context.palette.setColor(QPalette::Text, color);
- }
- doc->documentLayout()->draw(&p, context);
- if (drawStyle)
- doc->setDefaultTextOption(oldOption);
- return img;
-}
-
-/*!
- Mark the image cache as dirty.
-*/
-void QDeclarativeTextPrivate::invalidateImageCache()
-{
- Q_Q(QDeclarativeText);
-
- if(cacheAllTextAsImage || style != QDeclarativeText::Normal){//If actually using the image cache
- if (imageCacheDirty)
- return;
-
- imageCacheDirty = true;
- imageCache = QPixmap();
- }
- if (q->isComponentComplete())
- q->update();
-}
-
-/*!
- Tests if the image cache is dirty, and repaints it if it is.
-*/
-void QDeclarativeTextPrivate::checkImageCache()
-{
- if (!imageCacheDirty)
- return;
-
- if (text.isEmpty()) {
-
- imageCache = QPixmap();
-
- } else {
-
- QPixmap textImage;
- QPixmap styledImage;
-
- if (richText) {
- textImage = textDocumentImage(false);
- if (style != QDeclarativeText::Normal)
- styledImage = textDocumentImage(true); //### should use styleColor
- } else {
- textImage = textLayoutImage(false);
- if (style != QDeclarativeText::Normal)
- styledImage = textLayoutImage(true); //### should use styleColor
- }
-
- switch (style) {
- case QDeclarativeText::Outline:
- imageCache = drawOutline(textImage, styledImage);
- break;
- case QDeclarativeText::Sunken:
- imageCache = drawOutline(textImage, styledImage, -1);
- break;
- case QDeclarativeText::Raised:
- imageCache = drawOutline(textImage, styledImage, 1);
- break;
- default:
- imageCache = textImage;
- break;
- }
-
- }
-
- imageCacheDirty = false;
-}
-
-/*!
- Ensures the QDeclarativeTextPrivate::doc variable is set to a valid text document
-*/
-void QDeclarativeTextPrivate::ensureDoc()
-{
- if (!doc) {
- Q_Q(QDeclarativeText);
- doc = new QTextDocumentWithImageResources(q);
- doc->setDocumentMargin(0);
- }
-}
-
-/*!
- Draw \a styleSource as an outline around \a source and return the new image.
-*/
-QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource)
-{
- QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
- img.fill(Qt::transparent);
-
- QPainter ppm(&img);
-
- QPoint pos(0, 0);
- pos += QPoint(-1, 0);
- ppm.drawPixmap(pos, styleSource);
- pos += QPoint(2, 0);
- ppm.drawPixmap(pos, styleSource);
- pos += QPoint(-1, -1);
- ppm.drawPixmap(pos, styleSource);
- pos += QPoint(0, 2);
- ppm.drawPixmap(pos, styleSource);
-
- pos += QPoint(0, -1);
- ppm.drawPixmap(pos, source);
- ppm.end();
-
- return img;
-}
-
-/*!
- Draw \a styleSource below \a source at \a yOffset and return the new image.
-*/
-QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset)
-{
- QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
- img.fill(Qt::transparent);
-
- QPainter ppm(&img);
-
- ppm.drawPixmap(QPoint(0, yOffset), styleSource);
- ppm.drawPixmap(0, 0, source);
-
- ppm.end();
-
- return img;
-}
-
-/*!
- \qmlclass Text QDeclarativeText
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The Text item allows you to add formatted text to a scene.
- \inherits Item
-
- Text items can display both plain and rich text. For example, red text with
- a specific font and size can be defined like this:
-
- \qml
- Text {
- text: "Hello World!"
- font.family: "Helvetica"
- font.pointSize: 24
- color: "red"
- }
- \endqml
-
- Rich text is defined using HTML-style markup:
-
- \qml
- Text {
- text: "<b>Hello</b> <i>World!</i>"
- }
- \endqml
-
- \image declarative-text.png
-
- If height and width are not explicitly set, Text will attempt to determine how
- much room is needed and set it accordingly. Unless \l wrapMode is set, it will always
- prefer width to height (all text will be placed on a single line).
-
- The \l elide property can alternatively be used to fit a single line of
- plain text to a set width.
-
- Note that the \l{Supported HTML Subset} is limited. Also, if the text contains
- HTML img tags that load remote images, the text is reloaded.
-
- Text provides read-only text. For editable text, see \l TextEdit.
-
- \sa {declarative/text/fonts}{Fonts example}
-*/
-QDeclarativeText::QDeclarativeText(QDeclarativeItem *parent)
- : QDeclarativeImplicitSizeItem(*(new QDeclarativeTextPrivate), parent)
-{
-}
-
-QDeclarativeText::~QDeclarativeText()
-{
-}
-
-/*!
- \qmlproperty bool Text::clip
- This property holds whether the text is clipped.
-
- Note that if the text does not fit in the bounding rectangle it will be abruptly chopped.
-
- If you want to display potentially long text in a limited space, you probably want to use \c elide instead.
-*/
-
-/*!
- \qmlproperty bool Text::smooth
-
- This property holds whether the text is smoothly scaled or transformed.
-
- Smooth filtering gives better visual quality, but is slower. If
- the item is displayed at its natural size, this property has no visual or
- performance effect.
-
- \note Generally scaling artifacts are only visible if the item is stationary on
- the screen. A common pattern when animating an item is to disable smooth
- filtering at the beginning of the animation and reenable it at the conclusion.
-*/
-
-/*!
- \qmlsignal Text::onLinkActivated(string link)
-
- This handler is called when the user clicks on a link embedded in the text.
- The link must be in rich text or HTML format and the
- \a link string provides access to the particular link.
-
- \snippet doc/src/snippets/declarative/text/onLinkActivated.qml 0
-
- The example code will display the text
- "The main website is at \l{http://qt.nokia.com}{Nokia Qt DF}."
-
- Clicking on the highlighted link will output
- \tt{http://qt.nokia.com link activated} to the console.
-*/
-
-/*!
- \qmlproperty string Text::font.family
-
- Sets the family name of the font.
-
- The family name is case insensitive and may optionally include a foundry name, e.g. "Helvetica [Cronyx]".
- If the family is available from more than one foundry and the foundry isn't specified, an arbitrary foundry is chosen.
- If the family isn't available a family will be set using the font matching algorithm.
-*/
-
-/*!
- \qmlproperty bool Text::font.bold
-
- Sets whether the font weight is bold.
-*/
-
-/*!
- \qmlproperty enumeration Text::font.weight
-
- Sets the font's weight.
-
- The weight can be one of:
- \list
- \o Font.Light
- \o Font.Normal - the default
- \o Font.DemiBold
- \o Font.Bold
- \o Font.Black
- \endlist
-
- \qml
- Text { text: "Hello"; font.weight: Font.DemiBold }
- \endqml
-*/
-
-/*!
- \qmlproperty bool Text::font.italic
-
- Sets whether the font has an italic style.
-*/
-
-/*!
- \qmlproperty bool Text::font.underline
-
- Sets whether the text is underlined.
-*/
-
-/*!
- \qmlproperty bool Text::font.strikeout
-
- Sets whether the font has a strikeout style.
-*/
-
-/*!
- \qmlproperty real Text::font.pointSize
-
- Sets the font size in points. The point size must be greater than zero.
-*/
-
-/*!
- \qmlproperty int Text::font.pixelSize
-
- Sets the font size in pixels.
-
- Using this function makes the font device dependent.
- Use \c pointSize to set the size of the font in a device independent manner.
-*/
-
-/*!
- \qmlproperty real Text::font.letterSpacing
-
- Sets the letter spacing for the font.
-
- Letter spacing changes the default spacing between individual letters in the font.
- A positive value increases the letter spacing by the corresponding pixels; a negative value decreases the spacing.
-*/
-
-/*!
- \qmlproperty real Text::font.wordSpacing
-
- Sets the word spacing for the font.
-
- Word spacing changes the default spacing between individual words.
- A positive value increases the word spacing by a corresponding amount of pixels,
- while a negative value decreases the inter-word spacing accordingly.
-*/
-
-/*!
- \qmlproperty enumeration Text::font.capitalization
-
- Sets the capitalization for the text.
-
- \list
- \o Font.MixedCase - This is the normal text rendering option where no capitalization change is applied.
- \o Font.AllUppercase - This alters the text to be rendered in all uppercase type.
- \o Font.AllLowercase - This alters the text to be rendered in all lowercase type.
- \o Font.SmallCaps - This alters the text to be rendered in small-caps type.
- \o Font.Capitalize - This alters the text to be rendered with the first character of each word as an uppercase character.
- \endlist
-
- \qml
- Text { text: "Hello"; font.capitalization: Font.AllLowercase }
- \endqml
-*/
-QFont QDeclarativeText::font() const
-{
- Q_D(const QDeclarativeText);
- return d->sourceFont;
-}
-
-void QDeclarativeText::setFont(const QFont &font)
-{
- Q_D(QDeclarativeText);
- if (d->sourceFont == font)
- return;
-
- d->sourceFont = font;
- QFont oldFont = d->font;
- d->font = font;
- if (d->font.pointSizeF() != -1) {
- // 0.5pt resolution
- qreal size = qRound(d->font.pointSizeF()*2.0);
- d->font.setPointSizeF(size/2.0);
- }
-
- if (oldFont != d->font)
- d->updateLayout();
-
- emit fontChanged(d->sourceFont);
-}
-
-/*!
- \qmlproperty string Text::text
-
- The text to display. Text supports both plain and rich text strings.
-
- The item will try to automatically determine whether the text should
- be treated as rich text. This determination is made using Qt::mightBeRichText().
-*/
-QString QDeclarativeText::text() const
-{
- Q_D(const QDeclarativeText);
- return d->text;
-}
-
-void QDeclarativeText::setText(const QString &n)
-{
- Q_D(QDeclarativeText);
- if (d->text == n)
- return;
-
- d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n));
- d->text = n;
- if (isComponentComplete()) {
- if (d->richText) {
- d->ensureDoc();
- d->doc->setText(n);
- d->rightToLeftText = d->doc->toPlainText().isRightToLeft();
- } else {
- d->rightToLeftText = d->text.isRightToLeft();
- }
- d->determineHorizontalAlignment();
- }
- d->updateLayout();
- emit textChanged(d->text);
-}
-
-
-/*!
- \qmlproperty color Text::color
-
- The text color.
-
- An example of green text defined using hexadecimal notation:
- \qml
- Text {
- color: "#00FF00"
- text: "green text"
- }
- \endqml
-
- An example of steel blue text defined using an SVG color name:
- \qml
- Text {
- color: "steelblue"
- text: "blue text"
- }
- \endqml
-*/
-QColor QDeclarativeText::color() const
-{
- Q_D(const QDeclarativeText);
- return d->color;
-}
-
-void QDeclarativeText::setColor(const QColor &color)
-{
- Q_D(QDeclarativeText);
- if (d->color == color)
- return;
-
- d->color = color;
- d->invalidateImageCache();
- emit colorChanged(d->color);
-}
-
-/*!
- \qmlproperty enumeration Text::style
-
- Set an additional text style.
-
- Supported text styles are:
- \list
- \o Text.Normal - the default
- \o Text.Outline
- \o Text.Raised
- \o Text.Sunken
- \endlist
-
- \qml
- Row {
- Text { font.pointSize: 24; text: "Normal" }
- Text { font.pointSize: 24; text: "Raised"; style: Text.Raised; styleColor: "#AAAAAA" }
- Text { font.pointSize: 24; text: "Outline";style: Text.Outline; styleColor: "red" }
- Text { font.pointSize: 24; text: "Sunken"; style: Text.Sunken; styleColor: "#AAAAAA" }
- }
- \endqml
-
- \image declarative-textstyle.png
-*/
-QDeclarativeText::TextStyle QDeclarativeText::style() const
-{
- Q_D(const QDeclarativeText);
- return d->style;
-}
-
-void QDeclarativeText::setStyle(QDeclarativeText::TextStyle style)
-{
- Q_D(QDeclarativeText);
- if (d->style == style)
- return;
-
- // changing to/from Normal requires the boundingRect() to change
- if (isComponentComplete() && (d->style == Normal || style == Normal))
- prepareGeometryChange();
- d->style = style;
- d->invalidateImageCache();
- emit styleChanged(d->style);
-}
-
-/*!
- \qmlproperty color Text::styleColor
-
- Defines the secondary color used by text styles.
-
- \c styleColor is used as the outline color for outlined text, and as the
- shadow color for raised or sunken text. If no style has been set, it is not
- used at all.
-
- \qml
- Text { font.pointSize: 18; text: "hello"; style: Text.Raised; styleColor: "gray" }
- \endqml
-
- \sa style
- */
-QColor QDeclarativeText::styleColor() const
-{
- Q_D(const QDeclarativeText);
- return d->styleColor;
-}
-
-void QDeclarativeText::setStyleColor(const QColor &color)
-{
- Q_D(QDeclarativeText);
- if (d->styleColor == color)
- return;
-
- d->styleColor = color;
- d->invalidateImageCache();
- emit styleColorChanged(d->styleColor);
-}
-
-
-/*!
- \qmlproperty enumeration Text::horizontalAlignment
- \qmlproperty enumeration Text::verticalAlignment
- \qmlproperty enumeration Text::effectiveHorizontalAlignment
-
- Sets the horizontal and vertical alignment of the text within the Text items
- width and height. By default, the text is vertically aligned to the top. Horizontal
- alignment follows the natural alignment of the text, for example text that is read
- from left to right will be aligned to the left.
-
- The valid values for \c horizontalAlignment are \c Text.AlignLeft, \c Text.AlignRight, \c Text.AlignHCenter and
- \c Text.AlignJustify. The valid values for \c verticalAlignment are \c Text.AlignTop, \c Text.AlignBottom
- and \c Text.AlignVCenter.
-
- Note that for a single line of text, the size of the text is the area of the text. In this common case,
- all alignments are equivalent. If you want the text to be, say, centered in its parent, then you will
- need to either modify the Item::anchors, or set horizontalAlignment to Text.AlignHCenter and bind the width to
- that of the parent.
-
- When using the attached property LayoutMirroring::enabled to mirror application
- layouts, the horizontal alignment of text will also be mirrored. However, the property
- \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment
- of Text, use the read-only property \c effectiveHorizontalAlignment.
-*/
-QDeclarativeText::HAlignment QDeclarativeText::hAlign() const
-{
- Q_D(const QDeclarativeText);
- return d->hAlign;
-}
-
-void QDeclarativeText::setHAlign(HAlignment align)
-{
- Q_D(QDeclarativeText);
- bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
- d->hAlignImplicit = false;
- if (d->setHAlign(align, forceAlign) && isComponentComplete())
- d->updateLayout();
-}
-
-void QDeclarativeText::resetHAlign()
-{
- Q_D(QDeclarativeText);
- d->hAlignImplicit = true;
- if (d->determineHorizontalAlignment() && isComponentComplete())
- d->updateLayout();
-}
-
-QDeclarativeText::HAlignment QDeclarativeText::effectiveHAlign() const
-{
- Q_D(const QDeclarativeText);
- QDeclarativeText::HAlignment effectiveAlignment = d->hAlign;
- if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
- switch (d->hAlign) {
- case QDeclarativeText::AlignLeft:
- effectiveAlignment = QDeclarativeText::AlignRight;
- break;
- case QDeclarativeText::AlignRight:
- effectiveAlignment = QDeclarativeText::AlignLeft;
- break;
- default:
- break;
- }
- }
- return effectiveAlignment;
-}
-
-bool QDeclarativeTextPrivate::setHAlign(QDeclarativeText::HAlignment alignment, bool forceAlign)
-{
- Q_Q(QDeclarativeText);
- if (hAlign != alignment || forceAlign) {
- QDeclarativeText::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
- hAlign = alignment;
-
- emit q->horizontalAlignmentChanged(hAlign);
- if (oldEffectiveHAlign != q->effectiveHAlign())
- emit q->effectiveHorizontalAlignmentChanged();
- return true;
- }
- return false;
-}
-
-bool QDeclarativeTextPrivate::determineHorizontalAlignment()
-{
- Q_Q(QDeclarativeText);
- if (hAlignImplicit && q->isComponentComplete()) {
- bool alignToRight = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : rightToLeftText;
- return setHAlign(alignToRight ? QDeclarativeText::AlignRight : QDeclarativeText::AlignLeft);
- }
- return false;
-}
-
-void QDeclarativeTextPrivate::mirrorChange()
-{
- Q_Q(QDeclarativeText);
- if (q->isComponentComplete()) {
- if (!hAlignImplicit && (hAlign == QDeclarativeText::AlignRight || hAlign == QDeclarativeText::AlignLeft)) {
- updateLayout();
- emit q->effectiveHorizontalAlignmentChanged();
- }
- }
-}
-
-QTextDocument *QDeclarativeTextPrivate::textDocument()
-{
- return doc;
-}
-
-QDeclarativeText::VAlignment QDeclarativeText::vAlign() const
-{
- Q_D(const QDeclarativeText);
- return d->vAlign;
-}
-
-void QDeclarativeText::setVAlign(VAlignment align)
-{
- Q_D(QDeclarativeText);
- if (d->vAlign == align)
- return;
-
- if (isComponentComplete())
- prepareGeometryChange();
- d->vAlign = align;
- emit verticalAlignmentChanged(align);
-}
-
-/*!
- \qmlproperty enumeration Text::wrapMode
-
- Set this property to wrap the text to the Text item's width. The text will only
- wrap if an explicit width has been set. wrapMode can be one of:
-
- \list
- \o Text.NoWrap (default) - no wrapping will be performed. If the text contains insufficient newlines, then \l paintedWidth will exceed a set width.
- \o Text.WordWrap - wrapping is done on word boundaries only. If a word is too long, \l paintedWidth will exceed a set width.
- \o Text.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word.
- \o Text.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word.
- \endlist
-*/
-QDeclarativeText::WrapMode QDeclarativeText::wrapMode() const
-{
- Q_D(const QDeclarativeText);
- return d->wrapMode;
-}
-
-void QDeclarativeText::setWrapMode(WrapMode mode)
-{
- Q_D(QDeclarativeText);
- if (mode == d->wrapMode)
- return;
-
- d->wrapMode = mode;
- d->updateLayout();
-
- emit wrapModeChanged();
-}
-
-/*!
- \qmlproperty int Text::lineCount
- \since Quick 1.1
-
- Returns the number of lines visible in the text item.
-
- This property is not supported for rich text.
-
- \sa maximumLineCount
-*/
-int QDeclarativeText::lineCount() const
-{
- Q_D(const QDeclarativeText);
- return d->lineCount;
-}
-
-/*!
- \qmlproperty bool Text::truncated
- \since Quick 1.1
-
- Returns true if the text has been truncated due to \l maximumLineCount
- or \l elide.
-
- This property is not supported for rich text.
-
- \sa maximumLineCount, elide
-*/
-bool QDeclarativeText::truncated() const
-{
- Q_D(const QDeclarativeText);
- return d->truncated;
-}
-
-/*!
- \qmlproperty int Text::maximumLineCount
- \since Quick 1.1
-
- Set this property to limit the number of lines that the text item will show.
- If elide is set to Text.ElideRight, the text will be elided appropriately.
- By default, this is the value of the largest possible integer.
-
- This property is not supported for rich text.
-
- \sa lineCount, elide
-*/
-int QDeclarativeText::maximumLineCount() const
-{
- Q_D(const QDeclarativeText);
- return d->maximumLineCount;
-}
-
-void QDeclarativeText::setMaximumLineCount(int lines)
-{
- Q_D(QDeclarativeText);
-
- d->maximumLineCountValid = lines==INT_MAX ? false : true;
- if (d->maximumLineCount != lines) {
- d->maximumLineCount = lines;
- d->updateLayout();
- emit maximumLineCountChanged();
- }
-}
-
-void QDeclarativeText::resetMaximumLineCount()
-{
- Q_D(QDeclarativeText);
- setMaximumLineCount(INT_MAX);
- d->elidePos = QPointF();
- if (d->truncated != false) {
- d->truncated = false;
- emit truncatedChanged();
- }
-}
-
-/*!
- \qmlproperty enumeration Text::textFormat
-
- The way the text property should be displayed.
-
- Supported text formats are:
-
- \list
- \o Text.AutoText (default)
- \o Text.PlainText
- \o Text.RichText
- \o Text.StyledText
- \endlist
-
- If the text format is \c Text.AutoText the text element
- will automatically determine whether the text should be treated as
- rich text. This determination is made using Qt::mightBeRichText().
-
- Text.StyledText is an optimized format supporting some basic text
- styling markup, in the style of html 3.2:
-
- \code
- <font size="4" color="#ff0000">font size and color</font>
- <b>bold</b>
- <i>italic</i>
- <br>
- &gt; &lt; &amp;
- \endcode
-
- \c Text.StyledText parser is strict, requiring tags to be correctly nested.
-
- \table
- \row
- \o
- \qml
-Column {
- Text {
- font.pointSize: 24
- text: "<b>Hello</b> <i>World!</i>"
- }
- Text {
- font.pointSize: 24
- textFormat: Text.RichText
- text: "<b>Hello</b> <i>World!</i>"
- }
- Text {
- font.pointSize: 24
- textFormat: Text.PlainText
- text: "<b>Hello</b> <i>World!</i>"
- }
-}
- \endqml
- \o \image declarative-textformat.png
- \endtable
-*/
-QDeclarativeText::TextFormat QDeclarativeText::textFormat() const
-{
- Q_D(const QDeclarativeText);
- return d->format;
-}
-
-void QDeclarativeText::setTextFormat(TextFormat format)
-{
- Q_D(QDeclarativeText);
- if (format == d->format)
- return;
- d->format = format;
- bool wasRich = d->richText;
- d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
-
- if (!wasRich && d->richText && isComponentComplete()) {
- d->ensureDoc();
- d->doc->setText(d->text);
- }
-
- d->updateLayout();
-
- emit textFormatChanged(d->format);
-}
-
-/*!
- \qmlproperty enumeration Text::elide
-
- Set this property to elide parts of the text fit to the Text item's width.
- The text will only elide if an explicit width has been set.
-
- This property cannot be used with rich text.
-
- Eliding can be:
- \list
- \o Text.ElideNone - the default
- \o Text.ElideLeft
- \o Text.ElideMiddle
- \o Text.ElideRight
- \endlist
-
- If this property is set to Text.ElideRight, it can be used with multiline
- text. The text will only elide if maximumLineCount has been set.
-
- If the text is a multi-length string, and the mode is not \c Text.ElideNone,
- the first string that fits will be used, otherwise the last will be elided.
-
- Multi-length strings are ordered from longest to shortest, separated by the
- Unicode "String Terminator" character \c U009C (write this in QML with \c{"\u009C"} or \c{"\x9C"}).
-*/
-QDeclarativeText::TextElideMode QDeclarativeText::elideMode() const
-{
- Q_D(const QDeclarativeText);
- return d->elideMode;
-}
-
-void QDeclarativeText::setElideMode(QDeclarativeText::TextElideMode mode)
-{
- Q_D(QDeclarativeText);
- if (mode == d->elideMode)
- return;
-
- d->elideMode = mode;
- d->updateLayout();
-
- emit elideModeChanged(d->elideMode);
-}
-
-/*! \internal */
-QRectF QDeclarativeText::boundingRect() const
-{
- Q_D(const QDeclarativeText);
-
- QRect rect = d->layedOutTextRect;
- if (d->style != Normal)
- rect.adjust(-1, 0, 1, 2);
-
- // Could include font max left/right bearings to either side of rectangle.
-
- int h = height();
- switch (d->vAlign) {
- case AlignTop:
- break;
- case AlignBottom:
- rect.moveTop(h - rect.height());
- break;
- case AlignVCenter:
- rect.moveTop((h - rect.height()) / 2);
- break;
- }
-
- return QRectF(rect);
-}
-
-/*! \internal */
-void QDeclarativeText::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeText);
- if ((!d->internalWidthUpdate && newGeometry.width() != oldGeometry.width())
- && (d->wrapMode != QDeclarativeText::NoWrap
- || d->elideMode != QDeclarativeText::ElideNone
- || d->hAlign != QDeclarativeText::AlignLeft)) {
- if ((d->singleline || d->maximumLineCountValid) && d->elideMode != QDeclarativeText::ElideNone && widthValid()) {
- // We need to re-elide
- d->updateLayout();
- } else {
- // We just need to re-layout
- d->updateSize();
- }
- }
-
- QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-/*!
- \qmlproperty real Text::paintedWidth
-
- Returns the width of the text, including width past the width
- which is covered due to insufficient wrapping if WrapMode is set.
-*/
-qreal QDeclarativeText::paintedWidth() const
-{
- Q_D(const QDeclarativeText);
- return d->paintedSize.width();
-}
-
-/*!
- \qmlproperty real Text::paintedHeight
-
- Returns the height of the text, including height past the height
- which is covered due to there being more text than fits in the set height.
-*/
-qreal QDeclarativeText::paintedHeight() const
-{
- Q_D(const QDeclarativeText);
- return d->paintedSize.height();
-}
-
-/*!
- \qmlproperty real Text::lineHeight
- \since Quick 1.1
-
- Sets the line height for the text.
- The value can be in pixels or a multiplier depending on lineHeightMode.
-
- The default value is a multiplier of 1.0.
- The line height must be a positive value.
-*/
-qreal QDeclarativeText::lineHeight() const
-{
- Q_D(const QDeclarativeText);
- return d->lineHeight;
-}
-
-void QDeclarativeText::setLineHeight(qreal lineHeight)
-{
- Q_D(QDeclarativeText);
-
- if ((d->lineHeight == lineHeight) || (lineHeight < 0.0))
- return;
-
- d->lineHeight = lineHeight;
- d->updateLayout();
- emit lineHeightChanged(lineHeight);
-}
-
-/*!
- \qmlproperty enumeration Text::lineHeightMode
-
- This property determines how the line height is specified.
- The possible values are:
-
- \list
- \o Text.ProportionalHeight (default) - this sets the spacing proportional to the
- line (as a multiplier). For example, set to 2 for double spacing.
- \o Text.FixedHeight - this sets the line height to a fixed line height (in pixels).
- \endlist
-*/
-QDeclarativeText::LineHeightMode QDeclarativeText::lineHeightMode() const
-{
- Q_D(const QDeclarativeText);
- return d->lineHeightMode;
-}
-
-void QDeclarativeText::setLineHeightMode(LineHeightMode mode)
-{
- Q_D(QDeclarativeText);
- if (mode == d->lineHeightMode)
- return;
-
- d->lineHeightMode = mode;
- d->updateLayout();
-
- emit lineHeightModeChanged(mode);
-}
-
-/*!
- Returns the number of resources (images) that are being loaded asynchronously.
-*/
-int QDeclarativeText::resourcesLoading() const
-{
- Q_D(const QDeclarativeText);
- return d->doc ? d->doc->resourcesLoading() : 0;
-}
-
-/*! \internal */
-void QDeclarativeText::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
-{
- Q_D(QDeclarativeText);
-
- if (d->cacheAllTextAsImage || d->style != Normal) {
- d->checkImageCache();
- if (d->imageCache.isNull())
- return;
-
- bool oldAA = p->testRenderHint(QPainter::Antialiasing);
- bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
- if (d->smooth)
- p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
-
- QRect br = boundingRect().toRect();
-
- bool needClip = clip() && (d->imageCache.width() > width() ||
- d->imageCache.height() > height());
-
- if (needClip)
- p->drawPixmap(0, 0, width(), height(), d->imageCache, -br.x(), -br.y(), width(), height());
- else
- p->drawPixmap(br.x(), br.y(), d->imageCache);
-
- if (d->smooth) {
- p->setRenderHint(QPainter::Antialiasing, oldAA);
- p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
- }
- } else {
- QRectF bounds = boundingRect();
-
- bool needClip = clip() && (d->layedOutTextRect.width() > width() ||
- d->layedOutTextRect.height() > height());
-
- if (needClip) {
- p->save();
- p->setClipRect(0, 0, width(), height(), Qt::IntersectClip);
- }
- if (d->richText) {
- QAbstractTextDocumentLayout::PaintContext context;
- context.palette.setColor(QPalette::Text, d->color);
- p->translate(bounds.x(), bounds.y());
- d->doc->documentLayout()->draw(p, context);
- p->translate(-bounds.x(), -bounds.y());
- } else {
- d->drawTextLayout(p, QPointF(0, bounds.y()), false);
- }
-
- if (needClip) {
- p->restore();
- }
- }
-}
-
-/*! \internal */
-void QDeclarativeText::componentComplete()
-{
- Q_D(QDeclarativeText);
- QDeclarativeItem::componentComplete();
- if (d->updateOnComponentComplete) {
- d->updateOnComponentComplete = false;
- if (d->richText) {
- d->ensureDoc();
- d->doc->setText(d->text);
- d->rightToLeftText = d->doc->toPlainText().isRightToLeft();
- } else {
- d->rightToLeftText = d->text.isRightToLeft();
- }
- d->determineHorizontalAlignment();
- d->updateLayout();
- }
-}
-
-/*! \internal */
-void QDeclarativeText::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeText);
-
- if (!d->richText || !d->doc || d->doc->documentLayout()->anchorAt(event->pos()).isEmpty()) {
- event->setAccepted(false);
- d->activeLink.clear();
- } else {
- d->activeLink = d->doc->documentLayout()->anchorAt(event->pos());
- }
-
- // ### may malfunction if two of the same links are clicked & dragged onto each other)
-
- if (!event->isAccepted())
- QDeclarativeItem::mousePressEvent(event);
-
-}
-
-/*! \internal */
-void QDeclarativeText::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeText);
-
- // ### confirm the link, and send a signal out
- if (d->richText && d->doc && d->activeLink == d->doc->documentLayout()->anchorAt(event->pos()))
- emit linkActivated(d->activeLink);
- else
- event->setAccepted(false);
-
- if (!event->isAccepted())
- QDeclarativeItem::mouseReleaseEvent(event);
-}
-
-QT_END_NAMESPACE
-
-#include "qdeclarativetext.moc"
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p.h b/src/declarative/graphicsitems/qdeclarativetext_p.h
deleted file mode 100644
index b711582535..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetext_p.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXT_H
-#define QDECLARATIVETEXT_H
-
-#include <QtGui/qtextoption.h>
-#include "qdeclarativeimplicitsizeitem_p.h"
-
-#include <private/qdeclarativeglobal_p.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-class QDeclarativeTextPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeImplicitSizeItem
-{
- Q_OBJECT
- Q_ENUMS(HAlignment)
- Q_ENUMS(VAlignment)
- Q_ENUMS(TextStyle)
- Q_ENUMS(TextFormat)
- Q_ENUMS(TextElideMode)
- Q_ENUMS(WrapMode)
- Q_ENUMS(LineHeightMode)
-
- Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
- Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
- Q_PROPERTY(TextStyle style READ style WRITE setStyle NOTIFY styleChanged)
- Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor NOTIFY styleColorChanged)
- Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
- Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1)
- Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
- Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
- Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1)
- Q_PROPERTY(bool truncated READ truncated NOTIFY truncatedChanged REVISION 1)
- Q_PROPERTY(int maximumLineCount READ maximumLineCount WRITE setMaximumLineCount NOTIFY maximumLineCountChanged RESET resetMaximumLineCount REVISION 1)
-
- Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
- Q_PROPERTY(TextElideMode elide READ elideMode WRITE setElideMode NOTIFY elideModeChanged) //### elideMode?
- Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
- Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
- Q_PROPERTY(qreal lineHeight READ lineHeight WRITE setLineHeight NOTIFY lineHeightChanged REVISION 1)
- Q_PROPERTY(LineHeightMode lineHeightMode READ lineHeightMode WRITE setLineHeightMode NOTIFY lineHeightModeChanged REVISION 1)
-
-public:
- QDeclarativeText(QDeclarativeItem *parent=0);
- ~QDeclarativeText();
-
- enum HAlignment { AlignLeft = Qt::AlignLeft,
- AlignRight = Qt::AlignRight,
- AlignHCenter = Qt::AlignHCenter,
- AlignJustify = Qt::AlignJustify }; // ### VERSIONING: Only in QtQuick 1.1
- enum VAlignment { AlignTop = Qt::AlignTop,
- AlignBottom = Qt::AlignBottom,
- AlignVCenter = Qt::AlignVCenter };
- enum TextStyle { Normal,
- Outline,
- Raised,
- Sunken };
- enum TextFormat { PlainText = Qt::PlainText,
- RichText = Qt::RichText,
- AutoText = Qt::AutoText,
- StyledText = 4 };
- enum TextElideMode { ElideLeft = Qt::ElideLeft,
- ElideRight = Qt::ElideRight,
- ElideMiddle = Qt::ElideMiddle,
- ElideNone = Qt::ElideNone };
-
- enum WrapMode { NoWrap = QTextOption::NoWrap,
- WordWrap = QTextOption::WordWrap,
- WrapAnywhere = QTextOption::WrapAnywhere,
- WrapAtWordBoundaryOrAnywhere = QTextOption::WrapAtWordBoundaryOrAnywhere, // COMPAT
- Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
- };
-
- enum LineHeightMode { ProportionalHeight, FixedHeight };
-
- QString text() const;
- void setText(const QString &);
-
- QFont font() const;
- void setFont(const QFont &font);
-
- QColor color() const;
- void setColor(const QColor &c);
-
- TextStyle style() const;
- void setStyle(TextStyle style);
-
- QColor styleColor() const;
- void setStyleColor(const QColor &c);
-
- HAlignment hAlign() const;
- void setHAlign(HAlignment align);
- void resetHAlign();
- HAlignment effectiveHAlign() const;
-
- VAlignment vAlign() const;
- void setVAlign(VAlignment align);
-
- WrapMode wrapMode() const;
- void setWrapMode(WrapMode w);
-
- int lineCount() const;
- bool truncated() const;
-
- int maximumLineCount() const;
- void setMaximumLineCount(int lines);
- void resetMaximumLineCount();
-
- TextFormat textFormat() const;
- void setTextFormat(TextFormat format);
-
- TextElideMode elideMode() const;
- void setElideMode(TextElideMode);
-
- qreal lineHeight() const;
- void setLineHeight(qreal lineHeight);
-
- LineHeightMode lineHeightMode() const;
- void setLineHeightMode(LineHeightMode);
-
- void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
-
- virtual void componentComplete();
-
- int resourcesLoading() const; // mainly for testing
-
- qreal paintedWidth() const;
- qreal paintedHeight() const;
-
- QRectF boundingRect() const;
-
-Q_SIGNALS:
- void textChanged(const QString &text);
- void linkActivated(const QString &link);
- void fontChanged(const QFont &font);
- void colorChanged(const QColor &color);
- void styleChanged(TextStyle style);
- void styleColorChanged(const QColor &color);
- void horizontalAlignmentChanged(HAlignment alignment);
- void verticalAlignmentChanged(VAlignment alignment);
- void wrapModeChanged();
- Q_REVISION(1) void lineCountChanged();
- Q_REVISION(1) void truncatedChanged();
- Q_REVISION(1) void maximumLineCountChanged();
- void textFormatChanged(TextFormat textFormat);
- void elideModeChanged(TextElideMode mode);
- void paintedSizeChanged();
- Q_REVISION(1) void lineHeightChanged(qreal lineHeight);
- Q_REVISION(1) void lineHeightModeChanged(LineHeightMode mode);
- Q_REVISION(1) void effectiveHorizontalAlignmentChanged();
-
-protected:
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
-
-private:
- Q_DISABLE_COPY(QDeclarativeText)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeText)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeText)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p_p.h b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
deleted file mode 100644
index dd12fb7ad9..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetext_p_p.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXT_P_H
-#define QDECLARATIVETEXT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qdeclarativeitem.h"
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-#include "private/qdeclarativetextlayout_p.h"
-
-#include <qdeclarative.h>
-
-#include <QtGui/qtextlayout.h>
-
-QT_BEGIN_NAMESPACE
-
-class QTextLayout;
-class QTextDocumentWithImageResources;
-
-class Q_AUTOTEST_EXPORT QDeclarativeTextPrivate : public QDeclarativeImplicitSizeItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeText)
-public:
- QDeclarativeTextPrivate();
-
- ~QDeclarativeTextPrivate();
-
- void updateSize();
- void updateLayout();
- bool determineHorizontalAlignment();
- bool setHAlign(QDeclarativeText::HAlignment, bool forceAlign = false);
- void mirrorChange();
- QTextDocument *textDocument();
-
- QString text;
- QFont font;
- QFont sourceFont;
- QColor color;
- QDeclarativeText::TextStyle style;
- QColor styleColor;
- QString activeLink;
- QDeclarativeText::HAlignment hAlign;
- QDeclarativeText::VAlignment vAlign;
- QDeclarativeText::TextElideMode elideMode;
- QDeclarativeText::TextFormat format;
- QDeclarativeText::WrapMode wrapMode;
- qreal lineHeight;
- QDeclarativeText::LineHeightMode lineHeightMode;
- int lineCount;
- bool truncated;
- int maximumLineCount;
- int maximumLineCountValid;
- QPointF elidePos;
-
- static QString elideChar;
-
- void invalidateImageCache();
- void checkImageCache();
- QPixmap imageCache;
-
- bool imageCacheDirty:1;
- bool updateOnComponentComplete:1;
- bool richText:1;
- bool singleline:1;
- bool cacheAllTextAsImage:1;
- bool internalWidthUpdate:1;
- bool requireImplicitWidth:1;
- bool hAlignImplicit:1;
- bool rightToLeftText:1;
- bool layoutTextElided:1;
-
- QRect layedOutTextRect;
- QSize paintedSize;
- qreal naturalWidth;
- virtual qreal implicitWidth() const;
- void ensureDoc();
- QPixmap textDocumentImage(bool drawStyle);
- QTextDocumentWithImageResources *doc;
-
- QRect setupTextLayout();
- QPixmap textLayoutImage(bool drawStyle);
- void drawTextLayout(QPainter *p, const QPointF &pos, bool drawStyle);
- QDeclarativeTextLayout layout;
-
- static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource);
- static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset);
-
- static inline QDeclarativeTextPrivate *get(QDeclarativeText *t) {
- return t->d_func();
- }
-};
-
-QT_END_NAMESPACE
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
deleted file mode 100644
index b32e02dcae..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ /dev/null
@@ -1,1888 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativetextedit_p.h"
-#include "private/qdeclarativetextedit_p_p.h"
-
-#include "private/qdeclarativeevents_p_p.h"
-#include <private/qdeclarativeglobal_p.h>
-#include <qdeclarativeinfo.h>
-
-#include <QtCore/qmath.h>
-
-#include <private/qtextengine_p.h>
-#include <QTextLayout>
-#include <QTextLine>
-#include <QTextDocument>
-#include <QTextObject>
-#include <QGraphicsSceneMouseEvent>
-#include <QDebug>
-#include <QPainter>
-
-#include <private/qtextcontrol_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass TextEdit QDeclarativeTextEdit
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The TextEdit item displays multiple lines of editable formatted text.
- \inherits Item
-
- The TextEdit item displays a block of editable, formatted text.
-
- It can display both plain and rich text. For example:
-
- \qml
-TextEdit {
- width: 240
- text: "<b>Hello</b> <i>World!</i>"
- font.family: "Helvetica"
- font.pointSize: 20
- color: "blue"
- focus: true
-}
- \endqml
-
- \image declarative-textedit.gif
-
- Setting \l {Item::focus}{focus} to \c true enables the TextEdit item to receive keyboard focus.
-
- Note that the TextEdit does not implement scrolling, following the cursor, or other behaviors specific
- to a look-and-feel. For example, to add flickable scrolling that follows the cursor:
-
- \snippet snippets/declarative/texteditor.qml 0
-
- A particular look-and-feel might use smooth scrolling (eg. using SmoothedFollow), might have a visible
- scrollbar, or a scrollbar that fades in to show location, etc.
-
- Clipboard support is provided by the cut(), copy(), and paste() functions, and the selection can
- be handled in a traditional "mouse" mechanism by setting selectByMouse, or handled completely
- from QML by manipulating selectionStart and selectionEnd, or using selectAll() or selectWord().
-
- You can translate between cursor positions (characters from the start of the document) and pixel
- points using positionAt() and positionToRectangle().
-
- \sa Text, TextInput, {declarative/text/textselection}{Text Selection example}
-*/
-
-/*!
- \qmlsignal TextEdit::onLinkActivated(string link)
- \since Quick 1.1
-
- This handler is called when the user clicks on a link embedded in the text.
- The link must be in rich text or HTML format and the
- \a link string provides access to the particular link.
-*/
-QDeclarativeTextEdit::QDeclarativeTextEdit(QDeclarativeItem *parent)
-: QDeclarativeImplicitSizePaintedItem(*(new QDeclarativeTextEditPrivate), parent)
-{
- Q_D(QDeclarativeTextEdit);
- d->init();
-}
-
-QString QDeclarativeTextEdit::text() const
-{
- Q_D(const QDeclarativeTextEdit);
-
-#ifndef QT_NO_TEXTHTMLPARSER
- if (d->richText)
- return d->document->toHtml();
- else
-#endif
- return d->document->toPlainText();
-}
-
-/*!
- \qmlproperty string TextEdit::font.family
-
- Sets the family name of the font.
-
- The family name is case insensitive and may optionally include a foundry name, e.g. "Helvetica [Cronyx]".
- If the family is available from more than one foundry and the foundry isn't specified, an arbitrary foundry is chosen.
- If the family isn't available a family will be set using the font matching algorithm.
-*/
-
-/*!
- \qmlproperty bool TextEdit::font.bold
-
- Sets whether the font weight is bold.
-*/
-
-/*!
- \qmlproperty enumeration TextEdit::font.weight
-
- Sets the font's weight.
-
- The weight can be one of:
- \list
- \o Font.Light
- \o Font.Normal - the default
- \o Font.DemiBold
- \o Font.Bold
- \o Font.Black
- \endlist
-
- \qml
- TextEdit { text: "Hello"; font.weight: Font.DemiBold }
- \endqml
-*/
-
-/*!
- \qmlproperty bool TextEdit::font.italic
-
- Sets whether the font has an italic style.
-*/
-
-/*!
- \qmlproperty bool TextEdit::font.underline
-
- Sets whether the text is underlined.
-*/
-
-/*!
- \qmlproperty bool TextEdit::font.strikeout
-
- Sets whether the font has a strikeout style.
-*/
-
-/*!
- \qmlproperty real TextEdit::font.pointSize
-
- Sets the font size in points. The point size must be greater than zero.
-*/
-
-/*!
- \qmlproperty int TextEdit::font.pixelSize
-
- Sets the font size in pixels.
-
- Using this function makes the font device dependent. Use
- \l{TextEdit::font.pointSize} to set the size of the font in a
- device independent manner.
-*/
-
-/*!
- \qmlproperty real TextEdit::font.letterSpacing
-
- Sets the letter spacing for the font.
-
- Letter spacing changes the default spacing between individual letters in the font.
- A positive value increases the letter spacing by the corresponding pixels; a negative value decreases the spacing.
-*/
-
-/*!
- \qmlproperty real TextEdit::font.wordSpacing
-
- Sets the word spacing for the font.
-
- Word spacing changes the default spacing between individual words.
- A positive value increases the word spacing by a corresponding amount of pixels,
- while a negative value decreases the inter-word spacing accordingly.
-*/
-
-/*!
- \qmlproperty enumeration TextEdit::font.capitalization
-
- Sets the capitalization for the text.
-
- \list
- \o Font.MixedCase - This is the normal text rendering option where no capitalization change is applied.
- \o Font.AllUppercase - This alters the text to be rendered in all uppercase type.
- \o Font.AllLowercase - This alters the text to be rendered in all lowercase type.
- \o Font.SmallCaps - This alters the text to be rendered in small-caps type.
- \o Font.Capitalize - This alters the text to be rendered with the first character of each word as an uppercase character.
- \endlist
-
- \qml
- TextEdit { text: "Hello"; font.capitalization: Font.AllLowercase }
- \endqml
-*/
-
-/*!
- \qmlproperty string TextEdit::text
-
- The text to display. If the text format is AutoText the text edit will
- automatically determine whether the text should be treated as
- rich text. This determination is made using Qt::mightBeRichText().
-*/
-void QDeclarativeTextEdit::setText(const QString &text)
-{
- Q_D(QDeclarativeTextEdit);
- if (QDeclarativeTextEdit::text() == text)
- return;
-
- d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(text));
- if (d->richText) {
-#ifndef QT_NO_TEXTHTMLPARSER
- d->control->setHtml(text);
-#else
- d->control->setPlainText(text);
-#endif
- } else {
- d->control->setPlainText(text);
- }
- q_textChanged();
-}
-
-/*!
- \qmlproperty enumeration TextEdit::textFormat
-
- The way the text property should be displayed.
-
- \list
- \o TextEdit.AutoText
- \o TextEdit.PlainText
- \o TextEdit.RichText
- \endlist
-
- The default is TextEdit.AutoText. If the text format is TextEdit.AutoText the text edit
- will automatically determine whether the text should be treated as
- rich text. This determination is made using Qt::mightBeRichText().
-
- \table
- \row
- \o
- \qml
-Column {
- TextEdit {
- font.pointSize: 24
- text: "<b>Hello</b> <i>World!</i>"
- }
- TextEdit {
- font.pointSize: 24
- textFormat: TextEdit.RichText
- text: "<b>Hello</b> <i>World!</i>"
- }
- TextEdit {
- font.pointSize: 24
- textFormat: TextEdit.PlainText
- text: "<b>Hello</b> <i>World!</i>"
- }
-}
- \endqml
- \o \image declarative-textformat.png
- \endtable
-*/
-QDeclarativeTextEdit::TextFormat QDeclarativeTextEdit::textFormat() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->format;
-}
-
-void QDeclarativeTextEdit::setTextFormat(TextFormat format)
-{
- Q_D(QDeclarativeTextEdit);
- if (format == d->format)
- return;
- bool wasRich = d->richText;
- d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
-
- if (wasRich && !d->richText) {
- d->control->setPlainText(d->text);
- updateSize();
- } else if (!wasRich && d->richText) {
-#ifndef QT_NO_TEXTHTMLPARSER
- d->control->setHtml(d->text);
-#else
- d->control->setPlainText(d->text);
-#endif
- updateSize();
- }
- d->format = format;
- d->control->setAcceptRichText(d->format != PlainText);
- emit textFormatChanged(d->format);
-}
-
-QFont QDeclarativeTextEdit::font() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->sourceFont;
-}
-
-void QDeclarativeTextEdit::setFont(const QFont &font)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->sourceFont == font)
- return;
-
- d->sourceFont = font;
- QFont oldFont = d->font;
- d->font = font;
- if (d->font.pointSizeF() != -1) {
- // 0.5pt resolution
- qreal size = qRound(d->font.pointSizeF()*2.0);
- d->font.setPointSizeF(size/2.0);
- }
-
- if (oldFont != d->font) {
- clearCache();
- d->document->setDefaultFont(d->font);
- if(d->cursor){
- d->cursor->setHeight(QFontMetrics(d->font).height());
- moveCursorDelegate();
- }
- updateSize();
- update();
- }
- emit fontChanged(d->sourceFont);
-}
-
-/*!
- \qmlproperty color TextEdit::color
-
- The text color.
-
- \qml
- // green text using hexadecimal notation
- TextEdit { color: "#00FF00" }
- \endqml
-
- \qml
- // steelblue text using SVG color name
- TextEdit { color: "steelblue" }
- \endqml
-*/
-QColor QDeclarativeTextEdit::color() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->color;
-}
-
-void QDeclarativeTextEdit::setColor(const QColor &color)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->color == color)
- return;
-
- clearCache();
- d->color = color;
- QPalette pal = d->control->palette();
- pal.setColor(QPalette::Text, color);
- d->control->setPalette(pal);
- update();
- emit colorChanged(d->color);
-}
-
-/*!
- \qmlproperty color TextEdit::selectionColor
-
- The text highlight color, used behind selections.
-*/
-QColor QDeclarativeTextEdit::selectionColor() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->selectionColor;
-}
-
-void QDeclarativeTextEdit::setSelectionColor(const QColor &color)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->selectionColor == color)
- return;
-
- clearCache();
- d->selectionColor = color;
- QPalette pal = d->control->palette();
- pal.setColor(QPalette::Highlight, color);
- d->control->setPalette(pal);
- update();
- emit selectionColorChanged(d->selectionColor);
-}
-
-/*!
- \qmlproperty color TextEdit::selectedTextColor
-
- The selected text color, used in selections.
-*/
-QColor QDeclarativeTextEdit::selectedTextColor() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->selectedTextColor;
-}
-
-void QDeclarativeTextEdit::setSelectedTextColor(const QColor &color)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->selectedTextColor == color)
- return;
-
- clearCache();
- d->selectedTextColor = color;
- QPalette pal = d->control->palette();
- pal.setColor(QPalette::HighlightedText, color);
- d->control->setPalette(pal);
- update();
- emit selectedTextColorChanged(d->selectedTextColor);
-}
-
-/*!
- \qmlproperty enumeration TextEdit::horizontalAlignment
- \qmlproperty enumeration TextEdit::verticalAlignment
- \qmlproperty enumeration TextEdit::effectiveHorizontalAlignment
-
- Sets the horizontal and vertical alignment of the text within the TextEdit item's
- width and height. By default, the text alignment follows the natural alignment
- of the text, for example text that is read from left to right will be aligned to
- the left.
-
- Valid values for \c horizontalAlignment are:
- \list
- \o TextEdit.AlignLeft (default)
- \o TextEdit.AlignRight
- \o TextEdit.AlignHCenter
- \o TextEdit.AlignJustify
- \endlist
-
- Valid values for \c verticalAlignment are:
- \list
- \o TextEdit.AlignTop (default)
- \o TextEdit.AlignBottom
- \o TextEdit.AlignVCenter
- \endlist
-
- When using the attached property LayoutMirroring::enabled to mirror application
- layouts, the horizontal alignment of text will also be mirrored. However, the property
- \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment
- of TextEdit, use the read-only property \c effectiveHorizontalAlignment.
-*/
-QDeclarativeTextEdit::HAlignment QDeclarativeTextEdit::hAlign() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->hAlign;
-}
-
-void QDeclarativeTextEdit::setHAlign(HAlignment align)
-{
- Q_D(QDeclarativeTextEdit);
- bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
- d->hAlignImplicit = false;
- if (d->setHAlign(align, forceAlign) && isComponentComplete()) {
- d->updateDefaultTextOption();
- updateSize();
- }
-}
-
-void QDeclarativeTextEdit::resetHAlign()
-{
- Q_D(QDeclarativeTextEdit);
- d->hAlignImplicit = true;
- if (d->determineHorizontalAlignment() && isComponentComplete()) {
- d->updateDefaultTextOption();
- updateSize();
- }
-}
-
-QDeclarativeTextEdit::HAlignment QDeclarativeTextEdit::effectiveHAlign() const
-{
- Q_D(const QDeclarativeTextEdit);
- QDeclarativeTextEdit::HAlignment effectiveAlignment = d->hAlign;
- if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
- switch (d->hAlign) {
- case QDeclarativeTextEdit::AlignLeft:
- effectiveAlignment = QDeclarativeTextEdit::AlignRight;
- break;
- case QDeclarativeTextEdit::AlignRight:
- effectiveAlignment = QDeclarativeTextEdit::AlignLeft;
- break;
- default:
- break;
- }
- }
- return effectiveAlignment;
-}
-
-bool QDeclarativeTextEditPrivate::setHAlign(QDeclarativeTextEdit::HAlignment alignment, bool forceAlign)
-{
- Q_Q(QDeclarativeTextEdit);
- if (hAlign != alignment || forceAlign) {
- QDeclarativeTextEdit::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
- hAlign = alignment;
- emit q->horizontalAlignmentChanged(alignment);
- if (oldEffectiveHAlign != q->effectiveHAlign())
- emit q->effectiveHorizontalAlignmentChanged();
- return true;
- }
- return false;
-}
-
-bool QDeclarativeTextEditPrivate::determineHorizontalAlignment()
-{
- Q_Q(QDeclarativeTextEdit);
- if (hAlignImplicit && q->isComponentComplete()) {
- bool alignToRight = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : rightToLeftText;
- return setHAlign(alignToRight ? QDeclarativeTextEdit::AlignRight : QDeclarativeTextEdit::AlignLeft);
- }
- return false;
-}
-
-void QDeclarativeTextEditPrivate::mirrorChange()
-{
- Q_Q(QDeclarativeTextEdit);
- if (q->isComponentComplete()) {
- if (!hAlignImplicit && (hAlign == QDeclarativeTextEdit::AlignRight || hAlign == QDeclarativeTextEdit::AlignLeft)) {
- updateDefaultTextOption();
- q->updateSize();
- emit q->effectiveHorizontalAlignmentChanged();
- }
- }
-}
-
-QDeclarativeTextEdit::VAlignment QDeclarativeTextEdit::vAlign() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->vAlign;
-}
-
-void QDeclarativeTextEdit::setVAlign(QDeclarativeTextEdit::VAlignment alignment)
-{
- Q_D(QDeclarativeTextEdit);
- if (alignment == d->vAlign)
- return;
- d->vAlign = alignment;
- d->updateDefaultTextOption();
- updateSize();
- moveCursorDelegate();
- emit verticalAlignmentChanged(d->vAlign);
-}
-
-/*!
- \qmlproperty enumeration TextEdit::wrapMode
-
- Set this property to wrap the text to the TextEdit item's width.
- The text will only wrap if an explicit width has been set.
-
- \list
- \o TextEdit.NoWrap - no wrapping will be performed. If the text contains insufficient newlines, then implicitWidth will exceed a set width.
- \o TextEdit.WordWrap - wrapping is done on word boundaries only. If a word is too long, implicitWidth will exceed a set width.
- \o TextEdit.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word.
- \o TextEdit.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word.
- \endlist
-
- The default is TextEdit.NoWrap. If you set a width, consider using TextEdit.Wrap.
-*/
-QDeclarativeTextEdit::WrapMode QDeclarativeTextEdit::wrapMode() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->wrapMode;
-}
-
-void QDeclarativeTextEdit::setWrapMode(WrapMode mode)
-{
- Q_D(QDeclarativeTextEdit);
- if (mode == d->wrapMode)
- return;
- d->wrapMode = mode;
- d->updateDefaultTextOption();
- updateSize();
- emit wrapModeChanged();
-}
-
-/*!
- \qmlproperty int TextEdit::lineCount
- \since Quick 1.1
-
- Returns the total number of lines in the textEdit item.
-*/
-int QDeclarativeTextEdit::lineCount() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->lineCount;
-}
-
-/*!
- \qmlproperty real TextEdit::paintedWidth
-
- Returns the width of the text, including the width past the width
- which is covered due to insufficient wrapping if \l wrapMode is set.
-*/
-qreal QDeclarativeTextEdit::paintedWidth() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->paintedSize.width();
-}
-
-/*!
- \qmlproperty real TextEdit::paintedHeight
-
- Returns the height of the text, including the height past the height
- that is covered if the text does not fit within the set height.
-*/
-qreal QDeclarativeTextEdit::paintedHeight() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->paintedSize.height();
-}
-
-/*!
- \qmlmethod rectangle TextEdit::positionToRectangle(position)
-
- Returns the rectangle at the given \a position in the text. The x, y,
- and height properties correspond to the cursor that would describe
- that position.
-*/
-QRectF QDeclarativeTextEdit::positionToRectangle(int pos) const
-{
- Q_D(const QDeclarativeTextEdit);
- QTextCursor c(d->document);
- c.setPosition(pos);
- return d->control->cursorRect(c);
-
-}
-
-/*!
- \qmlmethod int TextEdit::positionAt(int x, int y)
-
- Returns the text position closest to pixel position (\a x, \a y).
-
- Position 0 is before the first character, position 1 is after the first character
- but before the second, and so on until position \l {text}.length, which is after all characters.
-*/
-int QDeclarativeTextEdit::positionAt(int x, int y) const
-{
- Q_D(const QDeclarativeTextEdit);
- int r = d->document->documentLayout()->hitTest(QPoint(x,y-d->yoff), Qt::FuzzyHit);
- QTextCursor cursor = d->control->textCursor();
- if (r > cursor.position()) {
- // The cursor position includes positions within the preedit text, but only positions in the
- // same text block are offset so it is possible to get a position that is either part of the
- // preedit or the next text block.
- QTextLayout *layout = cursor.block().layout();
- const int preeditLength = layout
- ? layout->preeditAreaText().length()
- : 0;
- if (preeditLength > 0
- && d->document->documentLayout()->blockBoundingRect(cursor.block()).contains(x,y-d->yoff)) {
- r = r > cursor.position() + preeditLength
- ? r - preeditLength
- : cursor.position();
- }
- }
- return r;
-}
-
-void QDeclarativeTextEdit::moveCursorSelection(int pos)
-{
- //Note that this is the same as setCursorPosition but with the KeepAnchor flag set
- Q_D(QDeclarativeTextEdit);
- QTextCursor cursor = d->control->textCursor();
- if (cursor.position() == pos)
- return;
- cursor.setPosition(pos, QTextCursor::KeepAnchor);
- d->control->setTextCursor(cursor);
-}
-
-/*!
- \qmlmethod void TextEdit::moveCursorSelection(int position, SelectionMode mode = TextEdit.SelectCharacters)
- \since Quick 1.1
-
- Moves the cursor to \a position and updates the selection according to the optional \a mode
- parameter. (To only move the cursor, set the \l cursorPosition property.)
-
- When this method is called it additionally sets either the
- selectionStart or the selectionEnd (whichever was at the previous cursor position)
- to the specified position. This allows you to easily extend and contract the selected
- text range.
-
- The selection mode specifies whether the selection is updated on a per character or a per word
- basis. If not specified the selection mode will default to TextEdit.SelectCharacters.
-
- \list
- \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at
- the previous cursor position) to the specified position.
- \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all
- words between the specified postion and the previous cursor position. Words partially in the
- range are included.
- \endlist
-
- For example, take this sequence of calls:
-
- \code
- cursorPosition = 5
- moveCursorSelection(9, TextEdit.SelectCharacters)
- moveCursorSelection(7, TextEdit.SelectCharacters)
- \endcode
-
- This moves the cursor to position 5, extend the selection end from 5 to 9
- and then retract the selection end from 9 to 7, leaving the text from position 5 to 7
- selected (the 6th and 7th characters).
-
- The same sequence with TextEdit.SelectWords will extend the selection start to a word boundary
- before or on position 5 and extend the selection end to a word boundary on or past position 9.
-*/
-void QDeclarativeTextEdit::moveCursorSelection(int pos, SelectionMode mode)
-{
- Q_D(QDeclarativeTextEdit);
- QTextCursor cursor = d->control->textCursor();
- if (cursor.position() == pos)
- return;
- if (mode == SelectCharacters) {
- cursor.setPosition(pos, QTextCursor::KeepAnchor);
- } else if (cursor.anchor() < pos || (cursor.anchor() == pos && cursor.position() < pos)) {
- if (cursor.anchor() > cursor.position()) {
- cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
- cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
- if (cursor.position() == cursor.anchor())
- cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor);
- else
- cursor.setPosition(cursor.position(), QTextCursor::MoveAnchor);
- } else {
- cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
- cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
- }
-
- cursor.setPosition(pos, QTextCursor::KeepAnchor);
- cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
- if (cursor.position() != pos)
- cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
- } else if (cursor.anchor() > pos || (cursor.anchor() == pos && cursor.position() > pos)) {
- if (cursor.anchor() < cursor.position()) {
- cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
- cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
- } else {
- cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
- cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
- cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
- if (cursor.position() != cursor.anchor()) {
- cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
- cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
- }
- }
-
- cursor.setPosition(pos, QTextCursor::KeepAnchor);
- cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
- if (cursor.position() != pos) {
- cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
- cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
- }
- }
- d->control->setTextCursor(cursor);
-}
-
-/*!
- \qmlproperty bool TextEdit::cursorVisible
- If true the text edit shows a cursor.
-
- This property is set and unset when the text edit gets active focus, but it can also
- be set directly (useful, for example, if a KeyProxy might forward keys to it).
-*/
-bool QDeclarativeTextEdit::isCursorVisible() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->cursorVisible;
-}
-
-void QDeclarativeTextEdit::setCursorVisible(bool on)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->cursorVisible == on)
- return;
- d->cursorVisible = on;
- QFocusEvent focusEvent(on ? QEvent::FocusIn : QEvent::FocusOut);
- if (!on && !d->persistentSelection)
- d->control->setCursorIsFocusIndicator(true);
- d->control->processEvent(&focusEvent, QPointF(0, -d->yoff));
- emit cursorVisibleChanged(d->cursorVisible);
-}
-
-/*!
- \qmlproperty int TextEdit::cursorPosition
- The position of the cursor in the TextEdit.
-*/
-int QDeclarativeTextEdit::cursorPosition() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->textCursor().position();
-}
-
-void QDeclarativeTextEdit::setCursorPosition(int pos)
-{
- Q_D(QDeclarativeTextEdit);
- if (pos < 0 || pos > d->text.length())
- return;
- QTextCursor cursor = d->control->textCursor();
- if (cursor.position() == pos && cursor.anchor() == pos)
- return;
- cursor.setPosition(pos);
- d->control->setTextCursor(cursor);
-}
-
-/*!
- \qmlproperty Component TextEdit::cursorDelegate
- The delegate for the cursor in the TextEdit.
-
- If you set a cursorDelegate for a TextEdit, this delegate will be used for
- drawing the cursor instead of the standard cursor. An instance of the
- delegate will be created and managed by the text edit when a cursor is
- needed, and the x and y properties of delegate instance will be set so as
- to be one pixel before the top left of the current character.
-
- Note that the root item of the delegate component must be a QDeclarativeItem or
- QDeclarativeItem derived item.
-*/
-QDeclarativeComponent* QDeclarativeTextEdit::cursorDelegate() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->cursorComponent;
-}
-
-void QDeclarativeTextEdit::setCursorDelegate(QDeclarativeComponent* c)
-{
- Q_D(QDeclarativeTextEdit);
- if(d->cursorComponent){
- if(d->cursor){
- d->control->setCursorWidth(-1);
- dirtyCache(cursorRectangle());
- delete d->cursor;
- d->cursor = 0;
- }
- }
- d->cursorComponent = c;
- if(c && c->isReady()){
- loadCursorDelegate();
- }else{
- if(c)
- connect(c, SIGNAL(statusChanged()),
- this, SLOT(loadCursorDelegate()));
- }
-
- emit cursorDelegateChanged();
-}
-
-void QDeclarativeTextEdit::loadCursorDelegate()
-{
- Q_D(QDeclarativeTextEdit);
- if(d->cursorComponent->isLoading())
- return;
- d->cursor = qobject_cast<QDeclarativeItem*>(d->cursorComponent->create(qmlContext(this)));
- if(d->cursor){
- d->control->setCursorWidth(0);
- dirtyCache(cursorRectangle());
- QDeclarative_setParent_noEvent(d->cursor, this);
- d->cursor->setParentItem(this);
- d->cursor->setHeight(QFontMetrics(d->font).height());
- moveCursorDelegate();
- }else{
- qmlInfo(this) << "Error loading cursor delegate.";
- }
-}
-
-/*!
- \qmlproperty int TextEdit::selectionStart
-
- The cursor position before the first character in the current selection.
-
- This property is read-only. To change the selection, use select(start,end),
- selectAll(), or selectWord().
-
- \sa selectionEnd, cursorPosition, selectedText
-*/
-int QDeclarativeTextEdit::selectionStart() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->textCursor().selectionStart();
-}
-
-/*!
- \qmlproperty int TextEdit::selectionEnd
-
- The cursor position after the last character in the current selection.
-
- This property is read-only. To change the selection, use select(start,end),
- selectAll(), or selectWord().
-
- \sa selectionStart, cursorPosition, selectedText
-*/
-int QDeclarativeTextEdit::selectionEnd() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->textCursor().selectionEnd();
-}
-
-/*!
- \qmlproperty string TextEdit::selectedText
-
- This read-only property provides the text currently selected in the
- text edit.
-
- It is equivalent to the following snippet, but is faster and easier
- to use.
- \code
- //myTextEdit is the id of the TextEdit
- myTextEdit.text.toString().substring(myTextEdit.selectionStart,
- myTextEdit.selectionEnd);
- \endcode
-*/
-QString QDeclarativeTextEdit::selectedText() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->textCursor().selectedText();
-}
-
-/*!
- \qmlproperty bool TextEdit::activeFocusOnPress
-
- Whether the TextEdit should gain active focus on a mouse press. By default this is
- set to true.
-*/
-bool QDeclarativeTextEdit::focusOnPress() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->focusOnPress;
-}
-
-void QDeclarativeTextEdit::setFocusOnPress(bool on)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->focusOnPress == on)
- return;
- d->focusOnPress = on;
- emit activeFocusOnPressChanged(d->focusOnPress);
-}
-
-/*!
- \qmlproperty bool TextEdit::persistentSelection
-
- Whether the TextEdit should keep the selection visible when it loses active focus to another
- item in the scene. By default this is set to true;
-*/
-bool QDeclarativeTextEdit::persistentSelection() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->persistentSelection;
-}
-
-void QDeclarativeTextEdit::setPersistentSelection(bool on)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->persistentSelection == on)
- return;
- d->persistentSelection = on;
- emit persistentSelectionChanged(d->persistentSelection);
-}
-
-/*
- \qmlproperty real TextEdit::textMargin
-
- The margin, in pixels, around the text in the TextEdit.
-*/
-qreal QDeclarativeTextEdit::textMargin() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->textMargin;
-}
-
-void QDeclarativeTextEdit::setTextMargin(qreal margin)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->textMargin == margin)
- return;
- d->textMargin = margin;
- d->document->setDocumentMargin(d->textMargin);
- emit textMarginChanged(d->textMargin);
-}
-
-void QDeclarativeTextEdit::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- if (newGeometry.width() != oldGeometry.width())
- updateSize();
- QDeclarativePaintedItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-/*!
- Ensures any delayed caching or data loading the class
- needs to performed is complete.
-*/
-void QDeclarativeTextEdit::componentComplete()
-{
- Q_D(QDeclarativeTextEdit);
- QDeclarativePaintedItem::componentComplete();
- if (d->dirty) {
- d->determineHorizontalAlignment();
- d->updateDefaultTextOption();
- updateSize();
- d->dirty = false;
- }
-}
-
-/*!
- \qmlproperty bool TextEdit::selectByMouse
-
- Defaults to false.
-
- If true, the user can use the mouse to select text in some
- platform-specific way. Note that for some platforms this may
- not be an appropriate interaction (eg. may conflict with how
- the text needs to behave inside a Flickable.
-*/
-bool QDeclarativeTextEdit::selectByMouse() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->selectByMouse;
-}
-
-void QDeclarativeTextEdit::setSelectByMouse(bool on)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->selectByMouse != on) {
- d->selectByMouse = on;
- setKeepMouseGrab(on);
- if (on)
- setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByMouse);
- else
- setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByMouse);
- emit selectByMouseChanged(on);
- }
-}
-
-
-/*!
- \qmlproperty enum TextEdit::mouseSelectionMode
- \since Quick 1.1
-
- Specifies how text should be selected using a mouse.
-
- \list
- \o TextEdit.SelectCharacters - The selection is updated with individual characters. (Default)
- \o TextEdit.SelectWords - The selection is updated with whole words.
- \endlist
-
- This property only applies when \l selectByMouse is true.
-*/
-
-QDeclarativeTextEdit::SelectionMode QDeclarativeTextEdit::mouseSelectionMode() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->mouseSelectionMode;
-}
-
-void QDeclarativeTextEdit::setMouseSelectionMode(SelectionMode mode)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->mouseSelectionMode != mode) {
- d->mouseSelectionMode = mode;
- d->control->setWordSelectionEnabled(mode == SelectWords);
- emit mouseSelectionModeChanged(mode);
- }
-}
-
-/*!
- \qmlproperty bool TextEdit::readOnly
-
- Whether the user can interact with the TextEdit item. If this
- property is set to true the text cannot be edited by user interaction.
-
- By default this property is false.
-*/
-void QDeclarativeTextEdit::setReadOnly(bool r)
-{
- Q_D(QDeclarativeTextEdit);
- if (r == isReadOnly())
- return;
-
- setFlag(QGraphicsItem::ItemAcceptsInputMethod, !r);
-
- Qt::TextInteractionFlags flags = Qt::LinksAccessibleByMouse;
- if (d->selectByMouse)
- flags = flags | Qt::TextSelectableByMouse;
- if (!r)
- flags = flags | Qt::TextSelectableByKeyboard | Qt::TextEditable;
- d->control->setTextInteractionFlags(flags);
- if (!r)
- d->control->moveCursor(QTextCursor::End);
-
- emit readOnlyChanged(r);
-}
-
-bool QDeclarativeTextEdit::isReadOnly() const
-{
- Q_D(const QDeclarativeTextEdit);
- return !(d->control->textInteractionFlags() & Qt::TextEditable);
-}
-
-/*!
- Sets how the text edit should interact with user input to the given
- \a flags.
-*/
-void QDeclarativeTextEdit::setTextInteractionFlags(Qt::TextInteractionFlags flags)
-{
- Q_D(QDeclarativeTextEdit);
- d->control->setTextInteractionFlags(flags);
-}
-
-/*!
- Returns the flags specifying how the text edit should interact
- with user input.
-*/
-Qt::TextInteractionFlags QDeclarativeTextEdit::textInteractionFlags() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->textInteractionFlags();
-}
-
-/*!
- \qmlproperty rectangle TextEdit::cursorRectangle
-
- The rectangle where the text cursor is rendered
- within the text edit. Read-only.
-*/
-QRect QDeclarativeTextEdit::cursorRectangle() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->cursorRect().toRect().translated(0,d->yoff);
-}
-
-
-/*!
-\overload
-Handles the given \a event.
-*/
-bool QDeclarativeTextEdit::event(QEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- if (event->type() == QEvent::ShortcutOverride) {
- d->control->processEvent(event, QPointF(0, -d->yoff));
- return event->isAccepted();
- }
- return QDeclarativePaintedItem::event(event);
-}
-
-/*!
-\overload
-Handles the given key \a event.
-*/
-void QDeclarativeTextEdit::keyPressEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- keyPressPreHandler(event);
- if (!event->isAccepted())
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::keyPressEvent(event);
-}
-
-/*!
-\overload
-Handles the given key \a event.
-*/
-void QDeclarativeTextEdit::keyReleaseEvent(QKeyEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- keyReleasePreHandler(event);
- if (!event->isAccepted())
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::keyReleaseEvent(event);
-}
-
-void QDeclarativeTextEditPrivate::focusChanged(bool hasFocus)
-{
- Q_Q(QDeclarativeTextEdit);
- q->setCursorVisible(hasFocus && scene && scene->hasFocus());
- QDeclarativeItemPrivate::focusChanged(hasFocus);
-}
-
-/*!
- \qmlmethod void TextEdit::deselect()
- \since Quick 1.1
-
- Removes active text selection.
-*/
-void QDeclarativeTextEdit::deselect()
-{
- Q_D(QDeclarativeTextEdit);
- QTextCursor c = d->control->textCursor();
- c.clearSelection();
- d->control->setTextCursor(c);
-}
-
-/*!
- \qmlmethod void TextEdit::selectAll()
-
- Causes all text to be selected.
-*/
-void QDeclarativeTextEdit::selectAll()
-{
- Q_D(QDeclarativeTextEdit);
- d->control->selectAll();
-}
-
-/*!
- \qmlmethod void TextEdit::selectWord()
-
- Causes the word closest to the current cursor position to be selected.
-*/
-void QDeclarativeTextEdit::selectWord()
-{
- Q_D(QDeclarativeTextEdit);
- QTextCursor c = d->control->textCursor();
- c.select(QTextCursor::WordUnderCursor);
- d->control->setTextCursor(c);
-}
-
-/*!
- \qmlmethod void TextEdit::select(int start, int end)
-
- Causes the text from \a start to \a end to be selected.
-
- If either start or end is out of range, the selection is not changed.
-
- After calling this, selectionStart will become the lesser
- and selectionEnd will become the greater (regardless of the order passed
- to this method).
-
- \sa selectionStart, selectionEnd
-*/
-void QDeclarativeTextEdit::select(int start, int end)
-{
- Q_D(QDeclarativeTextEdit);
- if (start < 0 || end < 0 || start > d->text.length() || end > d->text.length())
- return;
- QTextCursor cursor = d->control->textCursor();
- cursor.beginEditBlock();
- cursor.setPosition(start, QTextCursor::MoveAnchor);
- cursor.setPosition(end, QTextCursor::KeepAnchor);
- cursor.endEditBlock();
- d->control->setTextCursor(cursor);
-
- // QTBUG-11100
- updateSelectionMarkers();
-}
-
-/*!
- \qmlmethod void TextEdit::isRightToLeft(int start, int end)
-
- Returns true if the natural reading direction of the editor text
- found between positions \a start and \a end is right to left.
-*/
-bool QDeclarativeTextEdit::isRightToLeft(int start, int end)
-{
- Q_D(QDeclarativeTextEdit);
- if (start > end) {
- qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start.";
- return false;
- } else {
- return d->text.mid(start, end - start).isRightToLeft();
- }
-}
-
-#ifndef QT_NO_CLIPBOARD
-/*!
- \qmlmethod TextEdit::cut()
-
- Moves the currently selected text to the system clipboard.
-*/
-void QDeclarativeTextEdit::cut()
-{
- Q_D(QDeclarativeTextEdit);
- d->control->cut();
-}
-
-/*!
- \qmlmethod TextEdit::copy()
-
- Copies the currently selected text to the system clipboard.
-*/
-void QDeclarativeTextEdit::copy()
-{
- Q_D(QDeclarativeTextEdit);
- d->control->copy();
-}
-
-/*!
- \qmlmethod TextEdit::paste()
-
- Replaces the currently selected text by the contents of the system clipboard.
-*/
-void QDeclarativeTextEdit::paste()
-{
- Q_D(QDeclarativeTextEdit);
- d->control->paste();
-}
-#endif // QT_NO_CLIPBOARD
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextEdit::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- if (d->focusOnPress){
- bool hadActiveFocus = hasActiveFocus();
- forceActiveFocus();
- if (d->showInputPanelOnFocus) {
- if (hasActiveFocus() && hadActiveFocus && !isReadOnly()) {
- // re-open input panel on press if already focused
- openSoftwareInputPanel();
- }
- } else { // show input panel on click
- if (hasActiveFocus() && !hadActiveFocus) {
- d->clickCausedFocus = true;
- }
- }
- }
-
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::mousePressEvent(event);
-}
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextEdit::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!d->showInputPanelOnFocus) { // input panel on click
- if (d->focusOnPress && !isReadOnly() && boundingRect().contains(event->pos())) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- qt_widget_private(view)->handleSoftwareInputPanel(event->button(), d->clickCausedFocus);
- }
- }
- }
- }
- d->clickCausedFocus = false;
-
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseReleaseEvent(event);
-}
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextEdit::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
-
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseDoubleClickEvent(event);
-
-}
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextEdit::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseMoveEvent(event);
-}
-
-/*!
-\overload
-Handles the given input method \a event.
-*/
-void QDeclarativeTextEdit::inputMethodEvent(QInputMethodEvent *event)
-{
- Q_D(QDeclarativeTextEdit);
- const bool wasComposing = isInputMethodComposing();
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (wasComposing != isInputMethodComposing())
- emit inputMethodComposingChanged();
-}
-
-/*!
-\overload
-Returns the value of the given \a property.
-*/
-QVariant QDeclarativeTextEdit::inputMethodQuery(Qt::InputMethodQuery property) const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->control->inputMethodQuery(property);
-}
-
-/*!
-Draws the contents of the text edit using the given \a painter within
-the given \a bounds.
-*/
-void QDeclarativeTextEdit::drawContents(QPainter *painter, const QRect &bounds)
-{
- Q_D(QDeclarativeTextEdit);
-
- painter->setRenderHint(QPainter::TextAntialiasing, true);
- painter->translate(0,d->yoff);
-
- d->control->drawContents(painter, bounds.translated(0,-d->yoff));
-
- painter->translate(0,-d->yoff);
-}
-
-void QDeclarativeTextEdit::updateImgCache(const QRectF &rf)
-{
- Q_D(const QDeclarativeTextEdit);
- QRect r;
- if (!rf.isValid()) {
- r = QRect(0,0,INT_MAX,INT_MAX);
- } else {
- r = rf.toRect();
- if (r.height() > INT_MAX/2) {
- // Take care of overflow when translating "everything"
- r.setTop(r.y() + d->yoff);
- r.setBottom(INT_MAX/2);
- } else {
- r = r.translated(0,d->yoff);
- }
- }
- dirtyCache(r);
- emit update();
-}
-
-/*!
- \qmlproperty bool TextEdit::smooth
-
- This property holds whether the text is smoothly scaled or transformed.
-
- Smooth filtering gives better visual quality, but is slower. If
- the item is displayed at its natural size, this property has no visual or
- performance effect.
-
- \note Generally scaling artifacts are only visible if the item is stationary on
- the screen. A common pattern when animating an item is to disable smooth
- filtering at the beginning of the animation and reenable it at the conclusion.
-*/
-
-/*!
- \qmlproperty bool TextEdit::canPaste
- \since QtQuick 1.1
-
- Returns true if the TextEdit is writable and the content of the clipboard is
- suitable for pasting into the TextEdit.
-*/
-bool QDeclarativeTextEdit::canPaste() const
-{
- Q_D(const QDeclarativeTextEdit);
- return d->canPaste;
-}
-
-/*!
- \qmlproperty bool TextEdit::inputMethodComposing
-
- \since QtQuick 1.1
-
- This property holds whether the TextEdit has partial text input from an
- input method.
-
- While it is composing an input method may rely on mouse or key events from
- the TextEdit to edit or commit the partial text. This property can be used
- to determine when to disable events handlers that may interfere with the
- correct operation of an input method.
-*/
-bool QDeclarativeTextEdit::isInputMethodComposing() const
-{
- Q_D(const QDeclarativeTextEdit);
- if (QTextLayout *layout = d->control->textCursor().block().layout())
- return layout->preeditAreaText().length() > 0;
- return false;
-}
-
-void QDeclarativeTextEditPrivate::init()
-{
- Q_Q(QDeclarativeTextEdit);
-
- q->setSmooth(smooth);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFlag(QGraphicsItem::ItemHasNoContents, false);
- q->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
-
- control = new QTextControl(q);
- control->setIgnoreUnusedNavigationEvents(true);
- control->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard | Qt::TextEditable);
- control->setDragEnabled(false);
-
- // QTextControl follows the default text color
- // defined by the platform, declarative text
- // should be black by default
- QPalette pal = control->palette();
- if (pal.color(QPalette::Text) != color) {
- pal.setColor(QPalette::Text, color);
- control->setPalette(pal);
- }
-
- QObject::connect(control, SIGNAL(updateRequest(QRectF)), q, SLOT(updateImgCache(QRectF)));
-
- QObject::connect(control, SIGNAL(textChanged()), q, SLOT(q_textChanged()));
- QObject::connect(control, SIGNAL(selectionChanged()), q, SIGNAL(selectionChanged()));
- QObject::connect(control, SIGNAL(selectionChanged()), q, SLOT(updateSelectionMarkers()));
- QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SLOT(updateSelectionMarkers()));
- QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorPositionChanged()));
- QObject::connect(control, SIGNAL(microFocusChanged()), q, SLOT(moveCursorDelegate()));
- QObject::connect(control, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString)));
-#ifndef QT_NO_CLIPBOARD
- QObject::connect(q, SIGNAL(readOnlyChanged(bool)), q, SLOT(q_canPasteChanged()));
- QObject::connect(QApplication::clipboard(), SIGNAL(dataChanged()), q, SLOT(q_canPasteChanged()));
- canPaste = control->canPaste();
-#endif
-
- document = control->document();
- document->setDefaultFont(font);
- document->setDocumentMargin(textMargin);
- document->setUndoRedoEnabled(false); // flush undo buffer.
- document->setUndoRedoEnabled(true);
- updateDefaultTextOption();
-}
-
-void QDeclarativeTextEdit::q_textChanged()
-{
- Q_D(QDeclarativeTextEdit);
- d->text = text();
- d->rightToLeftText = d->document->begin().layout()->engine()->isRightToLeft();
- d->determineHorizontalAlignment();
- d->updateDefaultTextOption();
- updateSize();
- updateTotalLines();
- emit textChanged(d->text);
-}
-
-void QDeclarativeTextEdit::moveCursorDelegate()
-{
- Q_D(QDeclarativeTextEdit);
- updateMicroFocus();
- emit cursorRectangleChanged();
- if(!d->cursor)
- return;
- QRectF cursorRect = cursorRectangle();
- d->cursor->setX(cursorRect.x());
- d->cursor->setY(cursorRect.y());
-}
-
-void QDeclarativeTextEditPrivate::updateSelection()
-{
- Q_Q(QDeclarativeTextEdit);
- QTextCursor cursor = control->textCursor();
- bool startChange = (lastSelectionStart != cursor.selectionStart());
- bool endChange = (lastSelectionEnd != cursor.selectionEnd());
- cursor.beginEditBlock();
- cursor.setPosition(lastSelectionStart, QTextCursor::MoveAnchor);
- cursor.setPosition(lastSelectionEnd, QTextCursor::KeepAnchor);
- cursor.endEditBlock();
- control->setTextCursor(cursor);
- if(startChange)
- q->selectionStartChanged();
- if(endChange)
- q->selectionEndChanged();
-}
-
-void QDeclarativeTextEdit::updateSelectionMarkers()
-{
- Q_D(QDeclarativeTextEdit);
- if(d->lastSelectionStart != d->control->textCursor().selectionStart()){
- d->lastSelectionStart = d->control->textCursor().selectionStart();
- emit selectionStartChanged();
- }
- if(d->lastSelectionEnd != d->control->textCursor().selectionEnd()){
- d->lastSelectionEnd = d->control->textCursor().selectionEnd();
- emit selectionEndChanged();
- }
-}
-
-QRectF QDeclarativeTextEdit::boundingRect() const
-{
- Q_D(const QDeclarativeTextEdit);
- QRectF r = QDeclarativePaintedItem::boundingRect();
- int cursorWidth = 1;
- if(d->cursor)
- cursorWidth = d->cursor->width();
- if(!d->document->isEmpty())
- cursorWidth += 3;// ### Need a better way of accounting for space between char and cursor
-
- // Could include font max left/right bearings to either side of rectangle.
-
- r.setRight(r.right() + cursorWidth);
- return r.translated(0,d->yoff);
-}
-
-qreal QDeclarativeTextEditPrivate::implicitWidth() const
-{
- Q_Q(const QDeclarativeTextEdit);
- if (!requireImplicitWidth) {
- // We don't calculate implicitWidth unless it is required.
- // We need to force a size update now to ensure implicitWidth is calculated
- const_cast<QDeclarativeTextEditPrivate*>(this)->requireImplicitWidth = true;
- const_cast<QDeclarativeTextEdit*>(q)->updateSize();
- }
- return mImplicitWidth;
-}
-
-//### we should perhaps be a bit smarter here -- depending on what has changed, we shouldn't
-// need to do all the calculations each time
-void QDeclarativeTextEdit::updateSize()
-{
- Q_D(QDeclarativeTextEdit);
- if (isComponentComplete()) {
- qreal naturalWidth = d->mImplicitWidth;
- // ### assumes that if the width is set, the text will fill to edges
- // ### (unless wrap is false, then clipping will occur)
- if (widthValid()) {
- if (!d->requireImplicitWidth) {
- emit implicitWidthChanged();
- // if the implicitWidth is used, then updateSize() has already been called (recursively)
- if (d->requireImplicitWidth)
- return;
- }
- if (d->requireImplicitWidth) {
- d->document->setTextWidth(-1);
- naturalWidth = d->document->idealWidth();
- }
- if (d->document->textWidth() != width())
- d->document->setTextWidth(width());
- } else {
- d->document->setTextWidth(-1);
- }
- QFontMetrics fm = QFontMetrics(d->font);
- int dy = height();
- dy -= (int)d->document->size().height();
-
- int nyoff;
- if (heightValid()) {
- if (d->vAlign == AlignBottom)
- nyoff = dy;
- else if (d->vAlign == AlignVCenter)
- nyoff = dy/2;
- else
- nyoff = 0;
- } else {
- nyoff = 0;
- }
- if (nyoff != d->yoff) {
- prepareGeometryChange();
- d->yoff = nyoff;
- }
- setBaselineOffset(fm.ascent() + d->yoff + d->textMargin);
-
- //### need to comfirm cost of always setting these
- int newWidth = qCeil(d->document->idealWidth());
- if (!widthValid() && d->document->textWidth() != newWidth)
- d->document->setTextWidth(newWidth); // ### Text does not align if width is not set (QTextDoc bug)
- // ### Setting the implicitWidth triggers another updateSize(), and unless there are bindings nothing has changed.
- if (!widthValid())
- setImplicitWidth(newWidth);
- else if (d->requireImplicitWidth)
- setImplicitWidth(naturalWidth);
- qreal newHeight = d->document->isEmpty() ? fm.height() : (int)d->document->size().height();
- setImplicitHeight(newHeight);
-
- d->paintedSize = QSize(newWidth, newHeight);
- setContentsSize(d->paintedSize);
- emit paintedSizeChanged();
- } else {
- d->dirty = true;
- }
- emit update();
-}
-
-void QDeclarativeTextEdit::updateTotalLines()
-{
- Q_D(QDeclarativeTextEdit);
-
- int subLines = 0;
-
- for (QTextBlock it = d->document->begin(); it != d->document->end(); it = it.next()) {
- QTextLayout *layout = it.layout();
- if (!layout)
- continue;
- subLines += layout->lineCount()-1;
- }
-
- int newTotalLines = d->document->lineCount() + subLines;
- if (d->lineCount != newTotalLines) {
- d->lineCount = newTotalLines;
- emit lineCountChanged();
- }
-}
-
-void QDeclarativeTextEditPrivate::updateDefaultTextOption()
-{
- Q_Q(QDeclarativeTextEdit);
- QTextOption opt = document->defaultTextOption();
- int oldAlignment = opt.alignment();
-
- QDeclarativeTextEdit::HAlignment horizontalAlignment = q->effectiveHAlign();
- if (rightToLeftText) {
- if (horizontalAlignment == QDeclarativeTextEdit::AlignLeft)
- horizontalAlignment = QDeclarativeTextEdit::AlignRight;
- else if (horizontalAlignment == QDeclarativeTextEdit::AlignRight)
- horizontalAlignment = QDeclarativeTextEdit::AlignLeft;
- }
- opt.setAlignment((Qt::Alignment)(int)(horizontalAlignment | vAlign));
-
- QTextOption::WrapMode oldWrapMode = opt.wrapMode();
- opt.setWrapMode(QTextOption::WrapMode(wrapMode));
-
- if (oldWrapMode == opt.wrapMode() && oldAlignment == opt.alignment())
- return;
- document->setDefaultTextOption(opt);
-}
-
-
-/*!
- \qmlmethod void TextEdit::openSoftwareInputPanel()
-
- Opens software input panels like virtual keyboards for typing, useful for
- customizing when you want the input keyboard to be shown and hidden in
- your application.
-
- By default the opening of input panels follows the platform style. On Symbian^1 and
- Symbian^3 -based devices the panels are opened by clicking TextEdit. On other platforms
- the panels are automatically opened when TextEdit element gains active focus. Input panels are
- always closed if no editor has active focus.
-
- You can disable the automatic behavior by setting the property \c activeFocusOnPress to false
- and use functions openSoftwareInputPanel() and closeSoftwareInputPanel() to implement
- the behavior you want.
-
- Only relevant on platforms, which provide virtual keyboards.
-
- \code
- import QtQuick 1.0
- TextEdit {
- id: textEdit
- text: "Hello world!"
- activeFocusOnPress: false
- MouseArea {
- anchors.fill: parent
- onClicked: {
- if (!textEdit.activeFocus) {
- textEdit.forceActiveFocus();
- textEdit.openSoftwareInputPanel();
- } else {
- textEdit.focus = false;
- }
- }
- onPressAndHold: textEdit.closeSoftwareInputPanel();
- }
- }
- \endcode
-*/
-void QDeclarativeTextEdit::openSoftwareInputPanel()
-{
- QEvent event(QEvent::RequestSoftwareInputPanel);
- if (qApp) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
- }
-}
-
-/*!
- \qmlmethod void TextEdit::closeSoftwareInputPanel()
-
- Closes a software input panel like a virtual keyboard shown on the screen, useful
- for customizing when you want the input keyboard to be shown and hidden in
- your application.
-
- By default the opening of input panels follows the platform style. On Symbian^1 and
- Symbian^3 -based devices the panels are opened by clicking TextEdit. On other platforms
- the panels are automatically opened when TextEdit element gains active focus. Input panels are
- always closed if no editor has active focus.
-
- You can disable the automatic behavior by setting the property \c activeFocusOnPress to false
- and use functions openSoftwareInputPanel() and closeSoftwareInputPanel() to implement
- the behavior you want.
-
- Only relevant on platforms, which provide virtual keyboards.
-
- \code
- import QtQuick 1.0
- TextEdit {
- id: textEdit
- text: "Hello world!"
- activeFocusOnPress: false
- MouseArea {
- anchors.fill: parent
- onClicked: {
- if (!textEdit.activeFocus) {
- textEdit.forceActiveFocus();
- textEdit.openSoftwareInputPanel();
- } else {
- textEdit.focus = false;
- }
- }
- onPressAndHold: textEdit.closeSoftwareInputPanel();
- }
- }
- \endcode
-*/
-void QDeclarativeTextEdit::closeSoftwareInputPanel()
-{
- QEvent event(QEvent::CloseSoftwareInputPanel);
- if (qApp) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
- }
-}
-
-void QDeclarativeTextEdit::focusInEvent(QFocusEvent *event)
-{
- Q_D(const QDeclarativeTextEdit);
- if (d->showInputPanelOnFocus) {
- if (d->focusOnPress && !isReadOnly()) {
- openSoftwareInputPanel();
- }
- }
- QDeclarativePaintedItem::focusInEvent(event);
-}
-
-void QDeclarativeTextEdit::q_canPasteChanged()
-{
- Q_D(QDeclarativeTextEdit);
- bool old = d->canPaste;
- d->canPaste = d->control->canPaste();
- if(old!=d->canPaste)
- emit canPasteChanged();
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
deleted file mode 100644
index f9a6c73a39..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p.h
+++ /dev/null
@@ -1,307 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXTEDIT_H
-#define QDECLARATIVETEXTEDIT_H
-
-#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativeimplicitsizeitem_p.h"
-
-#include <QtGui/qtextdocument.h>
-#include <QtGui/qtextoption.h>
-#include <QtGui/qtextcursor.h>
-#include <QtGui/qtextformat.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-
-class QDeclarativeTextEditPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativeImplicitSizePaintedItem
-{
- Q_OBJECT
- Q_ENUMS(VAlignment)
- Q_ENUMS(HAlignment)
- Q_ENUMS(TextFormat)
- Q_ENUMS(WrapMode)
- Q_ENUMS(SelectionMode)
-
- Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
- Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged)
- Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged)
- Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
- Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
- Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1)
- Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
- Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
- Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1)
- Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
- Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
- Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
- Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
- Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged)
- Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
- Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
- Q_PROPERTY(QDeclarativeComponent* cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged)
- Q_PROPERTY(int selectionStart READ selectionStart NOTIFY selectionStartChanged)
- Q_PROPERTY(int selectionEnd READ selectionEnd NOTIFY selectionEndChanged)
- Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectionChanged)
- Q_PROPERTY(bool activeFocusOnPress READ focusOnPress WRITE setFocusOnPress NOTIFY activeFocusOnPressChanged)
- Q_PROPERTY(bool persistentSelection READ persistentSelection WRITE setPersistentSelection NOTIFY persistentSelectionChanged)
- Q_PROPERTY(qreal textMargin READ textMargin WRITE setTextMargin NOTIFY textMarginChanged)
- Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ inputMethodHints WRITE setInputMethodHints)
- Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
- Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged REVISION 1)
- Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged REVISION 1)
- Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged REVISION 1)
-
-public:
- QDeclarativeTextEdit(QDeclarativeItem *parent=0);
-
- enum HAlignment {
- AlignLeft = Qt::AlignLeft,
- AlignRight = Qt::AlignRight,
- AlignHCenter = Qt::AlignHCenter,
- AlignJustify = Qt::AlignJustify // ### VERSIONING: Only in QtQuick 1.1
- };
-
- enum VAlignment {
- AlignTop = Qt::AlignTop,
- AlignBottom = Qt::AlignBottom,
- AlignVCenter = Qt::AlignVCenter
- };
-
- enum TextFormat {
- PlainText = Qt::PlainText,
- RichText = Qt::RichText,
- AutoText = Qt::AutoText
- };
-
- enum WrapMode { NoWrap = QTextOption::NoWrap,
- WordWrap = QTextOption::WordWrap,
- WrapAnywhere = QTextOption::WrapAnywhere,
- WrapAtWordBoundaryOrAnywhere = QTextOption::WrapAtWordBoundaryOrAnywhere, // COMPAT
- Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
- };
-
- enum SelectionMode {
- SelectCharacters,
- SelectWords
- };
-
- Q_INVOKABLE void openSoftwareInputPanel();
- Q_INVOKABLE void closeSoftwareInputPanel();
-
- QString text() const;
- void setText(const QString &);
-
- TextFormat textFormat() const;
- void setTextFormat(TextFormat format);
-
- QFont font() const;
- void setFont(const QFont &font);
-
- QColor color() const;
- void setColor(const QColor &c);
-
- QColor selectionColor() const;
- void setSelectionColor(const QColor &c);
-
- QColor selectedTextColor() const;
- void setSelectedTextColor(const QColor &c);
-
- HAlignment hAlign() const;
- void setHAlign(HAlignment align);
- void resetHAlign();
- HAlignment effectiveHAlign() const;
-
- VAlignment vAlign() const;
- void setVAlign(VAlignment align);
-
- WrapMode wrapMode() const;
- void setWrapMode(WrapMode w);
-
- int lineCount() const;
-
- bool isCursorVisible() const;
- void setCursorVisible(bool on);
-
- int cursorPosition() const;
- void setCursorPosition(int pos);
-
- QDeclarativeComponent* cursorDelegate() const;
- void setCursorDelegate(QDeclarativeComponent*);
-
- int selectionStart() const;
- int selectionEnd() const;
-
- QString selectedText() const;
-
- bool focusOnPress() const;
- void setFocusOnPress(bool on);
-
- bool persistentSelection() const;
- void setPersistentSelection(bool on);
-
- qreal textMargin() const;
- void setTextMargin(qreal margin);
-
- bool selectByMouse() const;
- void setSelectByMouse(bool);
-
- SelectionMode mouseSelectionMode() const;
- void setMouseSelectionMode(SelectionMode mode);
-
- bool canPaste() const;
-
- virtual void componentComplete();
-
- /* FROM EDIT */
- void setReadOnly(bool);
- bool isReadOnly() const;
-
- void setTextInteractionFlags(Qt::TextInteractionFlags flags);
- Qt::TextInteractionFlags textInteractionFlags() const;
-
- QRect cursorRectangle() const;
-
- QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
-
- qreal paintedWidth() const;
- qreal paintedHeight() const;
-
- Q_INVOKABLE QRectF positionToRectangle(int) const;
- Q_INVOKABLE int positionAt(int x, int y) const;
- Q_INVOKABLE void moveCursorSelection(int pos);
- Q_INVOKABLE Q_REVISION(1) void moveCursorSelection(int pos, SelectionMode mode);
-
- QRectF boundingRect() const;
-
- bool isInputMethodComposing() const;
-
-Q_SIGNALS:
- void textChanged(const QString &);
- void paintedSizeChanged();
- void cursorPositionChanged();
- void cursorRectangleChanged();
- void selectionStartChanged();
- void selectionEndChanged();
- void selectionChanged();
- void colorChanged(const QColor &color);
- void selectionColorChanged(const QColor &color);
- void selectedTextColorChanged(const QColor &color);
- void fontChanged(const QFont &font);
- void horizontalAlignmentChanged(HAlignment alignment);
- void verticalAlignmentChanged(VAlignment alignment);
- void wrapModeChanged();
- void lineCountChanged();
- void textFormatChanged(TextFormat textFormat);
- void readOnlyChanged(bool isReadOnly);
- void cursorVisibleChanged(bool isCursorVisible);
- void cursorDelegateChanged();
- void activeFocusOnPressChanged(bool activeFocusOnPressed);
- void persistentSelectionChanged(bool isPersistentSelection);
- void textMarginChanged(qreal textMargin);
- void selectByMouseChanged(bool selectByMouse);
- Q_REVISION(1) void mouseSelectionModeChanged(SelectionMode mode);
- Q_REVISION(1) void linkActivated(const QString &link);
- Q_REVISION(1) void canPasteChanged();
- Q_REVISION(1) void inputMethodComposingChanged();
- Q_REVISION(1) void effectiveHorizontalAlignmentChanged();
-
-public Q_SLOTS:
- void selectAll();
- void selectWord();
- void select(int start, int end);
- Q_REVISION(1) void deselect();
- Q_REVISION(1) bool isRightToLeft(int start, int end);
-#ifndef QT_NO_CLIPBOARD
- void cut();
- void copy();
- void paste();
-#endif
-
-private Q_SLOTS:
- void updateImgCache(const QRectF &rect);
- void q_textChanged();
- void updateSelectionMarkers();
- void moveCursorDelegate();
- void loadCursorDelegate();
- void q_canPasteChanged();
-
-private:
- void updateSize();
- void updateTotalLines();
-
-protected:
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
-
- bool event(QEvent *);
- void keyPressEvent(QKeyEvent *);
- void keyReleaseEvent(QKeyEvent *);
- void focusInEvent(QFocusEvent *event);
-
- // mouse filter?
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
-
- void inputMethodEvent(QInputMethodEvent *e);
-
- void drawContents(QPainter *, const QRect &);
-private:
- Q_DISABLE_COPY(QDeclarativeTextEdit)
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeTextEdit)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeTextEdit)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
deleted file mode 100644
index 731d956602..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXTEDIT_P_H
-#define QDECLARATIVETEXTEDIT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qdeclarativeitem.h"
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-
-#include <qdeclarative.h>
-
-QT_BEGIN_NAMESPACE
-class QTextLayout;
-class QTextDocument;
-class QTextControl;
-class QDeclarativeTextEditPrivate : public QDeclarativeImplicitSizePaintedItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeTextEdit)
-
-public:
- QDeclarativeTextEditPrivate()
- : color("black"), hAlign(QDeclarativeTextEdit::AlignLeft), vAlign(QDeclarativeTextEdit::AlignTop),
- imgDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true),
- showInputPanelOnFocus(true), clickCausedFocus(false), persistentSelection(true), requireImplicitWidth(false),
- hAlignImplicit(true), rightToLeftText(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0),
- cursorComponent(0), cursor(0), format(QDeclarativeTextEdit::AutoText), document(0), wrapMode(QDeclarativeTextEdit::NoWrap),
- mouseSelectionMode(QDeclarativeTextEdit::SelectCharacters), selectByMouse(false), canPaste(false),
- yoff(0)
- {
-#ifdef Q_OS_SYMBIAN
- if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
- showInputPanelOnFocus = false;
- }
-#endif
- }
-
- void init();
-
- void updateDefaultTextOption();
- void relayoutDocument();
- void updateSelection();
- bool determineHorizontalAlignment();
- bool setHAlign(QDeclarativeTextEdit::HAlignment, bool forceAlign = false);
- void mirrorChange();
- qreal implicitWidth() const;
- void focusChanged(bool);
-
- QString text;
- QFont font;
- QFont sourceFont;
- QColor color;
- QColor selectionColor;
- QColor selectedTextColor;
- QString style;
- QColor styleColor;
- QPixmap imgCache;
- QPixmap imgStyleCache;
- QDeclarativeTextEdit::HAlignment hAlign;
- QDeclarativeTextEdit::VAlignment vAlign;
- bool imgDirty : 1;
- bool dirty : 1;
- bool richText : 1;
- bool cursorVisible : 1;
- bool focusOnPress : 1;
- bool showInputPanelOnFocus : 1;
- bool clickCausedFocus : 1;
- bool persistentSelection : 1;
- bool requireImplicitWidth:1;
- bool hAlignImplicit:1;
- bool rightToLeftText:1;
- qreal textMargin;
- int lastSelectionStart;
- int lastSelectionEnd;
- QDeclarativeComponent* cursorComponent;
- QDeclarativeItem* cursor;
- QDeclarativeTextEdit::TextFormat format;
- QTextDocument *document;
- QTextControl *control;
- QDeclarativeTextEdit::WrapMode wrapMode;
- QDeclarativeTextEdit::SelectionMode mouseSelectionMode;
- int lineCount;
- bool selectByMouse;
- bool canPaste;
- int yoff;
- QSize paintedSize;
-};
-
-QT_END_NAMESPACE
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
deleted file mode 100644
index b456d07c02..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ /dev/null
@@ -1,2010 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativetextinput_p.h"
-#include "private/qdeclarativetextinput_p_p.h"
-
-#include <private/qdeclarativeglobal_p.h>
-#include <qdeclarativeinfo.h>
-
-#include <QValidator>
-#include <QTextCursor>
-#include <QApplication>
-#include <QFontMetrics>
-#include <QPainter>
-#include <QTextBoundaryFinder>
-#include <QInputContext>
-#include <qstyle.h>
-
-#ifndef QT_NO_LINEEDIT
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass TextInput QDeclarativeTextInput
- \ingroup qml-basic-visual-elements
- \since 4.7
- \brief The TextInput item displays an editable line of text.
- \inherits Item
-
- The TextInput element displays a single line of editable plain text.
-
- TextInput is used to accept a line of text input. Input constraints
- can be placed on a TextInput item (for example, through a \l validator or \l inputMask),
- and setting \l echoMode to an appropriate value enables TextInput to be used for
- a password input field.
-
- On Mac OS X, the Up/Down key bindings for Home/End are explicitly disabled.
- If you want such bindings (on any platform), you will need to construct them in QML.
-
- \sa TextEdit, Text, {declarative/text/textselection}{Text Selection example}
-*/
-QDeclarativeTextInput::QDeclarativeTextInput(QDeclarativeItem* parent)
- : QDeclarativeImplicitSizePaintedItem(*(new QDeclarativeTextInputPrivate), parent)
-{
- Q_D(QDeclarativeTextInput);
- d->init();
-}
-
-QDeclarativeTextInput::~QDeclarativeTextInput()
-{
-}
-
-/*!
- \qmlproperty string TextInput::text
-
- The text in the TextInput.
-*/
-
-QString QDeclarativeTextInput::text() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->text();
-}
-
-void QDeclarativeTextInput::setText(const QString &s)
-{
- Q_D(QDeclarativeTextInput);
- if(s == text())
- return;
- d->control->setText(s);
-}
-
-/*!
- \qmlproperty string TextInput::font.family
-
- Sets the family name of the font.
-
- The family name is case insensitive and may optionally include a foundry name, e.g. "Helvetica [Cronyx]".
- If the family is available from more than one foundry and the foundry isn't specified, an arbitrary foundry is chosen.
- If the family isn't available a family will be set using the font matching algorithm.
-*/
-
-/*!
- \qmlproperty bool TextInput::font.bold
-
- Sets whether the font weight is bold.
-*/
-
-/*!
- \qmlproperty enumeration TextInput::font.weight
-
- Sets the font's weight.
-
- The weight can be one of:
- \list
- \o Font.Light
- \o Font.Normal - the default
- \o Font.DemiBold
- \o Font.Bold
- \o Font.Black
- \endlist
-
- \qml
- TextInput { text: "Hello"; font.weight: Font.DemiBold }
- \endqml
-*/
-
-/*!
- \qmlproperty bool TextInput::font.italic
-
- Sets whether the font has an italic style.
-*/
-
-/*!
- \qmlproperty bool TextInput::font.underline
-
- Sets whether the text is underlined.
-*/
-
-/*!
- \qmlproperty bool TextInput::font.strikeout
-
- Sets whether the font has a strikeout style.
-*/
-
-/*!
- \qmlproperty real TextInput::font.pointSize
-
- Sets the font size in points. The point size must be greater than zero.
-*/
-
-/*!
- \qmlproperty int TextInput::font.pixelSize
-
- Sets the font size in pixels.
-
- Using this function makes the font device dependent.
- Use \c pointSize to set the size of the font in a device independent manner.
-*/
-
-/*!
- \qmlproperty real TextInput::font.letterSpacing
-
- Sets the letter spacing for the font.
-
- Letter spacing changes the default spacing between individual letters in the font.
- A positive value increases the letter spacing by the corresponding pixels; a negative value decreases the spacing.
-*/
-
-/*!
- \qmlproperty real TextInput::font.wordSpacing
-
- Sets the word spacing for the font.
-
- Word spacing changes the default spacing between individual words.
- A positive value increases the word spacing by a corresponding amount of pixels,
- while a negative value decreases the inter-word spacing accordingly.
-*/
-
-/*!
- \qmlproperty enumeration TextInput::font.capitalization
-
- Sets the capitalization for the text.
-
- \list
- \o Font.MixedCase - This is the normal text rendering option where no capitalization change is applied.
- \o Font.AllUppercase - This alters the text to be rendered in all uppercase type.
- \o Font.AllLowercase - This alters the text to be rendered in all lowercase type.
- \o Font.SmallCaps - This alters the text to be rendered in small-caps type.
- \o Font.Capitalize - This alters the text to be rendered with the first character of each word as an uppercase character.
- \endlist
-
- \qml
- TextInput { text: "Hello"; font.capitalization: Font.AllLowercase }
- \endqml
-*/
-
-QFont QDeclarativeTextInput::font() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->sourceFont;
-}
-
-void QDeclarativeTextInput::setFont(const QFont &font)
-{
- Q_D(QDeclarativeTextInput);
- if (d->sourceFont == font)
- return;
-
- d->sourceFont = font;
- QFont oldFont = d->font;
- d->font = font;
- if (d->font.pointSizeF() != -1) {
- // 0.5pt resolution
- qreal size = qRound(d->font.pointSizeF()*2.0);
- d->font.setPointSizeF(size/2.0);
- }
-
- if (oldFont != d->font) {
- d->control->setFont(d->font);
- updateSize();
- updateCursorRectangle();
- if(d->cursorItem){
- d->cursorItem->setHeight(QFontMetrics(d->font).height());
- }
- }
- emit fontChanged(d->sourceFont);
-}
-
-/*!
- \qmlproperty color TextInput::color
-
- The text color.
-*/
-QColor QDeclarativeTextInput::color() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->color;
-}
-
-void QDeclarativeTextInput::setColor(const QColor &c)
-{
- Q_D(QDeclarativeTextInput);
- if (c != d->color) {
- d->color = c;
- clearCache();
- update();
- emit colorChanged(c);
- }
-}
-
-
-/*!
- \qmlproperty color TextInput::selectionColor
-
- The text highlight color, used behind selections.
-*/
-QColor QDeclarativeTextInput::selectionColor() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->selectionColor;
-}
-
-void QDeclarativeTextInput::setSelectionColor(const QColor &color)
-{
- Q_D(QDeclarativeTextInput);
- if (d->selectionColor == color)
- return;
-
- d->selectionColor = color;
- QPalette p = d->control->palette();
- p.setColor(QPalette::Highlight, d->selectionColor);
- d->control->setPalette(p);
- if (d->control->hasSelectedText()) {
- clearCache();
- update();
- }
- emit selectionColorChanged(color);
-}
-
-/*!
- \qmlproperty color TextInput::selectedTextColor
-
- The highlighted text color, used in selections.
-*/
-QColor QDeclarativeTextInput::selectedTextColor() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->selectedTextColor;
-}
-
-void QDeclarativeTextInput::setSelectedTextColor(const QColor &color)
-{
- Q_D(QDeclarativeTextInput);
- if (d->selectedTextColor == color)
- return;
-
- d->selectedTextColor = color;
- QPalette p = d->control->palette();
- p.setColor(QPalette::HighlightedText, d->selectedTextColor);
- d->control->setPalette(p);
- if (d->control->hasSelectedText()) {
- clearCache();
- update();
- }
- emit selectedTextColorChanged(color);
-}
-
-/*!
- \qmlproperty enumeration TextInput::horizontalAlignment
- \qmlproperty enumeration TextInput::effectiveHorizontalAlignment
-
- Sets the horizontal alignment of the text within the TextInput item's
- width and height. By default, the text alignment follows the natural alignment
- of the text, for example text that is read from left to right will be aligned to
- the left.
-
- TextInput does not have vertical alignment, as the natural height is
- exactly the height of the single line of text. If you set the height
- manually to something larger, TextInput will always be top aligned
- vertically. You can use anchors to align it however you want within
- another item.
-
- The valid values for \c horizontalAlignment are \c TextInput.AlignLeft, \c TextInput.AlignRight and
- \c TextInput.AlignHCenter.
-
- When using the attached property LayoutMirroring::enabled to mirror application
- layouts, the horizontal alignment of text will also be mirrored. However, the property
- \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment
- of TextInput, use the read-only property \c effectiveHorizontalAlignment.
-*/
-QDeclarativeTextInput::HAlignment QDeclarativeTextInput::hAlign() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->hAlign;
-}
-
-void QDeclarativeTextInput::setHAlign(HAlignment align)
-{
- Q_D(QDeclarativeTextInput);
- bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror;
- d->hAlignImplicit = false;
- if (d->setHAlign(align, forceAlign) && isComponentComplete()) {
- updateCursorRectangle();
- }
-}
-
-void QDeclarativeTextInput::resetHAlign()
-{
- Q_D(QDeclarativeTextInput);
- d->hAlignImplicit = true;
- if (d->determineHorizontalAlignment() && isComponentComplete()) {
- updateCursorRectangle();
- }
-}
-
-QDeclarativeTextInput::HAlignment QDeclarativeTextInput::effectiveHAlign() const
-{
- Q_D(const QDeclarativeTextInput);
- QDeclarativeTextInput::HAlignment effectiveAlignment = d->hAlign;
- if (!d->hAlignImplicit && d->effectiveLayoutMirror) {
- switch (d->hAlign) {
- case QDeclarativeTextInput::AlignLeft:
- effectiveAlignment = QDeclarativeTextInput::AlignRight;
- break;
- case QDeclarativeTextInput::AlignRight:
- effectiveAlignment = QDeclarativeTextInput::AlignLeft;
- break;
- default:
- break;
- }
- }
- return effectiveAlignment;
-}
-
-bool QDeclarativeTextInputPrivate::setHAlign(QDeclarativeTextInput::HAlignment alignment, bool forceAlign)
-{
- Q_Q(QDeclarativeTextInput);
- if ((hAlign != alignment || forceAlign) && alignment <= QDeclarativeTextInput::AlignHCenter) { // justify not supported
- QDeclarativeTextInput::HAlignment oldEffectiveHAlign = q->effectiveHAlign();
- hAlign = alignment;
- emit q->horizontalAlignmentChanged(alignment);
- if (oldEffectiveHAlign != q->effectiveHAlign())
- emit q->effectiveHorizontalAlignmentChanged();
- return true;
- }
- return false;
-}
-
-bool QDeclarativeTextInputPrivate::determineHorizontalAlignment()
-{
- if (hAlignImplicit) {
- // if no explicit alignment has been set, follow the natural layout direction of the text
- QString text = control->text();
- bool isRightToLeft = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : text.isRightToLeft();
- return setHAlign(isRightToLeft ? QDeclarativeTextInput::AlignRight : QDeclarativeTextInput::AlignLeft);
- }
- return false;
-}
-
-void QDeclarativeTextInputPrivate::mirrorChange()
-{
- Q_Q(QDeclarativeTextInput);
- if (q->isComponentComplete()) {
- if (!hAlignImplicit && (hAlign == QDeclarativeTextInput::AlignRight || hAlign == QDeclarativeTextInput::AlignLeft)) {
- q->updateCursorRectangle();
- emit q->effectiveHorizontalAlignmentChanged();
- }
- }
-}
-
-/*!
- \qmlproperty bool TextInput::readOnly
-
- Sets whether user input can modify the contents of the TextInput.
-
- If readOnly is set to true, then user input will not affect the text
- property. Any bindings or attempts to set the text property will still
- work.
-*/
-
-bool QDeclarativeTextInput::isReadOnly() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->isReadOnly();
-}
-
-void QDeclarativeTextInput::setReadOnly(bool ro)
-{
- Q_D(QDeclarativeTextInput);
- if (d->control->isReadOnly() == ro)
- return;
-
- setFlag(QGraphicsItem::ItemAcceptsInputMethod, !ro);
- d->control->setReadOnly(ro);
-
- emit readOnlyChanged(ro);
-}
-
-/*!
- \qmlproperty int TextInput::maximumLength
- The maximum permitted length of the text in the TextInput.
-
- If the text is too long, it is truncated at the limit.
-
- By default, this property contains a value of 32767.
-*/
-int QDeclarativeTextInput::maxLength() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->maxLength();
-}
-
-void QDeclarativeTextInput::setMaxLength(int ml)
-{
- Q_D(QDeclarativeTextInput);
- if (d->control->maxLength() == ml)
- return;
-
- d->control->setMaxLength(ml);
-
- emit maximumLengthChanged(ml);
-}
-
-/*!
- \qmlproperty bool TextInput::cursorVisible
- Set to true when the TextInput shows a cursor.
-
- This property is set and unset when the TextInput gets active focus, so that other
- properties can be bound to whether the cursor is currently showing. As it
- gets set and unset automatically, when you set the value yourself you must
- keep in mind that your value may be overwritten.
-
- It can be set directly in script, for example if a KeyProxy might
- forward keys to it and you desire it to look active when this happens
- (but without actually giving it active focus).
-
- It should not be set directly on the element, like in the below QML,
- as the specified value will be overridden an lost on focus changes.
-
- \code
- TextInput {
- text: "Text"
- cursorVisible: false
- }
- \endcode
-
- In the above snippet the cursor will still become visible when the
- TextInput gains active focus.
-*/
-bool QDeclarativeTextInput::isCursorVisible() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->cursorVisible;
-}
-
-void QDeclarativeTextInput::setCursorVisible(bool on)
-{
- Q_D(QDeclarativeTextInput);
- if (d->cursorVisible == on)
- return;
- d->cursorVisible = on;
- d->control->setCursorBlinkPeriod(on?QApplication::cursorFlashTime():0);
- QRect r = d->control->cursorRect();
- if (d->control->inputMask().isEmpty())
- updateRect(r);
- else
- updateRect();
- emit cursorVisibleChanged(d->cursorVisible);
-}
-
-/*!
- \qmlproperty int TextInput::cursorPosition
- The position of the cursor in the TextInput.
-*/
-int QDeclarativeTextInput::cursorPosition() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->cursor();
-}
-void QDeclarativeTextInput::setCursorPosition(int cp)
-{
- Q_D(QDeclarativeTextInput);
- if (cp < 0 || cp > d->control->text().length())
- return;
- d->control->moveCursor(cp);
-}
-
-/*!
- Returns a Rect which encompasses the cursor, but which may be larger than is
- required. Ignores custom cursor delegates.
-*/
-QRect QDeclarativeTextInput::cursorRectangle() const
-{
- Q_D(const QDeclarativeTextInput);
- QRect r = d->control->cursorRect();
- // Scroll and make consistent with TextEdit
- // QLineControl inexplicably adds 1 to the height and horizontal padding
- // for unicode direction markers.
- r.adjust(5 - d->hscroll, 0, -4 - d->hscroll, -1);
- return r;
-}
-
-/*!
- \qmlproperty int TextInput::selectionStart
-
- The cursor position before the first character in the current selection.
- Setting this and selectionEnd allows you to specify a selection in the
- text edit.
-
- Note that if selectionStart == selectionEnd then there is no current
- selection.
-
- \sa selectionEnd, cursorPosition, selectedText, select()
-*/
-int QDeclarativeTextInput::selectionStart() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->lastSelectionStart;
-}
-
-/*!
- \qmlproperty int TextInput::selectionEnd
-
- The cursor position after the last character in the current selection.
- Setting this and selectionStart allows you to specify a selection in the
- text edit.
-
- Note that if selectionStart == selectionEnd then there is no current
- selection.
-
- \sa selectionStart, cursorPosition, selectedText, select()
-*/
-int QDeclarativeTextInput::selectionEnd() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->lastSelectionEnd;
-}
-
-/*!
- \qmlmethod void TextInput::select(int start, int end)
-
- Causes the text from \a start to \a end to be selected.
-
- If either start or end is out of range, the selection is not changed.
-
- After calling this, selectionStart will become the lesser
- and selectionEnd will become the greater (regardless of the order passed
- to this method).
-
- \sa selectionStart, selectionEnd
-*/
-void QDeclarativeTextInput::select(int start, int end)
-{
- Q_D(QDeclarativeTextInput);
- if (start < 0 || end < 0 || start > d->control->text().length() || end > d->control->text().length())
- return;
- d->control->setSelection(start, end-start);
-}
-
-/*!
- \qmlproperty string TextInput::selectedText
-
- This read-only property provides the text currently selected in the
- text input.
-
- It is equivalent to the following snippet, but is faster and easier
- to use.
-
- \js
- myTextInput.text.toString().substring(myTextInput.selectionStart,
- myTextInput.selectionEnd);
- \endjs
-*/
-QString QDeclarativeTextInput::selectedText() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->selectedText();
-}
-
-/*!
- \qmlproperty bool TextInput::activeFocusOnPress
-
- Whether the TextInput should gain active focus on a mouse press. By default this is
- set to true.
-*/
-bool QDeclarativeTextInput::focusOnPress() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->focusOnPress;
-}
-
-void QDeclarativeTextInput::setFocusOnPress(bool b)
-{
- Q_D(QDeclarativeTextInput);
- if (d->focusOnPress == b)
- return;
-
- d->focusOnPress = b;
-
- emit activeFocusOnPressChanged(d->focusOnPress);
-}
-
-/*!
- \qmlproperty bool TextInput::autoScroll
-
- Whether the TextInput should scroll when the text is longer than the width. By default this is
- set to true.
-*/
-bool QDeclarativeTextInput::autoScroll() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->autoScroll;
-}
-
-void QDeclarativeTextInput::setAutoScroll(bool b)
-{
- Q_D(QDeclarativeTextInput);
- if (d->autoScroll == b)
- return;
-
- d->autoScroll = b;
- //We need to repaint so that the scrolling is taking into account.
- updateSize(true);
- updateCursorRectangle();
- emit autoScrollChanged(d->autoScroll);
-}
-
-/*!
- \qmlclass IntValidator QIntValidator
- \ingroup qml-basic-visual-elements
-
- This element provides a validator for integer values.
-
- IntValidator uses the \l {QLocale::setDefault()}{default locale} to interpret the number and
- will accept locale specific digits, group separators, and positive and negative signs. In
- addition, IntValidator is always guaranteed to accept a number formatted according to the "C"
- locale.
-*/
-/*!
- \qmlproperty int IntValidator::top
-
- This property holds the validator's highest acceptable value.
- By default, this property's value is derived from the highest signed integer available (typically 2147483647).
-*/
-/*!
- \qmlproperty int IntValidator::bottom
-
- This property holds the validator's lowest acceptable value.
- By default, this property's value is derived from the lowest signed integer available (typically -2147483647).
-*/
-
-/*!
- \qmlclass DoubleValidator QDoubleValidator
- \ingroup qml-basic-visual-elements
-
- This element provides a validator for non-integer numbers.
-*/
-
-/*!
- \qmlproperty real DoubleValidator::top
-
- This property holds the validator's maximum acceptable value.
- By default, this property contains a value of infinity.
-*/
-/*!
- \qmlproperty real DoubleValidator::bottom
-
- This property holds the validator's minimum acceptable value.
- By default, this property contains a value of -infinity.
-*/
-/*!
- \qmlproperty int DoubleValidator::decimals
-
- This property holds the validator's maximum number of digits after the decimal point.
- By default, this property contains a value of 1000.
-*/
-/*!
- \qmlproperty enumeration DoubleValidator::notation
- This property holds the notation of how a string can describe a number.
-
- The possible values for this property are:
-
- \list
- \o DoubleValidator.StandardNotation
- \o DoubleValidator.ScientificNotation (default)
- \endlist
-
- If this property is set to DoubleValidator.ScientificNotation, the written number may have an exponent part (e.g. 1.5E-2).
-*/
-
-/*!
- \qmlclass RegExpValidator QRegExpValidator
- \ingroup qml-basic-visual-elements
-
- This element provides a validator, which counts as valid any string which
- matches a specified regular expression.
-*/
-/*!
- \qmlproperty regExp RegExpValidator::regExp
-
- This property holds the regular expression used for validation.
-
- Note that this property should be a regular expression in JS syntax, e.g /a/ for the regular expression
- matching "a".
-
- By default, this property contains a regular expression with the pattern .* that matches any string.
-*/
-
-/*!
- \qmlproperty Validator TextInput::validator
-
- Allows you to set a validator on the TextInput. When a validator is set
- the TextInput will only accept input which leaves the text property in
- an acceptable or intermediate state. The accepted signal will only be sent
- if the text is in an acceptable state when enter is pressed.
-
- Currently supported validators are IntValidator, DoubleValidator and
- RegExpValidator. An example of using validators is shown below, which allows
- input of integers between 11 and 31 into the text input:
-
- \code
- import QtQuick 1.0
- TextInput{
- validator: IntValidator{bottom: 11; top: 31;}
- focus: true
- }
- \endcode
-
- \sa acceptableInput, inputMask
-*/
-#ifndef QT_NO_VALIDATOR
-QValidator* QDeclarativeTextInput::validator() const
-{
- Q_D(const QDeclarativeTextInput);
- //###const cast isn't good, but needed for property system?
- return const_cast<QValidator*>(d->control->validator());
-}
-
-void QDeclarativeTextInput::setValidator(QValidator* v)
-{
- Q_D(QDeclarativeTextInput);
- if (d->control->validator() == v)
- return;
-
- d->control->setValidator(v);
- if(!d->control->hasAcceptableInput()){
- d->oldValidity = false;
- emit acceptableInputChanged();
- }
-
- emit validatorChanged();
-}
-#endif // QT_NO_VALIDATOR
-
-/*!
- \qmlproperty string TextInput::inputMask
-
- Allows you to set an input mask on the TextInput, restricting the allowable
- text inputs. See QLineEdit::inputMask for further details, as the exact
- same mask strings are used by TextInput.
-
- \sa acceptableInput, validator
-*/
-QString QDeclarativeTextInput::inputMask() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->inputMask();
-}
-
-void QDeclarativeTextInput::setInputMask(const QString &im)
-{
- Q_D(QDeclarativeTextInput);
- if (d->control->inputMask() == im)
- return;
-
- d->control->setInputMask(im);
- emit inputMaskChanged(d->control->inputMask());
-}
-
-/*!
- \qmlproperty bool TextInput::acceptableInput
-
- This property is always true unless a validator or input mask has been set.
- If a validator or input mask has been set, this property will only be true
- if the current text is acceptable to the validator or input mask as a final
- string (not as an intermediate string).
-*/
-bool QDeclarativeTextInput::hasAcceptableInput() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->hasAcceptableInput();
-}
-
-/*!
- \qmlsignal TextInput::onAccepted()
-
- This handler is called when the Return or Enter key is pressed.
- Note that if there is a \l validator or \l inputMask set on the text
- input, the handler will only be emitted if the input is in an acceptable
- state.
-*/
-
-void QDeclarativeTextInputPrivate::updateInputMethodHints()
-{
- Q_Q(QDeclarativeTextInput);
- Qt::InputMethodHints hints = inputMethodHints;
- uint echo = control->echoMode();
- if (echo == QDeclarativeTextInput::Password || echo == QDeclarativeTextInput::NoEcho)
- hints |= Qt::ImhHiddenText;
- else if (echo == QDeclarativeTextInput::PasswordEchoOnEdit)
- hints &= ~Qt::ImhHiddenText;
- if (echo != QDeclarativeTextInput::Normal)
- hints |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
- q->setInputMethodHints(hints);
-}
-
-/*!
- \qmlproperty enumeration TextInput::echoMode
-
- Specifies how the text should be displayed in the TextInput.
- \list
- \o TextInput.Normal - Displays the text as it is. (Default)
- \o TextInput.Password - Displays asterixes instead of characters.
- \o TextInput.NoEcho - Displays nothing.
- \o TextInput.PasswordEchoOnEdit - Displays all but the current character as asterixes.
- \endlist
-*/
-QDeclarativeTextInput::EchoMode QDeclarativeTextInput::echoMode() const
-{
- Q_D(const QDeclarativeTextInput);
- return (QDeclarativeTextInput::EchoMode)d->control->echoMode();
-}
-
-void QDeclarativeTextInput::setEchoMode(QDeclarativeTextInput::EchoMode echo)
-{
- Q_D(QDeclarativeTextInput);
- if (echoMode() == echo)
- return;
- d->control->setEchoMode((uint)echo);
- d->updateInputMethodHints();
- q_textChanged();
- emit echoModeChanged(echoMode());
-}
-
-Qt::InputMethodHints QDeclarativeTextInput::imHints() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->inputMethodHints;
-}
-
-void QDeclarativeTextInput::setIMHints(Qt::InputMethodHints hints)
-{
- Q_D(QDeclarativeTextInput);
- if (d->inputMethodHints == hints)
- return;
- d->inputMethodHints = hints;
- d->updateInputMethodHints();
-}
-
-/*!
- \qmlproperty Component TextInput::cursorDelegate
- The delegate for the cursor in the TextInput.
-
- If you set a cursorDelegate for a TextInput, this delegate will be used for
- drawing the cursor instead of the standard cursor. An instance of the
- delegate will be created and managed by the TextInput when a cursor is
- needed, and the x property of delegate instance will be set so as
- to be one pixel before the top left of the current character.
-
- Note that the root item of the delegate component must be a QDeclarativeItem or
- QDeclarativeItem derived item.
-*/
-QDeclarativeComponent* QDeclarativeTextInput::cursorDelegate() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->cursorComponent;
-}
-
-void QDeclarativeTextInput::setCursorDelegate(QDeclarativeComponent* c)
-{
- Q_D(QDeclarativeTextInput);
- if (d->cursorComponent == c)
- return;
-
- d->cursorComponent = c;
- if(!c){
- //note that the components are owned by something else
- delete d->cursorItem;
- }else{
- d->startCreatingCursor();
- }
-
- emit cursorDelegateChanged();
-}
-
-void QDeclarativeTextInputPrivate::startCreatingCursor()
-{
- Q_Q(QDeclarativeTextInput);
- if(cursorComponent->isReady()){
- q->createCursor();
- }else if(cursorComponent->isLoading()){
- q->connect(cursorComponent, SIGNAL(statusChanged(int)),
- q, SLOT(createCursor()));
- }else {//isError
- qmlInfo(q, cursorComponent->errors()) << QDeclarativeTextInput::tr("Could not load cursor delegate");
- }
-}
-
-void QDeclarativeTextInput::createCursor()
-{
- Q_D(QDeclarativeTextInput);
- if(d->cursorComponent->isError()){
- qmlInfo(this, d->cursorComponent->errors()) << tr("Could not load cursor delegate");
- return;
- }
-
- if(!d->cursorComponent->isReady())
- return;
-
- if(d->cursorItem)
- delete d->cursorItem;
- d->cursorItem = qobject_cast<QDeclarativeItem*>(d->cursorComponent->create());
- if(!d->cursorItem){
- qmlInfo(this, d->cursorComponent->errors()) << tr("Could not instantiate cursor delegate");
- return;
- }
-
- QDeclarative_setParent_noEvent(d->cursorItem, this);
- d->cursorItem->setParentItem(this);
- d->cursorItem->setX(d->control->cursorToX());
- d->cursorItem->setHeight(d->control->height()-1); // -1 to counter QLineControl's +1 which is not consistent with Text.
-}
-
-/*!
- \qmlmethod rect TextInput::positionToRectangle(int pos)
-
- This function takes a character position and returns the rectangle that the
- cursor would occupy, if it was placed at that character position.
-
- This is similar to setting the cursorPosition, and then querying the cursor
- rectangle, but the cursorPosition is not changed.
-*/
-QRectF QDeclarativeTextInput::positionToRectangle(int pos) const
-{
- Q_D(const QDeclarativeTextInput);
- if (pos > d->control->cursorPosition())
- pos += d->control->preeditAreaText().length();
- return QRectF(d->control->cursorToX(pos)-d->hscroll,
- 0.0,
- d->control->cursorWidth(),
- cursorRectangle().height());
-}
-
-int QDeclarativeTextInput::positionAt(int x) const
-{
- return positionAt(x, CursorBetweenCharacters);
-}
-
-/*!
- \qmlmethod int TextInput::positionAt(int x, CursorPosition position = CursorBetweenCharacters)
- \since Quick 1.1
-
- This function returns the character position at
- x pixels from the left of the textInput. Position 0 is before the
- first character, position 1 is after the first character but before the second,
- and so on until position text.length, which is after all characters.
-
- This means that for all x values before the first character this function returns 0,
- and for all x values after the last character this function returns text.length.
-
- The cursor position type specifies how the cursor position should be resolved.
-
- \list
- \o TextInput.CursorBetweenCharacters - Returns the position between characters that is nearest x.
- \o TextInput.CursorOnCharacter - Returns the position before the character that is nearest x.
- \endlist
-*/
-int QDeclarativeTextInput::positionAt(int x, CursorPosition position) const
-{
- Q_D(const QDeclarativeTextInput);
- int pos = d->control->xToPos(x + d->hscroll, QTextLine::CursorPosition(position));
- const int cursor = d->control->cursor();
- if (pos > cursor) {
- const int preeditLength = d->control->preeditAreaText().length();
- pos = pos > cursor + preeditLength
- ? pos - preeditLength
- : cursor;
- }
- return pos;
-}
-
-void QDeclarativeTextInputPrivate::focusChanged(bool hasFocus)
-{
- Q_Q(QDeclarativeTextInput);
- focused = hasFocus;
- q->setCursorVisible(hasFocus && scene && scene->hasFocus());
- if(q->echoMode() == QDeclarativeTextInput::PasswordEchoOnEdit && !hasFocus)
- control->updatePasswordEchoEditing(false);//QLineControl sets it on key events, but doesn't deal with focus events
- if (!hasFocus)
- control->deselect();
- QDeclarativeItemPrivate::focusChanged(hasFocus);
-}
-
-void QDeclarativeTextInput::keyPressEvent(QKeyEvent* ev)
-{
- Q_D(QDeclarativeTextInput);
- keyPressPreHandler(ev);
- if (ev->isAccepted())
- return;
-
- // Don't allow MacOSX up/down support, and we don't allow a completer.
- bool ignore = (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down) && ev->modifiers() == Qt::NoModifier;
- if (!ignore && (d->lastSelectionStart == d->lastSelectionEnd) && (ev->key() == Qt::Key_Right || ev->key() == Qt::Key_Left)) {
- // Ignore when moving off the end unless there is a selection,
- // because then moving will do something (deselect).
- int cursorPosition = d->control->cursor();
- if (cursorPosition == 0)
- ignore = ev->key() == (d->control->layoutDirection() == Qt::LeftToRight ? Qt::Key_Left : Qt::Key_Right);
- if (cursorPosition == d->control->text().length())
- ignore = ev->key() == (d->control->layoutDirection() == Qt::LeftToRight ? Qt::Key_Right : Qt::Key_Left);
- }
- if (ignore) {
- ev->ignore();
- } else {
- d->control->processKeyEvent(ev);
- }
- if (!ev->isAccepted())
- QDeclarativePaintedItem::keyPressEvent(ev);
-}
-
-void QDeclarativeTextInput::inputMethodEvent(QInputMethodEvent *ev)
-{
- Q_D(QDeclarativeTextInput);
- ev->ignore();
- const bool wasComposing = d->control->preeditAreaText().length() > 0;
- inputMethodPreHandler(ev);
- if (!ev->isAccepted()) {
- if (d->control->isReadOnly()) {
- ev->ignore();
- } else {
- d->control->processInputMethodEvent(ev);
- }
- }
- if (!ev->isAccepted())
- QDeclarativePaintedItem::inputMethodEvent(ev);
-
- if (wasComposing != (d->control->preeditAreaText().length() > 0))
- emit inputMethodComposingChanged();
-}
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextInput::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextInput);
- if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonDblClick))
- return;
- if (d->selectByMouse) {
- int cursor = d->xToPos(event->pos().x());
- d->control->selectWordAtPos(cursor);
- event->setAccepted(true);
- } else {
- QDeclarativePaintedItem::mouseDoubleClickEvent(event);
- }
-}
-
-void QDeclarativeTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextInput);
- if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonPress))
- return;
- if(d->focusOnPress){
- bool hadActiveFocus = hasActiveFocus();
- forceActiveFocus();
- if (d->showInputPanelOnFocus) {
- if (hasActiveFocus() && hadActiveFocus && !isReadOnly()) {
- // re-open input panel on press if already focused
- openSoftwareInputPanel();
- }
- } else { // show input panel on click
- if (hasActiveFocus() && !hadActiveFocus) {
- d->clickCausedFocus = true;
- }
- }
- }
- if (d->selectByMouse) {
- setKeepMouseGrab(false);
- d->selectPressed = true;
- d->pressPos = event->pos();
- }
- bool mark = (event->modifiers() & Qt::ShiftModifier) && d->selectByMouse;
- int cursor = d->xToPos(event->pos().x());
- d->control->moveCursor(cursor, mark);
- event->setAccepted(true);
-}
-
-void QDeclarativeTextInput::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextInput);
- if (d->sendMouseEventToInputContext(event, QEvent::MouseMove))
- return;
- if (d->selectPressed) {
- if (qAbs(int(event->pos().x() - d->pressPos.x())) > QApplication::startDragDistance())
- setKeepMouseGrab(true);
- moveCursorSelection(d->xToPos(event->pos().x()), d->mouseSelectionMode);
- event->setAccepted(true);
- } else {
- QDeclarativePaintedItem::mouseMoveEvent(event);
- }
-}
-
-/*!
-\overload
-Handles the given mouse \a event.
-*/
-void QDeclarativeTextInput::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- Q_D(QDeclarativeTextInput);
- if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonRelease))
- return;
- if (d->selectPressed) {
- d->selectPressed = false;
- setKeepMouseGrab(false);
- }
- if (!d->showInputPanelOnFocus) { // input panel on click
- if (d->focusOnPress && !isReadOnly() && boundingRect().contains(event->pos())) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- qt_widget_private(view)->handleSoftwareInputPanel(event->button(), d->clickCausedFocus);
- }
- }
- }
- }
- d->clickCausedFocus = false;
- d->control->processEvent(event);
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseReleaseEvent(event);
-}
-
-bool QDeclarativeTextInputPrivate::sendMouseEventToInputContext(
- QGraphicsSceneMouseEvent *event, QEvent::Type eventType)
-{
-#if !defined QT_NO_IM
- if (event->widget() && control->composeMode()) {
- int tmp_cursor = xToPos(event->pos().x());
- int mousePos = tmp_cursor - control->cursor();
- if (mousePos < 0 || mousePos > control->preeditAreaText().length()) {
- mousePos = -1;
- // don't send move events outside the preedit area
- if (eventType == QEvent::MouseMove)
- return true;
- }
-
- QInputContext *qic = event->widget()->inputContext();
- if (qic) {
- QMouseEvent mouseEvent(
- eventType,
- event->widget()->mapFromGlobal(event->screenPos()),
- event->screenPos(),
- event->button(),
- event->buttons(),
- event->modifiers());
- // may be causing reset() in some input methods
- qic->mouseHandler(mousePos, &mouseEvent);
- event->setAccepted(mouseEvent.isAccepted());
- }
- if (!control->preeditAreaText().isEmpty())
- return true;
- }
-#else
- Q_UNUSED(event);
- Q_UNUSED(eventType)
-#endif
-
- return false;
-}
-
-bool QDeclarativeTextInput::sceneEvent(QEvent *event)
-{
- Q_D(QDeclarativeTextInput);
- bool rv = QDeclarativeItem::sceneEvent(event);
- if (event->type() == QEvent::UngrabMouse) {
- d->selectPressed = false;
- setKeepMouseGrab(false);
- }
- return rv;
-}
-
-bool QDeclarativeTextInput::event(QEvent* ev)
-{
- Q_D(QDeclarativeTextInput);
- //Anything we don't deal with ourselves, pass to the control
- bool handled = false;
- switch(ev->type()){
- case QEvent::KeyPress:
- case QEvent::KeyRelease://###Should the control be doing anything with release?
- case QEvent::InputMethod:
- case QEvent::GraphicsSceneMousePress:
- case QEvent::GraphicsSceneMouseMove:
- case QEvent::GraphicsSceneMouseRelease:
- case QEvent::GraphicsSceneMouseDoubleClick:
- break;
- default:
- handled = d->control->processEvent(ev);
- }
- if(!handled)
- handled = QDeclarativePaintedItem::event(ev);
- return handled;
-}
-
-void QDeclarativeTextInput::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QDeclarativeTextInput);
- if (newGeometry.width() != oldGeometry.width()) {
- updateSize();
- updateCursorRectangle();
- }
- QDeclarativePaintedItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-int QDeclarativeTextInputPrivate::calculateTextWidth()
-{
- return qRound(control->naturalTextWidth());
-}
-
-void QDeclarativeTextInputPrivate::updateHorizontalScroll()
-{
- Q_Q(QDeclarativeTextInput);
- const int preeditLength = control->preeditAreaText().length();
- int cix = qRound(control->cursorToX(control->cursor() + preeditLength));
- QRect br(q->boundingRect().toRect());
- int widthUsed = calculateTextWidth();
-
- QDeclarativeTextInput::HAlignment effectiveHAlign = q->effectiveHAlign();
- if (autoScroll) {
- if (widthUsed <= br.width()) {
- // text fits in br; use hscroll for alignment
- switch (effectiveHAlign & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) {
- case Qt::AlignRight:
- hscroll = widthUsed - br.width() - 1;
- break;
- case Qt::AlignHCenter:
- hscroll = (widthUsed - br.width()) / 2;
- break;
- default:
- // Left
- hscroll = 0;
- break;
- }
- } else if (cix - hscroll >= br.width()) {
- // text doesn't fit, cursor is to the right of br (scroll right)
- hscroll = cix - br.width() + 1;
- } else if (cix - hscroll < 0 && hscroll < widthUsed) {
- // text doesn't fit, cursor is to the left of br (scroll left)
- hscroll = cix;
- } else if (widthUsed - hscroll < br.width()) {
- // text doesn't fit, text document is to the left of br; align
- // right
- hscroll = widthUsed - br.width() + 1;
- }
- if (preeditLength > 0) {
- // check to ensure long pre-edit text doesn't push the cursor
- // off to the left
- cix = qRound(control->cursorToX(
- control->cursor() + qMax(0, control->preeditCursor() - 1)));
- if (cix < hscroll)
- hscroll = cix;
- }
- } else {
- switch (effectiveHAlign) {
- case QDeclarativeTextInput::AlignRight:
- hscroll = q->width() - widthUsed;
- break;
- case QDeclarativeTextInput::AlignHCenter:
- hscroll = (q->width() - widthUsed) / 2;
- break;
- default:
- // Left
- hscroll = 0;
- break;
- }
- }
-}
-
-void QDeclarativeTextInput::drawContents(QPainter *p, const QRect &r)
-{
- Q_D(QDeclarativeTextInput);
- p->setRenderHint(QPainter::TextAntialiasing, true);
- p->save();
- p->setPen(QPen(d->color));
- int flags = QLineControl::DrawText;
- if(!isReadOnly() && d->cursorVisible && !d->cursorItem)
- flags |= QLineControl::DrawCursor;
- if (d->control->hasSelectedText())
- flags |= QLineControl::DrawSelections;
- QPoint offset = QPoint(0,0);
- QFontMetrics fm = QFontMetrics(d->font);
- QRect br(boundingRect().toRect());
- if (d->autoScroll) {
- // the y offset is there to keep the baseline constant in case we have script changes in the text.
- offset = br.topLeft() - QPoint(d->hscroll, d->control->ascent() - fm.ascent());
- } else {
- offset = QPoint(d->hscroll, 0);
- }
- d->control->draw(p, offset, r, flags);
- p->restore();
-}
-
-/*!
-\overload
-Returns the value of the given \a property.
-*/
-QVariant QDeclarativeTextInput::inputMethodQuery(Qt::InputMethodQuery property) const
-{
- Q_D(const QDeclarativeTextInput);
- switch(property) {
- case Qt::ImMicroFocus:
- return cursorRectangle();
- case Qt::ImFont:
- return font();
- case Qt::ImCursorPosition:
- return QVariant(d->control->cursor());
- case Qt::ImSurroundingText:
- if (d->control->echoMode() == PasswordEchoOnEdit && !d->control->passwordEchoEditing())
- return QVariant(displayText());
- else
- return QVariant(text());
- case Qt::ImCurrentSelection:
- return QVariant(selectedText());
- case Qt::ImMaximumTextLength:
- return QVariant(maxLength());
- case Qt::ImAnchorPosition:
- if (d->control->selectionStart() == d->control->selectionEnd())
- return QVariant(d->control->cursor());
- else if (d->control->selectionStart() == d->control->cursor())
- return QVariant(d->control->selectionEnd());
- else
- return QVariant(d->control->selectionStart());
- default:
- return QVariant();
- }
-}
-
-/*!
- \qmlmethod void TextInput::deselect()
- \since Quick 1.1
-
- Removes active text selection.
-*/
-void QDeclarativeTextInput::deselect()
-{
- Q_D(QDeclarativeTextInput);
- d->control->deselect();
-}
-
-/*!
- \qmlmethod void TextInput::selectAll()
-
- Causes all text to be selected.
-*/
-void QDeclarativeTextInput::selectAll()
-{
- Q_D(QDeclarativeTextInput);
- d->control->setSelection(0, d->control->text().length());
-}
-
-/*!
- \qmlmethod void TextInput::isRightToLeft(int start, int end)
-
- Returns true if the natural reading direction of the editor text
- found between positions \a start and \a end is right to left.
-*/
-bool QDeclarativeTextInput::isRightToLeft(int start, int end)
-{
- Q_D(QDeclarativeTextInput);
- if (start > end) {
- qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start.";
- return false;
- } else {
- return d->control->text().mid(start, end - start).isRightToLeft();
- }
-}
-
-#ifndef QT_NO_CLIPBOARD
-/*!
- \qmlmethod TextInput::cut()
-
- Moves the currently selected text to the system clipboard.
-*/
-void QDeclarativeTextInput::cut()
-{
- Q_D(QDeclarativeTextInput);
- d->control->copy();
- d->control->del();
-}
-
-/*!
- \qmlmethod TextInput::copy()
-
- Copies the currently selected text to the system clipboard.
-*/
-void QDeclarativeTextInput::copy()
-{
- Q_D(QDeclarativeTextInput);
- d->control->copy();
-}
-
-/*!
- \qmlmethod TextInput::paste()
-
- Replaces the currently selected text by the contents of the system clipboard.
-*/
-void QDeclarativeTextInput::paste()
-{
- Q_D(QDeclarativeTextInput);
- if(!d->control->isReadOnly())
- d->control->paste();
-}
-#endif // QT_NO_CLIPBOARD
-
-/*!
- \qmlmethod void TextInput::selectWord()
-
- Causes the word closest to the current cursor position to be selected.
-*/
-void QDeclarativeTextInput::selectWord()
-{
- Q_D(QDeclarativeTextInput);
- d->control->selectWordAtPos(d->control->cursor());
-}
-
-/*!
- \qmlproperty bool TextInput::smooth
-
- This property holds whether the text is smoothly scaled or transformed.
-
- Smooth filtering gives better visual quality, but is slower. If
- the item is displayed at its natural size, this property has no visual or
- performance effect.
-
- \note Generally scaling artifacts are only visible if the item is stationary on
- the screen. A common pattern when animating an item is to disable smooth
- filtering at the beginning of the animation and reenable it at the conclusion.
-*/
-
-/*!
- \qmlproperty string TextInput::passwordCharacter
-
- This is the character displayed when echoMode is set to Password or
- PasswordEchoOnEdit. By default it is an asterisk.
-
- If this property is set to a string with more than one character,
- the first character is used. If the string is empty, the value
- is ignored and the property is not set.
-*/
-QString QDeclarativeTextInput::passwordCharacter() const
-{
- Q_D(const QDeclarativeTextInput);
- return QString(d->control->passwordCharacter());
-}
-
-void QDeclarativeTextInput::setPasswordCharacter(const QString &str)
-{
- Q_D(QDeclarativeTextInput);
- if(str.length() < 1)
- return;
- d->control->setPasswordCharacter(str.constData()[0]);
- EchoMode echoMode_ = echoMode();
- if (echoMode_ == Password || echoMode_ == PasswordEchoOnEdit) {
- updateSize();
- }
- emit passwordCharacterChanged();
-}
-
-/*!
- \qmlproperty string TextInput::displayText
-
- This is the text displayed in the TextInput.
-
- If \l echoMode is set to TextInput::Normal, this holds the
- same value as the TextInput::text property. Otherwise,
- this property holds the text visible to the user, while
- the \l text property holds the actual entered text.
-*/
-QString QDeclarativeTextInput::displayText() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->displayText();
-}
-
-/*!
- \qmlproperty bool TextInput::selectByMouse
-
- Defaults to false.
-
- If true, the user can use the mouse to select text in some
- platform-specific way. Note that for some platforms this may
- not be an appropriate interaction (eg. may conflict with how
- the text needs to behave inside a Flickable.
-*/
-bool QDeclarativeTextInput::selectByMouse() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->selectByMouse;
-}
-
-void QDeclarativeTextInput::setSelectByMouse(bool on)
-{
- Q_D(QDeclarativeTextInput);
- if (d->selectByMouse != on) {
- d->selectByMouse = on;
- emit selectByMouseChanged(on);
- }
-}
-
-/*!
- \qmlproperty enum TextInput::mouseSelectionMode
- \since Quick 1.1
-
- Specifies how text should be selected using a mouse.
-
- \list
- \o TextInput.SelectCharacters - The selection is updated with individual characters. (Default)
- \o TextInput.SelectWords - The selection is updated with whole words.
- \endlist
-
- This property only applies when \l selectByMouse is true.
-*/
-
-QDeclarativeTextInput::SelectionMode QDeclarativeTextInput::mouseSelectionMode() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->mouseSelectionMode;
-}
-
-void QDeclarativeTextInput::setMouseSelectionMode(SelectionMode mode)
-{
- Q_D(QDeclarativeTextInput);
- if (d->mouseSelectionMode != mode) {
- d->mouseSelectionMode = mode;
- emit mouseSelectionModeChanged(mode);
- }
-}
-
-/*!
- \qmlproperty bool TextInput::canPaste
- \since QtQuick 1.1
-
- Returns true if the TextInput is writable and the content of the clipboard is
- suitable for pasting into the TextEdit.
-*/
-bool QDeclarativeTextInput::canPaste() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->canPaste;
-}
-
-void QDeclarativeTextInput::moveCursorSelection(int position)
-{
- Q_D(QDeclarativeTextInput);
- d->control->moveCursor(position, true);
-}
-
-/*!
- \qmlmethod void TextInput::moveCursorSelection(int position, SelectionMode mode = TextInput.SelectCharacters)
- \since Quick 1.1
-
- Moves the cursor to \a position and updates the selection according to the optional \a mode
- parameter. (To only move the cursor, set the \l cursorPosition property.)
-
- When this method is called it additionally sets either the
- selectionStart or the selectionEnd (whichever was at the previous cursor position)
- to the specified position. This allows you to easily extend and contract the selected
- text range.
-
- The selection mode specifies whether the selection is updated on a per character or a per word
- basis. If not specified the selection mode will default to TextInput.SelectCharacters.
-
- \list
- \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at
- the previous cursor position) to the specified position.
- \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all
- words between the specified postion and the previous cursor position. Words partially in the
- range are included.
- \endlist
-
- For example, take this sequence of calls:
-
- \code
- cursorPosition = 5
- moveCursorSelection(9, TextInput.SelectCharacters)
- moveCursorSelection(7, TextInput.SelectCharacters)
- \endcode
-
- This moves the cursor to position 5, extend the selection end from 5 to 9
- and then retract the selection end from 9 to 7, leaving the text from position 5 to 7
- selected (the 6th and 7th characters).
-
- The same sequence with TextInput.SelectWords will extend the selection start to a word boundary
- before or on position 5 and extend the selection end to a word boundary on or past position 9.
-*/
-void QDeclarativeTextInput::moveCursorSelection(int pos, SelectionMode mode)
-{
- Q_D(QDeclarativeTextInput);
-
- if (mode == SelectCharacters) {
- d->control->moveCursor(pos, true);
- } else if (pos != d->control->cursor()){
- const int cursor = d->control->cursor();
- int anchor;
- if (!d->control->hasSelectedText())
- anchor = d->control->cursor();
- else if (d->control->selectionStart() == d->control->cursor())
- anchor = d->control->selectionEnd();
- else
- anchor = d->control->selectionStart();
-
- if (anchor < pos || (anchor == pos && cursor < pos)) {
- const QString text = d->control->text();
- QTextBoundaryFinder finder(QTextBoundaryFinder::Word, text);
- finder.setPosition(anchor);
-
- const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
- if (anchor < text.length() && (!(reasons & QTextBoundaryFinder::StartWord)
- || ((reasons & QTextBoundaryFinder::EndWord) && anchor > cursor))) {
- finder.toPreviousBoundary();
- }
- anchor = finder.position() != -1 ? finder.position() : 0;
-
- finder.setPosition(pos);
- if (pos > 0 && !finder.boundaryReasons())
- finder.toNextBoundary();
- const int cursor = finder.position() != -1 ? finder.position() : text.length();
-
- d->control->setSelection(anchor, cursor - anchor);
- } else if (anchor > pos || (anchor == pos && cursor > pos)) {
- const QString text = d->control->text();
- QTextBoundaryFinder finder(QTextBoundaryFinder::Word, text);
- finder.setPosition(anchor);
-
- const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
- if (anchor > 0 && (!(reasons & QTextBoundaryFinder::EndWord)
- || ((reasons & QTextBoundaryFinder::StartWord) && anchor < cursor))) {
- finder.toNextBoundary();
- }
- anchor = finder.position() != -1 ? finder.position() : text.length();
-
- finder.setPosition(pos);
- if (pos < text.length() && !finder.boundaryReasons())
- finder.toPreviousBoundary();
- const int cursor = finder.position() != -1 ? finder.position() : 0;
-
- d->control->setSelection(anchor, cursor - anchor);
- }
- }
-}
-
-/*!
- \qmlmethod void TextInput::openSoftwareInputPanel()
-
- Opens software input panels like virtual keyboards for typing, useful for
- customizing when you want the input keyboard to be shown and hidden in
- your application.
-
- By default the opening of input panels follows the platform style. On Symbian^1 and
- Symbian^3 -based devices the panels are opened by clicking TextInput. On other platforms
- the panels are automatically opened when TextInput element gains active focus. Input panels are
- always closed if no editor has active focus.
-
- . You can disable the automatic behavior by setting the property \c activeFocusOnPress to false
- and use functions openSoftwareInputPanel() and closeSoftwareInputPanel() to implement
- the behavior you want.
-
- Only relevant on platforms, which provide virtual keyboards.
-
- \qml
- import QtQuick 1.0
- TextInput {
- id: textInput
- text: "Hello world!"
- activeFocusOnPress: false
- MouseArea {
- anchors.fill: parent
- onClicked: {
- if (!textInput.activeFocus) {
- textInput.forceActiveFocus()
- textInput.openSoftwareInputPanel();
- } else {
- textInput.focus = false;
- }
- }
- onPressAndHold: textInput.closeSoftwareInputPanel();
- }
- }
- \endqml
-*/
-void QDeclarativeTextInput::openSoftwareInputPanel()
-{
- QEvent event(QEvent::RequestSoftwareInputPanel);
- if (qApp) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
- }
-}
-
-/*!
- \qmlmethod void TextInput::closeSoftwareInputPanel()
-
- Closes a software input panel like a virtual keyboard shown on the screen, useful
- for customizing when you want the input keyboard to be shown and hidden in
- your application.
-
- By default the opening of input panels follows the platform style. On Symbian^1 and
- Symbian^3 -based devices the panels are opened by clicking TextInput. On other platforms
- the panels are automatically opened when TextInput element gains active focus. Input panels are
- always closed if no editor has active focus.
-
- . You can disable the automatic behavior by setting the property \c activeFocusOnPress to false
- and use functions openSoftwareInputPanel() and closeSoftwareInputPanel() to implement
- the behavior you want.
-
- Only relevant on platforms, which provide virtual keyboards.
-
- \qml
- import QtQuick 1.0
- TextInput {
- id: textInput
- text: "Hello world!"
- activeFocusOnPress: false
- MouseArea {
- anchors.fill: parent
- onClicked: {
- if (!textInput.activeFocus) {
- textInput.forceActiveFocus();
- textInput.openSoftwareInputPanel();
- } else {
- textInput.focus = false;
- }
- }
- onPressAndHold: textInput.closeSoftwareInputPanel();
- }
- }
- \endqml
-*/
-void QDeclarativeTextInput::closeSoftwareInputPanel()
-{
- QEvent event(QEvent::CloseSoftwareInputPanel);
- if (qApp) {
- QEvent event(QEvent::CloseSoftwareInputPanel);
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
- }
-}
-
-void QDeclarativeTextInput::focusInEvent(QFocusEvent *event)
-{
- Q_D(const QDeclarativeTextInput);
- if (d->showInputPanelOnFocus) {
- if (d->focusOnPress && !isReadOnly()) {
- openSoftwareInputPanel();
- }
- }
- QDeclarativePaintedItem::focusInEvent(event);
-}
-
-/*!
- \qmlproperty bool TextInput::inputMethodComposing
-
- \since QtQuick 1.1
-
- This property holds whether the TextInput has partial text input from an
- input method.
-
- While it is composing an input method may rely on mouse or key events from
- the TextInput to edit or commit the partial text. This property can be
- used to determine when to disable events handlers that may interfere with
- the correct operation of an input method.
-*/
-bool QDeclarativeTextInput::isInputMethodComposing() const
-{
- Q_D(const QDeclarativeTextInput);
- return d->control->preeditAreaText().length() > 0;
-}
-
-void QDeclarativeTextInputPrivate::init()
-{
- Q_Q(QDeclarativeTextInput);
- control->setParent(q);//Now mandatory due to accessibility changes
- control->setCursorWidth(1);
- control->setPasswordCharacter(QLatin1Char('*'));
- q->setSmooth(smooth);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFlag(QGraphicsItem::ItemHasNoContents, false);
- q->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
- q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
- q, SLOT(cursorPosChanged()));
- q->connect(control, SIGNAL(selectionChanged()),
- q, SLOT(selectionChanged()));
- q->connect(control, SIGNAL(textChanged(QString)),
- q, SLOT(q_textChanged()));
- q->connect(control, SIGNAL(accepted()),
- q, SIGNAL(accepted()));
- q->connect(control, SIGNAL(updateNeeded(QRect)),
- q, SLOT(updateRect(QRect)));
-#ifndef QT_NO_CLIPBOARD
- q->connect(q, SIGNAL(readOnlyChanged(bool)),
- q, SLOT(q_canPasteChanged()));
- q->connect(QApplication::clipboard(), SIGNAL(dataChanged()),
- q, SLOT(q_canPasteChanged()));
- canPaste = !control->isReadOnly() && QApplication::clipboard()->text().length() != 0;
-#endif // QT_NO_CLIPBOARD
- q->connect(control, SIGNAL(updateMicroFocus()),
- q, SLOT(updateCursorRectangle()));
- q->connect(control, SIGNAL(displayTextChanged(QString)),
- q, SLOT(updateRect()));
- q->updateSize();
- oldValidity = control->hasAcceptableInput();
- lastSelectionStart = 0;
- lastSelectionEnd = 0;
- QPalette p = control->palette();
- selectedTextColor = p.color(QPalette::HighlightedText);
- selectionColor = p.color(QPalette::Highlight);
- determineHorizontalAlignment();
-}
-
-void QDeclarativeTextInput::cursorPosChanged()
-{
- Q_D(QDeclarativeTextInput);
- updateCursorRectangle();
- emit cursorPositionChanged();
- d->control->resetCursorBlinkTimer();
-
- if(!d->control->hasSelectedText()){
- if(d->lastSelectionStart != d->control->cursor()){
- d->lastSelectionStart = d->control->cursor();
- emit selectionStartChanged();
- }
- if(d->lastSelectionEnd != d->control->cursor()){
- d->lastSelectionEnd = d->control->cursor();
- emit selectionEndChanged();
- }
- }
-}
-
-void QDeclarativeTextInput::updateCursorRectangle()
-{
- Q_D(QDeclarativeTextInput);
- d->updateHorizontalScroll();
- updateRect();//TODO: Only update rect between pos's
- updateMicroFocus();
- emit cursorRectangleChanged();
- if (d->cursorItem)
- d->cursorItem->setX(d->control->cursorToX() - d->hscroll);
-}
-
-void QDeclarativeTextInput::selectionChanged()
-{
- Q_D(QDeclarativeTextInput);
- updateRect();//TODO: Only update rect in selection
- emit selectedTextChanged();
-
- if(d->lastSelectionStart != d->control->selectionStart()){
- d->lastSelectionStart = d->control->selectionStart();
- if(d->lastSelectionStart == -1)
- d->lastSelectionStart = d->control->cursor();
- emit selectionStartChanged();
- }
- if(d->lastSelectionEnd != d->control->selectionEnd()){
- d->lastSelectionEnd = d->control->selectionEnd();
- if(d->lastSelectionEnd == -1)
- d->lastSelectionEnd = d->control->cursor();
- emit selectionEndChanged();
- }
-}
-
-void QDeclarativeTextInput::q_textChanged()
-{
- Q_D(QDeclarativeTextInput);
- updateSize();
- d->determineHorizontalAlignment();
- d->updateHorizontalScroll();
- updateMicroFocus();
- emit textChanged();
- emit displayTextChanged();
- if(hasAcceptableInput() != d->oldValidity){
- d->oldValidity = hasAcceptableInput();
- emit acceptableInputChanged();
- }
-}
-
-void QDeclarativeTextInput::updateRect(const QRect &r)
-{
- Q_D(QDeclarativeTextInput);
- if(r == QRect())
- clearCache();
- else
- dirtyCache(QRect(r.x() - d->hscroll, r.y(), r.width(), r.height()));
- update();
-}
-
-QRectF QDeclarativeTextInput::boundingRect() const
-{
- Q_D(const QDeclarativeTextInput);
- QRectF r = QDeclarativePaintedItem::boundingRect();
-
- int cursorWidth = d->cursorItem ? d->cursorItem->width() : d->control->cursorWidth();
-
- // Could include font max left/right bearings to either side of rectangle.
-
- r.setRight(r.right() + cursorWidth);
- return r;
-}
-
-void QDeclarativeTextInput::updateSize(bool needsRedraw)
-{
- Q_D(QDeclarativeTextInput);
- int w = width();
- int h = height();
- setImplicitHeight(d->control->height()-1); // -1 to counter QLineControl's +1 which is not consistent with Text.
- setImplicitWidth(d->calculateTextWidth());
- setContentsSize(QSize(width(), height()));//Repaints if changed
- if(w==width() && h==height() && needsRedraw){
- clearCache();
- update();
- }
-}
-
-void QDeclarativeTextInput::q_canPasteChanged()
-{
- Q_D(QDeclarativeTextInput);
- bool old = d->canPaste;
-#ifndef QT_NO_CLIPBOARD
- d->canPaste = !d->control->isReadOnly() && QApplication::clipboard()->text().length() != 0;
-#endif
- if(d->canPaste != old)
- emit canPasteChanged();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_LINEEDIT
-
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p.h
deleted file mode 100644
index 8b7fff9cfb..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextinput_p.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXTINPUT_H
-#define QDECLARATIVETEXTINPUT_H
-
-#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativeimplicitsizeitem_p.h"
-
-#include <QGraphicsSceneMouseEvent>
-#include <QIntValidator>
-
-#ifndef QT_NO_LINEEDIT
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeTextInputPrivate;
-class QValidator;
-class Q_AUTOTEST_EXPORT QDeclarativeTextInput : public QDeclarativeImplicitSizePaintedItem
-{
- Q_OBJECT
- Q_ENUMS(HAlignment)
- Q_ENUMS(EchoMode)
- Q_ENUMS(SelectionMode)
-
- Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
- Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged)
- Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged)
- Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
- Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged)
- Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1)
- Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
- Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged)
- Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
- Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
- Q_PROPERTY(QDeclarativeComponent *cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged)
- Q_PROPERTY(int selectionStart READ selectionStart NOTIFY selectionStartChanged)
- Q_PROPERTY(int selectionEnd READ selectionEnd NOTIFY selectionEndChanged)
- Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectedTextChanged)
-
- Q_PROPERTY(int maximumLength READ maxLength WRITE setMaxLength NOTIFY maximumLengthChanged)
-#ifndef QT_NO_VALIDATOR
- Q_PROPERTY(QValidator* validator READ validator WRITE setValidator NOTIFY validatorChanged)
-#endif
- Q_PROPERTY(QString inputMask READ inputMask WRITE setInputMask NOTIFY inputMaskChanged)
- Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ imHints WRITE setIMHints)
-
- Q_PROPERTY(bool acceptableInput READ hasAcceptableInput NOTIFY acceptableInputChanged)
- Q_PROPERTY(EchoMode echoMode READ echoMode WRITE setEchoMode NOTIFY echoModeChanged)
- Q_PROPERTY(bool activeFocusOnPress READ focusOnPress WRITE setFocusOnPress NOTIFY activeFocusOnPressChanged)
- Q_PROPERTY(QString passwordCharacter READ passwordCharacter WRITE setPasswordCharacter NOTIFY passwordCharacterChanged)
- Q_PROPERTY(QString displayText READ displayText NOTIFY displayTextChanged)
- Q_PROPERTY(bool autoScroll READ autoScroll WRITE setAutoScroll NOTIFY autoScrollChanged)
- Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
- Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged REVISION 1)
- Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged REVISION 1)
- Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged REVISION 1)
-
-public:
- QDeclarativeTextInput(QDeclarativeItem* parent=0);
- ~QDeclarativeTextInput();
-
- enum EchoMode {//To match QLineEdit::EchoMode
- Normal,
- NoEcho,
- Password,
- PasswordEchoOnEdit
- };
-
- enum HAlignment {
- AlignLeft = Qt::AlignLeft,
- AlignRight = Qt::AlignRight,
- AlignHCenter = Qt::AlignHCenter
- };
-
- enum SelectionMode {
- SelectCharacters,
- SelectWords
- };
-
- enum CursorPosition {
- CursorBetweenCharacters,
- CursorOnCharacter
- };
-
- //Auxilliary functions needed to control the TextInput from QML
- Q_INVOKABLE int positionAt(int x) const;
- Q_INVOKABLE Q_REVISION(1) int positionAt(int x, CursorPosition position) const;
- Q_INVOKABLE QRectF positionToRectangle(int pos) const;
- Q_INVOKABLE void moveCursorSelection(int pos);
- Q_INVOKABLE Q_REVISION(1) void moveCursorSelection(int pos, SelectionMode mode);
-
- Q_INVOKABLE void openSoftwareInputPanel();
- Q_INVOKABLE void closeSoftwareInputPanel();
-
- QString text() const;
- void setText(const QString &);
-
- QFont font() const;
- void setFont(const QFont &font);
-
- QColor color() const;
- void setColor(const QColor &c);
-
- QColor selectionColor() const;
- void setSelectionColor(const QColor &c);
-
- QColor selectedTextColor() const;
- void setSelectedTextColor(const QColor &c);
-
- HAlignment hAlign() const;
- void setHAlign(HAlignment align);
- void resetHAlign();
- HAlignment effectiveHAlign() const;
-
- bool isReadOnly() const;
- void setReadOnly(bool);
-
- bool isCursorVisible() const;
- void setCursorVisible(bool on);
-
- int cursorPosition() const;
- void setCursorPosition(int cp);
-
- QRect cursorRectangle() const;
-
- int selectionStart() const;
- int selectionEnd() const;
-
- QString selectedText() const;
-
- int maxLength() const;
- void setMaxLength(int ml);
-
-#ifndef QT_NO_VALIDATOR
- QValidator * validator() const;
- void setValidator(QValidator* v);
-#endif
- QString inputMask() const;
- void setInputMask(const QString &im);
-
- EchoMode echoMode() const;
- void setEchoMode(EchoMode echo);
-
- QString passwordCharacter() const;
- void setPasswordCharacter(const QString &str);
-
- QString displayText() const;
-
- QDeclarativeComponent* cursorDelegate() const;
- void setCursorDelegate(QDeclarativeComponent*);
-
- bool focusOnPress() const;
- void setFocusOnPress(bool);
-
- bool autoScroll() const;
- void setAutoScroll(bool);
-
- bool selectByMouse() const;
- void setSelectByMouse(bool);
-
- SelectionMode mouseSelectionMode() const;
- void setMouseSelectionMode(SelectionMode mode);
-
- bool hasAcceptableInput() const;
-
- void drawContents(QPainter *p,const QRect &r);
- QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
-
- QRectF boundingRect() const;
- bool canPaste() const;
-
- bool isInputMethodComposing() const;
-
- Qt::InputMethodHints imHints() const;
- void setIMHints(Qt::InputMethodHints hints);
-
-Q_SIGNALS:
- void textChanged();
- void cursorPositionChanged();
- void cursorRectangleChanged();
- void selectionStartChanged();
- void selectionEndChanged();
- void selectedTextChanged();
- void accepted();
- void acceptableInputChanged();
- void colorChanged(const QColor &color);
- void selectionColorChanged(const QColor &color);
- void selectedTextColorChanged(const QColor &color);
- void fontChanged(const QFont &font);
- void horizontalAlignmentChanged(HAlignment alignment);
- void readOnlyChanged(bool isReadOnly);
- void cursorVisibleChanged(bool isCursorVisible);
- void cursorDelegateChanged();
- void maximumLengthChanged(int maximumLength);
- void validatorChanged();
- void inputMaskChanged(const QString &inputMask);
- void echoModeChanged(EchoMode echoMode);
- void passwordCharacterChanged();
- void displayTextChanged();
- void activeFocusOnPressChanged(bool activeFocusOnPress);
- void autoScrollChanged(bool autoScroll);
- void selectByMouseChanged(bool selectByMouse);
- Q_REVISION(1) void mouseSelectionModeChanged(SelectionMode mode);
- Q_REVISION(1) void canPasteChanged();
- Q_REVISION(1) void inputMethodComposingChanged();
- Q_REVISION(1) void effectiveHorizontalAlignmentChanged();
-
-protected:
- virtual void geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry);
-
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
- bool sceneEvent(QEvent *event);
- void keyPressEvent(QKeyEvent* ev);
- void inputMethodEvent(QInputMethodEvent *);
- bool event(QEvent *e);
- void focusInEvent(QFocusEvent *event);
-
-public Q_SLOTS:
- void selectAll();
- void selectWord();
- void select(int start, int end);
- Q_REVISION(1) void deselect();
- Q_REVISION(1) bool isRightToLeft(int start, int end);
-#ifndef QT_NO_CLIPBOARD
- void cut();
- void copy();
- void paste();
-#endif
-
-private Q_SLOTS:
- void updateSize(bool needsRedraw = true);
- void q_textChanged();
- void selectionChanged();
- void createCursor();
- void cursorPosChanged();
- void updateCursorRectangle();
- void updateRect(const QRect &r = QRect());
- void q_canPasteChanged();
-
-private:
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeTextInput)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeTextInput)
-#ifndef QT_NO_VALIDATOR
-QML_DECLARE_TYPE(QValidator)
-QML_DECLARE_TYPE(QIntValidator)
-QML_DECLARE_TYPE(QDoubleValidator)
-QML_DECLARE_TYPE(QRegExpValidator)
-#endif
-
-QT_END_HEADER
-
-#endif // QT_NO_LINEEDIT
-
-#endif // QDECLARATIVETEXTINPUT_H
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
deleted file mode 100644
index 947ddc7bfa..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXTINPUT_P_H
-#define QDECLARATIVETEXTINPUT_P_H
-
-#include "private/qdeclarativetextinput_p.h"
-
-#include "private/qdeclarativeimplicitsizeitem_p_p.h"
-
-#include <qdeclarative.h>
-
-#include <QPointer>
-
-#include <private/qlinecontrol_p.h>
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-
-#ifndef QT_NO_LINEEDIT
-
-QT_BEGIN_NAMESPACE
-
-class Q_AUTOTEST_EXPORT QDeclarativeTextInputPrivate : public QDeclarativeImplicitSizePaintedItemPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeTextInput)
-public:
- QDeclarativeTextInputPrivate() : control(new QLineControl),
- color((QRgb)0), style(QDeclarativeText::Normal),
- styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
- mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone),
- hscroll(0), oldScroll(0), oldValidity(false), focused(false), focusOnPress(true),
- showInputPanelOnFocus(true), clickCausedFocus(false), cursorVisible(false),
- autoScroll(true), selectByMouse(false), canPaste(false), hAlignImplicit(true),
- selectPressed(false)
- {
-#ifdef Q_OS_SYMBIAN
- if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
- showInputPanelOnFocus = false;
- }
-#endif
- }
-
- ~QDeclarativeTextInputPrivate()
- {
- }
-
- int xToPos(int x, QTextLine::CursorPosition betweenOrOn = QTextLine::CursorBetweenCharacters) const
- {
- Q_Q(const QDeclarativeTextInput);
- QRect cr = q->boundingRect().toRect();
- x-= cr.x() - hscroll;
- return control->xToPos(x, betweenOrOn);
- }
-
- void init();
- void startCreatingCursor();
- void focusChanged(bool hasFocus);
- void updateHorizontalScroll();
- bool determineHorizontalAlignment();
- bool setHAlign(QDeclarativeTextInput::HAlignment, bool forceAlign = false);
- void mirrorChange();
- int calculateTextWidth();
- bool sendMouseEventToInputContext(QGraphicsSceneMouseEvent *event, QEvent::Type eventType);
- void updateInputMethodHints();
-
- QLineControl* control;
-
- QFont font;
- QFont sourceFont;
- QColor color;
- QColor selectionColor;
- QColor selectedTextColor;
- QDeclarativeText::TextStyle style;
- QColor styleColor;
- QDeclarativeTextInput::HAlignment hAlign;
- QDeclarativeTextInput::SelectionMode mouseSelectionMode;
- Qt::InputMethodHints inputMethodHints;
- QPointer<QDeclarativeComponent> cursorComponent;
- QPointer<QDeclarativeItem> cursorItem;
- QPointF pressPos;
-
- int lastSelectionStart;
- int lastSelectionEnd;
- int oldHeight;
- int oldWidth;
- int hscroll;
- int oldScroll;
- bool oldValidity:1;
- bool focused:1;
- bool focusOnPress:1;
- bool showInputPanelOnFocus:1;
- bool clickCausedFocus:1;
- bool cursorVisible:1;
- bool autoScroll:1;
- bool selectByMouse:1;
- bool canPaste:1;
- bool hAlignImplicit:1;
- bool selectPressed:1;
-
- static inline QDeclarativeTextInputPrivate *get(QDeclarativeTextInput *t) {
- return t->d_func();
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_LINEEDIT
-
-#endif
-
diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
deleted file mode 100644
index e7bcf1f460..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativetextlayout_p.h"
-#include <private/qstatictext_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qtextengine_p.h>
-#include <private/qpainter_p.h>
-#include <private/qpaintengineex_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeTextLayoutPrivate
-{
-public:
- QDeclarativeTextLayoutPrivate()
- : cached(false) {}
-
- QPointF position;
-
- bool cached;
- QVector<QStaticTextItem> items;
- QVector<QFixedPoint> positions;
- QVector<glyph_t> glyphs;
- QVector<QChar> chars;
-};
-
-namespace {
-class DrawTextItemRecorder: public QPaintEngine
-{
- public:
- DrawTextItemRecorder(bool untransformedCoordinates, bool useBackendOptimizations)
- : m_inertText(0), m_dirtyPen(false), m_useBackendOptimizations(useBackendOptimizations),
- m_untransformedCoordinates(untransformedCoordinates), m_currentColor(Qt::black)
- {
- }
-
- virtual void updateState(const QPaintEngineState &newState)
- {
- if (newState.state() & QPaintEngine::DirtyPen
- && newState.pen().color() != m_currentColor) {
- m_dirtyPen = true;
- m_currentColor = newState.pen().color();
- }
- }
-
- virtual void drawTextItem(const QPointF &position, const QTextItem &textItem)
- {
- int glyphOffset = m_inertText->glyphs.size(); // Store offset into glyph pool
- int positionOffset = m_inertText->glyphs.size(); // Offset into position pool
- int charOffset = m_inertText->chars.size();
-
- const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem);
-
- bool needFreshCurrentItem = true;
- if (!m_inertText->items.isEmpty()) {
- QStaticTextItem &last = m_inertText->items[m_inertText->items.count() - 1];
-
- if (last.fontEngine() == ti.fontEngine && last.font == ti.font() &&
- (!m_dirtyPen || last.color == state->pen().color())) {
- needFreshCurrentItem = false;
-
- last.numChars += ti.num_chars;
-
- }
- }
-
- if (needFreshCurrentItem) {
- QStaticTextItem currentItem;
-
- currentItem.setFontEngine(ti.fontEngine);
- currentItem.font = ti.font();
- currentItem.charOffset = charOffset;
- currentItem.numChars = ti.num_chars;
- currentItem.numGlyphs = 0;
- currentItem.glyphOffset = glyphOffset;
- currentItem.positionOffset = positionOffset;
- currentItem.useBackendOptimizations = m_useBackendOptimizations;
- if (m_dirtyPen)
- currentItem.color = m_currentColor;
-
- m_inertText->items.append(currentItem);
- }
-
- QStaticTextItem &currentItem = m_inertText->items.last();
-
- QTransform matrix = m_untransformedCoordinates ? QTransform() : state->transform();
- matrix.translate(position.x(), position.y());
-
- QVarLengthArray<glyph_t> glyphs;
- QVarLengthArray<QFixedPoint> positions;
- ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions);
-
- int size = glyphs.size();
- Q_ASSERT(size == positions.size());
- currentItem.numGlyphs += size;
-
- m_inertText->glyphs.resize(m_inertText->glyphs.size() + size);
- m_inertText->positions.resize(m_inertText->glyphs.size());
- m_inertText->chars.resize(m_inertText->chars.size() + ti.num_chars);
-
- glyph_t *glyphsDestination = m_inertText->glyphs.data() + glyphOffset;
- qMemCopy(glyphsDestination, glyphs.constData(), sizeof(glyph_t) * size);
-
- QFixedPoint *positionsDestination = m_inertText->positions.data() + positionOffset;
- qMemCopy(positionsDestination, positions.constData(), sizeof(QFixedPoint) * size);
-
- QChar *charsDestination = m_inertText->chars.data() + charOffset;
- qMemCopy(charsDestination, ti.chars, sizeof(QChar) * ti.num_chars);
-
- }
-
- virtual void drawPolygon(const QPointF *, int , PolygonDrawMode )
- {
- /* intentionally empty */
- }
-
- virtual bool begin(QPaintDevice *) { return true; }
- virtual bool end() { return true; }
- virtual void drawPixmap(const QRectF &, const QPixmap &, const QRectF &) {}
- virtual Type type() const
- {
- return User;
- }
-
- void begin(QDeclarativeTextLayoutPrivate *t) {
- m_inertText = t;
- m_dirtyPen = false;
- }
-
- private:
- QDeclarativeTextLayoutPrivate *m_inertText;
-
- bool m_dirtyPen;
- bool m_useBackendOptimizations;
- bool m_untransformedCoordinates;
- QColor m_currentColor;
-};
-
-class DrawTextItemDevice: public QPaintDevice
-{
- public:
- DrawTextItemDevice(bool untransformedCoordinates, bool useBackendOptimizations)
- {
- m_paintEngine = new DrawTextItemRecorder(untransformedCoordinates,
- useBackendOptimizations);
- }
-
- ~DrawTextItemDevice()
- {
- delete m_paintEngine;
- }
-
- void begin(QDeclarativeTextLayoutPrivate *t) {
- m_paintEngine->begin(t);
- }
-
- int metric(PaintDeviceMetric m) const
- {
- int val;
- switch (m) {
- case PdmWidth:
- case PdmHeight:
- case PdmWidthMM:
- case PdmHeightMM:
- val = 0;
- break;
- case PdmDpiX:
- case PdmPhysicalDpiX:
- val = qt_defaultDpiX();
- break;
- case PdmDpiY:
- case PdmPhysicalDpiY:
- val = qt_defaultDpiY();
- break;
- case PdmNumColors:
- val = 16777216;
- break;
- case PdmDepth:
- val = 24;
- break;
- default:
- val = 0;
- qWarning("DrawTextItemDevice::metric: Invalid metric command");
- }
- return val;
- }
-
- virtual QPaintEngine *paintEngine() const
- {
- return m_paintEngine;
- }
-
- private:
- DrawTextItemRecorder *m_paintEngine;
-};
-
-struct InertTextPainter {
- InertTextPainter()
- : device(true, true), painter(&device) {}
-
- DrawTextItemDevice device;
- QPainter painter;
-};
-}
-
-Q_GLOBAL_STATIC(InertTextPainter, inertTextPainter);
-
-/*!
-\class QDeclarativeTextLayout
-\brief The QDeclarativeTextLayout class is a version of QStaticText that works with QTextLayouts.
-\internal
-
-This class is basically a copy of the QStaticText code, but it is adapted to source its text from
-QTextLayout.
-
-It is also considerably faster to create a QDeclarativeTextLayout than a QStaticText because it uses
-a single, shared QPainter instance. QStaticText by comparison creates a new QPainter per instance.
-As a consequence this means that QDeclarativeTextLayout is not re-enterant. Adding a lock around
-the shared painter solves this, and only introduces a minor performance penalty, but is unnecessary
-for QDeclarativeTextLayout's current use (QDeclarativeText is already tied to the GUI thread).
-*/
-
-QDeclarativeTextLayout::QDeclarativeTextLayout()
-: d(0)
-{
-}
-
-QDeclarativeTextLayout::QDeclarativeTextLayout(const QString &text)
-: QTextLayout(text), d(0)
-{
-}
-
-QDeclarativeTextLayout::~QDeclarativeTextLayout()
-{
- if (d) delete d;
-}
-
-void QDeclarativeTextLayout::beginLayout()
-{
- if (d && d->cached) {
- d->cached = false;
- d->items.clear();
- d->positions.clear();
- d->glyphs.clear();
- d->chars.clear();
- d->position = QPointF();
- }
- QTextLayout::beginLayout();
-}
-
-void QDeclarativeTextLayout::clearLayout()
-{
- if (d && d->cached) {
- d->cached = false;
- d->items.clear();
- d->positions.clear();
- d->glyphs.clear();
- d->chars.clear();
- d->position = QPointF();
- }
- QTextLayout::clearLayout();
-}
-
-void QDeclarativeTextLayout::prepare()
-{
- if (!d || !d->cached) {
-
- if (!d)
- d = new QDeclarativeTextLayoutPrivate;
-
- InertTextPainter *itp = inertTextPainter();
- itp->device.begin(d);
- QTextLayout::draw(&itp->painter, QPointF(0, 0));
-
- glyph_t *glyphPool = d->glyphs.data();
- QFixedPoint *positionPool = d->positions.data();
- QChar *charPool = d->chars.data();
-
- int itemCount = d->items.count();
- for (int ii = 0; ii < itemCount; ++ii) {
- QStaticTextItem &item = d->items[ii];
- item.glyphs = glyphPool + item.glyphOffset;
- item.glyphPositions = positionPool + item.positionOffset;
- item.chars = charPool + item.charOffset;
- }
-
- d->cached = true;
- }
-}
-
-// Defined in qpainter.cpp
-extern Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
- const QFixedPoint *positions, int glyphCount,
- QFontEngine *fontEngine, const QFont &font,
- const QTextCharFormat &charFormat);
-
-void QDeclarativeTextLayout::draw(QPainter *painter, const QPointF &p)
-{
- QPainterPrivate *priv = QPainterPrivate::get(painter);
-
- bool paintEngineSupportsTransformations = priv->extended &&
- (priv->extended->type() == QPaintEngine::OpenGL2 ||
- priv->extended->type() == QPaintEngine::OpenVG ||
- priv->extended->type() == QPaintEngine::OpenGL);
-
- if (!paintEngineSupportsTransformations || !priv->state->matrix.isAffine()) {
- QTextLayout::draw(painter, p);
- return;
- }
-
- prepare();
-
- int itemCount = d->items.count();
-
- if (p != d->position) {
- QFixed fx = QFixed::fromReal(p.x());
- QFixed fy = QFixed::fromReal(p.y());
- QFixed oldX = QFixed::fromReal(d->position.x());
- QFixed oldY = QFixed::fromReal(d->position.y());
- for (int item = 0; item < itemCount; ++item) {
- QStaticTextItem &textItem = d->items[item];
-
- for (int ii = 0; ii < textItem.numGlyphs; ++ii) {
- textItem.glyphPositions[ii].x += fx - oldX;
- textItem.glyphPositions[ii].y += fy - oldY;
- }
- textItem.userDataNeedsUpdate = true;
- }
-
- d->position = p;
- }
-
- QPen oldPen = priv->state->pen;
- QColor currentColor = oldPen.color();
- for (int ii = 0; ii < itemCount; ++ii) {
- QStaticTextItem &item = d->items[ii];
- if (item.color.isValid() && currentColor != item.color) {
- painter->setPen(item.color);
- currentColor = item.color;
- }
- priv->extended->drawStaticTextItem(&item);
-
- qt_draw_decoration_for_glyphs(painter, item.glyphs, item.glyphPositions,
- item.numGlyphs, item.fontEngine(), painter->font(),
- QTextCharFormat());
- }
- if (currentColor != oldPen.color())
- painter->setPen(oldPen);
-}
-
-QT_END_NAMESPACE
-
diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout_p.h b/src/declarative/graphicsitems/qdeclarativetextlayout_p.h
deleted file mode 100644
index d83ce7e4ce..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetextlayout_p.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETEXTLAYOUT_P_H
-#define QDECLARATIVETEXTLAYOUT_P_H
-
-#include <QtGui/qtextlayout.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeTextLayoutPrivate;
-class QDeclarativeTextLayout : public QTextLayout
-{
-public:
- QDeclarativeTextLayout();
- QDeclarativeTextLayout(const QString &);
- ~QDeclarativeTextLayout();
-
- void beginLayout();
- void clearLayout();
-
- void prepare();
- void draw(QPainter *, const QPointF & = QPointF());
-
-private:
- QDeclarativeTextLayoutPrivate *d;
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVETEXTLAYOUT_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativetranslate.cpp b/src/declarative/graphicsitems/qdeclarativetranslate.cpp
deleted file mode 100644
index 186a56aef6..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetranslate.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativetranslate_p.h"
-#include <private/qgraphicstransform_p.h>
-#include <QDebug>
-#include <QtCore/qmath.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeTranslatePrivate : public QGraphicsTransformPrivate
-{
-public:
- QDeclarativeTranslatePrivate()
- : x(0), y(0) {}
- qreal x;
- qreal y;
-};
-
-/*!
- Constructs an empty QDeclarativeTranslate object with the given \a parent.
-*/
-QDeclarativeTranslate::QDeclarativeTranslate(QObject *parent)
- : QGraphicsTransform(*new QDeclarativeTranslatePrivate, parent)
-{
-}
-
-/*!
- Destroys the graphics scale.
-*/
-QDeclarativeTranslate::~QDeclarativeTranslate()
-{
-}
-
-/*!
- \property QDeclarativeTranslate::x
- \brief the horizontal translation.
-
- The translation can be any real number; the default value is 0.0.
-
- \sa y
-*/
-qreal QDeclarativeTranslate::x() const
-{
- Q_D(const QDeclarativeTranslate);
- return d->x;
-}
-void QDeclarativeTranslate::setX(qreal x)
-{
- Q_D(QDeclarativeTranslate);
- if (d->x == x)
- return;
- d->x = x;
- update();
- emit xChanged();
-}
-
-/*!
- \property QDeclarativeTranslate::y
- \brief the vertical translation.
-
- The translation can be any real number; the default value is 0.0.
-
- \sa x
-*/
-qreal QDeclarativeTranslate::y() const
-{
- Q_D(const QDeclarativeTranslate);
- return d->y;
-}
-void QDeclarativeTranslate::setY(qreal y)
-{
- Q_D(QDeclarativeTranslate);
- if (d->y == y)
- return;
- d->y = y;
- update();
- emit yChanged();
-}
-
-void QDeclarativeTranslate::applyTo(QMatrix4x4 *matrix) const
-{
- Q_D(const QDeclarativeTranslate);
- matrix->translate(d->x, d->y, 0);
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetranslate_p.h b/src/declarative/graphicsitems/qdeclarativetranslate_p.h
deleted file mode 100644
index b67ff229a1..0000000000
--- a/src/declarative/graphicsitems/qdeclarativetranslate_p.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVETRANSLATE_H
-#define QDECLARATIVETRANSLATE_H
-
-#include "qdeclarativeitem.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeTranslatePrivate;
-
-class Q_AUTOTEST_EXPORT QDeclarativeTranslate : public QGraphicsTransform
-{
- Q_OBJECT
-
- Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
- Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
-
-public:
- QDeclarativeTranslate(QObject *parent = 0);
- ~QDeclarativeTranslate();
-
- qreal x() const;
- void setX(qreal);
-
- qreal y() const;
- void setY(qreal);
-
- void applyTo(QMatrix4x4 *matrix) const;
-
-Q_SIGNALS:
- void xChanged();
- void yChanged();
-
-private:
- Q_DECLARE_PRIVATE(QDeclarativeTranslate)
- Q_DISABLE_COPY(QDeclarativeTranslate)
-};
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeTranslate)
-
-QT_END_HEADER
-
-#endif
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
deleted file mode 100644
index 26757b57ec..0000000000
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ /dev/null
@@ -1,1425 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativevisualitemmodel_p.h"
-
-#include "qdeclarativeitem.h"
-
-#include <qdeclarativecontext.h>
-#include <qdeclarativecontext_p.h>
-#include <qdeclarativeengine.h>
-#include <qdeclarativeexpression.h>
-#include <qdeclarativepackage_p.h>
-#include <qdeclarativeopenmetaobject_p.h>
-#include <qdeclarativelistaccessor_p.h>
-#include <qdeclarativeinfo.h>
-#include <qdeclarativedata_p.h>
-#include <qdeclarativepropertycache_p.h>
-#include <qdeclarativeguard_p.h>
-#include <qdeclarativeglobal_p.h>
-
-#include <qgraphicsscene.h>
-#include <qlistmodelinterface_p.h>
-#include <qhash.h>
-#include <qlist.h>
-#include <qmetaobjectbuilder_p.h>
-#include <QtCore/qdebug.h>
-
-#include <private/qobject_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QHash<QObject*, QDeclarativeVisualItemModelAttached*> QDeclarativeVisualItemModelAttached::attachedProperties;
-
-
-class QDeclarativeVisualItemModelPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeVisualItemModel)
-public:
- QDeclarativeVisualItemModelPrivate() : QObjectPrivate() {}
-
- static void children_append(QDeclarativeListProperty<QDeclarativeItem> *prop, QDeclarativeItem *item) {
- QDeclarative_setParent_noEvent(item, prop->object);
- static_cast<QDeclarativeVisualItemModelPrivate *>(prop->data)->children.append(Item(item));
- static_cast<QDeclarativeVisualItemModelPrivate *>(prop->data)->itemAppended();
- static_cast<QDeclarativeVisualItemModelPrivate *>(prop->data)->emitChildrenChanged();
- }
-
- static int children_count(QDeclarativeListProperty<QDeclarativeItem> *prop) {
- return static_cast<QDeclarativeVisualItemModelPrivate *>(prop->data)->children.count();
- }
-
- static QDeclarativeItem *children_at(QDeclarativeListProperty<QDeclarativeItem> *prop, int index) {
- return static_cast<QDeclarativeVisualItemModelPrivate *>(prop->data)->children.at(index).item;
- }
-
- void itemAppended() {
- Q_Q(QDeclarativeVisualItemModel);
- QDeclarativeVisualItemModelAttached *attached = QDeclarativeVisualItemModelAttached::properties(children.last().item);
- attached->setIndex(children.count()-1);
- emit q->itemsInserted(children.count()-1, 1);
- emit q->countChanged();
- }
-
- void emitChildrenChanged() {
- Q_Q(QDeclarativeVisualItemModel);
- emit q->childrenChanged();
- }
-
- int indexOf(QDeclarativeItem *item) const {
- for (int i = 0; i < children.count(); ++i)
- if (children.at(i).item == item)
- return i;
- return -1;
- }
-
- class Item {
- public:
- Item(QDeclarativeItem *i) : item(i), ref(0) {}
-
- void addRef() { ++ref; }
- bool deref() { return --ref == 0; }
-
- QDeclarativeItem *item;
- int ref;
- };
-
- QList<Item> children;
-};
-
-
-/*!
- \qmlclass VisualItemModel QDeclarativeVisualItemModel
- \ingroup qml-working-with-data
- \since 4.7
- \brief The VisualItemModel allows items to be provided to a view.
-
- A VisualItemModel contains the visual items to be used in a view.
- When a VisualItemModel is used in a view, the view does not require
- a delegate since the VisualItemModel already contains the visual
- delegate (items).
-
- An item can determine its index within the
- model via the \l{VisualItemModel::index}{index} attached property.
-
- The example below places three colored rectangles in a ListView.
- \code
- import QtQuick 1.0
-
- Rectangle {
- VisualItemModel {
- id: itemModel
- Rectangle { height: 30; width: 80; color: "red" }
- Rectangle { height: 30; width: 80; color: "green" }
- Rectangle { height: 30; width: 80; color: "blue" }
- }
-
- ListView {
- anchors.fill: parent
- model: itemModel
- }
- }
- \endcode
-
- \image visualitemmodel.png
-
- \sa {declarative/modelviews/visualitemmodel}{VisualItemModel example}
-*/
-QDeclarativeVisualItemModel::QDeclarativeVisualItemModel(QObject *parent)
- : QDeclarativeVisualModel(*(new QDeclarativeVisualItemModelPrivate), parent)
-{
-}
-
-/*!
- \qmlattachedproperty int VisualItemModel::index
- This attached property holds the index of this delegate's item within the model.
-
- It is attached to each instance of the delegate.
-*/
-
-QDeclarativeListProperty<QDeclarativeItem> QDeclarativeVisualItemModel::children()
-{
- Q_D(QDeclarativeVisualItemModel);
- return QDeclarativeListProperty<QDeclarativeItem>(this, d, d->children_append,
- d->children_count, d->children_at);
-}
-
-/*!
- \qmlproperty int VisualItemModel::count
-
- The number of items in the model. This property is readonly.
-*/
-int QDeclarativeVisualItemModel::count() const
-{
- Q_D(const QDeclarativeVisualItemModel);
- return d->children.count();
-}
-
-bool QDeclarativeVisualItemModel::isValid() const
-{
- return true;
-}
-
-QDeclarativeItem *QDeclarativeVisualItemModel::item(int index, bool)
-{
- Q_D(QDeclarativeVisualItemModel);
- QDeclarativeVisualItemModelPrivate::Item &item = d->children[index];
- item.addRef();
- return item.item;
-}
-
-QDeclarativeVisualModel::ReleaseFlags QDeclarativeVisualItemModel::release(QDeclarativeItem *item)
-{
- Q_D(QDeclarativeVisualItemModel);
- int idx = d->indexOf(item);
- if (idx >= 0) {
- if (d->children[idx].deref()) {
- if (item->scene())
- item->scene()->removeItem(item);
- QDeclarative_setParent_noEvent(item, this);
- }
- }
- return 0;
-}
-
-bool QDeclarativeVisualItemModel::completePending() const
-{
- return false;
-}
-
-void QDeclarativeVisualItemModel::completeItem()
-{
- // Nothing to do
-}
-
-QString QDeclarativeVisualItemModel::stringValue(int index, const QString &name)
-{
- Q_D(QDeclarativeVisualItemModel);
- if (index < 0 || index >= d->children.count())
- return QString();
- return QDeclarativeEngine::contextForObject(d->children.at(index).item)->contextProperty(name).toString();
-}
-
-int QDeclarativeVisualItemModel::indexOf(QDeclarativeItem *item, QObject *) const
-{
- Q_D(const QDeclarativeVisualItemModel);
- return d->indexOf(item);
-}
-
-QDeclarativeVisualItemModelAttached *QDeclarativeVisualItemModel::qmlAttachedProperties(QObject *obj)
-{
- return QDeclarativeVisualItemModelAttached::properties(obj);
-}
-
-//============================================================================
-
-class VDMDelegateDataType : public QDeclarativeOpenMetaObjectType
-{
-public:
- VDMDelegateDataType(const QMetaObject *base, QDeclarativeEngine *engine) : QDeclarativeOpenMetaObjectType(base, engine) {}
-
- void propertyCreated(int, QMetaPropertyBuilder &prop) {
- prop.setWritable(false);
- }
-};
-
-class QDeclarativeVisualDataModelParts;
-class QDeclarativeVisualDataModelData;
-class QDeclarativeVisualDataModelPrivate : public QObjectPrivate
-{
-public:
- QDeclarativeVisualDataModelPrivate(QDeclarativeContext *);
-
- static QDeclarativeVisualDataModelPrivate *get(QDeclarativeVisualDataModel *m) {
- return static_cast<QDeclarativeVisualDataModelPrivate *>(QObjectPrivate::get(m));
- }
-
- QDeclarativeGuard<QListModelInterface> m_listModelInterface;
- QDeclarativeGuard<QAbstractItemModel> m_abstractItemModel;
- QDeclarativeGuard<QDeclarativeVisualDataModel> m_visualItemModel;
- QString m_part;
-
- QDeclarativeComponent *m_delegate;
- QDeclarativeGuard<QDeclarativeContext> m_context;
- QList<int> m_roles;
- QHash<QByteArray,int> m_roleNames;
- void ensureRoles() {
- if (m_roleNames.isEmpty()) {
- if (m_listModelInterface) {
- m_roles = m_listModelInterface->roles();
- for (int ii = 0; ii < m_roles.count(); ++ii)
- m_roleNames.insert(m_listModelInterface->toString(m_roles.at(ii)).toUtf8(), m_roles.at(ii));
- } else if (m_abstractItemModel) {
- for (QHash<int,QByteArray>::const_iterator it = m_abstractItemModel->roleNames().begin();
- it != m_abstractItemModel->roleNames().end(); ++it) {
- m_roles.append(it.key());
- m_roleNames.insert(*it, it.key());
- }
- if (m_roles.count())
- m_roleNames.insert("hasModelChildren", -1);
- } else if (m_listAccessor) {
- m_roleNames.insert("modelData", 0);
- if (m_listAccessor->type() == QDeclarativeListAccessor::Instance) {
- if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
- int count = object->metaObject()->propertyCount();
- for (int ii = 1; ii < count; ++ii) {
- const QMetaProperty &prop = object->metaObject()->property(ii);
- m_roleNames.insert(prop.name(), 0);
- }
- }
- }
- }
- }
- }
-
- QHash<int,int> m_roleToPropId;
- int m_modelDataPropId;
- void createMetaData() {
- if (!m_metaDataCreated) {
- ensureRoles();
- if (m_roleNames.count()) {
- QHash<QByteArray, int>::const_iterator it = m_roleNames.begin();
- while (it != m_roleNames.end()) {
- int propId = m_delegateDataType->createProperty(it.key()) - m_delegateDataType->propertyOffset();
- m_roleToPropId.insert(*it, propId);
- ++it;
- }
- // Add modelData property
- if (m_roles.count() == 1)
- m_modelDataPropId = m_delegateDataType->createProperty("modelData") - m_delegateDataType->propertyOffset();
- m_metaDataCreated = true;
- }
- }
- }
-
- struct ObjectRef {
- ObjectRef(QObject *object=0) : obj(object), ref(1) {}
- QObject *obj;
- int ref;
- };
- class Cache : public QHash<int, ObjectRef> {
- public:
- QObject *getItem(int index) {
- QObject *item = 0;
- QHash<int,ObjectRef>::iterator it = find(index);
- if (it != end()) {
- (*it).ref++;
- item = (*it).obj;
- }
- return item;
- }
- QObject *item(int index) {
- QObject *item = 0;
- QHash<int, ObjectRef>::const_iterator it = find(index);
- if (it != end())
- item = (*it).obj;
- return item;
- }
- void insertItem(int index, QObject *obj) {
- insert(index, ObjectRef(obj));
- }
- bool releaseItem(QObject *obj) {
- QHash<int, ObjectRef>::iterator it = begin();
- for (; it != end(); ++it) {
- ObjectRef &objRef = *it;
- if (objRef.obj == obj) {
- if (--objRef.ref == 0) {
- erase(it);
- return true;
- }
- break;
- }
- }
- return false;
- }
- };
-
- int modelCount() const {
- if (m_visualItemModel)
- return m_visualItemModel->count();
- if (m_listModelInterface)
- return m_listModelInterface->count();
- if (m_abstractItemModel)
- return m_abstractItemModel->rowCount(m_root);
- if (m_listAccessor)
- return m_listAccessor->count();
- return 0;
- }
-
- Cache m_cache;
- QHash<QObject *, QDeclarativePackage*> m_packaged;
-
- QDeclarativeVisualDataModelParts *m_parts;
- friend class QDeclarativeVisualItemParts;
-
- VDMDelegateDataType *m_delegateDataType;
- friend class QDeclarativeVisualDataModelData;
- bool m_metaDataCreated : 1;
- bool m_metaDataCacheable : 1;
- bool m_delegateValidated : 1;
- bool m_completePending : 1;
-
- QDeclarativeVisualDataModelData *data(QObject *item);
-
- QVariant m_modelVariant;
- QDeclarativeListAccessor *m_listAccessor;
-
- QModelIndex m_root;
- QList<QByteArray> watchedRoles;
- QList<int> watchedRoleIds;
-};
-
-class QDeclarativeVisualDataModelDataMetaObject : public QDeclarativeOpenMetaObject
-{
-public:
- QDeclarativeVisualDataModelDataMetaObject(QObject *parent, QDeclarativeOpenMetaObjectType *type)
- : QDeclarativeOpenMetaObject(parent, type) {}
-
- virtual QVariant initialValue(int);
- virtual int createProperty(const char *, const char *);
-
-private:
- friend class QDeclarativeVisualDataModelData;
-};
-
-class QDeclarativeVisualDataModelData : public QObject
-{
-Q_OBJECT
-public:
- QDeclarativeVisualDataModelData(int index, QDeclarativeVisualDataModel *model);
- ~QDeclarativeVisualDataModelData();
-
- Q_PROPERTY(int index READ index NOTIFY indexChanged)
- int index() const;
- void setIndex(int index);
-
- int propForRole(int) const;
- int modelDataPropertyId() const {
- QDeclarativeVisualDataModelPrivate *model = QDeclarativeVisualDataModelPrivate::get(m_model);
- return model->m_modelDataPropId;
- }
-
- void setValue(int, const QVariant &);
- bool hasValue(int id) const {
- return m_meta->hasValue(id);
- }
-
- void ensureProperties();
-
-Q_SIGNALS:
- void indexChanged();
-
-private:
- friend class QDeclarativeVisualDataModelDataMetaObject;
- int m_index;
- QDeclarativeGuard<QDeclarativeVisualDataModel> m_model;
- QDeclarativeVisualDataModelDataMetaObject *m_meta;
-};
-
-int QDeclarativeVisualDataModelData::propForRole(int id) const
-{
- QDeclarativeVisualDataModelPrivate *model = QDeclarativeVisualDataModelPrivate::get(m_model);
- QHash<int,int>::const_iterator it = model->m_roleToPropId.find(id);
- if (it != model->m_roleToPropId.end())
- return *it;
-
- return -1;
-}
-
-void QDeclarativeVisualDataModelData::setValue(int id, const QVariant &val)
-{
- m_meta->setValue(id, val);
-}
-
-int QDeclarativeVisualDataModelDataMetaObject::createProperty(const char *name, const char *type)
-{
- QDeclarativeVisualDataModelData *data =
- static_cast<QDeclarativeVisualDataModelData *>(object());
-
- if (!data->m_model)
- return -1;
-
- QDeclarativeVisualDataModelPrivate *model = QDeclarativeVisualDataModelPrivate::get(data->m_model);
- if (data->m_index < 0 || data->m_index >= model->modelCount())
- return -1;
-
- if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
- if (model->m_listAccessor->type() == QDeclarativeListAccessor::ListProperty) {
- model->ensureRoles();
- if (qstrcmp(name,"modelData") == 0)
- return QDeclarativeOpenMetaObject::createProperty(name, type);
- }
- }
- return -1;
-}
-
-QVariant QDeclarativeVisualDataModelDataMetaObject::initialValue(int propId)
-{
- QDeclarativeVisualDataModelData *data =
- static_cast<QDeclarativeVisualDataModelData *>(object());
-
- Q_ASSERT(data->m_model);
- QDeclarativeVisualDataModelPrivate *model = QDeclarativeVisualDataModelPrivate::get(data->m_model);
-
- QByteArray propName = name(propId);
- if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
- if (propName == "modelData") {
- if (model->m_listAccessor->type() == QDeclarativeListAccessor::Instance) {
- QObject *object = model->m_listAccessor->at(0).value<QObject*>();
- return object->metaObject()->property(1).read(object); // the first property after objectName
- }
- return model->m_listAccessor->at(data->m_index);
- } else {
- // return any property of a single object instance.
- QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
- return object->property(propName);
- }
- } else if (model->m_listModelInterface) {
- model->ensureRoles();
- QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
- if (it != model->m_roleNames.end()) {
- QVariant value = model->m_listModelInterface->data(data->m_index, *it);
- return value;
- } else if (model->m_roles.count() == 1 && propName == "modelData") {
- //for compatibility with other lists, assign modelData if there is only a single role
- QVariant value = model->m_listModelInterface->data(data->m_index, model->m_roles.first());
- return value;
- }
- } else if (model->m_abstractItemModel) {
- model->ensureRoles();
- QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0, model->m_root);
- if (propName == "hasModelChildren") {
- return model->m_abstractItemModel->hasChildren(index);
- } else {
- QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
- if (it != model->m_roleNames.end()) {
- return model->m_abstractItemModel->data(index, *it);
- } else if (model->m_roles.count() == 1 && propName == "modelData") {
- //for compatibility with other lists, assign modelData if there is only a single role
- return model->m_abstractItemModel->data(index, model->m_roles.first());
- }
- }
- }
- Q_ASSERT(!"Can never be reached");
- return QVariant();
-}
-
-QDeclarativeVisualDataModelData::QDeclarativeVisualDataModelData(int index,
- QDeclarativeVisualDataModel *model)
-: m_index(index), m_model(model),
-m_meta(new QDeclarativeVisualDataModelDataMetaObject(this, QDeclarativeVisualDataModelPrivate::get(model)->m_delegateDataType))
-{
- ensureProperties();
-}
-
-QDeclarativeVisualDataModelData::~QDeclarativeVisualDataModelData()
-{
-}
-
-void QDeclarativeVisualDataModelData::ensureProperties()
-{
- QDeclarativeVisualDataModelPrivate *modelPriv = QDeclarativeVisualDataModelPrivate::get(m_model);
- if (modelPriv->m_metaDataCacheable) {
- if (!modelPriv->m_metaDataCreated)
- modelPriv->createMetaData();
- if (modelPriv->m_metaDataCreated)
- m_meta->setCached(true);
- }
-}
-
-int QDeclarativeVisualDataModelData::index() const
-{
- return m_index;
-}
-
-// This is internal only - it should not be set from qml
-void QDeclarativeVisualDataModelData::setIndex(int index)
-{
- m_index = index;
- emit indexChanged();
-}
-
-//---------------------------------------------------------------------------
-
-class QDeclarativeVisualDataModelPartsMetaObject : public QDeclarativeOpenMetaObject
-{
-public:
- QDeclarativeVisualDataModelPartsMetaObject(QObject *parent)
- : QDeclarativeOpenMetaObject(parent) {}
-
- virtual void propertyCreated(int, QMetaPropertyBuilder &);
- virtual QVariant initialValue(int);
-};
-
-class QDeclarativeVisualDataModelParts : public QObject
-{
-Q_OBJECT
-public:
- QDeclarativeVisualDataModelParts(QDeclarativeVisualDataModel *parent);
-
-private:
- friend class QDeclarativeVisualDataModelPartsMetaObject;
- QDeclarativeVisualDataModel *model;
-};
-
-void QDeclarativeVisualDataModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
-{
- prop.setWritable(false);
-}
-
-QVariant QDeclarativeVisualDataModelPartsMetaObject::initialValue(int id)
-{
- QDeclarativeVisualDataModel *m = new QDeclarativeVisualDataModel;
- m->setParent(object());
- m->setPart(QString::fromUtf8(name(id)));
- m->setModel(QVariant::fromValue(static_cast<QDeclarativeVisualDataModelParts *>(object())->model));
-
- QVariant var = QVariant::fromValue((QObject *)m);
- return var;
-}
-
-QDeclarativeVisualDataModelParts::QDeclarativeVisualDataModelParts(QDeclarativeVisualDataModel *parent)
-: QObject(parent), model(parent)
-{
- new QDeclarativeVisualDataModelPartsMetaObject(this);
-}
-
-QDeclarativeVisualDataModelPrivate::QDeclarativeVisualDataModelPrivate(QDeclarativeContext *ctxt)
-: m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
-, m_context(ctxt), m_modelDataPropId(-1), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
-, m_metaDataCacheable(false), m_delegateValidated(false), m_completePending(false), m_listAccessor(0)
-{
-}
-
-QDeclarativeVisualDataModelData *QDeclarativeVisualDataModelPrivate::data(QObject *item)
-{
- QDeclarativeVisualDataModelData *dataItem =
- item->findChild<QDeclarativeVisualDataModelData *>();
- Q_ASSERT(dataItem);
- return dataItem;
-}
-
-//---------------------------------------------------------------------------
-
-/*!
- \qmlclass VisualDataModel QDeclarativeVisualDataModel
- \ingroup qml-working-with-data
- \brief The VisualDataModel encapsulates a model and delegate
-
- A VisualDataModel encapsulates a model and the delegate that will
- be instantiated for items in the model.
-
- It is usually not necessary to create VisualDataModel elements.
- However, it can be useful for manipulating and accessing the \l modelIndex
- when a QAbstractItemModel subclass is used as the
- model. Also, VisualDataModel is used together with \l Package to
- provide delegates to multiple views.
-
- The example below illustrates using a VisualDataModel with a ListView.
-
- \snippet doc/src/snippets/declarative/visualdatamodel.qml 0
-*/
-
-QDeclarativeVisualDataModel::QDeclarativeVisualDataModel()
-: QDeclarativeVisualModel(*(new QDeclarativeVisualDataModelPrivate(0)))
-{
-}
-
-QDeclarativeVisualDataModel::QDeclarativeVisualDataModel(QDeclarativeContext *ctxt, QObject *parent)
-: QDeclarativeVisualModel(*(new QDeclarativeVisualDataModelPrivate(ctxt)), parent)
-{
-}
-
-QDeclarativeVisualDataModel::~QDeclarativeVisualDataModel()
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_listAccessor)
- delete d->m_listAccessor;
- if (d->m_delegateDataType)
- d->m_delegateDataType->release();
-}
-
-/*!
- \qmlproperty model VisualDataModel::model
- This property holds the model providing data for the VisualDataModel.
-
- The model provides a set of data that is used to create the items
- for a view. For large or dynamic datasets the model is usually
- provided by a C++ model object. The C++ model object must be a \l
- {QAbstractItemModel} subclass or a simple list.
-
- Models can also be created directly in QML, using a \l{ListModel} or
- \l{XmlListModel}.
-
- \sa {qmlmodels}{Data Models}
-*/
-QVariant QDeclarativeVisualDataModel::model() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- return d->m_modelVariant;
-}
-
-void QDeclarativeVisualDataModel::setModel(const QVariant &model)
-{
- Q_D(QDeclarativeVisualDataModel);
- delete d->m_listAccessor;
- d->m_listAccessor = 0;
- d->m_modelVariant = model;
- if (d->m_listModelInterface) {
- // Assume caller has released all items.
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
- this, SLOT(_q_itemsChanged(int,int,QList<int>)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
- this, SLOT(_q_itemsInserted(int,int)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
- this, SLOT(_q_itemsRemoved(int,int)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
- this, SLOT(_q_itemsMoved(int,int,int)));
- d->m_listModelInterface = 0;
- } else if (d->m_abstractItemModel) {
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
- this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
- d->m_abstractItemModel = 0;
- } else if (d->m_visualItemModel) {
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
- this, SIGNAL(itemsInserted(int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
- this, SIGNAL(itemsRemoved(int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
- this, SIGNAL(itemsMoved(int,int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarativePackage*)),
- this, SLOT(_q_createdPackage(int,QDeclarativePackage*)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarativePackage*)),
- this, SLOT(_q_destroyingPackage(QDeclarativePackage*)));
- d->m_visualItemModel = 0;
- }
-
- d->m_roles.clear();
- d->m_roleNames.clear();
- if (d->m_delegateDataType)
- d->m_delegateDataType->release();
- d->m_metaDataCreated = 0;
- d->m_metaDataCacheable = false;
- d->m_delegateDataType = new VDMDelegateDataType(&QDeclarativeVisualDataModelData::staticMetaObject, d->m_context?d->m_context->engine():qmlEngine(this));
-
- QObject *object = qvariant_cast<QObject *>(model);
- if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
- this, SLOT(_q_itemsChanged(int,int,QList<int>)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
- this, SLOT(_q_itemsInserted(int,int)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
- this, SLOT(_q_itemsRemoved(int,int)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
- this, SLOT(_q_itemsMoved(int,int,int)));
- d->m_metaDataCacheable = true;
- if (d->m_delegate && d->m_listModelInterface->count())
- emit itemsInserted(0, d->m_listModelInterface->count());
- return;
- } else if (object && (d->m_abstractItemModel = qobject_cast<QAbstractItemModel *>(object))) {
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
- this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
- QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
- d->m_metaDataCacheable = true;
- if (d->m_abstractItemModel->canFetchMore(d->m_root))
- d->m_abstractItemModel->fetchMore(d->m_root);
- return;
- }
- if ((d->m_visualItemModel = qvariant_cast<QDeclarativeVisualDataModel *>(model))) {
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
- this, SIGNAL(itemsInserted(int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
- this, SIGNAL(itemsRemoved(int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
- this, SIGNAL(itemsMoved(int,int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarativePackage*)),
- this, SLOT(_q_createdPackage(int,QDeclarativePackage*)));
- QObject::connect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarativePackage*)),
- this, SLOT(_q_destroyingPackage(QDeclarativePackage*)));
- return;
- }
- d->m_listAccessor = new QDeclarativeListAccessor;
- d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
- if (d->m_listAccessor->type() != QDeclarativeListAccessor::ListProperty)
- d->m_metaDataCacheable = true;
- if (d->m_delegate && d->modelCount()) {
- emit itemsInserted(0, d->modelCount());
- emit countChanged();
- }
-}
-
-/*!
- \qmlproperty Component VisualDataModel::delegate
-
- The delegate provides a template defining each item instantiated by a view.
- The index is exposed as an accessible \c index property. Properties of the
- model are also available depending upon the type of \l {qmlmodels}{Data Model}.
-*/
-QDeclarativeComponent *QDeclarativeVisualDataModel::delegate() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->delegate();
- return d->m_delegate;
-}
-
-void QDeclarativeVisualDataModel::setDelegate(QDeclarativeComponent *delegate)
-{
- Q_D(QDeclarativeVisualDataModel);
- bool wasValid = d->m_delegate != 0;
- d->m_delegate = delegate;
- d->m_delegateValidated = false;
- if (!wasValid && d->modelCount() && d->m_delegate) {
- emit itemsInserted(0, d->modelCount());
- emit countChanged();
- }
- if (wasValid && !d->m_delegate && d->modelCount()) {
- emit itemsRemoved(0, d->modelCount());
- emit countChanged();
- }
-}
-
-/*!
- \qmlproperty QModelIndex VisualDataModel::rootIndex
-
- QAbstractItemModel provides a hierarchical tree of data, whereas
- QML only operates on list data. \c rootIndex allows the children of
- any node in a QAbstractItemModel to be provided by this model.
-
- This property only affects models of type QAbstractItemModel that
- are hierarchical (e.g, a tree model).
-
- For example, here is a simple interactive file system browser.
- When a directory name is clicked, the view's \c rootIndex is set to the
- QModelIndex node of the clicked directory, thus updating the view to show
- the new directory's contents.
-
- \c main.cpp:
- \snippet doc/src/snippets/declarative/visualdatamodel_rootindex/main.cpp 0
-
- \c view.qml:
- \snippet doc/src/snippets/declarative/visualdatamodel_rootindex/view.qml 0
-
- If the \l model is a QAbstractItemModel subclass, the delegate can also
- reference a \c hasModelChildren property (optionally qualified by a
- \e model. prefix) that indicates whether the delegate's model item has
- any child nodes.
-
-
- \sa modelIndex(), parentModelIndex()
-*/
-QVariant QDeclarativeVisualDataModel::rootIndex() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- return QVariant::fromValue(d->m_root);
-}
-
-void QDeclarativeVisualDataModel::setRootIndex(const QVariant &root)
-{
- Q_D(QDeclarativeVisualDataModel);
- QModelIndex modelIndex = qvariant_cast<QModelIndex>(root);
- if (d->m_root != modelIndex) {
- int oldCount = d->modelCount();
- d->m_root = modelIndex;
- if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
- d->m_abstractItemModel->fetchMore(modelIndex);
- int newCount = d->modelCount();
- if (d->m_delegate && oldCount)
- emit itemsRemoved(0, oldCount);
- if (d->m_delegate && newCount)
- emit itemsInserted(0, newCount);
- if (newCount != oldCount)
- emit countChanged();
- emit rootIndexChanged();
- }
-}
-
-
-/*!
- \qmlmethod QModelIndex VisualDataModel::modelIndex(int index)
-
- QAbstractItemModel provides a hierarchical tree of data, whereas
- QML only operates on list data. This function assists in using
- tree models in QML.
-
- Returns a QModelIndex for the specified index.
- This value can be assigned to rootIndex.
-
- \sa rootIndex
-*/
-QVariant QDeclarativeVisualDataModel::modelIndex(int idx) const
-{
- Q_D(const QDeclarativeVisualDataModel);
- if (d->m_abstractItemModel)
- return QVariant::fromValue(d->m_abstractItemModel->index(idx, 0, d->m_root));
- return QVariant::fromValue(QModelIndex());
-}
-
-/*!
- \qmlmethod QModelIndex VisualDataModel::parentModelIndex()
-
- QAbstractItemModel provides a hierarchical tree of data, whereas
- QML only operates on list data. This function assists in using
- tree models in QML.
-
- Returns a QModelIndex for the parent of the current rootIndex.
- This value can be assigned to rootIndex.
-
- \sa rootIndex
-*/
-QVariant QDeclarativeVisualDataModel::parentModelIndex() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- if (d->m_abstractItemModel)
- return QVariant::fromValue(d->m_abstractItemModel->parent(d->m_root));
- return QVariant::fromValue(QModelIndex());
-}
-
-QString QDeclarativeVisualDataModel::part() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- return d->m_part;
-}
-
-void QDeclarativeVisualDataModel::setPart(const QString &part)
-{
- Q_D(QDeclarativeVisualDataModel);
- d->m_part = part;
-}
-
-int QDeclarativeVisualDataModel::count() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->count();
- if (!d->m_delegate)
- return 0;
- return d->modelCount();
-}
-
-QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, bool complete)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->item(index, d->m_part.toUtf8(), complete);
- return item(index, QByteArray(), complete);
-}
-
-/*
- Returns ReleaseStatus flags.
-*/
-QDeclarativeVisualDataModel::ReleaseFlags QDeclarativeVisualDataModel::release(QDeclarativeItem *item)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->release(item);
-
- ReleaseFlags stat = 0;
- QObject *obj = item;
- bool inPackage = false;
-
- QHash<QObject*,QDeclarativePackage*>::iterator it = d->m_packaged.find(item);
- if (it != d->m_packaged.end()) {
- QDeclarativePackage *package = *it;
- d->m_packaged.erase(it);
- if (d->m_packaged.contains(item))
- stat |= Referenced;
- inPackage = true;
- obj = package; // fall through and delete
- }
-
- if (d->m_cache.releaseItem(obj)) {
- // Remove any bindings to avoid warnings due to parent change.
- QObjectPrivate *p = QObjectPrivate::get(obj);
- Q_ASSERT(p->declarativeData);
- QDeclarativeData *d = static_cast<QDeclarativeData*>(p->declarativeData);
- if (d->ownContext && d->context)
- d->context->clearContext();
-
- if (inPackage) {
- emit destroyingPackage(qobject_cast<QDeclarativePackage*>(obj));
- } else {
- if (item->scene())
- item->scene()->removeItem(item);
- }
- stat |= Destroyed;
- obj->deleteLater();
- } else if (!inPackage) {
- stat |= Referenced;
- }
-
- return stat;
-}
-
-/*!
- \qmlproperty object VisualDataModel::parts
-
- The \a parts property selects a VisualDataModel which creates
- delegates from the part named. This is used in conjunction with
- the \l Package element.
-
- For example, the code below selects a model which creates
- delegates named \e list from a \l Package:
-
- \code
- VisualDataModel {
- id: visualModel
- delegate: Package {
- Item { Package.name: "list" }
- }
- model: myModel
- }
-
- ListView {
- width: 200; height:200
- model: visualModel.parts.list
- }
- \endcode
-
- \sa Package
-*/
-QObject *QDeclarativeVisualDataModel::parts()
-{
- Q_D(QDeclarativeVisualDataModel);
- if (!d->m_parts)
- d->m_parts = new QDeclarativeVisualDataModelParts(this);
- return d->m_parts;
-}
-
-QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray &viewId, bool complete)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->item(index, viewId, complete);
-
- if (d->modelCount() <= 0 || !d->m_delegate)
- return 0;
- QObject *nobj = d->m_cache.getItem(index);
- bool needComplete = false;
- if (!nobj) {
- QDeclarativeContext *ccontext = d->m_context;
- if (!ccontext) ccontext = qmlContext(this);
- QDeclarativeContext *ctxt = new QDeclarativeContext(ccontext);
- QDeclarativeVisualDataModelData *data = new QDeclarativeVisualDataModelData(index, this);
- if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor
- && d->m_listAccessor->type() == QDeclarativeListAccessor::ListProperty) {
- ctxt->setContextObject(d->m_listAccessor->at(index).value<QObject*>());
- ctxt = new QDeclarativeContext(ctxt, ctxt);
- }
- ctxt->setContextProperty(QLatin1String("model"), data);
- ctxt->setContextObject(data);
- d->m_completePending = false;
- nobj = d->m_delegate->beginCreate(ctxt);
- if (complete) {
- d->m_delegate->completeCreate();
- } else {
- d->m_completePending = true;
- needComplete = true;
- }
- if (nobj) {
- QDeclarative_setParent_noEvent(ctxt, nobj);
- QDeclarative_setParent_noEvent(data, nobj);
- d->m_cache.insertItem(index, nobj);
- if (QDeclarativePackage *package = qobject_cast<QDeclarativePackage *>(nobj))
- emit createdPackage(index, package);
- } else {
- delete data;
- delete ctxt;
- qmlInfo(this, d->m_delegate->errors()) << "Error creating delegate";
- }
- }
- QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(nobj);
- if (!item) {
- QDeclarativePackage *package = qobject_cast<QDeclarativePackage *>(nobj);
- if (package) {
- QObject *o = package->part(QString::fromUtf8(viewId));
- item = qobject_cast<QDeclarativeItem *>(o);
- if (item)
- d->m_packaged.insertMulti(item, package);
- }
- }
- if (!item) {
- if (needComplete)
- d->m_delegate->completeCreate();
- d->m_cache.releaseItem(nobj);
- if (!d->m_delegateValidated) {
- qmlInfo(d->m_delegate) << QDeclarativeVisualDataModel::tr("Delegate component must be Item type.");
- d->m_delegateValidated = true;
- }
- }
- if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
- d->m_abstractItemModel->fetchMore(d->m_root);
-
- return item;
-}
-
-bool QDeclarativeVisualDataModel::completePending() const
-{
- Q_D(const QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->completePending();
- return d->m_completePending;
-}
-
-void QDeclarativeVisualDataModel::completeItem()
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_visualItemModel) {
- d->m_visualItemModel->completeItem();
- return;
- }
-
- d->m_delegate->completeCreate();
- d->m_completePending = false;
-}
-
-QString QDeclarativeVisualDataModel::stringValue(int index, const QString &name)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->stringValue(index, name);
-
- if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor) {
- if (QObject *object = d->m_listAccessor->at(index).value<QObject*>())
- return object->property(name.toUtf8()).toString();
- }
-
- if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
- return QString();
-
- QString val;
- QObject *data = 0;
- bool tempData = false;
-
- if (QObject *nobj = d->m_cache.item(index))
- data = d->data(nobj);
- if (!data) {
- data = new QDeclarativeVisualDataModelData(index, this);
- tempData = true;
- }
-
- QDeclarativeData *ddata = QDeclarativeData::get(data);
- if (ddata && ddata->propertyCache) {
- QDeclarativePropertyCache::Data *prop = ddata->propertyCache->property(name);
- if (prop) {
- if (prop->propType == QVariant::String) {
- void *args[] = { &val, 0 };
- QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
- } else if (prop->propType == qMetaTypeId<QVariant>()) {
- QVariant v;
- void *args[] = { &v, 0 };
- QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
- val = v.toString();
- }
- } else {
- val = data->property(name.toUtf8()).toString();
- }
- } else {
- val = data->property(name.toUtf8()).toString();
- }
-
- if (tempData)
- delete data;
-
- return val;
-}
-
-int QDeclarativeVisualDataModel::indexOf(QDeclarativeItem *item, QObject *) const
-{
- QVariant val = QDeclarativeEngine::contextForObject(item)->contextProperty(QLatin1String("index"));
- return val.toInt();
- return -1;
-}
-
-void QDeclarativeVisualDataModel::setWatchedRoles(QList<QByteArray> roles)
-{
- Q_D(QDeclarativeVisualDataModel);
- d->watchedRoles = roles;
- d->watchedRoleIds.clear();
-}
-
-void QDeclarativeVisualDataModel::_q_itemsChanged(int index, int count,
- const QList<int> &roles)
-{
- Q_D(QDeclarativeVisualDataModel);
- bool changed = false;
- if (!d->watchedRoles.isEmpty() && d->watchedRoleIds.isEmpty()) {
- foreach (QByteArray r, d->watchedRoles) {
- if (d->m_roleNames.contains(r))
- d->watchedRoleIds << d->m_roleNames.value(r);
- }
- }
-
- for (QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef>::ConstIterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ++iter) {
- const int idx = iter.key();
-
- if (idx >= index && idx < index+count) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
- int role = roles.at(roleIdx);
- if (!changed && !d->watchedRoleIds.isEmpty() && d->watchedRoleIds.contains(role))
- changed = true;
- int propId = data->propForRole(role);
- if (propId != -1) {
- if (data->hasValue(propId)) {
- if (d->m_listModelInterface) {
- data->setValue(propId, d->m_listModelInterface->data(idx, role));
- } else if (d->m_abstractItemModel) {
- QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
- data->setValue(propId, d->m_abstractItemModel->data(index, role));
- }
- }
- } else {
- QString roleName;
- if (d->m_listModelInterface)
- roleName = d->m_listModelInterface->toString(role);
- else if (d->m_abstractItemModel)
- roleName = QString::fromUtf8(d->m_abstractItemModel->roleNames().value(role));
- qmlInfo(this) << "Changing role not present in item: " << roleName;
- }
- }
- if (d->m_roles.count() == 1) {
- // Handle the modelData role we add if there is just one role.
- int propId = data->modelDataPropertyId();
- if (data->hasValue(propId)) {
- int role = d->m_roles.at(0);
- if (d->m_listModelInterface) {
- data->setValue(propId, d->m_listModelInterface->data(idx, role));
- } else if (d->m_abstractItemModel) {
- QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
- data->setValue(propId, d->m_abstractItemModel->data(index, role));
- }
- }
- }
- }
- }
- if (changed)
- emit itemsChanged(index, count);
-}
-
-void QDeclarativeVisualDataModel::_q_itemsInserted(int index, int count)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (!count)
- return;
- // XXX - highly inefficient
- QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- if (iter.key() >= index) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() + count;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- d->m_cache.unite(items);
-
- emit itemsInserted(index, count);
- emit countChanged();
-}
-
-void QDeclarativeVisualDataModel::_q_itemsRemoved(int index, int count)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (!count)
- return;
- // XXX - highly inefficient
- QHash<int, QDeclarativeVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int, QDeclarativeVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
- if (iter.key() >= index && iter.key() < index + count) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- iter = d->m_cache.erase(iter);
- items.insertMulti(-1, objRef); //XXX perhaps better to maintain separately
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(-1);
- } else if (iter.key() >= index + count) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() - count;
- iter = d->m_cache.erase(iter);
- items.insert(index, objRef);
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
-
- d->m_cache.unite(items);
- emit itemsRemoved(index, count);
- emit countChanged();
-}
-
-void QDeclarativeVisualDataModel::_q_itemsMoved(int from, int to, int count)
-{
- Q_D(QDeclarativeVisualDataModel);
- // XXX - highly inefficient
- QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- if (iter.key() >= from && iter.key() < from + count) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() - from + to;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- for (QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- int diff = from > to ? count : -count;
- if (iter.key() >= qMin(from,to) && iter.key() < qMax(from+count,to+count)) {
- QDeclarativeVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() + diff;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- d->m_cache.unite(items);
-
- emit itemsMoved(from, to, count);
-}
-
-void QDeclarativeVisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (parent == d->m_root)
- _q_itemsInserted(begin, end - begin + 1);
-}
-
-void QDeclarativeVisualDataModel::_q_rowsRemoved(const QModelIndex &parent, int begin, int end)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (parent == d->m_root)
- _q_itemsRemoved(begin, end - begin + 1);
-}
-
-void QDeclarativeVisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
-{
- Q_D(QDeclarativeVisualDataModel);
- const int count = sourceEnd - sourceStart + 1;
- if (destinationParent == d->m_root && sourceParent == d->m_root) {
- _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow-1, count);
- } else if (sourceParent == d->m_root) {
- _q_itemsRemoved(sourceStart, count);
- } else if (destinationParent == d->m_root) {
- _q_itemsInserted(destinationRow, count);
- }
-}
-
-void QDeclarativeVisualDataModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end)
-{
- Q_D(QDeclarativeVisualDataModel);
- if (begin.parent() == d->m_root)
- _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, d->m_roles);
-}
-
-void QDeclarativeVisualDataModel::_q_layoutChanged()
-{
- Q_D(QDeclarativeVisualDataModel);
- _q_itemsChanged(0, count(), d->m_roles);
-}
-
-void QDeclarativeVisualDataModel::_q_modelReset()
-{
- Q_D(QDeclarativeVisualDataModel);
- d->m_root = QModelIndex();
- emit modelReset();
- emit rootIndexChanged();
- if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
- d->m_abstractItemModel->fetchMore(d->m_root);
-}
-
-void QDeclarativeVisualDataModel::_q_createdPackage(int index, QDeclarativePackage *package)
-{
- Q_D(QDeclarativeVisualDataModel);
- emit createdItem(index, qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
-}
-
-void QDeclarativeVisualDataModel::_q_destroyingPackage(QDeclarativePackage *package)
-{
- Q_D(QDeclarativeVisualDataModel);
- emit destroyingItem(qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
-}
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QListModelInterface)
-
-#include <qdeclarativevisualitemmodel.moc>
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h b/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
deleted file mode 100644
index e46b6d85cc..0000000000
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEVISUALDATAMODEL_H
-#define QDECLARATIVEVISUALDATAMODEL_H
-
-#include <qdeclarative.h>
-
-#include <QtCore/qobject.h>
-#include <QtCore/qabstractitemmodel.h>
-
-QT_BEGIN_HEADER
-
-Q_DECLARE_METATYPE(QModelIndex)
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QDeclarativeItem;
-class QDeclarativeComponent;
-class QDeclarativePackage;
-class QDeclarativeVisualDataModelPrivate;
-
-class Q_AUTOTEST_EXPORT QDeclarativeVisualModel : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(int count READ count NOTIFY countChanged)
-
-public:
- virtual ~QDeclarativeVisualModel() {}
-
- enum ReleaseFlag { Referenced = 0x01, Destroyed = 0x02 };
- Q_DECLARE_FLAGS(ReleaseFlags, ReleaseFlag)
-
- virtual int count() const = 0;
- virtual bool isValid() const = 0;
- virtual QDeclarativeItem *item(int index, bool complete=true) = 0;
- virtual ReleaseFlags release(QDeclarativeItem *item) = 0;
- virtual bool completePending() const = 0;
- virtual void completeItem() = 0;
- virtual QString stringValue(int, const QString &) = 0;
- virtual void setWatchedRoles(QList<QByteArray> roles) = 0;
-
- virtual int indexOf(QDeclarativeItem *item, QObject *objectContext) const = 0;
-
-Q_SIGNALS:
- void countChanged();
- void itemsInserted(int index, int count);
- void itemsRemoved(int index, int count);
- void itemsMoved(int from, int to, int count);
- void itemsChanged(int index, int count);
- void modelReset();
- void createdItem(int index, QDeclarativeItem *item);
- void destroyingItem(QDeclarativeItem *item);
-
-protected:
- QDeclarativeVisualModel(QObjectPrivate &dd, QObject *parent = 0)
- : QObject(dd, parent) {}
-
-private:
- Q_DISABLE_COPY(QDeclarativeVisualModel)
-};
-
-class QDeclarativeVisualItemModelAttached;
-class QDeclarativeVisualItemModelPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeVisualItemModel : public QDeclarativeVisualModel
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeVisualItemModel)
-
- Q_PROPERTY(QDeclarativeListProperty<QDeclarativeItem> children READ children NOTIFY childrenChanged DESIGNABLE false)
- Q_CLASSINFO("DefaultProperty", "children")
-
-public:
- QDeclarativeVisualItemModel(QObject *parent=0);
- virtual ~QDeclarativeVisualItemModel() {}
-
- virtual int count() const;
- virtual bool isValid() const;
- virtual QDeclarativeItem *item(int index, bool complete=true);
- virtual ReleaseFlags release(QDeclarativeItem *item);
- virtual bool completePending() const;
- virtual void completeItem();
- virtual QString stringValue(int index, const QString &role);
- virtual void setWatchedRoles(QList<QByteArray>) {}
-
- virtual int indexOf(QDeclarativeItem *item, QObject *objectContext) const;
-
- QDeclarativeListProperty<QDeclarativeItem> children();
-
- static QDeclarativeVisualItemModelAttached *qmlAttachedProperties(QObject *obj);
-
-Q_SIGNALS:
- void childrenChanged();
-
-private:
- Q_DISABLE_COPY(QDeclarativeVisualItemModel)
-};
-
-
-class Q_AUTOTEST_EXPORT QDeclarativeVisualDataModel : public QDeclarativeVisualModel
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeVisualDataModel)
-
- Q_PROPERTY(QVariant model READ model WRITE setModel)
- Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate)
- Q_PROPERTY(QString part READ part WRITE setPart)
- Q_PROPERTY(QObject *parts READ parts CONSTANT)
- Q_PROPERTY(QVariant rootIndex READ rootIndex WRITE setRootIndex NOTIFY rootIndexChanged)
- Q_CLASSINFO("DefaultProperty", "delegate")
-public:
- QDeclarativeVisualDataModel();
- QDeclarativeVisualDataModel(QDeclarativeContext *, QObject *parent=0);
- virtual ~QDeclarativeVisualDataModel();
-
- QVariant model() const;
- void setModel(const QVariant &);
-
- QDeclarativeComponent *delegate() const;
- void setDelegate(QDeclarativeComponent *);
-
- QVariant rootIndex() const;
- void setRootIndex(const QVariant &root);
-
- Q_INVOKABLE QVariant modelIndex(int idx) const;
- Q_INVOKABLE QVariant parentModelIndex() const;
-
- QString part() const;
- void setPart(const QString &);
-
- int count() const;
- bool isValid() const { return delegate() != 0; }
- QDeclarativeItem *item(int index, bool complete=true);
- QDeclarativeItem *item(int index, const QByteArray &, bool complete=true);
- ReleaseFlags release(QDeclarativeItem *item);
- bool completePending() const;
- void completeItem();
- virtual QString stringValue(int index, const QString &role);
- virtual void setWatchedRoles(QList<QByteArray> roles);
-
- int indexOf(QDeclarativeItem *item, QObject *objectContext) const;
-
- QObject *parts();
-
-Q_SIGNALS:
- void createdPackage(int index, QDeclarativePackage *package);
- void destroyingPackage(QDeclarativePackage *package);
- void rootIndexChanged();
-
-private Q_SLOTS:
- void _q_itemsChanged(int, int, const QList<int> &);
- void _q_itemsInserted(int index, int count);
- void _q_itemsRemoved(int index, int count);
- void _q_itemsMoved(int from, int to, int count);
- void _q_rowsInserted(const QModelIndex &,int,int);
- void _q_rowsRemoved(const QModelIndex &,int,int);
- void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
- void _q_dataChanged(const QModelIndex&,const QModelIndex&);
- void _q_layoutChanged();
- void _q_modelReset();
- void _q_createdPackage(int index, QDeclarativePackage *package);
- void _q_destroyingPackage(QDeclarativePackage *package);
-
-private:
- Q_DISABLE_COPY(QDeclarativeVisualDataModel)
-};
-
-class QDeclarativeVisualItemModelAttached : public QObject
-{
- Q_OBJECT
-
-public:
- QDeclarativeVisualItemModelAttached(QObject *parent)
- : QObject(parent), m_index(0) {}
- ~QDeclarativeVisualItemModelAttached() {
- attachedProperties.remove(parent());
- }
-
- Q_PROPERTY(int index READ index NOTIFY indexChanged)
- int index() const { return m_index; }
- void setIndex(int idx) {
- if (m_index != idx) {
- m_index = idx;
- emit indexChanged();
- }
- }
-
- static QDeclarativeVisualItemModelAttached *properties(QObject *obj) {
- QDeclarativeVisualItemModelAttached *rv = attachedProperties.value(obj);
- if (!rv) {
- rv = new QDeclarativeVisualItemModelAttached(obj);
- attachedProperties.insert(obj, rv);
- }
- return rv;
- }
-
-Q_SIGNALS:
- void indexChanged();
-
-public:
- int m_index;
-
- static QHash<QObject*, QDeclarativeVisualItemModelAttached*> attachedProperties;
-};
-
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QDeclarativeVisualModel)
-QML_DECLARE_TYPE(QDeclarativeVisualItemModel)
-QML_DECLARE_TYPEINFO(QDeclarativeVisualItemModel, QML_HAS_ATTACHED_PROPERTIES)
-QML_DECLARE_TYPE(QDeclarativeVisualDataModel)
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEVISUALDATAMODEL_H
diff --git a/src/declarative/items/qsgitem.cpp b/src/declarative/items/qsgitem.cpp
index 2b6f5573aa..b4fbacb90b 100644
--- a/src/declarative/items/qsgitem.cpp
+++ b/src/declarative/items/qsgitem.cpp
@@ -48,9 +48,7 @@
#include "qsgevents_p_p.h"
-#include <QtDeclarative/qdeclarativeitem.h>
#include <QtDeclarative/qdeclarativeengine.h>
-#include <QtDeclarative/qdeclarativeview.h>
#include <QtDeclarative/qdeclarativecomponent.h>
#include <QtDeclarative/qdeclarativeinfo.h>
#include <QtGui/qgraphicstransform.h>
@@ -1311,7 +1309,7 @@ void QSGItemPrivate::data_append(QDeclarativeListProperty<QObject> *prop, QObjec
// This test is measurably (albeit only slightly) faster than qobject_cast<>()
const QMetaObject *mo = o->metaObject();
while (mo && mo != &QSGItem::staticMetaObject) {
- if (mo == &QDeclarativeItem::staticMetaObject)
+ if (mo == &QGraphicsObject::staticMetaObject)
qWarning("Cannot add a QtQuick 1.0 item (%s) into a QtQuick 2.0 scene!", o->metaObject()->className());
mo = mo->d.superdata;
}
diff --git a/src/declarative/items/qsgitem.h b/src/declarative/items/qsgitem.h
index e7d9d0aa0a..12e93603c7 100644
--- a/src/declarative/items/qsgitem.h
+++ b/src/declarative/items/qsgitem.h
@@ -82,6 +82,7 @@ private:
Q_DECLARE_PRIVATE(QSGTransform);
};
+class QDeclarativeV8Function;
class QDeclarativeState;
class QSGAnchorLine;
class QDeclarativeTransition;
diff --git a/src/declarative/items/qsgtext_p_p.h b/src/declarative/items/qsgtext_p_p.h
index 0d4a9d2d18..050e3984ab 100644
--- a/src/declarative/items/qsgtext_p_p.h
+++ b/src/declarative/items/qsgtext_p_p.h
@@ -60,8 +60,6 @@
#include <QtDeclarative/qdeclarative.h>
#include <QtGui/qtextlayout.h>
-#include <private/qdeclarativetextlayout_p.h>
-
QT_BEGIN_NAMESPACE
class QTextLayout;
diff --git a/src/declarative/qml/qdeclarative.h b/src/declarative/qml/qdeclarative.h
index da9fc76f4a..9c434ea557 100644
--- a/src/declarative/qml/qdeclarative.h
+++ b/src/declarative/qml/qdeclarative.h
@@ -410,6 +410,9 @@ QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true)
return qmlAttachedPropertiesObject(&idx, obj, &T::staticMetaObject, create);
}
+// For the use of QtQuick1 module
+Q_DECLARATIVE_EXPORT void qmlRegisterBaseTypes(const char *uri, int versionMajor, int versionMinor);
+
/*!
This function may be used to register a module API provider \a callback in a particular \a uri
with a version specified in \a versionMajor and \a versionMinor.
diff --git a/src/declarative/qml/qdeclarativeboundsignal_p.h b/src/declarative/qml/qdeclarativeboundsignal_p.h
index bc1cd3ba49..42852131f5 100644
--- a/src/declarative/qml/qdeclarativeboundsignal_p.h
+++ b/src/declarative/qml/qdeclarativeboundsignal_p.h
@@ -61,7 +61,7 @@
QT_BEGIN_NAMESPACE
-class QDeclarativeAbstractBoundSignal : public QObject
+class Q_DECLARATIVE_EXPORT QDeclarativeAbstractBoundSignal : public QObject
{
Q_OBJECT
public:
@@ -70,7 +70,7 @@ public:
};
class QDeclarativeBoundSignalParameters;
-class QDeclarativeBoundSignal : public QDeclarativeAbstractBoundSignal
+class Q_DECLARATIVE_EXPORT QDeclarativeBoundSignal : public QDeclarativeAbstractBoundSignal
{
public:
QDeclarativeBoundSignal(QObject *scope, const QMetaMethod &signal, QObject *parent);
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 7571704f19..d0fd3ae4f4 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -1356,7 +1356,7 @@ bool QDeclarativeCompiler::buildSubObject(QDeclarativeParser::Object *obj, const
int QDeclarativeCompiler::componentTypeRef()
{
- QDeclarativeType *t = QDeclarativeMetaType::qmlType("QtQuick/Component",1,0);
+ QDeclarativeType *t = QDeclarativeMetaType::qmlType("QtQuick/Component",2,0);
for (int ii = output->types.count() - 1; ii >= 0; --ii) {
if (output->types.at(ii).type == t)
return ii;
diff --git a/src/declarative/qml/qdeclarativecontext_p.h b/src/declarative/qml/qdeclarativecontext_p.h
index 59d886c366..bb9c2ada02 100644
--- a/src/declarative/qml/qdeclarativecontext_p.h
+++ b/src/declarative/qml/qdeclarativecontext_p.h
@@ -110,7 +110,7 @@ public:
class QDeclarativeComponentAttached;
class QDeclarativeGuardedContextData;
-class Q_AUTOTEST_EXPORT QDeclarativeContextData
+class Q_DECLARATIVE_EXPORT QDeclarativeContextData
{
public:
QDeclarativeContextData();
diff --git a/src/declarative/qml/qdeclarativedata_p.h b/src/declarative/qml/qdeclarativedata_p.h
index 65f49268e9..b7b68b20cf 100644
--- a/src/declarative/qml/qdeclarativedata_p.h
+++ b/src/declarative/qml/qdeclarativedata_p.h
@@ -72,7 +72,7 @@ class QDeclarativeDataExtended;
// default state for elemental object allocations. This is crucial in the
// workings of the QDeclarativeInstruction::CreateSimpleObject instruction.
// Don't change anything here without first considering that case!
-class Q_AUTOTEST_EXPORT QDeclarativeData : public QAbstractDeclarativeData
+class Q_DECLARATIVE_EXPORT QDeclarativeData : public QAbstractDeclarativeData
{
public:
QDeclarativeData()
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index ab85b2d273..2117f063fc 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -96,7 +96,6 @@
#include <private/qobject_p.h>
-#include <private/qdeclarativeitemsmodule_p.h>
#include <private/qdeclarativeutilmodule_p.h>
#include <private/qsgitemsmodule_p.h>
#include <private/qsgparticlesmodule_p.h>
@@ -114,6 +113,13 @@ Q_DECLARE_METATYPE(QDeclarativeProperty)
QT_BEGIN_NAMESPACE
+void qmlRegisterBaseTypes(const char *uri, int versionMajor, int versionMinor)
+{
+ QDeclarativeEnginePrivate::registerBaseTypes(uri, versionMajor, versionMinor);
+ QDeclarativeValueTypeFactory::registerBaseTypes(uri, versionMajor, versionMinor);
+ QDeclarativeUtilModule::registerBaseTypes(uri, versionMajor, versionMinor);
+}
+
/*!
\qmlclass QtObject QObject
\ingroup qml-utility-elements
@@ -178,18 +184,16 @@ struct StaticQtMetaObject : public QObject
static bool qt_QmlQtModule_registered = false;
bool QDeclarativeEnginePrivate::qml_debugging_enabled = false;
-void QDeclarativeEnginePrivate::defineModule()
+void QDeclarativeEnginePrivate::registerBaseTypes(const char *uri, int versionMajor, int versionMinor)
{
- qmlRegisterType<QDeclarativeComponent>("QtQuick",1,0,"Component");
- qmlRegisterType<QObject>("QtQuick",1,0,"QtObject");
- qmlRegisterType<QDeclarativeWorkerScript>("QtQuick",1,0,"WorkerScript");
-
-#ifndef QT_NO_IMPORT_QT47_QML
- qmlRegisterType<QDeclarativeComponent>("Qt",4,7,"Component");
- qmlRegisterType<QObject>("Qt",4,7,"QtObject");
- qmlRegisterType<QDeclarativeWorkerScript>("Qt",4,7,"WorkerScript");
-#endif
+ qmlRegisterType<QDeclarativeComponent>(uri,versionMajor,versionMinor,"Component");
+ qmlRegisterType<QObject>(uri,versionMajor,versionMinor,"QtObject");
+ qmlRegisterType<QDeclarativeWorkerScript>(uri,versionMajor,versionMinor,"WorkerScript");
+}
+void QDeclarativeEnginePrivate::defineModule()
+{
+ registerBaseTypes("QtQuick", 2, 0);
qmlRegisterType<QDeclarativeBinding>();
}
@@ -352,7 +356,6 @@ QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e)
{
if (!qt_QmlQtModule_registered) {
qt_QmlQtModule_registered = true;
- QDeclarativeItemModule::defineModule();
QDeclarativeUtilModule::defineModule();
QDeclarativeEnginePrivate::defineModule();
QSGItemsModule::defineModule();
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
index ba22ba95c0..538e8a05a0 100644
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ b/src/declarative/qml/qdeclarativeengine_p.h
@@ -101,7 +101,7 @@ class QDir;
class QSGTexture;
class QSGContext;
-class Q_AUTOTEST_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
+class Q_DECLARATIVE_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QDeclarativeEngine)
public:
@@ -264,6 +264,7 @@ public:
static QString urlToLocalFileOrQrc(const QUrl& url);
+ static void registerBaseTypes(const char *uri, int versionMajor, int versionMinor);
static void defineModule();
static bool qml_debugging_enabled;
diff --git a/src/declarative/qml/qdeclarativefastproperties.cpp b/src/declarative/qml/qdeclarativefastproperties.cpp
index 5c447eef41..93703e2bdc 100644
--- a/src/declarative/qml/qdeclarativefastproperties.cpp
+++ b/src/declarative/qml/qdeclarativefastproperties.cpp
@@ -41,7 +41,8 @@
#include "private/qdeclarativefastproperties_p.h"
-#include <private/qdeclarativeitem_p.h>
+#include <private/qdeclarativedata_p.h>
+#include <private/qdeclarativenotifier_p.h>
QT_BEGIN_NAMESPACE
@@ -51,6 +52,13 @@ QT_BEGIN_NAMESPACE
// primarily read from bindings is a candidate for inclusion as a fast
// property.
+Q_GLOBAL_STATIC(QDeclarativeFastProperties, fastProperties)
+
+QDeclarativeFastProperties *QDeclarativeFastProperties::instance()
+{
+ return fastProperties();
+}
+
static void QObject_objectName(QObject *object, void *output, QDeclarativeNotifierEndpoint *endpoint)
{
if (endpoint)
@@ -60,8 +68,6 @@ static void QObject_objectName(QObject *object, void *output, QDeclarativeNotifi
QDeclarativeFastProperties::QDeclarativeFastProperties()
{
- add(&QDeclarativeItem::staticMetaObject, QDeclarativeItem::staticMetaObject.indexOfProperty("parent"),
- QDeclarativeItemPrivate::parentProperty);
add(&QObject::staticMetaObject, QObject::staticMetaObject.indexOfProperty("objectName"),
QObject_objectName);
}
@@ -75,6 +81,7 @@ int QDeclarativeFastProperties::accessorIndexForProperty(const QMetaObject *meta
while (metaObject->propertyOffset() > propertyIndex)
metaObject = metaObject->superClass();
+ QReadLocker lock(&m_lock);
QHash<QPair<const QMetaObject *, int>, int>::Iterator iter =
m_index.find(qMakePair(metaObject, propertyIndex));
if (iter != m_index.end())
@@ -93,6 +100,7 @@ void QDeclarativeFastProperties::add(const QMetaObject *metaObject, int property
metaObject = metaObject->superClass();
QPair<const QMetaObject *, int> data = qMakePair(metaObject, propertyIndex);
+ QWriteLocker lock(&m_lock);
int accessorIndex = m_accessors.count();
m_accessors.append(accessor);
m_index.insert(data, accessorIndex);
diff --git a/src/declarative/qml/qdeclarativefastproperties_p.h b/src/declarative/qml/qdeclarativefastproperties_p.h
index ed4975f2f8..1e09131222 100644
--- a/src/declarative/qml/qdeclarativefastproperties_p.h
+++ b/src/declarative/qml/qdeclarativefastproperties_p.h
@@ -44,6 +44,7 @@
#include <QtCore/qvector.h>
#include <QtCore/qhash.h>
+#include <QtCore/QReadWriteLock>
QT_BEGIN_HEADER
@@ -51,21 +52,23 @@ QT_BEGIN_NAMESPACE
class QObject;
class QDeclarativeNotifierEndpoint;
-class QDeclarativeFastProperties
+class Q_DECLARATIVE_EXPORT QDeclarativeFastProperties
{
public:
typedef void (*Accessor)(QObject *object, void *output, QDeclarativeNotifierEndpoint *endpoint);
-
QDeclarativeFastProperties();
- Accessor accessor(int index) const { return m_accessors.at(index); }
+ Accessor accessor(int index) const { QReadLocker lock(&m_lock); return m_accessors.at(index); }
int accessorIndexForProperty(const QMetaObject *, int);
-private:
void add(const QMetaObject *, int, Accessor);
+ static QDeclarativeFastProperties *instance();
+
+private:
QHash<QPair<const QMetaObject *, int>, int> m_index;
QVector<Accessor> m_accessors;
+ mutable QReadWriteLock m_lock;
};
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp
index 16b2fa2886..b2fa071f91 100644
--- a/src/declarative/qml/qdeclarativeimport.cpp
+++ b/src/declarative/qml/qdeclarativeimport.cpp
@@ -195,7 +195,7 @@ cacheForNamespace(QDeclarativeEngine *engine, const QDeclarativeImportedNamespac
foreach (QDeclarativeType *type, types) {
if (type->qmlTypeName().startsWith(base) &&
type->qmlTypeName().lastIndexOf('/') == (base.length() - 1) &&
- type->availableInVersion(major,minor))
+ (major < 0 || type->availableInVersion(major,minor)))
{
QString name = QString::fromUtf8(type->qmlTypeName().mid(base.length()));
@@ -295,17 +295,19 @@ bool QDeclarativeImportedNamespace::find_helper(int i, const QByteArray& type, i
int vmaj = majversions.at(i);
int vmin = minversions.at(i);
- QByteArray qt = uris.at(i).toUtf8();
- qt += '/';
- qt += type;
-
- QDeclarativeType *t = QDeclarativeMetaType::qmlType(qt,vmaj,vmin);
- if (t) {
- if (vmajor) *vmajor = vmaj;
- if (vminor) *vminor = vmin;
- if (type_return)
- *type_return = t;
- return true;
+ if (vmaj >= 0 && vmin >= 0) {
+ QByteArray qt = uris.at(i).toUtf8();
+ qt += '/';
+ qt += type;
+
+ QDeclarativeType *t = QDeclarativeMetaType::qmlType(qt,vmaj,vmin);
+ if (t) {
+ if (vmajor) *vmajor = vmaj;
+ if (vminor) *vminor = vmin;
+ if (type_return)
+ *type_return = t;
+ return true;
+ }
}
QUrl url = QUrl(urls.at(i) + QLatin1Char('/') + QString::fromUtf8(type) + QLatin1String(".qml"));
@@ -319,7 +321,7 @@ bool QDeclarativeImportedNamespace::find_helper(int i, const QByteArray& type, i
typeWasDeclaredInQmldir = true;
// importing version -1 means import ALL versions
- if ((vmaj == -1) || (c.majorVersion < vmaj || (c.majorVersion == vmaj && vmin >= c.minorVersion))) {
+ if ((vmaj == -1) || (c.majorVersion == vmaj && vmin >= c.minorVersion)) {
QUrl candidate = url.resolved(QUrl(c.fileName));
if (c.internal && base) {
if (base->resolved(QUrl(c.fileName)) != candidate)
@@ -501,53 +503,53 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
if (!s)
set.insert(prefix,(s=new QDeclarativeImportedNamespace));
}
-
QString url = uri;
bool versionFound = false;
if (importType == QDeclarativeScriptParser::Import::Library) {
+
+ Q_ASSERT(vmaj >= 0 && vmin >= 0); // Versions are always specified for libraries
+
url.replace(QLatin1Char('.'), QLatin1Char('/'));
bool found = false;
QString dir;
// step 1: search for extension with fully encoded version number
- if (vmaj >= 0 && vmin >= 0) {
- foreach (const QString &p, database->fileImportPath) {
- dir = p+QLatin1Char('/')+url;
+ foreach (const QString &p, database->fileImportPath) {
+ dir = p+QLatin1Char('/')+url;
- QFileInfo fi(dir+QString(QLatin1String(".%1.%2")).arg(vmaj).arg(vmin)+QLatin1String("/qmldir"));
- const QString absoluteFilePath = fi.absoluteFilePath();
+ QFileInfo fi(dir+QString(QLatin1String(".%1.%2")).arg(vmaj).arg(vmin)+QLatin1String("/qmldir"));
+ const QString absoluteFilePath = fi.absoluteFilePath();
- if (fi.isFile()) {
- found = true;
+ if (fi.isFile()) {
+ found = true;
- url = QUrl::fromLocalFile(fi.absolutePath()).toString();
- uri = resolvedUri(dir, database);
- if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
- return false;
- break;
- }
+ url = QUrl::fromLocalFile(fi.absolutePath()).toString();
+ uri = resolvedUri(dir, database);
+ if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
+ return false;
+ break;
}
}
+
// step 2: search for extension with encoded version major
- if (vmaj >= 0 && vmin >= 0) {
- foreach (const QString &p, database->fileImportPath) {
- dir = p+QLatin1Char('/')+url;
+ foreach (const QString &p, database->fileImportPath) {
+ dir = p+QLatin1Char('/')+url;
- QFileInfo fi(dir+QString(QLatin1String(".%1")).arg(vmaj)+QLatin1String("/qmldir"));
- const QString absoluteFilePath = fi.absoluteFilePath();
+ QFileInfo fi(dir+QString(QLatin1String(".%1")).arg(vmaj)+QLatin1String("/qmldir"));
+ const QString absoluteFilePath = fi.absoluteFilePath();
- if (fi.isFile()) {
- found = true;
+ if (fi.isFile()) {
+ found = true;
- url = QUrl::fromLocalFile(fi.absolutePath()).toString();
- uri = resolvedUri(dir, database);
- if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
- return false;
- break;
- }
+ url = QUrl::fromLocalFile(fi.absolutePath()).toString();
+ uri = resolvedUri(dir, database);
+ if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errors))
+ return false;
+ break;
}
}
+
if (!found) {
// step 3: search for extension without version number
@@ -569,12 +571,13 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
}
}
- if (QDeclarativeMetaType::isModule(uri.toUtf8(), vmaj, vmin))
+ if (QDeclarativeMetaType::isModule(uri.toUtf8(), vmaj, vmin)) {
versionFound = true;
+ }
if (!versionFound && qmldircomponents.isEmpty()) {
if (errors) {
- bool anyversion = QDeclarativeMetaType::isModule(uri.toUtf8(), -1, -1);
+ bool anyversion = QDeclarativeMetaType::isAnyModule(uri.toUtf8());
QDeclarativeError error; // we don't set the url or line or column as these will be set by the loader.
if (anyversion)
error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin));
@@ -636,23 +639,15 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
if (!versionFound && vmaj > -1 && vmin > -1 && !qmldircomponents.isEmpty()) {
QList<QDeclarativeDirParser::Component>::ConstIterator it = qmldircomponents.begin();
- int lowest_maj = INT_MAX;
int lowest_min = INT_MAX;
- int highest_maj = INT_MIN;
int highest_min = INT_MIN;
for (; it != qmldircomponents.end(); ++it) {
- if (it->majorVersion > highest_maj || (it->majorVersion == highest_maj && it->minorVersion > highest_min)) {
- highest_maj = it->majorVersion;
- highest_min = it->minorVersion;
- }
- if (it->majorVersion < lowest_maj || (it->majorVersion == lowest_maj && it->minorVersion < lowest_min)) {
- lowest_maj = it->majorVersion;
- lowest_min = it->minorVersion;
+ if (it->majorVersion == vmaj) {
+ lowest_min = qMin(lowest_min, it->minorVersion);
+ highest_min = qMax(highest_min, it->minorVersion);
}
}
- if (lowest_maj > vmaj || (lowest_maj == vmaj && lowest_min > vmin)
- || highest_maj < vmaj || (highest_maj == vmaj && highest_min < vmin))
- {
+ if (lowest_min > vmin || highest_min < vmin) {
if (errors) {
QDeclarativeError error; // we don't set the url or line or column information, as these will be set by the loader.
error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin));
diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp
index aab5f63f08..4884d1cc4a 100644
--- a/src/declarative/qml/qdeclarativemetatype.cpp
+++ b/src/declarative/qml/qdeclarativemetatype.cpp
@@ -110,13 +110,13 @@ struct QDeclarativeMetaTypeData
struct ModuleInfo {
ModuleInfo(int major, int minor)
- : vmajor_min(major), vminor_min(minor), vmajor_max(major), vminor_max(minor) {}
- ModuleInfo(int major_min, int minor_min, int major_max, int minor_max)
- : vmajor_min(major_min), vminor_min(minor_min), vmajor_max(major_max), vminor_max(minor_max) {}
- int vmajor_min, vminor_min;
- int vmajor_max, vminor_max;
+ : vmajor(major), vminor_min(minor), vminor_max(minor) {}
+ ModuleInfo(int major, int minor_min, int minor_max)
+ : vmajor(major), vminor_min(minor_min), vminor_max(minor_max) {}
+ int vmajor;
+ int vminor_min, vminor_max;
};
- typedef QHash<QByteArray, ModuleInfo> ModuleInfoHash;
+ typedef QHash<QPair<QByteArray,int>, ModuleInfo> ModuleInfoHash;
ModuleInfoHash modules;
QBitArray objects;
@@ -268,12 +268,12 @@ int QDeclarativeType::minorVersion() const
bool QDeclarativeType::availableInVersion(int vmajor, int vminor) const
{
- return vmajor > d->m_version_maj || (vmajor == d->m_version_maj && vminor >= d->m_version_min);
+ return vmajor == d->m_version_maj && vminor >= d->m_version_min;
}
bool QDeclarativeType::availableInVersion(const QByteArray &module, int vmajor, int vminor) const
{
- return module == d->m_module && (vmajor > d->m_version_maj || (vmajor == d->m_version_maj && vminor >= d->m_version_min));
+ return module == d->m_module && vmajor == d->m_version_maj && vminor >= d->m_version_min;
}
// returns the nearest _registered_ super class
@@ -662,16 +662,19 @@ int registerType(const QDeclarativePrivate::RegisterType &type)
if (type.uri) {
QByteArray mod(type.uri);
- QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.find(mod);
+ QPair<QByteArray,int> key(mod,type.versionMajor);
+ QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.find(key);
if (it == data->modules.end()) {
// New module
- data->modules.insert(mod, QDeclarativeMetaTypeData::ModuleInfo(type.versionMajor,type.versionMinor));
- } else if ((*it).vmajor_max < type.versionMajor || ((*it).vmajor_max == type.versionMajor && (*it).vminor_max < type.versionMinor)) {
- // Newer module
- data->modules.insert(mod, QDeclarativeMetaTypeData::ModuleInfo((*it).vmajor_min, (*it).vminor_min, type.versionMajor, type.versionMinor));
- } else if ((*it).vmajor_min > type.versionMajor || ((*it).vmajor_min == type.versionMajor && (*it).vminor_min > type.versionMinor)) {
- // Older module
- data->modules.insert(mod, QDeclarativeMetaTypeData::ModuleInfo(type.versionMajor, type.versionMinor, (*it).vmajor_min, (*it).vminor_min));
+ data->modules.insert(key, QDeclarativeMetaTypeData::ModuleInfo(type.versionMajor,type.versionMinor));
+ } else {
+ if ((*it).vminor_max < type.versionMinor) {
+ // Newer module
+ data->modules.insert(key, QDeclarativeMetaTypeData::ModuleInfo((*it).vmajor, (*it).vminor_min, type.versionMinor));
+ } else if ((*it).vminor_min > type.versionMinor) {
+ // Older module
+ data->modules.insert(key, QDeclarativeMetaTypeData::ModuleInfo((*it).vmajor, type.versionMinor, (*it).vminor_min));
+ }
}
}
@@ -724,34 +727,41 @@ int QDeclarativePrivate::qmlregister(RegistrationType type, void *data)
return -1;
}
+bool QDeclarativeMetaType::isAnyModule(const QByteArray &module)
+{
+ QDeclarativeMetaTypeData *data = metaTypeData();
+
+ QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.begin();
+ while (it != data->modules.end()) {
+ if (it.key().first == module)
+ return true;
+ ++it;
+ }
+
+ return false;
+}
+
/*
Returns true if any type or API has been registered for the given \a module with at least
versionMajor.versionMinor, or if types have been registered for \a module with at most
versionMajor.versionMinor.
So if only 4.7 and 4.9 have been registered, 4.7,4.8, and 4.9 are valid, but not 4.6 nor 4.10.
-
- Passing -1 for both \a versionMajor \a versionMinor will return true if any version is installed.
*/
bool QDeclarativeMetaType::isModule(const QByteArray &module, int versionMajor, int versionMinor)
{
QDeclarativeMetaTypeData *data = metaTypeData();
// first, check Types
- QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.find(module);
- if (it != data->modules.end()
- && ((versionMajor<0 && versionMinor<0) ||
- (((*it).vmajor_max > versionMajor ||
- ((*it).vmajor_max == versionMajor && (*it).vminor_max >= versionMinor))
- && ((*it).vmajor_min < versionMajor ||
- ((*it).vmajor_min == versionMajor && (*it).vminor_min <= versionMinor))))) {
- return true;
+ QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.find(QPair<QByteArray,int>(module,versionMajor));
+ if (it != data->modules.end()) {
+ if (((*it).vminor_max >= versionMinor && (*it).vminor_min <= versionMinor))
+ return true;
}
// then, check ModuleApis
foreach (const QDeclarativeMetaType::ModuleApi &mApi, data->moduleApis.value(module).moduleApis) {
- if ((versionMajor<0 && versionMinor<0)
- || (mApi.major == versionMajor && mApi.minor == versionMinor)) {
+ if (mApi.major == versionMajor && mApi.minor == versionMinor) {
return true;
}
}
diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h
index ba2d445826..cfc4f077f8 100644
--- a/src/declarative/qml/qdeclarativemetatype_p.h
+++ b/src/declarative/qml/qdeclarativemetatype_p.h
@@ -104,6 +104,7 @@ public:
static void registerCustomStringConverter(int, StringConverter);
static StringConverter customStringConverter(int);
+ static bool isAnyModule(const QByteArray &module);
static bool isModule(const QByteArray &module, int versionMajor, int versionMinor);
static QList<QDeclarativePrivate::AutoParentFunction> parentFunctions();
diff --git a/src/declarative/qml/qdeclarativenotifier_p.h b/src/declarative/qml/qdeclarativenotifier_p.h
index 5f70f7d138..0781886ea2 100644
--- a/src/declarative/qml/qdeclarativenotifier_p.h
+++ b/src/declarative/qml/qdeclarativenotifier_p.h
@@ -47,7 +47,7 @@
QT_BEGIN_NAMESPACE
class QDeclarativeNotifierEndpoint;
-class QDeclarativeNotifier
+class Q_DECLARATIVE_EXPORT QDeclarativeNotifier
{
public:
inline QDeclarativeNotifier();
diff --git a/src/declarative/util/qdeclarativenullablevalue_p_p.h b/src/declarative/qml/qdeclarativenullablevalue_p_p.h
index 630f39d446..630f39d446 100644
--- a/src/declarative/util/qdeclarativenullablevalue_p_p.h
+++ b/src/declarative/qml/qdeclarativenullablevalue_p_p.h
diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h
index 1787e6ad14..621463dad9 100644
--- a/src/declarative/qml/qdeclarativepropertycache_p.h
+++ b/src/declarative/qml/qdeclarativepropertycache_p.h
@@ -68,7 +68,7 @@ class QMetaProperty;
class QV8Engine;
class QV8QObjectWrapper;
-class Q_AUTOTEST_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, public QDeclarativeCleanup
+class Q_DECLARATIVE_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, public QDeclarativeCleanup
{
public:
QDeclarativePropertyCache(QDeclarativeEngine *);
diff --git a/src/declarative/qml/qdeclarativevaluetype.cpp b/src/declarative/qml/qdeclarativevaluetype.cpp
index 8505caefac..7f77388516 100644
--- a/src/declarative/qml/qdeclarativevaluetype.cpp
+++ b/src/declarative/qml/qdeclarativevaluetype.cpp
@@ -97,14 +97,15 @@ bool QDeclarativeValueTypeFactory::isValueType(int idx)
return false;
}
+void QDeclarativeValueTypeFactory::registerBaseTypes(const char *uri, int versionMajor, int versionMinor)
+{
+ qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>(uri, versionMajor, versionMinor, "Easing");
+ qmlRegisterValueTypeEnums<QDeclarativeFontValueType>(uri, versionMajor, versionMinor, "Font");
+}
+
void QDeclarativeValueTypeFactory::registerValueTypes()
{
- qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>("QtQuick",1,0,"Easing");
- qmlRegisterValueTypeEnums<QDeclarativeFontValueType>("QtQuick",1,0,"Font");
-#ifndef QT_NO_IMPORT_QT47_QML
- qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>("Qt",4,7,"Easing");
- qmlRegisterValueTypeEnums<QDeclarativeFontValueType>("Qt",4,7,"Font");
-#endif
+ registerBaseTypes("QtQuick", 2, 0);
}
QDeclarativeValueType *QDeclarativeValueTypeFactory::valueType(int t)
diff --git a/src/declarative/qml/qdeclarativevaluetype_p.h b/src/declarative/qml/qdeclarativevaluetype_p.h
index 73fa6ca54e..5d103a46de 100644
--- a/src/declarative/qml/qdeclarativevaluetype_p.h
+++ b/src/declarative/qml/qdeclarativevaluetype_p.h
@@ -89,6 +89,7 @@ public:
static bool isValueType(int);
static QDeclarativeValueType *valueType(int);
+ static void registerBaseTypes(const char *uri, int versionMajor, int versionMinor);
static void registerValueTypes();
QDeclarativeValueType *operator[](int idx) const {
diff --git a/src/declarative/qml/qml.pri b/src/declarative/qml/qml.pri
index 7325cd8340..3e63a9c88f 100644
--- a/src/declarative/qml/qml.pri
+++ b/src/declarative/qml/qml.pri
@@ -112,6 +112,8 @@ HEADERS += \
$$PWD/qdeclarativeextensioninterface.h \
$$PWD/qdeclarativeimport_p.h \
$$PWD/qdeclarativeextensionplugin.h \
+ $$PWD/qperformancetimer_p.h \
+ $$PWD/qdeclarativenullablevalue_p_p.h \
$$PWD/qintrusivelist_p.h \
$$PWD/qdeclarativescriptstring_p.h
diff --git a/src/declarative/qml/rewriter/textwriter_p.h b/src/declarative/qml/rewriter/textwriter_p.h
index 719297f701..1f94591c30 100644
--- a/src/declarative/qml/rewriter/textwriter_p.h
+++ b/src/declarative/qml/rewriter/textwriter_p.h
@@ -42,7 +42,7 @@
#ifndef TEXTWRITER_H
#define TEXTWRITER_H
-#include <qdeclarativejsglobal_p.h>
+#include <private/qdeclarativejsglobal_p.h>
#include <QtCore/QString>
#include <QtCore/QList>
diff --git a/src/declarative/qml/v4/qdeclarativev4bindings.cpp b/src/declarative/qml/v4/qdeclarativev4bindings.cpp
index c81f59b0bc..9209e93e4f 100644
--- a/src/declarative/qml/v4/qdeclarativev4bindings.cpp
+++ b/src/declarative/qml/v4/qdeclarativev4bindings.cpp
@@ -44,10 +44,10 @@
#include "private/qdeclarativev4bindings_p.h"
#include "private/qdeclarativev4program_p.h"
#include "private/qdeclarativev4compiler_p.h"
+#include "private/qdeclarativev4compiler_p_p.h"
#include <private/qdeclarativefastproperties_p.h>
#include <private/qdeclarativedebugtrace_p.h>
-#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
#include <private/qsganchors_p_p.h> // For AnchorLine
#include <QtDeclarative/qdeclarativeinfo.h>
@@ -534,10 +534,10 @@ static bool testCompareVariants(const QVariant &qtscriptRaw, const QVariant &v4)
}
int type = qtscript.userType();
-
- if (type == qMetaTypeId<QDeclarativeAnchorLine>()) {
- QDeclarativeAnchorLine la = qvariant_cast<QDeclarativeAnchorLine>(qtscript);
- QDeclarativeAnchorLine ra = qvariant_cast<QDeclarativeAnchorLine>(v4);
+
+ if (type == qMetaTypeId<QDeclarative1AnchorLine>()) {
+ QDeclarative1AnchorLine la = qvariant_cast<QDeclarative1AnchorLine>(qtscript);
+ QDeclarative1AnchorLine ra = qvariant_cast<QDeclarative1AnchorLine>(v4);
return la == ra;
} else if (type == qMetaTypeId<QSGAnchorLine>()) {
@@ -623,8 +623,8 @@ static void testBindingResult(const QString &binding, int line, int column,
v4value = result.getqreal();
break;
default:
- if (resultType == qMetaTypeId<QDeclarativeAnchorLine>()) {
- v4value = qVariantFromValue<QDeclarativeAnchorLine>(*(QDeclarativeAnchorLine *)result.typeDataPtr());
+ if (resultType == qMetaTypeId<QDeclarative1AnchorLine>()) {
+ v4value = qVariantFromValue<QDeclarative1AnchorLine>(*(QDeclarative1AnchorLine *)result.typeDataPtr());
} else if (resultType == qMetaTypeId<QSGAnchorLine>()) {
v4value = qVariantFromValue<QSGAnchorLine>(*(QSGAnchorLine *)result.typeDataPtr());
} else {
@@ -852,7 +852,7 @@ void QDeclarativeV4BindingsPrivate::run(int instrIndex, quint32 &executedBlocks,
reg.init((Register::Type)instr->fetchAndSubscribe.valueType);
if (instr->fetchAndSubscribe.valueType >= FirstCleanupType)
MARK_REGISTER(instr->fetchAndSubscribe.reg);
- QDeclarativeV4Compiler::fastPropertyAccessor()->accessor(instr->fetchAndSubscribe.function)(object, reg.typeDataPtr(), sub);
+ QDeclarativeFastProperties::instance()->accessor(instr->fetchAndSubscribe.function)(object, reg.typeDataPtr(), sub);
}
}
QML_V4_END_INSTR(FetchAndSubscribe, fetchAndSubscribe)
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler.cpp b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
index 672bf2e57d..371edda6c9 100644
--- a/src/declarative/qml/v4/qdeclarativev4compiler.cpp
+++ b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
@@ -48,7 +48,6 @@
#include <private/qdeclarativejsast_p.h>
#include <private/qdeclarativefastproperties_p.h>
#include <private/qdeclarativejsengine_p.h>
-#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
#include <private/qsganchors_p_p.h> // For AnchorLine
QT_BEGIN_NAMESPACE
@@ -59,8 +58,6 @@ DEFINE_BOOL_CONFIG_OPTION(qmlExperimental, QML_EXPERIMENTAL)
DEFINE_BOOL_CONFIG_OPTION(qmlVerboseCompiler, QML_VERBOSE_COMPILER)
DEFINE_BOOL_CONFIG_OPTION(qmlBindingsTestEnv, QML_BINDINGS_TEST)
-Q_GLOBAL_STATIC(QDeclarativeFastProperties, fastProperties)
-
static bool qmlBindingsTest = false;
using namespace QDeclarativeJS;
@@ -312,7 +309,7 @@ void QDeclarativeV4CompilerPrivate::visitName(IR::Name *e)
_subscribeName << e->id;
QMetaProperty prop = e->meta->property(e->index);
- int fastFetchIndex = fastProperties()->accessorIndexForProperty(e->meta, e->index);
+ int fastFetchIndex = QDeclarativeFastProperties::instance()->accessorIndexForProperty(e->meta, e->index);
const int propTy = prop.userType();
QDeclarativeRegisterType regType;
@@ -332,7 +329,7 @@ void QDeclarativeV4CompilerPrivate::visitName(IR::Name *e)
break;
default:
- if (propTy == qMetaTypeId<QDeclarativeAnchorLine>()) {
+ if (propTy == qMetaTypeId<QDeclarative1AnchorLine>()) {
regType = PODValueType;
} else if (propTy == qMetaTypeId<QSGAnchorLine>()) {
regType = PODValueType;
@@ -925,7 +922,7 @@ void QDeclarativeV4CompilerPrivate::visitRet(IR::Ret *s)
test.storetest.regType = QMetaType::QUrl;
break;
case IR::AnchorLineType:
- test.storetest.regType = qMetaTypeId<QDeclarativeAnchorLine>();
+ test.storetest.regType = qMetaTypeId<QDeclarative1AnchorLine>();
break;
case IR::SGAnchorLineType:
test.storetest.regType = qMetaTypeId<QSGAnchorLine>();
@@ -978,11 +975,6 @@ void QDeclarativeV4Compiler::dump(const QByteArray &programData)
}
}
-QDeclarativeFastProperties *QDeclarativeV4Compiler::fastPropertyAccessor()
-{
- return fastProperties();
-}
-
/*!
Clear the state associated with attempting to compile a specific binding.
This does not clear the global "committed binding" states.
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler_p.h b/src/declarative/qml/v4/qdeclarativev4compiler_p.h
index 3b89d0d376..cc93f4dbf2 100644
--- a/src/declarative/qml/v4/qdeclarativev4compiler_p.h
+++ b/src/declarative/qml/v4/qdeclarativev4compiler_p.h
@@ -60,7 +60,6 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class QDeclarativeFastProperties;
class QDeclarativeTypeNameCache;
class QDeclarativeV4CompilerPrivate;
class Q_AUTOTEST_EXPORT QDeclarativeV4Compiler
@@ -90,7 +89,6 @@ public:
QByteArray program() const;
static void dump(const QByteArray &);
- static QDeclarativeFastProperties *fastPropertyAccessor();
static void enableBindingsTest(bool);
private:
QDeclarativeV4CompilerPrivate *d;
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h b/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
index 2776630fb8..1d9414dce6 100644
--- a/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
+++ b/src/declarative/qml/v4/qdeclarativev4compiler_p_p.h
@@ -63,6 +63,36 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+// NOTE: This is a copy of QDeclarative1AnchorLine: src/qtquick1/graphicsitems/qdeclarativeanchors_p_p.h
+class QGraphicsObject;
+class QDeclarative1AnchorLine
+{
+public:
+ QDeclarative1AnchorLine() : item(0), anchorLine(Invalid) {}
+
+ enum AnchorLine {
+ Invalid = 0x0,
+ Left = 0x01,
+ Right = 0x02,
+ Top = 0x04,
+ Bottom = 0x08,
+ HCenter = 0x10,
+ VCenter = 0x20,
+ Baseline = 0x40,
+ Horizontal_Mask = Left | Right | HCenter,
+ Vertical_Mask = Top | Bottom | VCenter | Baseline
+ };
+
+ QGraphicsObject *item;
+ AnchorLine anchorLine;
+};
+
+inline bool operator==(const QDeclarative1AnchorLine& a, const QDeclarative1AnchorLine& b)
+{
+ return a.item == b.item && a.anchorLine == b.anchorLine;
+}
+
+
class QDeclarativeV4CompilerPrivate: protected QDeclarativeJS::IR::ExprVisitor,
protected QDeclarativeJS::IR::StmtVisitor
{
@@ -178,6 +208,8 @@ private:
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QDeclarative1AnchorLine)
+
QT_END_HEADER
#endif // QDECLARATIVEV4COMPILER_P_P_H
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
index 795406f006..34a59caf1a 100644
--- a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
+++ b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
@@ -40,8 +40,8 @@
****************************************************************************/
#include "qdeclarativev4irbuilder_p.h"
+#include "qdeclarativev4compiler_p_p.h"
-#include <private/qdeclarativeanchors_p_p.h> // For AnchorLine
#include <private/qsganchors_p_p.h> // For AnchorLine
#include <private/qdeclarativetypenamecache_p.h>
@@ -70,7 +70,7 @@ static IR::Type irTypeFromVariantType(int t, QDeclarativeEnginePrivate *engine,
return IR::UrlType;
default:
- if (t == qMetaTypeId<QDeclarativeAnchorLine>())
+ if (t == qMetaTypeId<QDeclarative1AnchorLine>())
return IR::AnchorLineType;
else if (t == qMetaTypeId<QSGAnchorLine>())
return IR::SGAnchorLineType;
diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h
index ef8f16013d..6c05fe4faf 100644
--- a/src/declarative/qml/v8/qv8engine_p.h
+++ b/src/declarative/qml/v8/qv8engine_p.h
@@ -206,7 +206,7 @@ class QDeclarativeEngine;
class QDeclarativeValueType;
class QNetworkAccessManager;
class QDeclarativeContextData;
-class Q_AUTOTEST_EXPORT QV8Engine
+class Q_DECLARATIVE_EXPORT QV8Engine
{
public:
QV8Engine();
diff --git a/src/declarative/qml/v8/qv8qobjectwrapper_p.h b/src/declarative/qml/v8/qv8qobjectwrapper_p.h
index bc4eb443dc..dd787cc476 100644
--- a/src/declarative/qml/v8/qv8qobjectwrapper_p.h
+++ b/src/declarative/qml/v8/qv8qobjectwrapper_p.h
@@ -71,7 +71,7 @@ class QV8ObjectResource;
class QV8QObjectInstance;
class QV8QObjectConnectionList;
class QDeclarativePropertyCache;
-class Q_AUTOTEST_EXPORT QV8QObjectWrapper
+class Q_DECLARATIVE_EXPORT QV8QObjectWrapper
{
public:
QV8QObjectWrapper();
diff --git a/src/declarative/qml/v8/qv8stringwrapper_p.h b/src/declarative/qml/v8/qv8stringwrapper_p.h
index 8dde5c8c44..36c9e24c06 100644
--- a/src/declarative/qml/v8/qv8stringwrapper_p.h
+++ b/src/declarative/qml/v8/qv8stringwrapper_p.h
@@ -58,7 +58,7 @@
QT_BEGIN_NAMESPACE
-class Q_AUTOTEST_EXPORT QV8StringWrapper
+class Q_DECLARATIVE_EXPORT QV8StringWrapper
{
public:
QV8StringWrapper();
diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp
index ce21bcd30e..213ebe564a 100644
--- a/src/declarative/util/qdeclarativeanimation.cpp
+++ b/src/declarative/util/qdeclarativeanimation.cpp
@@ -2431,519 +2431,6 @@ void QDeclarativePropertyAnimation::transition(QDeclarativeStateActions &actions
}
}
-/*!
- \qmlclass ParentAnimation QDeclarativeParentAnimation
- \ingroup qml-animation-transition
- \since 4.7
- \inherits Animation
- \brief The ParentAnimation element animates changes in parent values.
-
- ParentAnimation is used to animate a parent change for an \l Item.
-
- For example, the following ParentChange changes \c blueRect to become
- a child of \c redRect when it is clicked. The inclusion of the
- ParentAnimation, which defines a NumberAnimation to be applied during
- the transition, ensures the item animates smoothly as it moves to
- its new parent:
-
- \snippet doc/src/snippets/declarative/parentanimation.qml 0
-
- A ParentAnimation can contain any number of animations. These animations will
- be run in parallel; to run them sequentially, define them within a
- SequentialAnimation.
-
- In some cases, such as when reparenting between items with clipping enabled, it is useful
- to animate the parent change via another item that does not have clipping
- enabled. Such an item can be set using the \l via property.
-
- For convenience, when a ParentAnimation is used in a \l Transition, it will
- animate any ParentChange that has occurred during the state change.
- This can be overridden by setting a specific target item using the
- \l target property.
-
- Like any other animation element, a ParentAnimation can be applied in a
- number of ways, including transitions, behaviors and property value
- sources. The \l {QML Animation and Transitions} documentation shows a
- variety of methods for creating animations.
-
- \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example}
-*/
-QDeclarativeParentAnimation::QDeclarativeParentAnimation(QObject *parent)
- : QDeclarativeAnimationGroup(*(new QDeclarativeParentAnimationPrivate), parent)
-{
- Q_D(QDeclarativeParentAnimation);
- d->topLevelGroup = new QSequentialAnimationGroup;
- QDeclarative_setParent_noEvent(d->topLevelGroup, this);
-
- d->startAction = new QActionAnimation;
- QDeclarative_setParent_noEvent(d->startAction, d->topLevelGroup);
- d->topLevelGroup->addAnimation(d->startAction);
-
- d->ag = new QParallelAnimationGroup;
- QDeclarative_setParent_noEvent(d->ag, d->topLevelGroup);
- d->topLevelGroup->addAnimation(d->ag);
-
- d->endAction = new QActionAnimation;
- QDeclarative_setParent_noEvent(d->endAction, d->topLevelGroup);
- d->topLevelGroup->addAnimation(d->endAction);
-}
-
-QDeclarativeParentAnimation::~QDeclarativeParentAnimation()
-{
-}
-
-/*!
- \qmlproperty Item ParentAnimation::target
- The item to reparent.
-
- When used in a transition, if no target is specified, all
- ParentChange occurrences are animated by the ParentAnimation.
-*/
-QDeclarativeItem *QDeclarativeParentAnimation::target() const
-{
- Q_D(const QDeclarativeParentAnimation);
- return d->target;
-}
-
-void QDeclarativeParentAnimation::setTarget(QDeclarativeItem *target)
-{
- Q_D(QDeclarativeParentAnimation);
- if (target == d->target)
- return;
-
- d->target = target;
- emit targetChanged();
-}
-
-/*!
- \qmlproperty Item ParentAnimation::newParent
- The new parent to animate to.
-
- If the ParentAnimation is defined within a \l Transition or \l Behavior,
- this value defaults to the value defined in the end state of the
- \l Transition, or the value of the property change that triggered the
- \l Behavior.
-*/
-QDeclarativeItem *QDeclarativeParentAnimation::newParent() const
-{
- Q_D(const QDeclarativeParentAnimation);
- return d->newParent;
-}
-
-void QDeclarativeParentAnimation::setNewParent(QDeclarativeItem *newParent)
-{
- Q_D(QDeclarativeParentAnimation);
- if (newParent == d->newParent)
- return;
-
- d->newParent = newParent;
- emit newParentChanged();
-}
-
-/*!
- \qmlproperty Item ParentAnimation::via
- The item to reparent via. This provides a way to do an unclipped animation
- when both the old parent and new parent are clipped.
-
- \qml
- ParentAnimation {
- target: myItem
- via: topLevelItem
- // ...
- }
- \endqml
-*/
-QDeclarativeItem *QDeclarativeParentAnimation::via() const
-{
- Q_D(const QDeclarativeParentAnimation);
- return d->via;
-}
-
-void QDeclarativeParentAnimation::setVia(QDeclarativeItem *via)
-{
- Q_D(QDeclarativeParentAnimation);
- if (via == d->via)
- return;
-
- d->via = via;
- emit viaChanged();
-}
-
-//### mirrors same-named function in QDeclarativeItem
-QPointF QDeclarativeParentAnimationPrivate::computeTransformOrigin(QDeclarativeItem::TransformOrigin origin, qreal width, qreal height) const
-{
- switch(origin) {
- default:
- case QDeclarativeItem::TopLeft:
- return QPointF(0, 0);
- case QDeclarativeItem::Top:
- return QPointF(width / 2., 0);
- case QDeclarativeItem::TopRight:
- return QPointF(width, 0);
- case QDeclarativeItem::Left:
- return QPointF(0, height / 2.);
- case QDeclarativeItem::Center:
- return QPointF(width / 2., height / 2.);
- case QDeclarativeItem::Right:
- return QPointF(width, height / 2.);
- case QDeclarativeItem::BottomLeft:
- return QPointF(0, height);
- case QDeclarativeItem::Bottom:
- return QPointF(width / 2., height);
- case QDeclarativeItem::BottomRight:
- return QPointF(width, height);
- }
-}
-
-void QDeclarativeParentAnimation::transition(QDeclarativeStateActions &actions,
- QDeclarativeProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QDeclarativeParentAnimation);
-
- struct QDeclarativeParentAnimationData : public QAbstractAnimationAction
- {
- QDeclarativeParentAnimationData() {}
- ~QDeclarativeParentAnimationData() { qDeleteAll(pc); }
-
- QDeclarativeStateActions actions;
- //### reverse should probably apply on a per-action basis
- bool reverse;
- QList<QDeclarativeParentChange *> pc;
- virtual void doAction()
- {
- for (int ii = 0; ii < actions.count(); ++ii) {
- const QDeclarativeAction &action = actions.at(ii);
- if (reverse)
- action.event->reverse();
- else
- action.event->execute();
- }
- }
- };
-
- QDeclarativeParentAnimationData *data = new QDeclarativeParentAnimationData;
- QDeclarativeParentAnimationData *viaData = new QDeclarativeParentAnimationData;
-
- bool hasExplicit = false;
- if (d->target && d->newParent) {
- data->reverse = false;
- QDeclarativeAction myAction;
- QDeclarativeParentChange *pc = new QDeclarativeParentChange;
- pc->setObject(d->target);
- pc->setParent(d->newParent);
- myAction.event = pc;
- data->pc << pc;
- data->actions << myAction;
- hasExplicit = true;
- if (d->via) {
- viaData->reverse = false;
- QDeclarativeAction myVAction;
- QDeclarativeParentChange *vpc = new QDeclarativeParentChange;
- vpc->setObject(d->target);
- vpc->setParent(d->via);
- myVAction.event = vpc;
- viaData->pc << vpc;
- viaData->actions << myVAction;
- }
- //### once actions have concept of modified,
- // loop to match appropriate ParentChanges and mark as modified
- }
-
- if (!hasExplicit)
- for (int i = 0; i < actions.size(); ++i) {
- QDeclarativeAction &action = actions[i];
- if (action.event && action.event->typeName() == QLatin1String("ParentChange")
- && (!d->target || static_cast<QDeclarativeParentChange*>(action.event)->object() == d->target)) {
-
- QDeclarativeParentChange *pc = static_cast<QDeclarativeParentChange*>(action.event);
- QDeclarativeAction myAction = action;
- data->reverse = action.reverseEvent;
-
- //### this logic differs from PropertyAnimation
- // (probably a result of modified vs. done)
- if (d->newParent) {
- QDeclarativeParentChange *epc = new QDeclarativeParentChange;
- epc->setObject(static_cast<QDeclarativeParentChange*>(action.event)->object());
- epc->setParent(d->newParent);
- myAction.event = epc;
- data->pc << epc;
- data->actions << myAction;
- pc = epc;
- } else {
- action.actionDone = true;
- data->actions << myAction;
- }
-
- if (d->via) {
- viaData->reverse = false;
- QDeclarativeAction myAction;
- QDeclarativeParentChange *vpc = new QDeclarativeParentChange;
- vpc->setObject(pc->object());
- vpc->setParent(d->via);
- myAction.event = vpc;
- viaData->pc << vpc;
- viaData->actions << myAction;
- QDeclarativeAction dummyAction;
- QDeclarativeAction &xAction = pc->xIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
- QDeclarativeAction &yAction = pc->yIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
- QDeclarativeAction &sAction = pc->scaleIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
- QDeclarativeAction &rAction = pc->rotationIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction;
- QDeclarativeItem *target = pc->object();
- QDeclarativeItem *targetParent = action.reverseEvent ? pc->originalParent() : pc->parent();
-
- //### this mirrors the logic in QDeclarativeParentChange.
- bool ok;
- const QTransform &transform = targetParent->itemTransform(d->via, &ok);
- if (transform.type() >= QTransform::TxShear || !ok) {
- qmlInfo(this) << QDeclarativeParentAnimation::tr("Unable to preserve appearance under complex transform");
- ok = false;
- }
-
- qreal scale = 1;
- qreal rotation = 0;
- bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0);
- if (ok && !isRotate) {
- if (transform.m11() == transform.m22())
- scale = transform.m11();
- else {
- qmlInfo(this) << QDeclarativeParentAnimation::tr("Unable to preserve appearance under non-uniform scale");
- ok = false;
- }
- } else if (ok && isRotate) {
- if (transform.m11() == transform.m22())
- scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
- else {
- qmlInfo(this) << QDeclarativeParentAnimation::tr("Unable to preserve appearance under non-uniform scale");
- ok = false;
- }
-
- if (scale != 0)
- rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
- else {
- qmlInfo(this) << QDeclarativeParentAnimation::tr("Unable to preserve appearance under scale of 0");
- ok = false;
- }
- }
-
- const QPointF &point = transform.map(QPointF(xAction.toValue.toReal(),yAction.toValue.toReal()));
- qreal x = point.x();
- qreal y = point.y();
- if (ok && target->transformOrigin() != QDeclarativeItem::TopLeft) {
- qreal w = target->width();
- qreal h = target->height();
- if (pc->widthIsSet() && i < actions.size() - 1)
- w = actions[++i].toValue.toReal();
- if (pc->heightIsSet() && i < actions.size() - 1)
- h = actions[++i].toValue.toReal();
- const QPointF &transformOrigin
- = d->computeTransformOrigin(target->transformOrigin(), w,h);
- qreal tempxt = transformOrigin.x();
- qreal tempyt = transformOrigin.y();
- QTransform t;
- t.translate(-tempxt, -tempyt);
- t.rotate(rotation);
- t.scale(scale, scale);
- t.translate(tempxt, tempyt);
- const QPointF &offset = t.map(QPointF(0,0));
- x += offset.x();
- y += offset.y();
- }
-
- if (ok) {
- //qDebug() << x << y << rotation << scale;
- xAction.toValue = x;
- yAction.toValue = y;
- sAction.toValue = sAction.toValue.toReal() * scale;
- rAction.toValue = rAction.toValue.toReal() + rotation;
- }
- }
- }
- }
-
- if (data->actions.count()) {
- if (direction == QDeclarativeAbstractAnimation::Forward) {
- d->startAction->setAnimAction(d->via ? viaData : data, QActionAnimation::DeleteWhenStopped);
- d->endAction->setAnimAction(d->via ? data : 0, QActionAnimation::DeleteWhenStopped);
- } else {
- d->endAction->setAnimAction(d->via ? viaData : data, QActionAnimation::DeleteWhenStopped);
- d->startAction->setAnimAction(d->via ? data : 0, QActionAnimation::DeleteWhenStopped);
- }
- if (!d->via)
- delete viaData;
- } else {
- delete data;
- delete viaData;
- }
-
- //take care of any child animations
- bool valid = d->defaultProperty.isValid();
- for (int ii = 0; ii < d->animations.count(); ++ii) {
- if (valid)
- d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
- d->animations.at(ii)->transition(actions, modified, direction);
- }
-
-}
-
-QAbstractAnimation *QDeclarativeParentAnimation::qtAnimation()
-{
- Q_D(QDeclarativeParentAnimation);
- return d->topLevelGroup;
-}
-
-/*!
- \qmlclass AnchorAnimation QDeclarativeAnchorAnimation
- \ingroup qml-animation-transition
- \since 4.7
- \inherits Animation
- \brief The AnchorAnimation element animates changes in anchor values.
-
- AnchorAnimation is used to animate an anchor change.
-
- In the following snippet we animate the addition of a right anchor to a \l Rectangle:
-
- \snippet doc/src/snippets/declarative/anchoranimation.qml 0
-
- For convenience, when an AnchorAnimation is used in a \l Transition, it will
- animate any AnchorChanges that have occurred during the state change.
- This can be overridden by setting a specific target item using the
- \l target property.
-
- Like any other animation element, an AnchorAnimation can be applied in a
- number of ways, including transitions, behaviors and property value
- sources. The \l {QML Animation and Transitions} documentation shows a
- variety of methods for creating animations.
-
- \sa {QML Animation and Transitions}, AnchorChanges
-*/
-
-QDeclarativeAnchorAnimation::QDeclarativeAnchorAnimation(QObject *parent)
-: QDeclarativeAbstractAnimation(*(new QDeclarativeAnchorAnimationPrivate), parent)
-{
- Q_D(QDeclarativeAnchorAnimation);
- d->va = new QDeclarativeBulkValueAnimator;
- QDeclarative_setParent_noEvent(d->va, this);
-}
-
-QDeclarativeAnchorAnimation::~QDeclarativeAnchorAnimation()
-{
-}
-
-QAbstractAnimation *QDeclarativeAnchorAnimation::qtAnimation()
-{
- Q_D(QDeclarativeAnchorAnimation);
- return d->va;
-}
-
-/*!
- \qmlproperty list<Item> AnchorAnimation::targets
- The items to reanchor.
-
- If no targets are specified all AnchorChanges will be
- animated by the AnchorAnimation.
-*/
-QDeclarativeListProperty<QDeclarativeItem> QDeclarativeAnchorAnimation::targets()
-{
- Q_D(QDeclarativeAnchorAnimation);
- return QDeclarativeListProperty<QDeclarativeItem>(this, d->targets);
-}
-
-/*!
- \qmlproperty int AnchorAnimation::duration
- This property holds the duration of the animation, in milliseconds.
-
- The default value is 250.
-*/
-int QDeclarativeAnchorAnimation::duration() const
-{
- Q_D(const QDeclarativeAnchorAnimation);
- return d->va->duration();
-}
-
-void QDeclarativeAnchorAnimation::setDuration(int duration)
-{
- if (duration < 0) {
- qmlInfo(this) << tr("Cannot set a duration of < 0");
- return;
- }
-
- Q_D(QDeclarativeAnchorAnimation);
- if (d->va->duration() == duration)
- return;
- d->va->setDuration(duration);
- emit durationChanged(duration);
-}
-
-/*!
- \qmlproperty enumeration AnchorAnimation::easing.type
- \qmlproperty real AnchorAnimation::easing.amplitude
- \qmlproperty real AnchorAnimation::easing.overshoot
- \qmlproperty real AnchorAnimation::easing.period
- \brief the easing curve used for the animation.
-
- To specify an easing curve you need to specify at least the type. For some curves you can also specify
- amplitude, period and/or overshoot. The default easing curve is
- Linear.
-
- \qml
- AnchorAnimation { easing.type: Easing.InOutQuad }
- \endqml
-
- See the \l{PropertyAnimation::easing.type} documentation for information
- about the different types of easing curves.
-*/
-
-QEasingCurve QDeclarativeAnchorAnimation::easing() const
-{
- Q_D(const QDeclarativeAnchorAnimation);
- return d->va->easingCurve();
-}
-
-void QDeclarativeAnchorAnimation::setEasing(const QEasingCurve &e)
-{
- Q_D(QDeclarativeAnchorAnimation);
- if (d->va->easingCurve() == e)
- return;
-
- d->va->setEasingCurve(e);
- emit easingChanged(e);
-}
-
-void QDeclarativeAnchorAnimation::transition(QDeclarativeStateActions &actions,
- QDeclarativeProperties &modified,
- TransitionDirection direction)
-{
- Q_UNUSED(modified);
- Q_D(QDeclarativeAnchorAnimation);
- QDeclarativeAnimationPropertyUpdater *data = new QDeclarativeAnimationPropertyUpdater;
- data->interpolatorType = QMetaType::QReal;
- data->interpolator = d->interpolator;
-
- data->reverse = direction == Backward ? true : false;
- data->fromSourced = false;
- data->fromDefined = false;
-
- for (int ii = 0; ii < actions.count(); ++ii) {
- QDeclarativeAction &action = actions[ii];
- if (action.event && action.event->typeName() == QLatin1String("AnchorChanges")
- && (d->targets.isEmpty() || d->targets.contains(static_cast<QDeclarativeAnchorChanges*>(action.event)->object()))) {
- data->actions << static_cast<QDeclarativeAnchorChanges*>(action.event)->additionalActions();
- }
- }
-
- if (data->actions.count()) {
- if (!d->rangeIsSet) {
- d->va->setStartValue(qreal(0));
- d->va->setEndValue(qreal(1));
- d->rangeIsSet = true;
- }
- d->va->setAnimValue(data, QAbstractAnimation::DeleteWhenStopped);
- d->va->setFromSourcedValue(&data->fromSourced);
- } else {
- delete data;
- }
-}
QDeclarativeScriptActionPrivate::QDeclarativeScriptActionPrivate()
: QDeclarativeAbstractAnimationPrivate(), hasRunScriptScript(false), reversing(false), proxy(this), rsa(0) {}
diff --git a/src/declarative/util/qdeclarativeanimation_p.h b/src/declarative/util/qdeclarativeanimation_p.h
index 09350ce61e..30f05ececa 100644
--- a/src/declarative/util/qdeclarativeanimation_p.h
+++ b/src/declarative/util/qdeclarativeanimation_p.h
@@ -235,7 +235,6 @@ protected:
virtual QAbstractAnimation *qtAnimation();
};
-class QDeclarativeItem;
class QDeclarativePropertyAnimationPrivate;
class Q_AUTOTEST_EXPORT QDeclarativePropertyAnimation : public QDeclarativeAbstractAnimation
{
@@ -440,72 +439,6 @@ protected:
virtual QAbstractAnimation *qtAnimation();
};
-class QDeclarativeParentAnimationPrivate;
-class QDeclarativeParentAnimation : public QDeclarativeAnimationGroup
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeParentAnimation)
-
- Q_PROPERTY(QDeclarativeItem *target READ target WRITE setTarget NOTIFY targetChanged)
- Q_PROPERTY(QDeclarativeItem *newParent READ newParent WRITE setNewParent NOTIFY newParentChanged)
- Q_PROPERTY(QDeclarativeItem *via READ via WRITE setVia NOTIFY viaChanged)
-
-public:
- QDeclarativeParentAnimation(QObject *parent=0);
- virtual ~QDeclarativeParentAnimation();
-
- QDeclarativeItem *target() const;
- void setTarget(QDeclarativeItem *);
-
- QDeclarativeItem *newParent() const;
- void setNewParent(QDeclarativeItem *);
-
- QDeclarativeItem *via() const;
- void setVia(QDeclarativeItem *);
-
-Q_SIGNALS:
- void targetChanged();
- void newParentChanged();
- void viaChanged();
-
-protected:
- virtual void transition(QDeclarativeStateActions &actions,
- QDeclarativeProperties &modified,
- TransitionDirection direction);
- virtual QAbstractAnimation *qtAnimation();
-};
-
-class QDeclarativeAnchorAnimationPrivate;
-class QDeclarativeAnchorAnimation : public QDeclarativeAbstractAnimation
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeAnchorAnimation)
- Q_PROPERTY(QDeclarativeListProperty<QDeclarativeItem> targets READ targets)
- Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged)
- Q_PROPERTY(QEasingCurve easing READ easing WRITE setEasing NOTIFY easingChanged)
-
-public:
- QDeclarativeAnchorAnimation(QObject *parent=0);
- virtual ~QDeclarativeAnchorAnimation();
-
- QDeclarativeListProperty<QDeclarativeItem> targets();
-
- int duration() const;
- void setDuration(int);
-
- QEasingCurve easing() const;
- void setEasing(const QEasingCurve &);
-
-Q_SIGNALS:
- void durationChanged(int);
- void easingChanged(const QEasingCurve&);
-
-protected:
- virtual void transition(QDeclarativeStateActions &actions,
- QDeclarativeProperties &modified,
- TransitionDirection direction);
- virtual QAbstractAnimation *qtAnimation();
-};
QT_END_NAMESPACE
@@ -520,8 +453,6 @@ QML_DECLARE_TYPE(QDeclarativeSequentialAnimation)
QML_DECLARE_TYPE(QDeclarativeParallelAnimation)
QML_DECLARE_TYPE(QDeclarativeVector3dAnimation)
QML_DECLARE_TYPE(QDeclarativeRotationAnimation)
-QML_DECLARE_TYPE(QDeclarativeParentAnimation)
-QML_DECLARE_TYPE(QDeclarativeAnchorAnimation)
QT_END_HEADER
diff --git a/src/declarative/util/qdeclarativeanimation_p_p.h b/src/declarative/util/qdeclarativeanimation_p_p.h
index 8e00b4b65a..b46475b5bd 100644
--- a/src/declarative/util/qdeclarativeanimation_p_p.h
+++ b/src/declarative/util/qdeclarativeanimation_p_p.h
@@ -59,7 +59,6 @@
#include "private/qdeclarativetimeline_p_p.h"
#include <qdeclarative.h>
-#include <qdeclarativeitem.h>
#include <qdeclarativecontext.h>
#include <QtCore/QPauseAnimation>
@@ -344,38 +343,6 @@ public:
QDeclarativeRotationAnimation::RotationDirection direction;
};
-class QDeclarativeParentAnimationPrivate : public QDeclarativeAnimationGroupPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeParentAnimation)
-public:
- QDeclarativeParentAnimationPrivate()
- : QDeclarativeAnimationGroupPrivate(), target(0), newParent(0),
- via(0), topLevelGroup(0), startAction(0), endAction(0) {}
-
- QDeclarativeItem *target;
- QDeclarativeItem *newParent;
- QDeclarativeItem *via;
-
- QSequentialAnimationGroup *topLevelGroup;
- QActionAnimation *startAction;
- QActionAnimation *endAction;
-
- QPointF computeTransformOrigin(QDeclarativeItem::TransformOrigin origin, qreal width, qreal height) const;
-};
-
-class QDeclarativeAnchorAnimationPrivate : public QDeclarativeAbstractAnimationPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeAnchorAnimation)
-public:
- QDeclarativeAnchorAnimationPrivate() : rangeIsSet(false), va(0),
- interpolator(QVariantAnimationPrivate::getInterpolator(QMetaType::QReal)) {}
-
- bool rangeIsSet;
- QDeclarativeBulkValueAnimator *va;
- QVariantAnimation::Interpolator interpolator;
- QList<QDeclarativeItem*> targets;
-};
-
class Q_AUTOTEST_EXPORT QDeclarativeAnimationPropertyUpdater : public QDeclarativeBulkValueUpdater
{
public:
diff --git a/src/declarative/graphicsitems/qdeclarativepath.cpp b/src/declarative/util/qdeclarativepath.cpp
index 3437e82d30..3437e82d30 100644
--- a/src/declarative/graphicsitems/qdeclarativepath.cpp
+++ b/src/declarative/util/qdeclarativepath.cpp
diff --git a/src/declarative/graphicsitems/qdeclarativepath_p.h b/src/declarative/util/qdeclarativepath_p.h
index db4d690cc7..c8420eb996 100644
--- a/src/declarative/graphicsitems/qdeclarativepath_p.h
+++ b/src/declarative/util/qdeclarativepath_p.h
@@ -42,8 +42,6 @@
#ifndef QDECLARATIVEPATH_H
#define QDECLARATIVEPATH_H
-#include "qdeclarativeitem.h"
-
#include <qdeclarative.h>
#include <QtCore/QObject>
diff --git a/src/declarative/graphicsitems/qdeclarativepath_p_p.h b/src/declarative/util/qdeclarativepath_p_p.h
index 2a1d072a39..4e407eca35 100644
--- a/src/declarative/graphicsitems/qdeclarativepath_p_p.h
+++ b/src/declarative/util/qdeclarativepath_p_p.h
@@ -57,6 +57,7 @@
#include <qdeclarative.h>
+#include <qstringlist.h>
#include <private/qobject_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index c260684eef..0ced8ebd61 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -45,8 +45,6 @@
#include <qdeclarativecontext.h>
#include <qdeclarativeexpression.h>
#include <qdeclarativeinfo.h>
-#include <qdeclarativeanchors_p_p.h>
-#include <qdeclarativeitem_p.h>
#include <qdeclarativeguard_p.h>
#include <qdeclarativenullablevalue_p_p.h>
#include "private/qdeclarativecontext_p.h"
@@ -62,532 +60,6 @@
QT_BEGIN_NAMESPACE
-class QDeclarativeParentChangePrivate : public QDeclarativeStateOperationPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeParentChange)
-public:
- QDeclarativeParentChangePrivate() : target(0), parent(0), origParent(0), origStackBefore(0),
- rewindParent(0), rewindStackBefore(0) {}
-
- QDeclarativeItem *target;
- QDeclarativeGuard<QDeclarativeItem> parent;
- QDeclarativeGuard<QDeclarativeItem> origParent;
- QDeclarativeGuard<QDeclarativeItem> origStackBefore;
- QDeclarativeItem *rewindParent;
- QDeclarativeItem *rewindStackBefore;
-
- QDeclarativeNullableValue<QDeclarativeScriptString> xString;
- QDeclarativeNullableValue<QDeclarativeScriptString> yString;
- QDeclarativeNullableValue<QDeclarativeScriptString> widthString;
- QDeclarativeNullableValue<QDeclarativeScriptString> heightString;
- QDeclarativeNullableValue<QDeclarativeScriptString> scaleString;
- QDeclarativeNullableValue<QDeclarativeScriptString> rotationString;
-
- QDeclarativeNullableValue<qreal> x;
- QDeclarativeNullableValue<qreal> y;
- QDeclarativeNullableValue<qreal> width;
- QDeclarativeNullableValue<qreal> height;
- QDeclarativeNullableValue<qreal> scale;
- QDeclarativeNullableValue<qreal> rotation;
-
- void doChange(QDeclarativeItem *targetParent, QDeclarativeItem *stackBefore = 0);
-};
-
-void QDeclarativeParentChangePrivate::doChange(QDeclarativeItem *targetParent, QDeclarativeItem *stackBefore)
-{
- if (targetParent && target && target->parentItem()) {
- Q_Q(QDeclarativeParentChange);
- bool ok;
- const QTransform &transform = target->parentItem()->itemTransform(targetParent, &ok);
- if (transform.type() >= QTransform::TxShear || !ok) {
- qmlInfo(q) << QDeclarativeParentChange::tr("Unable to preserve appearance under complex transform");
- ok = false;
- }
-
- qreal scale = 1;
- qreal rotation = 0;
- bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0);
- if (ok && !isRotate) {
- if (transform.m11() == transform.m22())
- scale = transform.m11();
- else {
- qmlInfo(q) << QDeclarativeParentChange::tr("Unable to preserve appearance under non-uniform scale");
- ok = false;
- }
- } else if (ok && isRotate) {
- if (transform.m11() == transform.m22())
- scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
- else {
- qmlInfo(q) << QDeclarativeParentChange::tr("Unable to preserve appearance under non-uniform scale");
- ok = false;
- }
-
- if (scale != 0)
- rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
- else {
- qmlInfo(q) << QDeclarativeParentChange::tr("Unable to preserve appearance under scale of 0");
- ok = false;
- }
- }
-
- const QPointF &point = transform.map(QPointF(target->x(),target->y()));
- qreal x = point.x();
- qreal y = point.y();
-
- // setParentItem will update the transformOriginPoint if needed
- target->setParentItem(targetParent);
-
- if (ok && target->transformOrigin() != QDeclarativeItem::TopLeft) {
- qreal tempxt = target->transformOriginPoint().x();
- qreal tempyt = target->transformOriginPoint().y();
- QTransform t;
- t.translate(-tempxt, -tempyt);
- t.rotate(rotation);
- t.scale(scale, scale);
- t.translate(tempxt, tempyt);
- const QPointF &offset = t.map(QPointF(0,0));
- x += offset.x();
- y += offset.y();
- }
-
- if (ok) {
- //qDebug() << x << y << rotation << scale;
- target->setX(x);
- target->setY(y);
- target->setRotation(target->rotation() + rotation);
- target->setScale(target->scale() * scale);
- }
- } else if (target) {
- target->setParentItem(targetParent);
- }
-
- //restore the original stack position.
- //### if stackBefore has also been reparented this won't work
- if (stackBefore)
- target->stackBefore(stackBefore);
-}
-
-/*!
- \preliminary
- \qmlclass ParentChange QDeclarativeParentChange
- \ingroup qml-state-elements
- \brief The ParentChange element allows you to reparent an Item in a state change.
-
- ParentChange reparents an item while preserving its visual appearance (position, size,
- rotation, and scale) on screen. You can then specify a transition to move/resize/rotate/scale
- the item to its final intended appearance.
-
- ParentChange can only preserve visual appearance if no complex transforms are involved.
- More specifically, it will not work if the transform property has been set for any
- items involved in the reparenting (i.e. items in the common ancestor tree
- for the original and new parent).
-
- The example below displays a large red rectangle and a small blue rectangle, side by side.
- When the \c blueRect is clicked, it changes to the "reparented" state: its parent is changed to \c redRect and it is
- positioned at (10, 10) within the red rectangle, as specified in the ParentChange.
-
- \snippet doc/src/snippets/declarative/parentchange.qml 0
-
- \image parentchange.png
-
- You can specify at which point in a transition you want a ParentChange to occur by
- using a ParentAnimation.
-*/
-
-
-QDeclarativeParentChange::QDeclarativeParentChange(QObject *parent)
- : QDeclarativeStateOperation(*(new QDeclarativeParentChangePrivate), parent)
-{
-}
-
-QDeclarativeParentChange::~QDeclarativeParentChange()
-{
-}
-
-/*!
- \qmlproperty real ParentChange::x
- \qmlproperty real ParentChange::y
- \qmlproperty real ParentChange::width
- \qmlproperty real ParentChange::height
- \qmlproperty real ParentChange::scale
- \qmlproperty real ParentChange::rotation
- These properties hold the new position, size, scale, and rotation
- for the item in this state.
-*/
-QDeclarativeScriptString QDeclarativeParentChange::x() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->xString.value;
-}
-
-void tryReal(QDeclarativeNullableValue<qreal> &value, const QString &string)
-{
- bool ok = false;
- qreal realValue = string.toFloat(&ok);
- if (ok)
- value = realValue;
- else
- value.invalidate();
-}
-
-void QDeclarativeParentChange::setX(QDeclarativeScriptString x)
-{
- Q_D(QDeclarativeParentChange);
- d->xString = x;
- tryReal(d->x, x.script());
-}
-
-bool QDeclarativeParentChange::xIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->xString.isValid();
-}
-
-QDeclarativeScriptString QDeclarativeParentChange::y() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->yString.value;
-}
-
-void QDeclarativeParentChange::setY(QDeclarativeScriptString y)
-{
- Q_D(QDeclarativeParentChange);
- d->yString = y;
- tryReal(d->y, y.script());
-}
-
-bool QDeclarativeParentChange::yIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->yString.isValid();
-}
-
-QDeclarativeScriptString QDeclarativeParentChange::width() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->widthString.value;
-}
-
-void QDeclarativeParentChange::setWidth(QDeclarativeScriptString width)
-{
- Q_D(QDeclarativeParentChange);
- d->widthString = width;
- tryReal(d->width, width.script());
-}
-
-bool QDeclarativeParentChange::widthIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->widthString.isValid();
-}
-
-QDeclarativeScriptString QDeclarativeParentChange::height() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->heightString.value;
-}
-
-void QDeclarativeParentChange::setHeight(QDeclarativeScriptString height)
-{
- Q_D(QDeclarativeParentChange);
- d->heightString = height;
- tryReal(d->height, height.script());
-}
-
-bool QDeclarativeParentChange::heightIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->heightString.isValid();
-}
-
-QDeclarativeScriptString QDeclarativeParentChange::scale() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->scaleString.value;
-}
-
-void QDeclarativeParentChange::setScale(QDeclarativeScriptString scale)
-{
- Q_D(QDeclarativeParentChange);
- d->scaleString = scale;
- tryReal(d->scale, scale.script());
-}
-
-bool QDeclarativeParentChange::scaleIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->scaleString.isValid();
-}
-
-QDeclarativeScriptString QDeclarativeParentChange::rotation() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->rotationString.value;
-}
-
-void QDeclarativeParentChange::setRotation(QDeclarativeScriptString rotation)
-{
- Q_D(QDeclarativeParentChange);
- d->rotationString = rotation;
- tryReal(d->rotation, rotation.script());
-}
-
-bool QDeclarativeParentChange::rotationIsSet() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->rotationString.isValid();
-}
-
-QDeclarativeItem *QDeclarativeParentChange::originalParent() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->origParent;
-}
-
-/*!
- \qmlproperty Item ParentChange::target
- This property holds the item to be reparented
-*/
-
-QDeclarativeItem *QDeclarativeParentChange::object() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->target;
-}
-
-void QDeclarativeParentChange::setObject(QDeclarativeItem *target)
-{
- Q_D(QDeclarativeParentChange);
- d->target = target;
-}
-
-/*!
- \qmlproperty Item ParentChange::parent
- This property holds the new parent for the item in this state.
-*/
-
-QDeclarativeItem *QDeclarativeParentChange::parent() const
-{
- Q_D(const QDeclarativeParentChange);
- return d->parent;
-}
-
-void QDeclarativeParentChange::setParent(QDeclarativeItem *parent)
-{
- Q_D(QDeclarativeParentChange);
- d->parent = parent;
-}
-
-QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
-{
- Q_D(QDeclarativeParentChange);
- if (!d->target || !d->parent)
- return ActionList();
-
- ActionList actions;
-
- QDeclarativeAction a;
- a.event = this;
- actions << a;
-
- QDeclarativeContext *ctxt = qmlContext(this);
-
- if (d->xString.isValid()) {
- if (d->x.isValid()) {
- QDeclarativeAction xa(d->target, QLatin1String("x"), ctxt, d->x.value);
- actions << xa;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->xString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("x"), ctxt));
- QDeclarativeAction xa;
- xa.property = newBinding->property();
- xa.toBinding = newBinding;
- xa.fromValue = xa.property.read();
- xa.deletableToBinding = true;
- actions << xa;
- }
- }
-
- if (d->yString.isValid()) {
- if (d->y.isValid()) {
- QDeclarativeAction ya(d->target, QLatin1String("y"), ctxt, d->y.value);
- actions << ya;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->yString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("y"), ctxt));
- QDeclarativeAction ya;
- ya.property = newBinding->property();
- ya.toBinding = newBinding;
- ya.fromValue = ya.property.read();
- ya.deletableToBinding = true;
- actions << ya;
- }
- }
-
- if (d->scaleString.isValid()) {
- if (d->scale.isValid()) {
- QDeclarativeAction sa(d->target, QLatin1String("scale"), ctxt, d->scale.value);
- actions << sa;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->scaleString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("scale"), ctxt));
- QDeclarativeAction sa;
- sa.property = newBinding->property();
- sa.toBinding = newBinding;
- sa.fromValue = sa.property.read();
- sa.deletableToBinding = true;
- actions << sa;
- }
- }
-
- if (d->rotationString.isValid()) {
- if (d->rotation.isValid()) {
- QDeclarativeAction ra(d->target, QLatin1String("rotation"), ctxt, d->rotation.value);
- actions << ra;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->rotationString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("rotation"), ctxt));
- QDeclarativeAction ra;
- ra.property = newBinding->property();
- ra.toBinding = newBinding;
- ra.fromValue = ra.property.read();
- ra.deletableToBinding = true;
- actions << ra;
- }
- }
-
- if (d->widthString.isValid()) {
- if (d->width.isValid()) {
- QDeclarativeAction wa(d->target, QLatin1String("width"), ctxt, d->width.value);
- actions << wa;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->widthString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("width"), ctxt));
- QDeclarativeAction wa;
- wa.property = newBinding->property();
- wa.toBinding = newBinding;
- wa.fromValue = wa.property.read();
- wa.deletableToBinding = true;
- actions << wa;
- }
- }
-
- if (d->heightString.isValid()) {
- if (d->height.isValid()) {
- QDeclarativeAction ha(d->target, QLatin1String("height"), ctxt, d->height.value);
- actions << ha;
- } else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->heightString.value.script(), d->target, ctxt);
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("height"), ctxt));
- QDeclarativeAction ha;
- ha.property = newBinding->property();
- ha.toBinding = newBinding;
- ha.fromValue = ha.property.read();
- ha.deletableToBinding = true;
- actions << ha;
- }
- }
-
- return actions;
-}
-
-class AccessibleFxItem : public QDeclarativeItem
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem)
-public:
- int siblingIndex() {
- Q_D(QDeclarativeItem);
- return d->siblingIndex;
- }
-};
-
-void QDeclarativeParentChange::saveOriginals()
-{
- Q_D(QDeclarativeParentChange);
- saveCurrentValues();
- d->origParent = d->rewindParent;
- d->origStackBefore = d->rewindStackBefore;
-}
-
-/*void QDeclarativeParentChange::copyOriginals(QDeclarativeActionEvent *other)
-{
- Q_D(QDeclarativeParentChange);
- QDeclarativeParentChange *pc = static_cast<QDeclarativeParentChange*>(other);
-
- d->origParent = pc->d_func()->rewindParent;
- d->origStackBefore = pc->d_func()->rewindStackBefore;
-
- saveCurrentValues();
-}*/
-
-void QDeclarativeParentChange::execute(Reason)
-{
- Q_D(QDeclarativeParentChange);
- d->doChange(d->parent);
-}
-
-bool QDeclarativeParentChange::isReversable()
-{
- return true;
-}
-
-void QDeclarativeParentChange::reverse(Reason)
-{
- Q_D(QDeclarativeParentChange);
- d->doChange(d->origParent, d->origStackBefore);
-}
-
-QString QDeclarativeParentChange::typeName() const
-{
- return QLatin1String("ParentChange");
-}
-
-bool QDeclarativeParentChange::override(QDeclarativeActionEvent*other)
-{
- Q_D(QDeclarativeParentChange);
- if (other->typeName() != QLatin1String("ParentChange"))
- return false;
- if (QDeclarativeParentChange *otherPC = static_cast<QDeclarativeParentChange*>(other))
- return (d->target == otherPC->object());
- return false;
-}
-
-void QDeclarativeParentChange::saveCurrentValues()
-{
- Q_D(QDeclarativeParentChange);
- if (!d->target) {
- d->rewindParent = 0;
- d->rewindStackBefore = 0;
- return;
- }
-
- d->rewindParent = d->target->parentItem();
- d->rewindStackBefore = 0;
-
- if (!d->rewindParent)
- return;
-
- //try to determine the item's original stack position so we can restore it
- int siblingIndex = ((AccessibleFxItem*)d->target)->siblingIndex() + 1;
- QList<QGraphicsItem*> children = d->rewindParent->childItems();
- for (int i = 0; i < children.count(); ++i) {
- QDeclarativeItem *child = qobject_cast<QDeclarativeItem*>(children.at(i));
- if (!child)
- continue;
- if (((AccessibleFxItem*)child)->siblingIndex() == siblingIndex) {
- d->rewindStackBefore = child;
- break;
- }
- }
-}
-
-void QDeclarativeParentChange::rewind()
-{
- Q_D(QDeclarativeParentChange);
- d->doChange(d->rewindParent, d->rewindStackBefore);
-}
-
class QDeclarativeStateChangeScriptPrivate : public QDeclarativeStateOperationPrivate
{
public:
@@ -684,903 +156,7 @@ QString QDeclarativeStateChangeScript::typeName() const
return QLatin1String("StateChangeScript");
}
-/*!
- \qmlclass AnchorChanges QDeclarativeAnchorChanges
- \ingroup qml-state-elements
- \brief The AnchorChanges element allows you to change the anchors of an item in a state.
-
- The AnchorChanges element is used to modify the anchors of an item in a \l State.
-
- AnchorChanges cannot be used to modify the margins on an item. For this, use
- PropertyChanges intead.
-
- In the following example we change the top and bottom anchors of an item
- using AnchorChanges, and the top and bottom anchor margins using
- PropertyChanges:
-
- \snippet doc/src/snippets/declarative/anchorchanges.qml 0
-
- \image anchorchanges.png
-
- AnchorChanges can be animated using AnchorAnimation.
- \qml
- //animate our anchor changes
- Transition {
- AnchorAnimation {}
- }
- \endqml
-
- Margin animations can be animated using NumberAnimation.
-
- For more information on anchors see \l {anchor-layout}{Anchor Layouts}.
-*/
-
-class QDeclarativeAnchorSetPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeAnchorSet)
-public:
- QDeclarativeAnchorSetPrivate()
- : usedAnchors(0), resetAnchors(0), fill(0),
- centerIn(0)/*, leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
- margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)*/
- {
- }
-
- QDeclarativeAnchors::Anchors usedAnchors;
- QDeclarativeAnchors::Anchors resetAnchors;
-
- QDeclarativeItem *fill;
- QDeclarativeItem *centerIn;
-
- QDeclarativeScriptString leftScript;
- QDeclarativeScriptString rightScript;
- QDeclarativeScriptString topScript;
- QDeclarativeScriptString bottomScript;
- QDeclarativeScriptString hCenterScript;
- QDeclarativeScriptString vCenterScript;
- QDeclarativeScriptString baselineScript;
-
- /*qreal leftMargin;
- qreal rightMargin;
- qreal topMargin;
- qreal bottomMargin;
- qreal margins;
- qreal vCenterOffset;
- qreal hCenterOffset;
- qreal baselineOffset;*/
-};
-
-QDeclarativeAnchorSet::QDeclarativeAnchorSet(QObject *parent)
- : QObject(*new QDeclarativeAnchorSetPrivate, parent)
-{
-}
-
-QDeclarativeAnchorSet::~QDeclarativeAnchorSet()
-{
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::top() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->topScript;
-}
-
-void QDeclarativeAnchorSet::setTop(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::TopAnchor;
- d->topScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetTop();
-}
-
-void QDeclarativeAnchorSet::resetTop()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::TopAnchor;
- d->topScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::TopAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::bottom() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->bottomScript;
-}
-
-void QDeclarativeAnchorSet::setBottom(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::BottomAnchor;
- d->bottomScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetBottom();
-}
-
-void QDeclarativeAnchorSet::resetBottom()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::BottomAnchor;
- d->bottomScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::BottomAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::verticalCenter() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->vCenterScript;
-}
-
-void QDeclarativeAnchorSet::setVerticalCenter(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::VCenterAnchor;
- d->vCenterScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetVerticalCenter();
-}
-
-void QDeclarativeAnchorSet::resetVerticalCenter()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::VCenterAnchor;
- d->vCenterScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::VCenterAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::baseline() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->baselineScript;
-}
-
-void QDeclarativeAnchorSet::setBaseline(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::BaselineAnchor;
- d->baselineScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetBaseline();
-}
-
-void QDeclarativeAnchorSet::resetBaseline()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::BaselineAnchor;
- d->baselineScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::BaselineAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::left() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->leftScript;
-}
-
-void QDeclarativeAnchorSet::setLeft(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::LeftAnchor;
- d->leftScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetLeft();
-}
-
-void QDeclarativeAnchorSet::resetLeft()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::LeftAnchor;
- d->leftScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::LeftAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::right() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->rightScript;
-}
-
-void QDeclarativeAnchorSet::setRight(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::RightAnchor;
- d->rightScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetRight();
-}
-
-void QDeclarativeAnchorSet::resetRight()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::RightAnchor;
- d->rightScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::RightAnchor;
-}
-
-QDeclarativeScriptString QDeclarativeAnchorSet::horizontalCenter() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->hCenterScript;
-}
-
-void QDeclarativeAnchorSet::setHorizontalCenter(const QDeclarativeScriptString &edge)
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors |= QDeclarativeAnchors::HCenterAnchor;
- d->hCenterScript = edge;
- if (edge.script() == QLatin1String("undefined"))
- resetHorizontalCenter();
-}
-
-void QDeclarativeAnchorSet::resetHorizontalCenter()
-{
- Q_D(QDeclarativeAnchorSet);
- d->usedAnchors &= ~QDeclarativeAnchors::HCenterAnchor;
- d->hCenterScript = QDeclarativeScriptString();
- d->resetAnchors |= QDeclarativeAnchors::HCenterAnchor;
-}
-
-QDeclarativeItem *QDeclarativeAnchorSet::fill() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->fill;
-}
-
-void QDeclarativeAnchorSet::setFill(QDeclarativeItem *f)
-{
- Q_D(QDeclarativeAnchorSet);
- d->fill = f;
-}
-
-void QDeclarativeAnchorSet::resetFill()
-{
- setFill(0);
-}
-
-QDeclarativeItem *QDeclarativeAnchorSet::centerIn() const
-{
- Q_D(const QDeclarativeAnchorSet);
- return d->centerIn;
-}
-
-void QDeclarativeAnchorSet::setCenterIn(QDeclarativeItem* c)
-{
- Q_D(QDeclarativeAnchorSet);
- d->centerIn = c;
-}
-
-void QDeclarativeAnchorSet::resetCenterIn()
-{
- setCenterIn(0);
-}
-
-
-class QDeclarativeAnchorChangesPrivate : public QDeclarativeStateOperationPrivate
-{
-public:
- QDeclarativeAnchorChangesPrivate()
- : target(0), anchorSet(new QDeclarativeAnchorSet),
- leftBinding(0), rightBinding(0), hCenterBinding(0),
- topBinding(0), bottomBinding(0), vCenterBinding(0), baselineBinding(0),
- origLeftBinding(0), origRightBinding(0), origHCenterBinding(0),
- origTopBinding(0), origBottomBinding(0), origVCenterBinding(0),
- origBaselineBinding(0)
- {
-
- }
- ~QDeclarativeAnchorChangesPrivate() { delete anchorSet; }
-
- QDeclarativeItem *target;
- QDeclarativeAnchorSet *anchorSet;
-
- QDeclarativeBinding *leftBinding;
- QDeclarativeBinding *rightBinding;
- QDeclarativeBinding *hCenterBinding;
- QDeclarativeBinding *topBinding;
- QDeclarativeBinding *bottomBinding;
- QDeclarativeBinding *vCenterBinding;
- QDeclarativeBinding *baselineBinding;
-
- QDeclarativeAbstractBinding *origLeftBinding;
- QDeclarativeAbstractBinding *origRightBinding;
- QDeclarativeAbstractBinding *origHCenterBinding;
- QDeclarativeAbstractBinding *origTopBinding;
- QDeclarativeAbstractBinding *origBottomBinding;
- QDeclarativeAbstractBinding *origVCenterBinding;
- QDeclarativeAbstractBinding *origBaselineBinding;
-
- QDeclarativeAnchorLine rewindLeft;
- QDeclarativeAnchorLine rewindRight;
- QDeclarativeAnchorLine rewindHCenter;
- QDeclarativeAnchorLine rewindTop;
- QDeclarativeAnchorLine rewindBottom;
- QDeclarativeAnchorLine rewindVCenter;
- QDeclarativeAnchorLine rewindBaseline;
-
- qreal fromX;
- qreal fromY;
- qreal fromWidth;
- qreal fromHeight;
-
- qreal toX;
- qreal toY;
- qreal toWidth;
- qreal toHeight;
-
- qreal rewindX;
- qreal rewindY;
- qreal rewindWidth;
- qreal rewindHeight;
-
- bool applyOrigLeft;
- bool applyOrigRight;
- bool applyOrigHCenter;
- bool applyOrigTop;
- bool applyOrigBottom;
- bool applyOrigVCenter;
- bool applyOrigBaseline;
-
- QDeclarativeNullableValue<qreal> origWidth;
- QDeclarativeNullableValue<qreal> origHeight;
- qreal origX;
- qreal origY;
-
- QList<QDeclarativeAbstractBinding*> oldBindings;
-
- QDeclarativeProperty leftProp;
- QDeclarativeProperty rightProp;
- QDeclarativeProperty hCenterProp;
- QDeclarativeProperty topProp;
- QDeclarativeProperty bottomProp;
- QDeclarativeProperty vCenterProp;
- QDeclarativeProperty baselineProp;
-};
-
-/*!
- \qmlproperty Item AnchorChanges::target
- This property holds the \l Item for which the anchor changes will be applied.
-*/
-
-QDeclarativeAnchorChanges::QDeclarativeAnchorChanges(QObject *parent)
- : QDeclarativeStateOperation(*(new QDeclarativeAnchorChangesPrivate), parent)
-{
-}
-
-QDeclarativeAnchorChanges::~QDeclarativeAnchorChanges()
-{
-}
-
-QDeclarativeAnchorChanges::ActionList QDeclarativeAnchorChanges::actions()
-{
- Q_D(QDeclarativeAnchorChanges);
- d->leftBinding = d->rightBinding = d->hCenterBinding = d->topBinding
- = d->bottomBinding = d->vCenterBinding = d->baselineBinding = 0;
-
- d->leftProp = QDeclarativeProperty(d->target, QLatin1String("anchors.left"));
- d->rightProp = QDeclarativeProperty(d->target, QLatin1String("anchors.right"));
- d->hCenterProp = QDeclarativeProperty(d->target, QLatin1String("anchors.horizontalCenter"));
- d->topProp = QDeclarativeProperty(d->target, QLatin1String("anchors.top"));
- d->bottomProp = QDeclarativeProperty(d->target, QLatin1String("anchors.bottom"));
- d->vCenterProp = QDeclarativeProperty(d->target, QLatin1String("anchors.verticalCenter"));
- d->baselineProp = QDeclarativeProperty(d->target, QLatin1String("anchors.baseline"));
-
- QDeclarativeContext *ctxt = qmlContext(this);
-
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::LeftAnchor) {
- d->leftBinding = new QDeclarativeBinding(d->anchorSet->d_func()->leftScript.script(), d->target, ctxt);
- d->leftBinding->setTarget(d->leftProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::RightAnchor) {
- d->rightBinding = new QDeclarativeBinding(d->anchorSet->d_func()->rightScript.script(), d->target, ctxt);
- d->rightBinding->setTarget(d->rightProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- d->hCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->hCenterScript.script(), d->target, ctxt);
- d->hCenterBinding->setTarget(d->hCenterProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::TopAnchor) {
- d->topBinding = new QDeclarativeBinding(d->anchorSet->d_func()->topScript.script(), d->target, ctxt);
- d->topBinding->setTarget(d->topProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- d->bottomBinding = new QDeclarativeBinding(d->anchorSet->d_func()->bottomScript.script(), d->target, ctxt);
- d->bottomBinding->setTarget(d->bottomProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- d->vCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->vCenterScript.script(), d->target, ctxt);
- d->vCenterBinding->setTarget(d->vCenterProp);
- }
- if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::BaselineAnchor) {
- d->baselineBinding = new QDeclarativeBinding(d->anchorSet->d_func()->baselineScript.script(), d->target, ctxt);
- d->baselineBinding->setTarget(d->baselineProp);
- }
-
- QDeclarativeAction a;
- a.event = this;
- return ActionList() << a;
-}
-
-QDeclarativeAnchorSet *QDeclarativeAnchorChanges::anchors()
-{
- Q_D(QDeclarativeAnchorChanges);
- return d->anchorSet;
-}
-
-QDeclarativeItem *QDeclarativeAnchorChanges::object() const
-{
- Q_D(const QDeclarativeAnchorChanges);
- return d->target;
-}
-
-void QDeclarativeAnchorChanges::setObject(QDeclarativeItem *target)
-{
- Q_D(QDeclarativeAnchorChanges);
- d->target = target;
-}
-
-/*!
- \qmlproperty AnchorLine AnchorChanges::anchors.left
- \qmlproperty AnchorLine AnchorChanges::anchors.right
- \qmlproperty AnchorLine AnchorChanges::anchors.horizontalCenter
- \qmlproperty AnchorLine AnchorChanges::anchors.top
- \qmlproperty AnchorLine AnchorChanges::anchors.bottom
- \qmlproperty AnchorLine AnchorChanges::anchors.verticalCenter
- \qmlproperty AnchorLine AnchorChanges::anchors.baseline
-
- These properties change the respective anchors of the item.
-
- To reset an anchor you can assign \c undefined:
- \qml
- AnchorChanges {
- target: myItem
- anchors.left: undefined //remove myItem's left anchor
- anchors.right: otherItem.right
- }
- \endqml
-*/
-
-void QDeclarativeAnchorChanges::execute(Reason reason)
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- //incorporate any needed "reverts"
- if (d->applyOrigLeft) {
- if (!d->origLeftBinding)
- targetPrivate->anchors()->resetLeft();
- QDeclarativePropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
- }
- if (d->applyOrigRight) {
- if (!d->origRightBinding)
- targetPrivate->anchors()->resetRight();
- QDeclarativePropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
- }
- if (d->applyOrigHCenter) {
- if (!d->origHCenterBinding)
- targetPrivate->anchors()->resetHorizontalCenter();
- QDeclarativePropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
- }
- if (d->applyOrigTop) {
- if (!d->origTopBinding)
- targetPrivate->anchors()->resetTop();
- QDeclarativePropertyPrivate::setBinding(d->topProp, d->origTopBinding);
- }
- if (d->applyOrigBottom) {
- if (!d->origBottomBinding)
- targetPrivate->anchors()->resetBottom();
- QDeclarativePropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
- }
- if (d->applyOrigVCenter) {
- if (!d->origVCenterBinding)
- targetPrivate->anchors()->resetVerticalCenter();
- QDeclarativePropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
- }
- if (d->applyOrigBaseline) {
- if (!d->origBaselineBinding)
- targetPrivate->anchors()->resetBaseline();
- QDeclarativePropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
- }
-
- //destroy old bindings
- if (reason == ActualChange) {
- for (int i = 0; i < d->oldBindings.size(); ++i) {
- QDeclarativeAbstractBinding *binding = d->oldBindings.at(i);
- if (binding)
- binding->destroy();
- }
- d->oldBindings.clear();
- }
-
- //reset any anchors that have been specified as "undefined"
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::LeftAnchor) {
- targetPrivate->anchors()->resetLeft();
- QDeclarativePropertyPrivate::setBinding(d->leftProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::RightAnchor) {
- targetPrivate->anchors()->resetRight();
- QDeclarativePropertyPrivate::setBinding(d->rightProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::HCenterAnchor) {
- targetPrivate->anchors()->resetHorizontalCenter();
- QDeclarativePropertyPrivate::setBinding(d->hCenterProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::TopAnchor) {
- targetPrivate->anchors()->resetTop();
- QDeclarativePropertyPrivate::setBinding(d->topProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::BottomAnchor) {
- targetPrivate->anchors()->resetBottom();
- QDeclarativePropertyPrivate::setBinding(d->bottomProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::VCenterAnchor) {
- targetPrivate->anchors()->resetVerticalCenter();
- QDeclarativePropertyPrivate::setBinding(d->vCenterProp, 0);
- }
- if (d->anchorSet->d_func()->resetAnchors & QDeclarativeAnchors::BaselineAnchor) {
- targetPrivate->anchors()->resetBaseline();
- QDeclarativePropertyPrivate::setBinding(d->baselineProp, 0);
- }
-
- //set any anchors that have been specified
- if (d->leftBinding)
- QDeclarativePropertyPrivate::setBinding(d->leftBinding->property(), d->leftBinding);
- if (d->rightBinding)
- QDeclarativePropertyPrivate::setBinding(d->rightBinding->property(), d->rightBinding);
- if (d->hCenterBinding)
- QDeclarativePropertyPrivate::setBinding(d->hCenterBinding->property(), d->hCenterBinding);
- if (d->topBinding)
- QDeclarativePropertyPrivate::setBinding(d->topBinding->property(), d->topBinding);
- if (d->bottomBinding)
- QDeclarativePropertyPrivate::setBinding(d->bottomBinding->property(), d->bottomBinding);
- if (d->vCenterBinding)
- QDeclarativePropertyPrivate::setBinding(d->vCenterBinding->property(), d->vCenterBinding);
- if (d->baselineBinding)
- QDeclarativePropertyPrivate::setBinding(d->baselineBinding->property(), d->baselineBinding);
-}
-
-bool QDeclarativeAnchorChanges::isReversable()
-{
- return true;
-}
-
-void QDeclarativeAnchorChanges::reverse(Reason reason)
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- //reset any anchors set by the state
- if (d->leftBinding) {
- targetPrivate->anchors()->resetLeft();
- QDeclarativePropertyPrivate::setBinding(d->leftBinding->property(), 0);
- if (reason == ActualChange) {
- d->leftBinding->destroy(); d->leftBinding = 0;
- }
- }
- if (d->rightBinding) {
- targetPrivate->anchors()->resetRight();
- QDeclarativePropertyPrivate::setBinding(d->rightBinding->property(), 0);
- if (reason == ActualChange) {
- d->rightBinding->destroy(); d->rightBinding = 0;
- }
- }
- if (d->hCenterBinding) {
- targetPrivate->anchors()->resetHorizontalCenter();
- QDeclarativePropertyPrivate::setBinding(d->hCenterBinding->property(), 0);
- if (reason == ActualChange) {
- d->hCenterBinding->destroy(); d->hCenterBinding = 0;
- }
- }
- if (d->topBinding) {
- targetPrivate->anchors()->resetTop();
- QDeclarativePropertyPrivate::setBinding(d->topBinding->property(), 0);
- if (reason == ActualChange) {
- d->topBinding->destroy(); d->topBinding = 0;
- }
- }
- if (d->bottomBinding) {
- targetPrivate->anchors()->resetBottom();
- QDeclarativePropertyPrivate::setBinding(d->bottomBinding->property(), 0);
- if (reason == ActualChange) {
- d->bottomBinding->destroy(); d->bottomBinding = 0;
- }
- }
- if (d->vCenterBinding) {
- targetPrivate->anchors()->resetVerticalCenter();
- QDeclarativePropertyPrivate::setBinding(d->vCenterBinding->property(), 0);
- if (reason == ActualChange) {
- d->vCenterBinding->destroy(); d->vCenterBinding = 0;
- }
- }
- if (d->baselineBinding) {
- targetPrivate->anchors()->resetBaseline();
- QDeclarativePropertyPrivate::setBinding(d->baselineBinding->property(), 0);
- if (reason == ActualChange) {
- d->baselineBinding->destroy(); d->baselineBinding = 0;
- }
- }
-
- //restore previous anchors
- if (d->origLeftBinding)
- QDeclarativePropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
- if (d->origRightBinding)
- QDeclarativePropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
- if (d->origHCenterBinding)
- QDeclarativePropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
- if (d->origTopBinding)
- QDeclarativePropertyPrivate::setBinding(d->topProp, d->origTopBinding);
- if (d->origBottomBinding)
- QDeclarativePropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
- if (d->origVCenterBinding)
- QDeclarativePropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
- if (d->origBaselineBinding)
- QDeclarativePropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
-
- //restore any absolute geometry changed by the state's anchors
- QDeclarativeAnchors::Anchors stateVAnchors = d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::Vertical_Mask;
- QDeclarativeAnchors::Anchors origVAnchors = targetPrivate->anchors()->usedAnchors() & QDeclarativeAnchors::Vertical_Mask;
- QDeclarativeAnchors::Anchors stateHAnchors = d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::Horizontal_Mask;
- QDeclarativeAnchors::Anchors origHAnchors = targetPrivate->anchors()->usedAnchors() & QDeclarativeAnchors::Horizontal_Mask;
-
- bool stateSetWidth = (stateHAnchors &&
- stateHAnchors != QDeclarativeAnchors::LeftAnchor &&
- stateHAnchors != QDeclarativeAnchors::RightAnchor &&
- stateHAnchors != QDeclarativeAnchors::HCenterAnchor);
- bool origSetWidth = (origHAnchors &&
- origHAnchors != QDeclarativeAnchors::LeftAnchor &&
- origHAnchors != QDeclarativeAnchors::RightAnchor &&
- origHAnchors != QDeclarativeAnchors::HCenterAnchor);
- if (d->origWidth.isValid() && stateSetWidth && !origSetWidth)
- d->target->setWidth(d->origWidth.value);
-
- bool stateSetHeight = (stateVAnchors &&
- stateVAnchors != QDeclarativeAnchors::TopAnchor &&
- stateVAnchors != QDeclarativeAnchors::BottomAnchor &&
- stateVAnchors != QDeclarativeAnchors::VCenterAnchor &&
- stateVAnchors != QDeclarativeAnchors::BaselineAnchor);
- bool origSetHeight = (origVAnchors &&
- origVAnchors != QDeclarativeAnchors::TopAnchor &&
- origVAnchors != QDeclarativeAnchors::BottomAnchor &&
- origVAnchors != QDeclarativeAnchors::VCenterAnchor &&
- origVAnchors != QDeclarativeAnchors::BaselineAnchor);
- if (d->origHeight.isValid() && stateSetHeight && !origSetHeight)
- d->target->setHeight(d->origHeight.value);
-
- if (stateHAnchors && !origHAnchors)
- d->target->setX(d->origX);
-
- if (stateVAnchors && !origVAnchors)
- d->target->setY(d->origY);
-}
-
-QString QDeclarativeAnchorChanges::typeName() const
-{
- return QLatin1String("AnchorChanges");
-}
-
-QList<QDeclarativeAction> QDeclarativeAnchorChanges::additionalActions()
-{
- Q_D(QDeclarativeAnchorChanges);
- QList<QDeclarativeAction> extra;
-
- QDeclarativeAnchors::Anchors combined = d->anchorSet->d_func()->usedAnchors | d->anchorSet->d_func()->resetAnchors;
- bool hChange = combined & QDeclarativeAnchors::Horizontal_Mask;
- bool vChange = combined & QDeclarativeAnchors::Vertical_Mask;
-
- if (d->target) {
- QDeclarativeContext *ctxt = qmlContext(this);
- QDeclarativeAction a;
- if (hChange && d->fromX != d->toX) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("x"), ctxt);
- a.toValue = d->toX;
- extra << a;
- }
- if (vChange && d->fromY != d->toY) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("y"), ctxt);
- a.toValue = d->toY;
- extra << a;
- }
- if (hChange && d->fromWidth != d->toWidth) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("width"), ctxt);
- a.toValue = d->toWidth;
- extra << a;
- }
- if (vChange && d->fromHeight != d->toHeight) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("height"), ctxt);
- a.toValue = d->toHeight;
- extra << a;
- }
- }
-
- return extra;
-}
-
-bool QDeclarativeAnchorChanges::changesBindings()
-{
- return true;
-}
-
-void QDeclarativeAnchorChanges::saveOriginals()
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- d->origLeftBinding = QDeclarativePropertyPrivate::binding(d->leftProp);
- d->origRightBinding = QDeclarativePropertyPrivate::binding(d->rightProp);
- d->origHCenterBinding = QDeclarativePropertyPrivate::binding(d->hCenterProp);
- d->origTopBinding = QDeclarativePropertyPrivate::binding(d->topProp);
- d->origBottomBinding = QDeclarativePropertyPrivate::binding(d->bottomProp);
- d->origVCenterBinding = QDeclarativePropertyPrivate::binding(d->vCenterProp);
- d->origBaselineBinding = QDeclarativePropertyPrivate::binding(d->baselineProp);
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- if (targetPrivate->widthValid)
- d->origWidth = d->target->width();
- if (targetPrivate->heightValid)
- d->origHeight = d->target->height();
- d->origX = d->target->x();
- d->origY = d->target->y();
-
- d->applyOrigLeft = d->applyOrigRight = d->applyOrigHCenter = d->applyOrigTop
- = d->applyOrigBottom = d->applyOrigVCenter = d->applyOrigBaseline = false;
-
- saveCurrentValues();
-}
-
-void QDeclarativeAnchorChanges::copyOriginals(QDeclarativeActionEvent *other)
-{
- Q_D(QDeclarativeAnchorChanges);
- QDeclarativeAnchorChanges *ac = static_cast<QDeclarativeAnchorChanges*>(other);
- QDeclarativeAnchorChangesPrivate *acp = ac->d_func();
-
- QDeclarativeAnchors::Anchors combined = acp->anchorSet->d_func()->usedAnchors |
- acp->anchorSet->d_func()->resetAnchors;
-
- //probably also need to revert some things
- d->applyOrigLeft = (combined & QDeclarativeAnchors::LeftAnchor);
- d->applyOrigRight = (combined & QDeclarativeAnchors::RightAnchor);
- d->applyOrigHCenter = (combined & QDeclarativeAnchors::HCenterAnchor);
- d->applyOrigTop = (combined & QDeclarativeAnchors::TopAnchor);
- d->applyOrigBottom = (combined & QDeclarativeAnchors::BottomAnchor);
- d->applyOrigVCenter = (combined & QDeclarativeAnchors::VCenterAnchor);
- d->applyOrigBaseline = (combined & QDeclarativeAnchors::BaselineAnchor);
-
- d->origLeftBinding = acp->origLeftBinding;
- d->origRightBinding = acp->origRightBinding;
- d->origHCenterBinding = acp->origHCenterBinding;
- d->origTopBinding = acp->origTopBinding;
- d->origBottomBinding = acp->origBottomBinding;
- d->origVCenterBinding = acp->origVCenterBinding;
- d->origBaselineBinding = acp->origBaselineBinding;
-
- d->origWidth = acp->origWidth;
- d->origHeight = acp->origHeight;
- d->origX = acp->origX;
- d->origY = acp->origY;
-
- d->oldBindings.clear();
- d->oldBindings << acp->leftBinding << acp->rightBinding << acp->hCenterBinding
- << acp->topBinding << acp->bottomBinding << acp->baselineBinding;
-
- saveCurrentValues();
-}
-
-void QDeclarativeAnchorChanges::clearBindings()
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- //### should this (saving "from" values) be moved to saveCurrentValues()?
- d->fromX = d->target->x();
- d->fromY = d->target->y();
- d->fromWidth = d->target->width();
- d->fromHeight = d->target->height();
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- //reset any anchors with corresponding reverts
- //reset any anchors that have been specified as "undefined"
- //reset any anchors that we'll be setting in the state
- QDeclarativeAnchors::Anchors combined = d->anchorSet->d_func()->resetAnchors |
- d->anchorSet->d_func()->usedAnchors;
- if (d->applyOrigLeft || (combined & QDeclarativeAnchors::LeftAnchor)) {
- targetPrivate->anchors()->resetLeft();
- QDeclarativePropertyPrivate::setBinding(d->leftProp, 0);
- }
- if (d->applyOrigRight || (combined & QDeclarativeAnchors::RightAnchor)) {
- targetPrivate->anchors()->resetRight();
- QDeclarativePropertyPrivate::setBinding(d->rightProp, 0);
- }
- if (d->applyOrigHCenter || (combined & QDeclarativeAnchors::HCenterAnchor)) {
- targetPrivate->anchors()->resetHorizontalCenter();
- QDeclarativePropertyPrivate::setBinding(d->hCenterProp, 0);
- }
- if (d->applyOrigTop || (combined & QDeclarativeAnchors::TopAnchor)) {
- targetPrivate->anchors()->resetTop();
- QDeclarativePropertyPrivate::setBinding(d->topProp, 0);
- }
- if (d->applyOrigBottom || (combined & QDeclarativeAnchors::BottomAnchor)) {
- targetPrivate->anchors()->resetBottom();
- QDeclarativePropertyPrivate::setBinding(d->bottomProp, 0);
- }
- if (d->applyOrigVCenter || (combined & QDeclarativeAnchors::VCenterAnchor)) {
- targetPrivate->anchors()->resetVerticalCenter();
- QDeclarativePropertyPrivate::setBinding(d->vCenterProp, 0);
- }
- if (d->applyOrigBaseline || (combined & QDeclarativeAnchors::BaselineAnchor)) {
- targetPrivate->anchors()->resetBaseline();
- QDeclarativePropertyPrivate::setBinding(d->baselineProp, 0);
- }
-}
-
-bool QDeclarativeAnchorChanges::override(QDeclarativeActionEvent*other)
-{
- if (other->typeName() != QLatin1String("AnchorChanges"))
- return false;
- if (static_cast<QDeclarativeActionEvent*>(this) == other)
- return true;
- if (static_cast<QDeclarativeAnchorChanges*>(other)->object() == object())
- return true;
- return false;
-}
-
-void QDeclarativeAnchorChanges::rewind()
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
-
- //restore previous values (but not previous bindings, i.e. anchors)
- d->target->setX(d->rewindX);
- d->target->setY(d->rewindY);
- if (targetPrivate->widthValid) {
- d->target->setWidth(d->rewindWidth);
- }
- if (targetPrivate->heightValid) {
- d->target->setHeight(d->rewindHeight);
- }
-}
-
-void QDeclarativeAnchorChanges::saveCurrentValues()
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- d->rewindLeft = targetPrivate->anchors()->left();
- d->rewindRight = targetPrivate->anchors()->right();
- d->rewindHCenter = targetPrivate->anchors()->horizontalCenter();
- d->rewindTop = targetPrivate->anchors()->top();
- d->rewindBottom = targetPrivate->anchors()->bottom();
- d->rewindVCenter = targetPrivate->anchors()->verticalCenter();
- d->rewindBaseline = targetPrivate->anchors()->baseline();
-
- d->rewindX = d->target->x();
- d->rewindY = d->target->y();
- d->rewindWidth = d->target->width();
- d->rewindHeight = d->target->height();
-}
-
-void QDeclarativeAnchorChanges::saveTargetValues()
-{
- Q_D(QDeclarativeAnchorChanges);
- if (!d->target)
- return;
-
- d->toX = d->target->x();
- d->toY = d->target->y();
- d->toWidth = d->target->width();
- d->toHeight = d->target->height();
-}
-#include <qdeclarativestateoperations.moc>
#include <moc_qdeclarativestateoperations_p.cpp>
QT_END_NAMESPACE
diff --git a/src/declarative/util/qdeclarativestateoperations_p.h b/src/declarative/util/qdeclarativestateoperations_p.h
index 6a6dda6526..9d30bf7578 100644
--- a/src/declarative/util/qdeclarativestateoperations_p.h
+++ b/src/declarative/util/qdeclarativestateoperations_p.h
@@ -43,9 +43,6 @@
#define QDECLARATIVESTATEOPERATIONS_H
#include "private/qdeclarativestate_p.h"
-
-#include <qdeclarativeitem.h>
-#include <private/qdeclarativeanchors_p.h>
#include <qdeclarativescriptstring.h>
QT_BEGIN_HEADER
@@ -54,68 +51,6 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
-class QDeclarativeParentChangePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeParentChange : public QDeclarativeStateOperation, public QDeclarativeActionEvent
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeParentChange)
-
- Q_PROPERTY(QDeclarativeItem *target READ object WRITE setObject)
- Q_PROPERTY(QDeclarativeItem *parent READ parent WRITE setParent)
- Q_PROPERTY(QDeclarativeScriptString x READ x WRITE setX)
- Q_PROPERTY(QDeclarativeScriptString y READ y WRITE setY)
- Q_PROPERTY(QDeclarativeScriptString width READ width WRITE setWidth)
- Q_PROPERTY(QDeclarativeScriptString height READ height WRITE setHeight)
- Q_PROPERTY(QDeclarativeScriptString scale READ scale WRITE setScale)
- Q_PROPERTY(QDeclarativeScriptString rotation READ rotation WRITE setRotation)
-public:
- QDeclarativeParentChange(QObject *parent=0);
- ~QDeclarativeParentChange();
-
- QDeclarativeItem *object() const;
- void setObject(QDeclarativeItem *);
-
- QDeclarativeItem *parent() const;
- void setParent(QDeclarativeItem *);
-
- QDeclarativeItem *originalParent() const;
-
- QDeclarativeScriptString x() const;
- void setX(QDeclarativeScriptString x);
- bool xIsSet() const;
-
- QDeclarativeScriptString y() const;
- void setY(QDeclarativeScriptString y);
- bool yIsSet() const;
-
- QDeclarativeScriptString width() const;
- void setWidth(QDeclarativeScriptString width);
- bool widthIsSet() const;
-
- QDeclarativeScriptString height() const;
- void setHeight(QDeclarativeScriptString height);
- bool heightIsSet() const;
-
- QDeclarativeScriptString scale() const;
- void setScale(QDeclarativeScriptString scale);
- bool scaleIsSet() const;
-
- QDeclarativeScriptString rotation() const;
- void setRotation(QDeclarativeScriptString rotation);
- bool rotationIsSet() const;
-
- virtual ActionList actions();
-
- virtual void saveOriginals();
- //virtual void copyOriginals(QDeclarativeActionEvent*);
- virtual void execute(Reason reason = ActualChange);
- virtual bool isReversable();
- virtual void reverse(Reason reason = ActualChange);
- virtual QString typeName() const;
- virtual bool override(QDeclarativeActionEvent*other);
- virtual void rewind();
- virtual void saveCurrentValues();
-};
class QDeclarativeStateChangeScriptPrivate;
class Q_AUTOTEST_EXPORT QDeclarativeStateChangeScript : public QDeclarativeStateOperation, public QDeclarativeActionEvent
@@ -143,156 +78,10 @@ public:
virtual void execute(Reason reason = ActualChange);
};
-class QDeclarativeAnchorChanges;
-class QDeclarativeAnchorSetPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeAnchorSet : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(QDeclarativeScriptString left READ left WRITE setLeft RESET resetLeft)
- Q_PROPERTY(QDeclarativeScriptString right READ right WRITE setRight RESET resetRight)
- Q_PROPERTY(QDeclarativeScriptString horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter)
- Q_PROPERTY(QDeclarativeScriptString top READ top WRITE setTop RESET resetTop)
- Q_PROPERTY(QDeclarativeScriptString bottom READ bottom WRITE setBottom RESET resetBottom)
- Q_PROPERTY(QDeclarativeScriptString verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter)
- Q_PROPERTY(QDeclarativeScriptString baseline READ baseline WRITE setBaseline RESET resetBaseline)
- //Q_PROPERTY(QDeclarativeItem *fill READ fill WRITE setFill RESET resetFill)
- //Q_PROPERTY(QDeclarativeItem *centerIn READ centerIn WRITE setCenterIn RESET resetCenterIn)
-
- /*Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged)
- Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
- Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
- Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged())
- Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin NOTIFY topMarginChanged)
- Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
- Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged())
- Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged())*/
-
-public:
- QDeclarativeAnchorSet(QObject *parent=0);
- virtual ~QDeclarativeAnchorSet();
-
- QDeclarativeScriptString left() const;
- void setLeft(const QDeclarativeScriptString &edge);
- void resetLeft();
-
- QDeclarativeScriptString right() const;
- void setRight(const QDeclarativeScriptString &edge);
- void resetRight();
-
- QDeclarativeScriptString horizontalCenter() const;
- void setHorizontalCenter(const QDeclarativeScriptString &edge);
- void resetHorizontalCenter();
-
- QDeclarativeScriptString top() const;
- void setTop(const QDeclarativeScriptString &edge);
- void resetTop();
-
- QDeclarativeScriptString bottom() const;
- void setBottom(const QDeclarativeScriptString &edge);
- void resetBottom();
-
- QDeclarativeScriptString verticalCenter() const;
- void setVerticalCenter(const QDeclarativeScriptString &edge);
- void resetVerticalCenter();
-
- QDeclarativeScriptString baseline() const;
- void setBaseline(const QDeclarativeScriptString &edge);
- void resetBaseline();
-
- QDeclarativeItem *fill() const;
- void setFill(QDeclarativeItem *);
- void resetFill();
-
- QDeclarativeItem *centerIn() const;
- void setCenterIn(QDeclarativeItem *);
- void resetCenterIn();
-
- /*qreal leftMargin() const;
- void setLeftMargin(qreal);
-
- qreal rightMargin() const;
- void setRightMargin(qreal);
-
- qreal horizontalCenterOffset() const;
- void setHorizontalCenterOffset(qreal);
-
- qreal topMargin() const;
- void setTopMargin(qreal);
-
- qreal bottomMargin() const;
- void setBottomMargin(qreal);
-
- qreal margins() const;
- void setMargins(qreal);
-
- qreal verticalCenterOffset() const;
- void setVerticalCenterOffset(qreal);
-
- qreal baselineOffset() const;
- void setBaselineOffset(qreal);*/
-
- QDeclarativeAnchors::Anchors usedAnchors() const;
-
-/*Q_SIGNALS:
- void leftMarginChanged();
- void rightMarginChanged();
- void topMarginChanged();
- void bottomMarginChanged();
- void marginsChanged();
- void verticalCenterOffsetChanged();
- void horizontalCenterOffsetChanged();
- void baselineOffsetChanged();*/
-
-private:
- friend class QDeclarativeAnchorChanges;
- Q_DISABLE_COPY(QDeclarativeAnchorSet)
- Q_DECLARE_PRIVATE(QDeclarativeAnchorSet)
-};
-
-class QDeclarativeAnchorChangesPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeAnchorChanges : public QDeclarativeStateOperation, public QDeclarativeActionEvent
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeAnchorChanges)
-
- Q_PROPERTY(QDeclarativeItem *target READ object WRITE setObject)
- Q_PROPERTY(QDeclarativeAnchorSet *anchors READ anchors CONSTANT)
-
-public:
- QDeclarativeAnchorChanges(QObject *parent=0);
- ~QDeclarativeAnchorChanges();
-
- virtual ActionList actions();
-
- QDeclarativeAnchorSet *anchors();
-
- QDeclarativeItem *object() const;
- void setObject(QDeclarativeItem *);
-
- virtual void execute(Reason reason = ActualChange);
- virtual bool isReversable();
- virtual void reverse(Reason reason = ActualChange);
- virtual QString typeName() const;
- virtual bool override(QDeclarativeActionEvent*other);
- virtual bool changesBindings();
- virtual void saveOriginals();
- virtual bool needsCopy() { return true; }
- virtual void copyOriginals(QDeclarativeActionEvent*);
- virtual void clearBindings();
- virtual void rewind();
- virtual void saveCurrentValues();
-
- QList<QDeclarativeAction> additionalActions();
- virtual void saveTargetValues();
-};
QT_END_NAMESPACE
-QML_DECLARE_TYPE(QDeclarativeParentChange)
QML_DECLARE_TYPE(QDeclarativeStateChangeScript)
-QML_DECLARE_TYPE(QDeclarativeAnchorSet)
-QML_DECLARE_TYPE(QDeclarativeAnchorChanges)
QT_END_HEADER
diff --git a/src/declarative/util/qdeclarativeutilmodule.cpp b/src/declarative/util/qdeclarativeutilmodule.cpp
index 4bea2e651a..9f3c9b05bf 100644
--- a/src/declarative/util/qdeclarativeutilmodule.cpp
+++ b/src/declarative/util/qdeclarativeutilmodule.cpp
@@ -17,7 +17,7 @@
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** version 1.2, 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
@@ -67,108 +67,60 @@
#include "private/qdeclarativetransitionmanager_p_p.h"
#include "private/qdeclarativetransition_p.h"
#include "private/qdeclarativeapplication_p.h"
-#include "qdeclarativeview.h"
#include "qdeclarativeinfo.h"
#include "private/qdeclarativetypenotavailable_p.h"
#ifndef QT_NO_XMLPATTERNS
#include "private/qdeclarativexmllistmodel_p.h"
#endif
-void QDeclarativeUtilModule::defineModule()
+void QDeclarativeUtilModule::registerBaseTypes(const char *uri, int versionMajor, int versionMinor)
{
- qmlRegisterUncreatableType<QDeclarativeApplication>("QtQuick",1,1,"Application", QDeclarativeApplication::tr("Application is an abstract class"));
-
- qmlRegisterType<QDeclarativeAnchorAnimation>("QtQuick",1,0,"AnchorAnimation");
- qmlRegisterType<QDeclarativeAnchorChanges>("QtQuick",1,0,"AnchorChanges");
- qmlRegisterType<QDeclarativeBehavior>("QtQuick",1,0,"Behavior");
- qmlRegisterType<QDeclarativeBind>("QtQuick",1,0,"Binding");
- qmlRegisterType<QDeclarativeColorAnimation>("QtQuick",1,0,"ColorAnimation");
- qmlRegisterType<QDeclarativeConnections>("QtQuick",1,0,"Connections");
- qmlRegisterType<QDeclarativeSmoothedAnimation>("QtQuick",1,0,"SmoothedAnimation");
- qmlRegisterType<QDeclarativeFontLoader>("QtQuick",1,0,"FontLoader");
- qmlRegisterType<QDeclarativeListElement>("QtQuick",1,0,"ListElement");
- qmlRegisterType<QDeclarativeNumberAnimation>("QtQuick",1,0,"NumberAnimation");
- qmlRegisterType<QDeclarativePackage>("QtQuick",1,0,"Package");
- qmlRegisterType<QDeclarativeParallelAnimation>("QtQuick",1,0,"ParallelAnimation");
- qmlRegisterType<QDeclarativeParentAnimation>("QtQuick",1,0,"ParentAnimation");
- qmlRegisterType<QDeclarativeParentChange>("QtQuick",1,0,"ParentChange");
- qmlRegisterType<QDeclarativePauseAnimation>("QtQuick",1,0,"PauseAnimation");
- qmlRegisterType<QDeclarativePropertyAction>("QtQuick",1,0,"PropertyAction");
- qmlRegisterType<QDeclarativePropertyAnimation>("QtQuick",1,0,"PropertyAnimation");
- qmlRegisterType<QDeclarativeRotationAnimation>("QtQuick",1,0,"RotationAnimation");
- qmlRegisterType<QDeclarativeScriptAction>("QtQuick",1,0,"ScriptAction");
- qmlRegisterType<QDeclarativeSequentialAnimation>("QtQuick",1,0,"SequentialAnimation");
- qmlRegisterType<QDeclarativeSpringAnimation>("QtQuick",1,0,"SpringAnimation");
- qmlRegisterType<QDeclarativeStateChangeScript>("QtQuick",1,0,"StateChangeScript");
- qmlRegisterType<QDeclarativeStateGroup>("QtQuick",1,0,"StateGroup");
- qmlRegisterType<QDeclarativeState>("QtQuick",1,0,"State");
- qmlRegisterType<QDeclarativeSystemPalette>("QtQuick",1,0,"SystemPalette");
- qmlRegisterType<QDeclarativeTimer>("QtQuick",1,0,"Timer");
- qmlRegisterType<QDeclarativeTransition>("QtQuick",1,0,"Transition");
- qmlRegisterType<QDeclarativeVector3dAnimation>("QtQuick",1,0,"Vector3dAnimation");
-#ifdef QT_NO_XMLPATTERNS
- qmlRegisterTypeNotAvailable("QtQuick",1,0,"XmlListModel",
- qApp->translate("QDeclarativeXmlListModel","Qt was built without support for xmlpatterns"));
- qmlRegisterTypeNotAvailable("QtQuick",1,0,"XmlRole",
- qApp->translate("QDeclarativeXmlListModel","Qt was built without support for xmlpatterns"));
-#else
- qmlRegisterType<QDeclarativeXmlListModel>("QtQuick",1,0,"XmlListModel");
- qmlRegisterType<QDeclarativeXmlListModelRole>("QtQuick",1,0,"XmlRole");
-#endif
-
- qmlRegisterType<QDeclarativeAnchors>();
- qmlRegisterType<QDeclarativeStateOperation>();
- qmlRegisterType<QDeclarativeAnchorSet>();
+ qmlRegisterType<QDeclarativeListElement>(uri, versionMajor, versionMinor,"ListElement");
+ qmlRegisterCustomType<QDeclarativeListModel>(uri, versionMajor, versionMinor,"ListModel", new QDeclarativeListModelParser);
+}
- qmlRegisterUncreatableType<QDeclarativeAbstractAnimation>("QtQuick",1,0,"Animation",QDeclarativeAbstractAnimation::tr("Animation is an abstract class"));
+void QDeclarativeUtilModule::defineModule()
+{
+ qmlRegisterUncreatableType<QDeclarativeApplication>("QtQuick",2,0,"Application", QDeclarativeApplication::tr("Application is an abstract class"));
- qmlRegisterCustomType<QDeclarativeListModel>("QtQuick",1,0,"ListModel", new QDeclarativeListModelParser);
- qmlRegisterCustomType<QDeclarativePropertyChanges>("QtQuick",1,0,"PropertyChanges", new QDeclarativePropertyChangesParser);
- qmlRegisterCustomType<QDeclarativeConnections>("QtQuick",1,0,"Connections", new QDeclarativeConnectionsParser);
+ qmlRegisterUncreatableType<QDeclarativeAbstractAnimation>("QtQuick",2,0,"Animation",QDeclarativeAbstractAnimation::tr("Animation is an abstract class"));
-#ifndef QT_NO_IMPORT_QT47_QML
- qmlRegisterType<QDeclarativeAnchorAnimation>("Qt",4,7,"AnchorAnimation");
- qmlRegisterType<QDeclarativeAnchorChanges>("Qt",4,7,"AnchorChanges");
- qmlRegisterType<QDeclarativeBehavior>("Qt",4,7,"Behavior");
- qmlRegisterType<QDeclarativeBind>("Qt",4,7,"Binding");
- qmlRegisterType<QDeclarativeColorAnimation>("Qt",4,7,"ColorAnimation");
- qmlRegisterType<QDeclarativeConnections>("Qt",4,7,"Connections");
- qmlRegisterType<QDeclarativeSmoothedAnimation>("Qt",4,7,"SmoothedAnimation");
- qmlRegisterType<QDeclarativeFontLoader>("Qt",4,7,"FontLoader");
- qmlRegisterType<QDeclarativeListElement>("Qt",4,7,"ListElement");
- qmlRegisterType<QDeclarativeNumberAnimation>("Qt",4,7,"NumberAnimation");
- qmlRegisterType<QDeclarativePackage>("Qt",4,7,"Package");
- qmlRegisterType<QDeclarativeParallelAnimation>("Qt",4,7,"ParallelAnimation");
- qmlRegisterType<QDeclarativeParentAnimation>("Qt",4,7,"ParentAnimation");
- qmlRegisterType<QDeclarativeParentChange>("Qt",4,7,"ParentChange");
- qmlRegisterType<QDeclarativePauseAnimation>("Qt",4,7,"PauseAnimation");
- qmlRegisterType<QDeclarativePropertyAction>("Qt",4,7,"PropertyAction");
- qmlRegisterType<QDeclarativePropertyAnimation>("Qt",4,7,"PropertyAnimation");
- qmlRegisterType<QDeclarativeRotationAnimation>("Qt",4,7,"RotationAnimation");
- qmlRegisterType<QDeclarativeScriptAction>("Qt",4,7,"ScriptAction");
- qmlRegisterType<QDeclarativeSequentialAnimation>("Qt",4,7,"SequentialAnimation");
- qmlRegisterType<QDeclarativeSpringAnimation>("Qt",4,7,"SpringAnimation");
- qmlRegisterType<QDeclarativeStateChangeScript>("Qt",4,7,"StateChangeScript");
- qmlRegisterType<QDeclarativeStateGroup>("Qt",4,7,"StateGroup");
- qmlRegisterType<QDeclarativeState>("Qt",4,7,"State");
- qmlRegisterType<QDeclarativeSystemPalette>("Qt",4,7,"SystemPalette");
- qmlRegisterType<QDeclarativeTimer>("Qt",4,7,"Timer");
- qmlRegisterType<QDeclarativeTransition>("Qt",4,7,"Transition");
- qmlRegisterType<QDeclarativeVector3dAnimation>("Qt",4,7,"Vector3dAnimation");
+ qmlRegisterType<QDeclarativeBehavior>("QtQuick",2,0,"Behavior");
+ qmlRegisterType<QDeclarativeBind>("QtQuick",2,0,"Binding");
+ qmlRegisterType<QDeclarativeColorAnimation>("QtQuick",2,0,"ColorAnimation");
+ qmlRegisterType<QDeclarativeConnections>("QtQuick",2,0,"Connections");
+ qmlRegisterType<QDeclarativeSmoothedAnimation>("QtQuick",2,0,"SmoothedAnimation");
+ qmlRegisterType<QDeclarativeFontLoader>("QtQuick",2,0,"FontLoader");
+ qmlRegisterType<QDeclarativeNumberAnimation>("QtQuick",2,0,"NumberAnimation");
+ qmlRegisterType<QDeclarativePackage>("QtQuick",2,0,"Package");
+ qmlRegisterType<QDeclarativeParallelAnimation>("QtQuick",2,0,"ParallelAnimation");
+ qmlRegisterType<QDeclarativePauseAnimation>("QtQuick",2,0,"PauseAnimation");
+ qmlRegisterType<QDeclarativePropertyAction>("QtQuick",2,0,"PropertyAction");
+ qmlRegisterType<QDeclarativePropertyAnimation>("QtQuick",2,0,"PropertyAnimation");
+ qmlRegisterType<QDeclarativeRotationAnimation>("QtQuick",2,0,"RotationAnimation");
+ qmlRegisterType<QDeclarativeScriptAction>("QtQuick",2,0,"ScriptAction");
+ qmlRegisterType<QDeclarativeSequentialAnimation>("QtQuick",2,0,"SequentialAnimation");
+ qmlRegisterType<QDeclarativeSpringAnimation>("QtQuick",2,0,"SpringAnimation");
+ qmlRegisterType<QDeclarativeStateChangeScript>("QtQuick",2,0,"StateChangeScript");
+ qmlRegisterType<QDeclarativeStateGroup>("QtQuick",2,0,"StateGroup");
+ qmlRegisterType<QDeclarativeState>("QtQuick",2,0,"State");
+ qmlRegisterType<QDeclarativeSystemPalette>("QtQuick",2,0,"SystemPalette");
+ qmlRegisterType<QDeclarativeTimer>("QtQuick",2,0,"Timer");
+ qmlRegisterType<QDeclarativeTransition>("QtQuick",2,0,"Transition");
+ qmlRegisterType<QDeclarativeVector3dAnimation>("QtQuick",2,0,"Vector3dAnimation");
#ifdef QT_NO_XMLPATTERNS
- qmlRegisterTypeNotAvailable("Qt",4,7,"XmlListModel",
+ qmlRegisterTypeNotAvailable("QtQuick",2,0,"XmlListModel",
qApp->translate("QDeclarativeXmlListModel","Qt was built without support for xmlpatterns"));
- qmlRegisterTypeNotAvailable("Qt",4,7,"XmlRole",
+ qmlRegisterTypeNotAvailable("QtQuick",2,0,"XmlRole",
qApp->translate("QDeclarativeXmlListModel","Qt was built without support for xmlpatterns"));
#else
- qmlRegisterType<QDeclarativeXmlListModel>("Qt",4,7,"XmlListModel");
- qmlRegisterType<QDeclarativeXmlListModelRole>("Qt",4,7,"XmlRole");
+ qmlRegisterType<QDeclarativeXmlListModel>("QtQuick",2,0,"XmlListModel");
+ qmlRegisterType<QDeclarativeXmlListModelRole>("QtQuick",2,0,"XmlRole");
#endif
- qmlRegisterUncreatableType<QDeclarativeAbstractAnimation>("Qt",4,7,"Animation",QDeclarativeAbstractAnimation::tr("Animation is an abstract class"));
+ qmlRegisterType<QDeclarativeStateOperation>();
- qmlRegisterCustomType<QDeclarativeListModel>("Qt", 4,7, "ListModel", new QDeclarativeListModelParser);
- qmlRegisterCustomType<QDeclarativePropertyChanges>("Qt", 4, 7, "PropertyChanges", new QDeclarativePropertyChangesParser);
- qmlRegisterCustomType<QDeclarativeConnections>("Qt", 4, 7, "Connections", new QDeclarativeConnectionsParser);
-#endif
+ qmlRegisterCustomType<QDeclarativePropertyChanges>("QtQuick",2,0,"PropertyChanges", new QDeclarativePropertyChangesParser);
+ qmlRegisterCustomType<QDeclarativeConnections>("QtQuick",2,0,"Connections", new QDeclarativeConnectionsParser);
+ registerBaseTypes("QtQuick",2,0);
}
diff --git a/src/declarative/util/qdeclarativeutilmodule_p.h b/src/declarative/util/qdeclarativeutilmodule_p.h
index 7304f6fd77..42a1e02097 100644
--- a/src/declarative/util/qdeclarativeutilmodule_p.h
+++ b/src/declarative/util/qdeclarativeutilmodule_p.h
@@ -53,6 +53,7 @@ QT_MODULE(Declarative)
class QDeclarativeUtilModule
{
public:
+ static void registerBaseTypes(const char *uri, int versionMajor, int versionMinor);
static void defineModule();
};
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
deleted file mode 100644
index bab991b175..0000000000
--- a/src/declarative/util/qdeclarativeview.cpp
+++ /dev/null
@@ -1,737 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativeview.h"
-
-#include <qdeclarative.h>
-#include <qdeclarativeitem.h>
-#include <qdeclarativeengine.h>
-#include <qdeclarativecontext.h>
-#include <qdeclarativeglobal_p.h>
-#include <qdeclarativeguard_p.h>
-
-#include <private/qdeclarativedebugtrace_p.h>
-#include <private/qdeclarativeinspectorservice_p.h>
-
-#include <qscriptvalueiterator.h>
-#include <qdebug.h>
-#include <qtimer.h>
-#include <qevent.h>
-#include <qdir.h>
-#include <qcoreapplication.h>
-#include <qfontdatabase.h>
-#include <qicon.h>
-#include <qurl.h>
-#include <qlayout.h>
-#include <qwidget.h>
-#include <qgraphicswidget.h>
-#include <qbasictimer.h>
-#include <QtCore/qabstractanimation.h>
-#include <private/qgraphicsview_p.h>
-#include <private/qdeclarativeitem_p.h>
-#include <private/qabstractanimation_p.h>
-#include <private/qdeclarativeitemchangelistener_p.h>
-
-QT_BEGIN_NAMESPACE
-
-DEFINE_BOOL_CONFIG_OPTION(frameRateDebug, QML_SHOW_FRAMERATE)
-
-class QDeclarativeScene : public QGraphicsScene
-{
-public:
- QDeclarativeScene(QObject *parent = 0);
-
-protected:
- virtual void keyPressEvent(QKeyEvent *);
- virtual void keyReleaseEvent(QKeyEvent *);
-
- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
-};
-
-QDeclarativeScene::QDeclarativeScene(QObject *parent) : QGraphicsScene(parent)
-{
-}
-
-void QDeclarativeScene::keyPressEvent(QKeyEvent *e)
-{
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Key);
-
- QGraphicsScene::keyPressEvent(e);
-}
-
-void QDeclarativeScene::keyReleaseEvent(QKeyEvent *e)
-{
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Key);
-
- QGraphicsScene::keyReleaseEvent(e);
-}
-
-void QDeclarativeScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
-{
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
-
- QGraphicsScene::mouseMoveEvent(e);
-}
-
-void QDeclarativeScene::mousePressEvent(QGraphicsSceneMouseEvent *e)
-{
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
-
- QGraphicsScene::mousePressEvent(e);
-}
-
-void QDeclarativeScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
-{
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::Mouse);
-
- QGraphicsScene::mouseReleaseEvent(e);
-}
-
-class QDeclarativeViewPrivate : public QGraphicsViewPrivate, public QDeclarativeItemChangeListener
-{
- Q_DECLARE_PUBLIC(QDeclarativeView)
-public:
- QDeclarativeViewPrivate()
- : root(0), declarativeItemRoot(0), graphicsWidgetRoot(0), component(0),
- resizeMode(QDeclarativeView::SizeViewToRootObject), initialSize(0,0) {}
- ~QDeclarativeViewPrivate() { delete root; delete engine; }
- void execute();
- void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
- void initResize();
- void updateSize();
- inline QSize rootObjectSize() const;
-
- QDeclarativeGuard<QGraphicsObject> root;
- QDeclarativeGuard<QDeclarativeItem> declarativeItemRoot;
- QDeclarativeGuard<QGraphicsWidget> graphicsWidgetRoot;
-
- QUrl source;
-
- QDeclarativeEngine* engine;
- QDeclarativeComponent *component;
- QBasicTimer resizetimer;
-
- QDeclarativeView::ResizeMode resizeMode;
- QSize initialSize;
- QElapsedTimer frameTimer;
-
- void init();
-};
-
-void QDeclarativeViewPrivate::execute()
-{
- Q_Q(QDeclarativeView);
- if (root) {
- delete root;
- root = 0;
- }
- if (component) {
- delete component;
- component = 0;
- }
- if (!source.isEmpty()) {
- component = new QDeclarativeComponent(engine, source, q);
- if (!component->isLoading()) {
- q->continueExecute();
- } else {
- QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), q, SLOT(continueExecute()));
- }
- }
-}
-
-void QDeclarativeViewPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- Q_Q(QDeclarativeView);
- if (resizeItem == root && resizeMode == QDeclarativeView::SizeViewToRootObject) {
- // wait for both width and height to be changed
- resizetimer.start(0,q);
- }
- QDeclarativeItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
-}
-
-/*!
- \class QDeclarativeView
- \since 4.7
- \brief The QDeclarativeView class provides a widget for displaying a Qt Declarative user interface.
-
- QDeclarativeItem objects can be placed on a standard QGraphicsScene and
- displayed with QGraphicsView. QDeclarativeView is a QGraphicsView subclass
- provided as a convenience for displaying QML files, and connecting between
- QML and C++ Qt objects.
-
- QDeclarativeView provides:
-
- \list
- \o Management of QDeclarativeComponent loading and object creation
- \o Initialization of QGraphicsView for optimal performance with QML using these settings:
- \list
- \o QGraphicsView::setOptimizationFlags(QGraphicsView::DontSavePainterState)
- \o QGraphicsView::setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate)
- \o QGraphicsScene::setItemIndexMethod(QGraphicsScene::NoIndex)
- \endlist
- \o Initialization of QGraphicsView for QML key handling using these settings:
- \list
- \o QGraphicsView::viewport()->setFocusPolicy(Qt::NoFocus)
- \o QGraphicsView::setFocusPolicy(Qt::StrongFocus)
- \o QGraphicsScene::setStickyFocus(true)
- \endlist
- \endlist
-
- Typical usage:
-
- \code
- QDeclarativeView *view = new QDeclarativeView;
- view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
- view->show();
- \endcode
-
- Since QDeclarativeView is a QWidget-based class, it can be used to
- display QML interfaces within QWidget-based GUI applications that do not
- use the Graphics View framework.
-
- To receive errors related to loading and executing QML with QDeclarativeView,
- you can connect to the statusChanged() signal and monitor for QDeclarativeView::Error.
- The errors are available via QDeclarativeView::errors().
-
- If you're using your own QGraphicsScene-based scene with QDeclarativeView, remember to
- enable scene's sticky focus mode and to set itemIndexMethod to QGraphicsScene::NoIndex.
-
- \sa {Integrating QML Code with Existing Qt UI Code}, {Using QML Bindings in C++ Applications}
-*/
-
-
-/*! \fn void QDeclarativeView::sceneResized(QSize size)
- This signal is emitted when the view is resized to \a size.
-*/
-
-/*! \fn void QDeclarativeView::statusChanged(QDeclarativeView::Status status)
- This signal is emitted when the component's current \a status changes.
-*/
-
-/*!
- \fn QDeclarativeView::QDeclarativeView(QWidget *parent)
-
- Constructs a QDeclarativeView with the given \a parent.
-*/
-QDeclarativeView::QDeclarativeView(QWidget *parent)
- : QGraphicsView(*(new QDeclarativeViewPrivate), parent)
-{
- Q_D(QDeclarativeView);
- setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
- d->init();
-}
-
-/*!
- \fn QDeclarativeView::QDeclarativeView(const QUrl &source, QWidget *parent)
-
- Constructs a QDeclarativeView with the given QML \a source and \a parent.
-*/
-QDeclarativeView::QDeclarativeView(const QUrl &source, QWidget *parent)
- : QGraphicsView(*(new QDeclarativeViewPrivate), parent)
-{
- Q_D(QDeclarativeView);
- setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
- d->init();
- setSource(source);
-}
-
-void QDeclarativeViewPrivate::init()
-{
- Q_Q(QDeclarativeView);
- engine = new QDeclarativeEngine();
- q->setScene(new QDeclarativeScene(q));
-
- q->setOptimizationFlags(QGraphicsView::DontSavePainterState);
- q->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- q->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- q->setFrameStyle(0);
-
- // These seem to give the best performance
- q->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
- q->scene()->setItemIndexMethod(QGraphicsScene::NoIndex);
- q->viewport()->setFocusPolicy(Qt::NoFocus);
- q->setFocusPolicy(Qt::StrongFocus);
-
- q->scene()->setStickyFocus(true); //### needed for correct focus handling
-
-#ifdef QDECLARATIVEVIEW_NOBACKGROUND
- q->setAttribute(Qt::WA_OpaquePaintEvent);
- q->setAttribute(Qt::WA_NoSystemBackground);
- q->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
- q->viewport()->setAttribute(Qt::WA_NoSystemBackground);
-#endif
-
- QDeclarativeInspectorService::instance()->addView(q);
-}
-
-/*!
- Destroys the view.
- */
-QDeclarativeView::~QDeclarativeView()
-{
- QDeclarativeInspectorService::instance()->removeView(this);
-}
-
-/*! \property QDeclarativeView::source
- \brief The URL of the source of the QML component.
-
- Changing this property causes the QML component to be reloaded.
-
- Ensure that the URL provided is full and correct, in particular, use
- \l QUrl::fromLocalFile() when loading a file from the local filesystem.
- */
-
-/*!
- Sets the source to the \a url, loads the QML component and instantiates it.
-
- Ensure that the URL provided is full and correct, in particular, use
- \l QUrl::fromLocalFile() when loading a file from the local filesystem.
-
- Calling this methods multiple times with the same url will result
- in the QML being reloaded.
- */
-void QDeclarativeView::setSource(const QUrl& url)
-{
- Q_D(QDeclarativeView);
- d->source = url;
- d->execute();
-}
-
-/*!
- Returns the source URL, if set.
-
- \sa setSource()
- */
-QUrl QDeclarativeView::source() const
-{
- Q_D(const QDeclarativeView);
- return d->source;
-}
-
-/*!
- Returns a pointer to the QDeclarativeEngine used for instantiating
- QML Components.
- */
-QDeclarativeEngine* QDeclarativeView::engine() const
-{
- Q_D(const QDeclarativeView);
- return d->engine;
-}
-
-/*!
- This function returns the root of the context hierarchy. Each QML
- component is instantiated in a QDeclarativeContext. QDeclarativeContext's are
- essential for passing data to QML components. In QML, contexts are
- arranged hierarchically and this hierarchy is managed by the
- QDeclarativeEngine.
- */
-QDeclarativeContext* QDeclarativeView::rootContext() const
-{
- Q_D(const QDeclarativeView);
- return d->engine->rootContext();
-}
-
-/*!
- \enum QDeclarativeView::Status
- Specifies the loading status of the QDeclarativeView.
-
- \value Null This QDeclarativeView has no source set.
- \value Ready This QDeclarativeView has loaded and created the QML component.
- \value Loading This QDeclarativeView is loading network data.
- \value Error One or more errors has occurred. Call errors() to retrieve a list
- of errors.
-*/
-
-/*! \enum QDeclarativeView::ResizeMode
-
- This enum specifies how to resize the view.
-
- \value SizeViewToRootObject The view resizes with the root item in the QML.
- \value SizeRootObjectToView The view will automatically resize the root item to the size of the view.
-*/
-
-/*!
- \property QDeclarativeView::status
- The component's current \l{QDeclarativeView::Status} {status}.
-*/
-
-QDeclarativeView::Status QDeclarativeView::status() const
-{
- Q_D(const QDeclarativeView);
- if (!d->component)
- return QDeclarativeView::Null;
-
- return QDeclarativeView::Status(d->component->status());
-}
-
-/*!
- Return the list of errors that occurred during the last compile or create
- operation. When the status is not Error, an empty list is returned.
-*/
-QList<QDeclarativeError> QDeclarativeView::errors() const
-{
- Q_D(const QDeclarativeView);
- if (d->component)
- return d->component->errors();
- return QList<QDeclarativeError>();
-}
-
-/*!
- \property QDeclarativeView::resizeMode
- \brief whether the view should resize the canvas contents
-
- If this property is set to SizeViewToRootObject (the default), the view
- resizes with the root item in the QML.
-
- If this property is set to SizeRootObjectToView, the view will
- automatically resize the root item.
-
- Regardless of this property, the sizeHint of the view
- is the initial size of the root item. Note though that
- since QML may load dynamically, that size may change.
-*/
-
-void QDeclarativeView::setResizeMode(ResizeMode mode)
-{
- Q_D(QDeclarativeView);
- if (d->resizeMode == mode)
- return;
-
- if (d->declarativeItemRoot) {
- if (d->resizeMode == SizeViewToRootObject) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(d->declarativeItemRoot));
- p->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry);
- }
- } else if (d->graphicsWidgetRoot) {
- if (d->resizeMode == QDeclarativeView::SizeViewToRootObject) {
- d->graphicsWidgetRoot->removeEventFilter(this);
- }
- }
-
- d->resizeMode = mode;
- if (d->root) {
- d->initResize();
- }
-}
-
-void QDeclarativeViewPrivate::initResize()
-{
- Q_Q(QDeclarativeView);
- if (declarativeItemRoot) {
- if (resizeMode == QDeclarativeView::SizeViewToRootObject) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(declarativeItemRoot));
- p->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- }
- } else if (graphicsWidgetRoot) {
- if (resizeMode == QDeclarativeView::SizeViewToRootObject) {
- graphicsWidgetRoot->installEventFilter(q);
- }
- }
- updateSize();
-}
-
-void QDeclarativeViewPrivate::updateSize()
-{
- Q_Q(QDeclarativeView);
- if (!root)
- return;
- if (declarativeItemRoot) {
- if (resizeMode == QDeclarativeView::SizeViewToRootObject) {
- QSize newSize = QSize(declarativeItemRoot->width(), declarativeItemRoot->height());
- if (newSize.isValid() && newSize != q->size()) {
- q->resize(newSize);
- }
- } else if (resizeMode == QDeclarativeView::SizeRootObjectToView) {
- if (!qFuzzyCompare(q->width(), declarativeItemRoot->width()))
- declarativeItemRoot->setWidth(q->width());
- if (!qFuzzyCompare(q->height(), declarativeItemRoot->height()))
- declarativeItemRoot->setHeight(q->height());
- }
- } else if (graphicsWidgetRoot) {
- if (resizeMode == QDeclarativeView::SizeViewToRootObject) {
- QSize newSize = QSize(graphicsWidgetRoot->size().width(), graphicsWidgetRoot->size().height());
- if (newSize.isValid() && newSize != q->size()) {
- q->resize(newSize);
- }
- } else if (resizeMode == QDeclarativeView::SizeRootObjectToView) {
- QSizeF newSize = QSize(q->size().width(), q->size().height());
- if (newSize.isValid() && newSize != graphicsWidgetRoot->size()) {
- graphicsWidgetRoot->resize(newSize);
- }
- }
- }
- q->updateGeometry();
-}
-
-QSize QDeclarativeViewPrivate::rootObjectSize() const
-{
- QSize rootObjectSize(0,0);
- int widthCandidate = -1;
- int heightCandidate = -1;
- if (root) {
- QSizeF size = root->boundingRect().size();
- widthCandidate = size.width();
- heightCandidate = size.height();
- }
- if (widthCandidate > 0) {
- rootObjectSize.setWidth(widthCandidate);
- }
- if (heightCandidate > 0) {
- rootObjectSize.setHeight(heightCandidate);
- }
- return rootObjectSize;
-}
-
-QDeclarativeView::ResizeMode QDeclarativeView::resizeMode() const
-{
- Q_D(const QDeclarativeView);
- return d->resizeMode;
-}
-
-/*!
- \internal
- */
-void QDeclarativeView::continueExecute()
-{
- Q_D(QDeclarativeView);
- disconnect(d->component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), this, SLOT(continueExecute()));
-
- if (d->component->isError()) {
- QList<QDeclarativeError> errorList = d->component->errors();
- foreach (const QDeclarativeError &error, errorList) {
- qWarning() << error;
- }
- emit statusChanged(status());
- return;
- }
-
- QObject *obj = d->component->create();
-
- if(d->component->isError()) {
- QList<QDeclarativeError> errorList = d->component->errors();
- foreach (const QDeclarativeError &error, errorList) {
- qWarning() << error;
- }
- emit statusChanged(status());
- return;
- }
-
- setRootObject(obj);
- emit statusChanged(status());
-}
-
-/*!
- \internal
-*/
-void QDeclarativeView::setRootObject(QObject *obj)
-{
- Q_D(QDeclarativeView);
- if (d->root == obj || !scene())
- return;
- if (QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem *>(obj)) {
- scene()->addItem(declarativeItem);
- d->root = declarativeItem;
- d->declarativeItemRoot = declarativeItem;
- } else if (QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(obj)) {
- scene()->addItem(graphicsObject);
- d->root = graphicsObject;
- if (graphicsObject->isWidget()) {
- d->graphicsWidgetRoot = static_cast<QGraphicsWidget*>(graphicsObject);
- } else {
- qWarning() << "QDeclarativeView::resizeMode is not honored for components of type QGraphicsObject";
- }
- } else if (obj) {
- qWarning() << "QDeclarativeView only supports loading of root objects that derive from QGraphicsObject";
- if (QWidget* widget = qobject_cast<QWidget *>(obj)) {
- window()->setAttribute(Qt::WA_OpaquePaintEvent, false);
- window()->setAttribute(Qt::WA_NoSystemBackground, false);
- if (layout() && layout()->count()) {
- // Hide the QGraphicsView in GV mode.
- QLayoutItem *item = layout()->itemAt(0);
- if (item->widget())
- item->widget()->hide();
- }
- widget->setParent(this);
- if (isVisible()) {
- widget->setVisible(true);
- }
- resize(widget->size());
- }
- }
-
- if (d->root) {
- d->initialSize = d->rootObjectSize();
- if (d->initialSize != size()) {
- if (!(parentWidget() && parentWidget()->layout())) {
- resize(d->initialSize);
- }
- }
- d->initResize();
- }
-}
-
-/*!
- \internal
- If the \l {QTimerEvent} {timer event} \a e is this
- view's resize timer, sceneResized() is emitted.
- */
-void QDeclarativeView::timerEvent(QTimerEvent* e)
-{
- Q_D(QDeclarativeView);
- if (!e || e->timerId() == d->resizetimer.timerId()) {
- d->updateSize();
- d->resizetimer.stop();
- }
-}
-
-/*! \internal */
-bool QDeclarativeView::eventFilter(QObject *watched, QEvent *e)
-{
- Q_D(QDeclarativeView);
- if (watched == d->root && d->resizeMode == SizeViewToRootObject) {
- if (d->graphicsWidgetRoot) {
- if (e->type() == QEvent::GraphicsSceneResize) {
- d->updateSize();
- }
- }
- }
- return QGraphicsView::eventFilter(watched, e);
-}
-
-/*!
- \internal
- Preferred size follows the root object geometry.
-*/
-QSize QDeclarativeView::sizeHint() const
-{
- Q_D(const QDeclarativeView);
- QSize rootObjectSize = d->rootObjectSize();
- if (rootObjectSize.isEmpty()) {
- return size();
- } else {
- return rootObjectSize;
- }
-}
-
-/*!
- Returns the initial size of the root object
-*/
-QSize QDeclarativeView::initialSize() const
-{
- Q_D(const QDeclarativeView);
- return d->initialSize;
-}
-
-/*!
- Returns the view's root \l {QGraphicsObject} {item}.
- */
-QGraphicsObject *QDeclarativeView::rootObject() const
-{
- Q_D(const QDeclarativeView);
- return d->root;
-}
-
-/*!
- \internal
- This function handles the \l {QResizeEvent} {resize event}
- \a e.
- */
-void QDeclarativeView::resizeEvent(QResizeEvent *e)
-{
- Q_D(QDeclarativeView);
- if (d->resizeMode == SizeRootObjectToView) {
- d->updateSize();
- }
- if (d->declarativeItemRoot) {
- setSceneRect(QRectF(0, 0, d->declarativeItemRoot->width(), d->declarativeItemRoot->height()));
- } else if (d->root) {
- setSceneRect(d->root->boundingRect());
- } else {
- setSceneRect(rect());
- }
- emit sceneResized(e->size());
- QGraphicsView::resizeEvent(e);
-}
-
-/*!
- \internal
-*/
-void QDeclarativeView::paintEvent(QPaintEvent *event)
-{
- Q_D(QDeclarativeView);
-
- QDeclarativeDebugTrace::addEvent(QDeclarativeDebugTrace::FramePaint);
- QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Painting);
-
- int time = 0;
- if (frameRateDebug())
- time = d->frameTimer.restart();
-
- QGraphicsView::paintEvent(event);
-
- QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Painting);
-
- if (frameRateDebug())
- qDebug() << "paintEvent:" << d->frameTimer.elapsed() << "time since last frame:" << time;
-
-#if QT_SHOW_DECLARATIVEVIEW_FPS
- static QTime timer;
- static int frames;
-
- if (frames == 0) {
- timer.start();
- } else if (timer.elapsed() > 5000) {
- qreal avgtime = timer.elapsed() / (qreal) frames;
- qDebug("Average time per frame: %f ms (%i fps)", avgtime, int(1000 / avgtime));
- timer.start();
- frames = 0;
- }
- ++frames;
- scene()->update();
-#endif
-
-}
-
-QT_END_NAMESPACE
diff --git a/src/declarative/util/qdeclarativeview.h b/src/declarative/util/qdeclarativeview.h
deleted file mode 100644
index 6959d246e4..0000000000
--- a/src/declarative/util/qdeclarativeview.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEVIEW_H
-#define QDECLARATIVEVIEW_H
-
-#include <QtCore/qdatetime.h>
-#include <QtCore/qurl.h>
-#include <QtGui/qgraphicssceneevent.h>
-#include <QtGui/qgraphicsview.h>
-#include <QtGui/qwidget.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-class QGraphicsObject;
-class QDeclarativeEngine;
-class QDeclarativeContext;
-class QDeclarativeError;
-
-class QDeclarativeViewPrivate;
-class Q_DECLARATIVE_EXPORT QDeclarativeView : public QGraphicsView
-{
- Q_OBJECT
- Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
- Q_PROPERTY(Status status READ status NOTIFY statusChanged)
- Q_PROPERTY(QUrl source READ source WRITE setSource DESIGNABLE true)
- Q_ENUMS(ResizeMode Status)
-public:
- explicit QDeclarativeView(QWidget *parent = 0);
- QDeclarativeView(const QUrl &source, QWidget *parent = 0);
- virtual ~QDeclarativeView();
-
- QUrl source() const;
-
- QDeclarativeEngine* engine() const;
- QDeclarativeContext* rootContext() const;
-
- QGraphicsObject *rootObject() const;
-
- enum ResizeMode { SizeViewToRootObject, SizeRootObjectToView };
- ResizeMode resizeMode() const;
- void setResizeMode(ResizeMode);
-
- enum Status { Null, Ready, Loading, Error };
- Status status() const;
-
- QList<QDeclarativeError> errors() const;
-
- QSize sizeHint() const;
- QSize initialSize() const;
-
-public Q_SLOTS:
- void setSource(const QUrl&);
-
-Q_SIGNALS:
- void sceneResized(QSize size); // ???
- void statusChanged(QDeclarativeView::Status);
-
-private Q_SLOTS:
- void continueExecute();
-
-protected:
- virtual void resizeEvent(QResizeEvent *);
- virtual void paintEvent(QPaintEvent *event);
- virtual void timerEvent(QTimerEvent*);
- virtual void setRootObject(QObject *obj);
- virtual bool eventFilter(QObject *watched, QEvent *e);
-
-private:
- Q_DISABLE_COPY(QDeclarativeView)
- Q_DECLARE_PRIVATE(QDeclarativeView)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QDECLARATIVEVIEW_H
diff --git a/src/declarative/util/util.pri b/src/declarative/util/util.pri
index 4bd1f1bb1b..965acf80c6 100644
--- a/src/declarative/util/util.pri
+++ b/src/declarative/util/util.pri
@@ -3,7 +3,6 @@ INCLUDEPATH += $$PWD
SOURCES += \
$$PWD/qdeclarativeapplication.cpp \
$$PWD/qdeclarativeutilmodule.cpp\
- $$PWD/qdeclarativeview.cpp \
$$PWD/qdeclarativeconnections.cpp \
$$PWD/qdeclarativepackage.cpp \
$$PWD/qdeclarativeanimation.cpp \
@@ -28,13 +27,13 @@ SOURCES += \
$$PWD/qdeclarativefontloader.cpp \
$$PWD/qdeclarativestyledtext.cpp \
$$PWD/qdeclarativelistmodelworkeragent.cpp \
+ $$PWD/qdeclarativepath.cpp \
$$PWD/qdeclarativechangeset.cpp \
$$PWD/qlistmodelinterface.cpp
HEADERS += \
$$PWD/qdeclarativeapplication_p.h \
$$PWD/qdeclarativeutilmodule_p.h\
- $$PWD/qdeclarativeview.h \
$$PWD/qdeclarativeconnections_p.h \
$$PWD/qdeclarativepackage_p.h \
$$PWD/qdeclarativeanimation_p.h \
@@ -54,7 +53,6 @@ HEADERS += \
$$PWD/qdeclarativelistmodel_p_p.h\
$$PWD/qdeclarativelistaccessor_p.h \
$$PWD/qdeclarativeopenmetaobject_p.h \
- $$PWD/qdeclarativenullablevalue_p_p.h \
$$PWD/qdeclarativetimeline_p_p.h \
$$PWD/qdeclarativetimer_p.h \
$$PWD/qdeclarativebind_p.h \
@@ -64,6 +62,8 @@ HEADERS += \
$$PWD/qdeclarativefontloader_p.h \
$$PWD/qdeclarativestyledtext_p.h \
$$PWD/qdeclarativelistmodelworkeragent_p.h \
+ $$PWD/qdeclarativepath_p.h \
+ $$PWD/qdeclarativepath_p_p.h \
$$PWD/qdeclarativechangeset_p.h \
$$PWD/qlistmodelinterface_p.h