source: trunk/src/declarative/qml/qdeclarativelistscriptclass.cpp

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 5.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the QtDeclarative module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "private/qdeclarativelistscriptclass_p.h"
43
44#include "private/qdeclarativeengine_p.h"
45#include "private/qdeclarativeguard_p.h"
46#include "private/qdeclarativelist_p.h"
47
48QT_BEGIN_NAMESPACE
49
50struct ListData : public QScriptDeclarativeClass::Object {
51 QDeclarativeGuard<QObject> object;
52 QDeclarativeListProperty<QObject> property;
53 int propertyType;
54};
55
56QDeclarativeListScriptClass::QDeclarativeListScriptClass(QDeclarativeEngine *e)
57: QScriptDeclarativeClass(QDeclarativeEnginePrivate::getScriptEngine(e)), engine(e)
58{
59 QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
60 Q_UNUSED(scriptEngine);
61
62 m_lengthId = createPersistentIdentifier(QLatin1String("length"));
63}
64
65QDeclarativeListScriptClass::~QDeclarativeListScriptClass()
66{
67}
68
69QScriptValue QDeclarativeListScriptClass::newList(QObject *object, int propId, int propType)
70{
71 QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
72
73 if (!object || propId == -1)
74 return scriptEngine->nullValue();
75
76 ListData *data = new ListData;
77 data->object = object;
78 data->propertyType = propType;
79 void *args[] = { &data->property, 0 };
80 QMetaObject::metacall(object, QMetaObject::ReadProperty, propId, args);
81
82 return newObject(scriptEngine, this, data);
83}
84
85QScriptValue QDeclarativeListScriptClass::newList(const QDeclarativeListProperty<QObject> &prop, int propType)
86{
87 QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
88
89 ListData *data = new ListData;
90 data->object = prop.object;
91 data->property = prop;
92 data->propertyType = propType;
93
94 return newObject(scriptEngine, this, data);
95}
96
97QScriptClass::QueryFlags
98QDeclarativeListScriptClass::queryProperty(Object *object, const Identifier &name,
99 QScriptClass::QueryFlags flags)
100{
101 Q_UNUSED(object);
102 Q_UNUSED(flags);
103 if (name == m_lengthId.identifier)
104 return QScriptClass::HandlesReadAccess;
105
106 bool ok = false;
107 quint32 idx = toArrayIndex(name, &ok);
108
109 if (ok) {
110 lastIndex = idx;
111 return QScriptClass::HandlesReadAccess;
112 } else {
113 return 0;
114 }
115}
116
117QDeclarativeListScriptClass::Value QDeclarativeListScriptClass::property(Object *obj, const Identifier &name)
118{
119 QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
120 QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
121
122 ListData *data = (ListData *)obj;
123 if (!data->object)
124 return Value();
125
126 quint32 count = data->property.count?data->property.count(&data->property):0;
127
128 if (name == m_lengthId.identifier)
129 return Value(scriptEngine, count);
130 else if (lastIndex < count && data->property.at)
131 return Value(scriptEngine, enginePriv->objectClass->newQObject(data->property.at(&data->property, lastIndex)));
132 else
133 return Value();
134}
135
136QVariant QDeclarativeListScriptClass::toVariant(Object *obj, bool *ok)
137{
138 ListData *data = (ListData *)obj;
139
140 if (!data->object) {
141 if (ok) *ok = false;
142 return QVariant();
143 }
144
145 return QVariant::fromValue(QDeclarativeListReferencePrivate::init(data->property, data->propertyType, engine));
146}
147
148QT_END_NAMESPACE
149
Note: See TracBrowser for help on using the repository browser.