void contextSetObject(QQmlContext_ *context, QObject_ *value) { QQmlContext *qcontext = reinterpret_cast<QQmlContext *>(context); QObject *qvalue = reinterpret_cast<QObject *>(value); // Give qvalue an engine reference if it doesn't yet have one. if (!qmlEngine(qvalue)) { QQmlEngine::setContextForObject(qvalue, qcontext->engine()->rootContext()); } qcontext->setContextObject(qvalue); }
void AbstractDataPlugin::handleViewportChange( const ViewportParams *viewport ) { QList<AbstractDataPluginItem*> orphane = d->m_delegateInstances.keys(); QList<AbstractDataPluginItem*> const items = d->m_model->items( viewport, numberOfItems() ); foreach( AbstractDataPluginItem* item, items ) { qreal x, y; Marble::GeoDataCoordinates const coordinates = item->coordinate(); bool const visible = viewport->screenCoordinates( coordinates.longitude(), coordinates.latitude(), x, y ); if ( !d->m_delegateInstances.contains( item ) ) { if ( !visible ) { // We don't have, but don't need it either. Shouldn't happen though as the model checks for it already. continue; } // Create a new QML object instance using the delegate as the factory. The original // data plugin item is set as the context object, i.e. all its properties are available // to QML directly with their names QQmlContext *context = new QQmlContext( qmlContext( d->m_delegate ) ); context->setContextObject( item ); QList<QByteArray> const dynamicProperties = item->dynamicPropertyNames(); foreach( const QByteArray &property, dynamicProperties ) { context->setContextProperty( property, item->property( property ) ); } QObject* component = d->m_delegate->create( context ); QQuickItem* newItem = qobject_cast<QQuickItem*>( component ); QGraphicsItem* graphicsItem = qobject_cast<QGraphicsItem*>( component ); if ( graphicsItem && newItem ) { graphicsItem->setParentItem( d->m_delegateParent ); } if ( newItem ) { d->m_delegateInstances[item] = newItem; } else { mDebug() << "Failed to create delegate"; continue; } } else if ( !visible ) {