void ImportView::slotZoomFactorChanged(double zoom) { toggleZoomActions(); emit signalZoomChanged(zoom); }
void BackendGoogleMaps::slotHTMLEvents(const QStringList& events) { // for some events, we just note that they appeared and then process them later on: bool centerProbablyChanged = false; bool mapTypeChanged = false; bool zoomProbablyChanged = false; bool mapBoundsProbablyChanged = false; QIntList movedClusters; QList<QPersistentModelIndex> movedMarkers; QIntList clickedClusters; // TODO: verify that the order of the events is still okay // or that the order does not matter for (QStringList::const_iterator it = events.constBegin(); it != events.constEnd(); ++it) { const QString eventCode = it->left(2); const QString eventParameter = it->mid(2); const QStringList eventParameters = eventParameter.split(QLatin1Char( '/' )); if (eventCode == QLatin1String("MT")) { // map type changed mapTypeChanged = true; d->cacheMapType = eventParameter; } else if (eventCode == QLatin1String("MB")) { // NOTE: event currently disabled in javascript part // map bounds changed centerProbablyChanged = true; zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == QLatin1String("ZC")) { // NOTE: event currently disabled in javascript part // zoom changed zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == QLatin1String("id")) { // idle after drastic map changes centerProbablyChanged = true; zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == QLatin1String("cm")) { /// @todo buffer this event type! // cluster moved bool okay = false; const int clusterIndex = eventParameter.toInt(&okay); KGEOMAP_ASSERT(okay); if (!okay) continue; KGEOMAP_ASSERT(clusterIndex >= 0); KGEOMAP_ASSERT(clusterIndex<s->clusterList.size()); if ((clusterIndex<0)||(clusterIndex>s->clusterList.size())) continue; // re-read the marker position: GeoCoordinates clusterCoordinates; const bool isValid = d->htmlWidget->runScript2Coordinates( QString::fromLatin1("kgeomapGetClusterPosition(%1);").arg(clusterIndex), &clusterCoordinates ); KGEOMAP_ASSERT(isValid); if (!isValid) continue; /// @todo this discards the altitude! /// @todo is this really necessary? clusters should be regenerated anyway... s->clusterList[clusterIndex].coordinates = clusterCoordinates; movedClusters << clusterIndex; } else if (eventCode == QLatin1String("cs")) { /// @todo buffer this event type! // cluster snapped bool okay = false; const int clusterIndex = eventParameters.first().toInt(&okay); KGEOMAP_ASSERT(okay); if (!okay) continue; KGEOMAP_ASSERT(clusterIndex >= 0); KGEOMAP_ASSERT(clusterIndex<s->clusterList.size()); if ((clusterIndex<0)||(clusterIndex>s->clusterList.size())) continue; // determine to which marker we snapped: okay = false; const int snapModelId = eventParameters.at(1).toInt(&okay); KGEOMAP_ASSERT(okay); if (!okay) continue; okay = false; const int snapMarkerId = eventParameters.at(2).toInt(&okay); KGEOMAP_ASSERT(okay); if (!okay) continue; /// @todo emit signal here or later? ModelHelper* const modelHelper = s->ungroupedModels.at(snapModelId); QAbstractItemModel* const model = modelHelper->model(); QPair<int, QModelIndex> snapTargetIndex(snapModelId, model->index(snapMarkerId, 0)); emit(signalClustersMoved(QIntList()<<clusterIndex, snapTargetIndex)); } else if (eventCode == QLatin1String("cc")) { /// @todo buffer this event type! // cluster clicked bool okay = false; const int clusterIndex = eventParameter.toInt(&okay); KGEOMAP_ASSERT(okay); if (!okay) continue; KGEOMAP_ASSERT(clusterIndex>=0); KGEOMAP_ASSERT(clusterIndex<s->clusterList.size()); if ((clusterIndex<0)||(clusterIndex>s->clusterList.size())) continue; clickedClusters << clusterIndex; } else if (eventCode == QLatin1String("mm")) { // // TODO: buffer this event type! // // marker moved // bool okay = false; // const int markerRow = eventParameter.toInt(&okay); // KGEOMAP_ASSERT(okay); // // if (!okay) // continue; // // KGEOMAP_ASSERT(markerRow >= 0); // KGEOMAP_ASSERT(markerRow<s->specialMarkersModel->rowCount()); // // if ((markerRow<0)||(markerRow>=s->specialMarkersModel->rowCount())) // continue; // // // re-read the marker position: // GeoCoordinates markerCoordinates; // const bool isValid = d->htmlWidget->runScript2Coordinates( // QString::fromLatin1("kgeomapGetMarkerPosition(%1);").arg(markerRow), // &markerCoordinates // ); // // KGEOMAP_ASSERT(isValid); // // if (!isValid) // continue; // // // TODO: this discards the altitude! // const QModelIndex markerIndex = s->specialMarkersModel->index(markerRow, 0); // s->specialMarkersModel->setData(markerIndex, QVariant::fromValue(markerCoordinates), s->specialMarkersCoordinatesRole); // // movedMarkers << QPersistentModelIndex(markerIndex); } else if (eventCode == QLatin1String("do")) { // debug output: kDebug() << QString::fromLatin1("javascript:%1").arg(eventParameter); } } if (!movedClusters.isEmpty()) { kDebug()<<movedClusters; emit(signalClustersMoved(movedClusters, QPair<int, QModelIndex>(-1, QModelIndex()))); } if (!movedMarkers.isEmpty()) { kDebug()<<movedMarkers; // emit(signalSpecialMarkersMoved(movedMarkers)); } if (!clickedClusters.isEmpty()) { kDebug()<<clickedClusters; emit(signalClustersClicked(clickedClusters)); } // now process the buffered events: if (mapTypeChanged) { updateZoomMinMaxCache(); } if (zoomProbablyChanged) { d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();")).toInt(); emit(signalZoomChanged(QString::fromLatin1("googlemaps:%1").arg(d->cacheZoom))); } if (centerProbablyChanged) { // there is nothing we can do if the coordinates are invalid /*const bool isValid = */d->htmlWidget->runScript2Coordinates(QLatin1String("kgeomapGetCenter();"), &(d->cacheCenter)); } // update the actions if necessary: if (zoomProbablyChanged || mapTypeChanged || centerProbablyChanged) { updateActionAvailability(); } if (mapBoundsProbablyChanged) { const QString mapBoundsString = d->htmlWidget->runScript(QLatin1String("kgeomapGetBounds();")).toString(); KGeoMapHelperParseBoundsString(mapBoundsString, &d->cacheBounds); } if (mapBoundsProbablyChanged||!movedClusters.isEmpty()) { s->worldMapWidget->markClustersAsDirty(); s->worldMapWidget->updateClusters(); } }
void BackendOSM::slotHTMLEvents(const QStringList& events) { // for some events, we just note that they appeared and then process them later on: bool centerProbablyChanged = false; bool mapTypeChanged = false; bool zoomProbablyChanged = false; bool mapBoundsProbablyChanged = false; QIntList movedClusters; QList<QPersistentModelIndex> movedMarkers; for (QStringList::const_iterator it = events.constBegin(); it != events.constEnd(); ++it) { const QString eventCode = it->left(2); const QString eventParameter = it->mid(2); const QStringList eventParameters = eventParameter.split(QLatin1Char( '/' )); if (eventCode == "MB") { // NOTE: event currently disabled in javascript part // map bounds changed centerProbablyChanged = true; zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == "ZC") { // NOTE: event currently disabled in javascript part // zoom changed zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == "id") { // idle after drastic map changes centerProbablyChanged = true; zoomProbablyChanged = true; mapBoundsProbablyChanged = true; } else if (eventCode == "cm") { // TODO: buffer this event type! // cluster moved bool okay = false; const int clusterIndex = eventParameter.toInt(&okay); if (!okay) continue; if ((clusterIndex < 0) || (clusterIndex > s->clusterList.size())) continue; // re-read the marker position: GeoCoordinates clusterCoordinates; const bool isValid = d->htmlWidget->runScript2Coordinates( QString::fromLatin1("kgeomapGetClusterPosition(%1);").arg(clusterIndex), &clusterCoordinates); if (!isValid) continue; // TODO: this discards the altitude! s->clusterList[clusterIndex].coordinates = clusterCoordinates; movedClusters << clusterIndex; } else if (eventCode == "mm") { // TODO: buffer this event type! // marker moved bool okay = false; const int markerRow = eventParameter.toInt(&okay); if (!okay) continue; if ((markerRow < 0) || (markerRow > s->specialMarkersModel->rowCount())) continue; // re-read the marker position: GeoCoordinates markerCoordinates; const bool isValid = d->htmlWidget->runScript2Coordinates( QString::fromLatin1("kgeomapGetMarkerPosition(%1);").arg(markerRow), &markerCoordinates ); if (!isValid) continue; // TODO: this discards the altitude! const QModelIndex markerIndex = s->specialMarkersModel->index(markerRow, 0); s->specialMarkersModel->setData(markerIndex, QVariant::fromValue(markerCoordinates), s->specialMarkersCoordinatesRole); movedMarkers << QPersistentModelIndex(markerIndex); } else if (eventCode == "do") { // debug output: qCDebug(LIBKGEOMAP_LOG)<<QString::fromLatin1("javascript:%1").arg(eventParameter); } } if (!movedClusters.isEmpty()) { qCDebug(LIBKGEOMAP_LOG) << movedClusters; emit(signalClustersMoved(movedClusters)); } if (!movedMarkers.isEmpty()) { qCDebug(LIBKGEOMAP_LOG) << movedMarkers; emit(signalSpecialMarkersMoved(movedMarkers)); } // now process the buffered events: if (zoomProbablyChanged) { d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();")).toInt(); emit(signalZoomChanged(QString::fromLatin1("googlemaps:%1").arg(d->cacheZoom))); } if (centerProbablyChanged) { // there is nothing we can do if the coordinates are invalid /*const bool isValid = */d->htmlWidget->runScript2Coordinates("kgeomapGetCenter();", &(d->cacheCenter)); } // update the actions if necessary: if (zoomProbablyChanged || mapTypeChanged || centerProbablyChanged) { updateActionsEnabled(); } if (mapBoundsProbablyChanged) { const QString mapBoundsString = d->htmlWidget->runScript("kgeomapGetBounds();").toString(); KGeoMapHelperParseBoundsString(mapBoundsString, &d->cacheBounds); } if (mapBoundsProbablyChanged || !movedClusters.isEmpty()) { s->worldMapWidget->updateClusters(); } }