diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2009-11-06 03:46:57 (GMT) |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2009-11-06 03:46:57 (GMT) |
commit | cd9f07d8c488ff35cceb73924af4da4bdc10a647 (patch) | |
tree | 8ce137546582b1eaa500322917b65d7d75d25516 /src | |
parent | 9c984b6b421e7cc6c091623f63ed84ce700f1ee1 (diff) | |
parent | 61d479a412e43255bf0681bec1cfb599cb7be886 (diff) | |
download | Qt-cd9f07d8c488ff35cceb73924af4da4bdc10a647.zip Qt-cd9f07d8c488ff35cceb73924af4da4bdc10a647.tar.gz Qt-cd9f07d8c488ff35cceb73924af4da4bdc10a647.tar.bz2 |
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicsitem.cpp | 74 | ||||
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicswebview.cpp | 2 | ||||
-rw-r--r-- | src/declarative/qml/qmlengine.cpp | 17 | ||||
-rw-r--r-- | src/declarative/qml/qmlinfo.cpp | 12 | ||||
-rw-r--r-- | src/declarative/qml/qmlintegercache.cpp | 29 | ||||
-rw-r--r-- | src/declarative/qml/qmlintegercache_p.h | 2 | ||||
-rw-r--r-- | src/declarative/qml/qmlvaluetypescriptclass.cpp | 101 | ||||
-rw-r--r-- | src/declarative/qml/qmlvaluetypescriptclass_p.h | 18 | ||||
-rw-r--r-- | src/declarative/util/qmltimer.cpp | 5 |
9 files changed, 140 insertions, 120 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsitem.cpp b/src/declarative/graphicsitems/qmlgraphicsitem.cpp index 77e6db8..a46c2be 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsitem.cpp @@ -389,6 +389,76 @@ void QmlGraphicsItemKeyFilter::componentComplete() if (m_next) m_next->componentComplete(); } + +/*! + \qmlclass KeyNavigation + \brief The KeyNavigation attached property supports key navigation by arrow keys. + + It is common in key-based UIs to use arrow keys to navigate + between focussed items. The KeyNavigation property provides a + convenient way of specifying which item will gain focus + when an arrow key is pressed. The following example provides + key navigation for a 2x2 grid of items. + + \code + Grid { + columns: 2 + width: 100; height: 100 + Rectangle { + id: item1 + focus: true + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item2 + KeyNavigation.down: item3 + } + Rectangle { + id: item2 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item1 + KeyNavigation.down: item4 + } + Rectangle { + id: item3 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item4 + KeyNavigation.up: item1 + } + Rectangle { + id: item4 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item3 + KeyNavigation.up: item2 + } + } + \endcode + + KeyNavigation receives key events after the item it is attached to. + If the item accepts an arrow key event, the KeyNavigation + attached property will not receive an event for that key. + + If an item has been set for a direction and the KeyNavigation + attached property receives the corresponding + key press and release events, the events will be accepted by + KeyNaviagtion and will not propagate any further. + + \sa {Keys}{Keys attached property} +*/ + +/*! + \qmlproperty Item KeyNavigation::left + \qmlproperty Item KeyNavigation::right + \qmlproperty Item KeyNavigation::up + \qmlproperty Item KeyNavigation::down + + These properties hold the item to assign focus to + when Key_Left, Key_Right, Key_Up or Key_Down are + pressed. +*/ + class QmlGraphicsKeyNavigationAttachedPrivate : public QObjectPrivate { public: @@ -606,7 +676,7 @@ void QmlGraphicsKeyNavigationAttached::keyReleased(QKeyEvent *event) See \l {Qt::Key}{Qt.Key} for the list of keyboard codes. - \sa KeyEvent + \sa KeyEvent, {KeyNavigation}{KeyNavigation attached property} */ /*! @@ -1119,7 +1189,7 @@ void QmlGraphicsKeysAttached::keyPressed(QKeyEvent *event) // If we specifically handle a key then default to accepted ke.setAccepted(true); int idx = QmlGraphicsKeysAttached::staticMetaObject.indexOfSignal(keySignal); - metaObject()->method(idx).invoke(this, Q_ARG(QmlGraphicsKeysAttached, &ke)); + metaObject()->method(idx).invoke(this, Qt::DirectConnection, Q_ARG(QmlGraphicsKeyEvent*, &ke)); } } if (!ke.isAccepted()) diff --git a/src/declarative/graphicsitems/qmlgraphicswebview.cpp b/src/declarative/graphicsitems/qmlgraphicswebview.cpp index 4ac208c..5ce0ee8 100644 --- a/src/declarative/graphicsitems/qmlgraphicswebview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicswebview.cpp @@ -362,7 +362,7 @@ void QmlGraphicsWebView::pageUrlChanged() expandToWebPage(); if ((d->url.isEmpty() && page()->mainFrame()->url() != QUrl(QLatin1String("about:blank"))) - || d->url != page()->mainFrame()->url()) + || d->url != page()->mainFrame()->url() && !page()->mainFrame()->url().isEmpty()) { d->url = page()->mainFrame()->url(); if (d->url == QUrl(QLatin1String("about:blank"))) diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index e46205d..177818f 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -908,7 +908,7 @@ QVariant QmlEnginePrivate::scriptValueToVariant(const QScriptValue &val) else if (dc == contextClass) return QVariant(); - QScriptClass *sc = val.scriptClass(); + QScriptDeclarativeClass *sc = QScriptDeclarativeClass::scriptClass(val); if (!sc) { return val.toVariant(); } else if (sc == valueTypeClass) { @@ -929,20 +929,7 @@ QVariant QmlScriptClass::toVariant(QmlEngine *engine, const QScriptValue &val) QmlEnginePrivate *ep = static_cast<QmlEnginePrivate *>(QObjectPrivate::get(engine)); - QScriptDeclarativeClass *dc = QScriptDeclarativeClass::scriptClass(val); - if (dc == ep->objectClass) - return QVariant::fromValue(ep->objectClass->toQObject(val)); - else if (dc == ep->contextClass) - return QVariant(); - - QScriptClass *sc = val.scriptClass(); - if (!sc) { - return val.toVariant(); - } else if (sc == ep->valueTypeClass) { - return ep->valueTypeClass->toVariant(val); - } - - return QVariant(); + return ep->scriptValueToVariant(val); } // XXX this beyonds in QUrl::toLocalFile() diff --git a/src/declarative/qml/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp index c0d9eca..f62f5fd 100644 --- a/src/declarative/qml/qmlinfo.cpp +++ b/src/declarative/qml/qmlinfo.cpp @@ -80,18 +80,18 @@ void qmlInfo(const QString& msg, QObject* object) pos += QLatin1Char(' '); pos += QLatin1String(object->metaObject()->className()); } - QmlDeclarativeData *ddata = QmlDeclarativeData::get(object); + QmlDeclarativeData *ddata = object?QmlDeclarativeData::get(object):0; pos += QLatin1String(" ("); if (ddata) { if (ddata->outerContext) { pos += ddata->outerContext->baseUrl().toString(); + pos += QLatin1String(":"); + pos += QString::number(ddata->lineNumber); + pos += QLatin1String(":"); + pos += QString::number(ddata->columnNumber); } else { - pos += qApp->translate("QmlInfo","unknown"); + pos += qApp->translate("QmlInfo","unknown location"); } - pos += QLatin1String(":"); - pos += QString::number(ddata->lineNumber); - pos += QLatin1String(":"); - pos += QString::number(ddata->columnNumber); } else { pos += qApp->translate("QmlInfo","unknown location"); } diff --git a/src/declarative/qml/qmlintegercache.cpp b/src/declarative/qml/qmlintegercache.cpp index b20b6eb..d1927b3 100644 --- a/src/declarative/qml/qmlintegercache.cpp +++ b/src/declarative/qml/qmlintegercache.cpp @@ -82,33 +82,4 @@ int QmlIntegerCache::value(const QString &id) return d?d->value:-1; } -QmlIntegerCache *QmlIntegerCache::createForEnums(QmlType *type, QmlEngine *engine) -{ - Q_ASSERT(type); - Q_ASSERT(engine); - - QmlIntegerCache *cache = new QmlIntegerCache(engine); - - const QMetaObject *mo = type->metaObject(); - - for (int ii = mo->enumeratorCount() - 1; ii >= 0; --ii) { - QMetaEnum enumerator = mo->enumerator(ii); - - for (int jj = 0; jj < enumerator.keyCount(); ++jj) { - QString name = QString::fromUtf8(enumerator.key(jj)); - int value = enumerator.value(jj); - - if (!name.at(0).isUpper()) - continue; - - if (cache->stringCache.contains(name)) - continue; - - cache->add(name, value); - } - } - - return cache; -} - QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlintegercache_p.h b/src/declarative/qml/qmlintegercache_p.h index 7816004..2b10dcc 100644 --- a/src/declarative/qml/qmlintegercache_p.h +++ b/src/declarative/qml/qmlintegercache_p.h @@ -73,8 +73,6 @@ public: int value(const QString &); inline int value(const QScriptDeclarativeClass::Identifier &id) const; - static QmlIntegerCache *createForEnums(QmlType *, QmlEngine *); - protected: virtual void clear(); diff --git a/src/declarative/qml/qmlvaluetypescriptclass.cpp b/src/declarative/qml/qmlvaluetypescriptclass.cpp index 0c30992..e939e80 100644 --- a/src/declarative/qml/qmlvaluetypescriptclass.cpp +++ b/src/declarative/qml/qmlvaluetypescriptclass.cpp @@ -44,15 +44,14 @@ QT_BEGIN_NAMESPACE -struct QmlValueTypeReference { +struct QmlValueTypeReference : public QScriptDeclarativeClass::Object { QmlValueType *type; QGuard<QObject> object; int property; }; -Q_DECLARE_METATYPE(QmlValueTypeReference); QmlValueTypeScriptClass::QmlValueTypeScriptClass(QmlEngine *bindEngine) -: QScriptClass(QmlEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine) +: QScriptDeclarativeClass(QmlEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine) { } @@ -62,89 +61,83 @@ QmlValueTypeScriptClass::~QmlValueTypeScriptClass() QScriptValue QmlValueTypeScriptClass::newObject(QObject *object, int coreIndex, QmlValueType *type) { - QmlValueTypeReference ref = { type, object, coreIndex }; - QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine); - return scriptEngine->newObject(this, scriptEngine->newVariant(qVariantFromValue(ref))); + QmlValueTypeReference *ref = new QmlValueTypeReference; + ref->type = type; + ref->object = object; + ref->property = coreIndex; + return QScriptDeclarativeClass::newObject(QmlEnginePrivate::getScriptEngine(engine), this, ref); } -QmlValueTypeScriptClass::QueryFlags -QmlValueTypeScriptClass::queryProperty(const QScriptValue &object, - const QScriptString &name, - QueryFlags flags, uint *id) +QScriptClass::QueryFlags +QmlValueTypeScriptClass::queryProperty(Object *obj, const Identifier &name, + QScriptClass::QueryFlags) { - Q_UNUSED(flags); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - if (!ref.object) + m_lastIndex = -1; + + if (!ref->object) return 0; - QByteArray propName = name.toString().toUtf8(); + QByteArray propName = toString(name).toUtf8(); - int idx = ref.type->metaObject()->indexOfProperty(propName.constData()); - if (idx == -1) + m_lastIndex = ref->type->metaObject()->indexOfProperty(propName.constData()); + if (m_lastIndex == -1) return 0; - *id = idx; - QMetaProperty prop = ref.object->metaObject()->property(idx); + QMetaProperty prop = ref->object->metaObject()->property(m_lastIndex); - QmlValueTypeScriptClass::QueryFlags rv = - QmlValueTypeScriptClass::HandlesReadAccess; + QScriptClass::QueryFlags rv = + QScriptClass::HandlesReadAccess; if (prop.isWritable()) - rv |= QmlValueTypeScriptClass::HandlesWriteAccess; + rv |= QScriptClass::HandlesWriteAccess; return rv; } -QScriptValue QmlValueTypeScriptClass::property(const QScriptValue &object, - const QScriptString &name, - uint id) +QScriptValue QmlValueTypeScriptClass::property(Object *obj, const Identifier &) { - Q_UNUSED(name); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); - - if (!ref.object) - return QScriptValue(); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - ref.type->read(ref.object, ref.property); - - QMetaProperty p = ref.type->metaObject()->property(id); - QVariant rv = p.read(ref.type); + QMetaProperty p = ref->type->metaObject()->property(m_lastIndex); + ref->type->read(ref->object, ref->property); + QVariant rv = p.read(ref->type); return static_cast<QmlEnginePrivate *>(QObjectPrivate::get(engine))->scriptValueFromVariant(rv); } -void QmlValueTypeScriptClass::setProperty(QScriptValue &object, - const QScriptString &name, - uint id, +void QmlValueTypeScriptClass::setProperty(Object *obj, const Identifier &, const QScriptValue &value) { - Q_UNUSED(name); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); - - if (!ref.object) - return; + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); QVariant v = QmlScriptClass::toVariant(engine, value); - ref.type->read(ref.object, ref.property); - QMetaProperty p = ref.type->metaObject()->property(id); - p.write(ref.type, v); - ref.type->write(ref.object, ref.property, 0); + ref->type->read(ref->object, ref->property); + QMetaProperty p = ref->type->metaObject()->property(m_lastIndex); + p.write(ref->type, v); + ref->type->write(ref->object, ref->property, 0); } -QVariant QmlValueTypeScriptClass::toVariant(const QScriptValue &val) +QVariant QmlValueTypeScriptClass::toVariant(Object *obj, bool *ok) { - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(val.data().toVariant()); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - if (!ref.object) + if (ok) *ok = true; + + if (ref->object) { + ref->type->read(ref->object, ref->property); + return ref->type->value(); + } else { return QVariant(); + } +} + +QVariant QmlValueTypeScriptClass::toVariant(const QScriptValue &value) +{ + Q_ASSERT(scriptClass(value) == this); - QMetaProperty p = ref.object->metaObject()->property(ref.property); - return p.read(ref.object); + return toVariant(object(value), 0); } QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlvaluetypescriptclass_p.h b/src/declarative/qml/qmlvaluetypescriptclass_p.h index bd31ec1..19020b2 100644 --- a/src/declarative/qml/qmlvaluetypescriptclass_p.h +++ b/src/declarative/qml/qmlvaluetypescriptclass_p.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE class QmlEngine; class QmlValueType; -class QmlValueTypeScriptClass : public QScriptClass +class QmlValueTypeScriptClass : public QScriptDeclarativeClass { public: QmlValueTypeScriptClass(QmlEngine *); @@ -67,20 +67,16 @@ public: QScriptValue newObject(QObject *object, int coreIndex, QmlValueType *); - virtual QueryFlags queryProperty(const QScriptValue &object, - const QScriptString &name, - QueryFlags flags, uint *id); - virtual QScriptValue property(const QScriptValue &object, - const QScriptString &name, - uint id); - virtual void setProperty(QScriptValue &object, - const QScriptString &name, - uint id, - const QScriptValue &value); + virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &, + QScriptClass::QueryFlags flags); + virtual QScriptValue property(Object *, const Identifier &); + virtual void setProperty(Object *, const Identifier &name, const QScriptValue &); + virtual QVariant toVariant(Object *, bool *ok = 0); QVariant toVariant(const QScriptValue &); private: QmlEngine *engine; + int m_lastIndex; }; QT_END_NAMESPACE diff --git a/src/declarative/util/qmltimer.cpp b/src/declarative/util/qmltimer.cpp index 0aa0747..8ee9059 100644 --- a/src/declarative/util/qmltimer.cpp +++ b/src/declarative/util/qmltimer.cpp @@ -176,6 +176,11 @@ void QmlTimer::setRepeating(bool repeating) /*! \qmlproperty bool Timer::triggeredOnStart + When the Timer is started the first trigger is normally after the specified + interval has elapsed. It is sometimes desireable to trigger immediately + when the timer is started, for example to establish an initial + state. + If \a triggeredOnStart is true, the timer will be triggered immediately when started, and subsequently at the specified interval. Note that for a Timer with \e repeat set to false, this will result in the timer being |