X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fengine%2Fengine.cpp;h=6b68d346f9fda4f4cec5f96b088c3893a1ec436f;hb=b1971264e6e95cb5f13ce8f2ca852edd028a8869;hp=6940e5849e65b222ed12189c7674bdc765bf46da;hpb=2769e0b50f414f281bb542085e3f9f446eed6cfb;p=situare diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 6940e58..6b68d34 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -22,16 +22,24 @@ USA. */ +#include + #include #include +#include "application.h" #include "common.h" +#include "contactmanager.h" +#include "../error.h" #include "facebookservice/facebookauthentication.h" #include "gps/gpsposition.h" #include "map/mapengine.h" +#include "routing/geocodingservice.h" +#include "routing/routingservice.h" +#include "mce.h" +#include "network/networkaccessmanager.h" #include "situareservice/situareservice.h" #include "ui/mainwindow.h" -#include #include "engine.h" @@ -42,17 +50,26 @@ const qreal USER_MOVEMENT_MINIMUM_LONGITUDE_DIFFERENCE = 0.003;///< Min value fo const qreal USER_MOVEMENT_MINIMUM_LATITUDE_DIFFERENCE = 0.001;///< Min value for user move longitude const int MIN_UPDATE_INTERVAL_MSECS = 5*60*1000; -SituareEngine::SituareEngine(QMainWindow *parent) - : QObject(parent), - m_autoCenteringEnabled(false), +SituareEngine::SituareEngine() + : m_autoCenteringEnabled(false), m_automaticUpdateFirstStart(true), + m_automaticUpdateRequest(false), m_userMoved(false), m_automaticUpdateIntervalTimer(0), - m_lastUpdatedGPSPosition(QPointF()) -{ + m_lastUpdatedGPSPosition(GeoCoordinate()) +{ qDebug() << __PRETTY_FUNCTION__; + m_ui = new MainWindow; - m_ui->updateItemVisibility(); + m_ui->updateItemVisibility(false); + + Application *application = static_cast(qApp); + application->registerWindow(m_ui->winId()); + + connect(application, SIGNAL(topmostWindowChanged(bool)), + this, SLOT(topmostWindowChanged(bool))); + + m_networkAccessManager = new NetworkAccessManager(this); // build MapEngine m_mapEngine = new MapEngine(this); @@ -65,11 +82,19 @@ SituareEngine::SituareEngine(QMainWindow *parent) m_situareService = new SituareService(this); // build FacebookAuthenticator - m_facebookAuthenticator = new FacebookAuthentication(this); + m_facebookAuthenticator = new FacebookAuthentication(m_ui, this); + + // build routing service + m_routingService = new RoutingService(this); // create this when needed, not in constructor! + + // build geocoding service + m_geocodingService = new GeocodingService(this); // connect signals signalsFromMapEngine(); + signalsFromGeocodingService(); signalsFromGPS(); + signalsFromRoutingService(); signalsFromSituareService(); signalsFromMainWindow(); signalsFromFacebookAuthenticator(); @@ -86,19 +111,31 @@ SituareEngine::SituareEngine(QMainWindow *parent) connect(this, SIGNAL(friendsLocationsReady(QList&)), m_mapEngine, SIGNAL(friendsLocationsReady(QList&))); + connect(this, SIGNAL(friendImageReady(User*)), + m_ui, SIGNAL(friendImageReady(User*))); + + connect(this, SIGNAL(friendImageReady(User*)), + m_mapEngine, SIGNAL(friendImageReady(User*))); + m_automaticUpdateIntervalTimer = new QTimer(this); connect(m_automaticUpdateIntervalTimer, SIGNAL(timeout()), - this, SLOT(automaticUpdateIntervalTimerTimeout())); + this, SLOT(startAutomaticUpdate())); // signals connected, now it's time to show the main window // but init the MapEngine before so starting location is set m_mapEngine->init(); m_ui->show(); - m_facebookAuthenticator->start(); - m_gps->setMode(GPSPosition::Default); initializeGpsAndAutocentering(); + + m_mce = new MCE(this); + connect(m_mce, SIGNAL(displayOff(bool)), this, SLOT(setPowerSaving(bool))); + + m_contactManager = new ContactManager(this); + m_contactManager->requestContactGuids(); + + m_facebookAuthenticator->login(); } SituareEngine::~SituareEngine() @@ -107,27 +144,17 @@ SituareEngine::~SituareEngine() delete m_ui; - QSettings settings(DIRECTORY_NAME, FILE_NAME); + QSettings settings(SETTINGS_ORGANIZATION_NAME, SETTINGS_APPLICATION_NAME); settings.setValue(SETTINGS_GPS_ENABLED, m_gps->isRunning()); settings.setValue(SETTINGS_AUTO_CENTERING_ENABLED, m_autoCenteringEnabled); } -void SituareEngine::automaticUpdateIntervalTimerTimeout() -{ - qDebug() << __PRETTY_FUNCTION__; - - if (m_gps->isRunning() && m_userMoved) { - requestUpdateLocation(); - m_userMoved = false; - } -} - void SituareEngine::changeAutoCenteringSetting(bool enabled) { - qDebug() << __PRETTY_FUNCTION__; + qDebug() << __PRETTY_FUNCTION__ << enabled; m_autoCenteringEnabled = enabled; - enableAutoCentering(enabled); + setAutoCentering(enabled); } void SituareEngine::disableAutoCentering() @@ -135,50 +162,14 @@ void SituareEngine::disableAutoCentering() qDebug() << __PRETTY_FUNCTION__; changeAutoCenteringSetting(false); - m_ui->buildInformationBox(tr("Auto centering disabled")); } -void SituareEngine::enableAutoCentering(bool enabled) +void SituareEngine::draggingModeTriggered() { qDebug() << __PRETTY_FUNCTION__; - m_ui->setAutoCenteringButtonEnabled(enabled); - m_mapEngine->setAutoCentering(enabled); - - if (enabled) - m_gps->requestLastPosition(); -} - -void SituareEngine::enableGPS(bool enabled) -{ - qDebug() << __PRETTY_FUNCTION__; - - m_ui->setOwnLocationCrosshairVisibility(!enabled); - - if (m_gps->isInitialized()) { - m_ui->setGPSButtonEnabled(enabled); - m_mapEngine->setGPSEnabled(enabled); - - if (enabled && !m_gps->isRunning()) { - m_gps->start(); - enableAutoCentering(m_autoCenteringEnabled); - m_gps->requestLastPosition(); - - if(m_ui->loginState()) - m_ui->readAutomaticLocationUpdateSettings(); - } - else if (!enabled && m_gps->isRunning()) { - m_gps->stop(); - enableAutoCentering(false); - enableAutomaticLocationUpdate(false); - } - } - else { - if (enabled) - m_ui->buildInformationBox(tr("Unable to start GPS")); - m_ui->setGPSButtonEnabled(false); - m_mapEngine->setGPSEnabled(false); - } + if (m_mce) + m_mce->vibrationFeedback(); } void SituareEngine::enableAutomaticLocationUpdate(bool enabled, int updateIntervalMsecs) @@ -199,49 +190,79 @@ void SituareEngine::enableAutomaticLocationUpdate(bool enabled, int updateInterv else m_automaticUpdateIntervalTimer->setInterval(updateIntervalMsecs); + connect(m_gps, SIGNAL(position(GeoCoordinate, qreal)), + this, SLOT(requestAutomaticUpdateIfMoved(GeoCoordinate))); + m_automaticUpdateIntervalTimer->start(); } else { + disconnect(m_gps, SIGNAL(position(GeoCoordinate, qreal)), + this, SLOT(requestAutomaticUpdateIfMoved(GeoCoordinate))); + m_automaticUpdateIntervalTimer->stop(); } } } -void SituareEngine::error(const int error) +void SituareEngine::error(const int context, const int error) { - qDebug() << __PRETTY_FUNCTION__; + qDebug() << __PRETTY_FUNCTION__; switch(error) { - case QNetworkReply::ConnectionRefusedError: - m_ui->buildInformationBox(tr("Connection refused by the server"), true); + case SituareError::ERROR_GENERAL: + if(context == ErrorContext::SITUARE) { + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("Unknown server error"), true); + } + break; + case 1: //errors: SituareError::ERROR_MISSING_ARGUMENT and QNetworkReply::ConnectionRefusedError + m_ui->toggleProgressIndicator(false); + if(context == ErrorContext::SITUARE) { + m_ui->buildInformationBox(tr("Missing parameter from request"), true); + } else if(context == ErrorContext::NETWORK) { + m_ui->buildInformationBox(tr("Connection refused by the server"), true); + } break; case QNetworkReply::RemoteHostClosedError: - m_ui->buildInformationBox(tr("Connection closed by the server"), true); + if(context == ErrorContext::NETWORK) { + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("Connection closed by the server"), true); + } break; case QNetworkReply::HostNotFoundError: - m_ui->buildInformationBox(tr("Remote server not found"), true); + if(context == ErrorContext::NETWORK) { + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("Remote server not found"), true); + } break; case QNetworkReply::TimeoutError: - m_ui->buildInformationBox(tr("Connection timed out"), true); + if(context == ErrorContext::NETWORK) { + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("Connection timed out"), true); + } + break; + case QNetworkReply::UnknownNetworkError: + if(context == ErrorContext::NETWORK) { + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("No network connection"), true); + } break; case SituareError::SESSION_EXPIRED: m_ui->buildInformationBox(tr("Session expired. Please login again"), true); - m_facebookAuthenticator->clearAccountInformation(true); // keep username = true - m_situareService->clearUserData(); - m_ui->loggedIn(false); - m_ui->loginFailed(); - break; - case SituareError::LOGIN_FAILED: - m_ui->buildInformationBox(tr("Invalid E-mail address or password"), true); + m_facebookAuthenticator->logOut(); + m_facebookAuthenticator->login(); break; case SituareError::UPDATE_FAILED: + m_ui->toggleProgressIndicator(false); m_ui->buildInformationBox(tr("Update failed, please try again"), true); break; case SituareError::DATA_RETRIEVAL_FAILED: + m_ui->toggleProgressIndicator(false); m_ui->buildInformationBox(tr("Data retrieval failed, please try again"), true); break; case SituareError::ADDRESS_RETRIEVAL_FAILED: + m_ui->toggleProgressIndicator(false); m_ui->buildInformationBox(tr("Address retrieval failed"), true); break; case SituareError::IMAGE_DOWNLOAD_FAILED: @@ -251,35 +272,46 @@ void SituareEngine::error(const int error) m_ui->buildInformationBox(tr("Map image download failed"), true); break; case SituareError::GPS_INITIALIZATION_FAILED: - enableGPS(false); + setGPS(false); m_ui->buildInformationBox(tr("GPS initialization failed"), true); break; - case SituareError::UNKNOWN_REPLY: - m_ui->buildInformationBox(tr("Unknown server response"), true); - break; case SituareError::INVALID_JSON: m_ui->buildInformationBox(tr("Malformatted reply from server"), true); m_ui->loggedIn(false); m_facebookAuthenticator->clearAccountInformation(false); // clean all break; + case SituareError::ERROR_ROUTING_FAILED: + m_ui->toggleProgressIndicator(false); + m_ui->buildInformationBox(tr("Routing failed"), true); + break; + case SituareError::ERROR_LOCATION_SEARCH_FAILED: + m_ui->buildInformationBox(tr("No results found"), true); + break; default: - qCritical() << "QNetworkReply::NetworkError :" << error; + m_ui->toggleProgressIndicator(false); + if(context == ErrorContext::NETWORK) + qCritical() << __PRETTY_FUNCTION__ << "QNetworkReply::NetworkError: " << error; + else + qCritical() << __PRETTY_FUNCTION__ << "Unknown error: " << error; break; } } -void SituareEngine::fetchUsernameFromSettings() +void SituareEngine::imageReady(User *user) { qDebug() << __PRETTY_FUNCTION__; - m_ui->setUsername(m_facebookAuthenticator->loadUsername()); + if(user->type()) + emit userLocationReady(user); + else + emit friendImageReady(user); } void SituareEngine::initializeGpsAndAutocentering() { qDebug() << __PRETTY_FUNCTION__; - QSettings settings(DIRECTORY_NAME, FILE_NAME); + QSettings settings(SETTINGS_ORGANIZATION_NAME, SETTINGS_APPLICATION_NAME); QVariant gpsEnabled = settings.value(SETTINGS_GPS_ENABLED); QVariant autoCenteringEnabled = settings.value(SETTINGS_AUTO_CENTERING_ENABLED); @@ -287,210 +319,291 @@ void SituareEngine::initializeGpsAndAutocentering() if (gpsEnabled.toString().isEmpty()) { // First start. Situare.conf file does not exists - connect(m_gps, SIGNAL(position(QPointF,qreal)), - this, SLOT(setFirstStartZoomLevel(QPointF,qreal))); + connect(m_gps, SIGNAL(position(GeoCoordinate, qreal)), + this, SLOT(setFirstStartZoomLevel())); changeAutoCenteringSetting(true); - enableGPS(true); + setGPS(true); m_ui->buildInformationBox(tr("GPS enabled")); - m_ui->buildInformationBox(tr("Auto centering enabled")); } else { // Normal start changeAutoCenteringSetting(autoCenteringEnabled.toBool()); - enableGPS(gpsEnabled.toBool()); + setGPS(gpsEnabled.toBool()); if (gpsEnabled.toBool()) m_ui->buildInformationBox(tr("GPS enabled")); - - if (gpsEnabled.toBool() && autoCenteringEnabled.toBool()) - m_ui->buildInformationBox(tr("Auto centering enabled")); } } else { - enableGPS(false); + setGPS(false); } } -bool SituareEngine::isUserMoved() +void SituareEngine::locationSearch(QString location) { qDebug() << __PRETTY_FUNCTION__; - return m_userMoved; + if(!location.isEmpty()) + m_geocodingService->requestLocation(location); } void SituareEngine::loginActionPressed() { qDebug() << __PRETTY_FUNCTION__; - if(m_ui->loginState()) { - logout(); - m_situareService->clearUserData(); - } - else { - m_facebookAuthenticator->start(); - } + if (m_facebookAuthenticator->isLoggedIn()) + m_facebookAuthenticator->logOut(true); + else if (m_networkAccessManager->isConnected()) + m_facebookAuthenticator->login(); + else + error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError); } -void SituareEngine::loginOk() +void SituareEngine::onLogin() { qDebug() << __PRETTY_FUNCTION__; m_ui->loggedIn(true); - m_ui->show(); - m_situareService->fetchLocations(); // request user locations + m_situareService->fetchLocations(); if (m_gps->isRunning()) m_ui->readAutomaticLocationUpdateSettings(); } -void SituareEngine::loginProcessCancelled() +void SituareEngine::onLogout() { qDebug() << __PRETTY_FUNCTION__; - m_ui->toggleProgressIndicator(false); - m_ui->updateItemVisibility(); + m_ui->loggedIn(false); + m_situareService->updateSession(""); // empty session string means logged out + m_automaticUpdateFirstStart = true; } -void SituareEngine::logout() +void SituareEngine::refreshUserData() { qDebug() << __PRETTY_FUNCTION__; - m_ui->loggedIn(false); + if (m_networkAccessManager->isConnected()) { + m_ui->toggleProgressIndicator(true); + m_situareService->fetchLocations(); + } + else { + error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError); + } +} - // signal to clear locationUpdateDialog's data - connect(this, SIGNAL(clearUpdateLocationDialogData()), - m_ui, SIGNAL(clearUpdateLocationDialogData())); - emit clearUpdateLocationDialogData(); +void SituareEngine::requestAddress() +{ + qDebug() << __PRETTY_FUNCTION__; - m_facebookAuthenticator->clearAccountInformation(); // clear all - m_automaticUpdateFirstStart = true; + if (m_networkAccessManager->isConnected()) { + if (m_gps->isRunning()) + m_situareService->reverseGeo(m_gps->lastPosition()); + else + m_situareService->reverseGeo(m_mapEngine->centerGeoCoordinate()); + } + else { + error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError); + } } -void SituareEngine::refreshUserData() +void SituareEngine::requestUpdateLocation(const QString &status, bool publish) { qDebug() << __PRETTY_FUNCTION__; - m_ui->toggleProgressIndicator(true); + if (m_networkAccessManager->isConnected()) { + m_ui->toggleProgressIndicator(true); - m_situareService->fetchLocations(); + if (m_gps->isRunning()) + m_situareService->updateLocation(m_gps->lastPosition(), status, publish); + else + m_situareService->updateLocation(m_mapEngine->centerGeoCoordinate(), status, publish); + } + else { + error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError); + } } -void SituareEngine::requestAddress() +void SituareEngine::requestAutomaticUpdateIfMoved(GeoCoordinate position) { qDebug() << __PRETTY_FUNCTION__; - if (m_gps->isRunning()) - m_situareService->reverseGeo(m_gps->lastPosition()); - else - m_situareService->reverseGeo(m_mapEngine->centerGeoCoordinate()); + if ((fabs(m_lastUpdatedGPSPosition.longitude() - position.longitude()) > + USER_MOVEMENT_MINIMUM_LONGITUDE_DIFFERENCE) || + (fabs(m_lastUpdatedGPSPosition.latitude() - position.latitude()) > + USER_MOVEMENT_MINIMUM_LATITUDE_DIFFERENCE)) { + + m_lastUpdatedGPSPosition = position; + m_userMoved = true; + } + + if (m_automaticUpdateRequest && m_userMoved) { + requestUpdateLocation(tr("Automatic location update")); + m_automaticUpdateRequest = false; + m_userMoved = false; + } } -void SituareEngine::requestUpdateLocation(const QString &status, bool publish) +void SituareEngine::routeParsed(Route &route) +{ + qDebug() << __PRETTY_FUNCTION__; + + Q_UNUSED(route); + + m_ui->toggleProgressIndicator(false); +} + +void SituareEngine::routeTo(const GeoCoordinate &endPointCoordinates) { qDebug() << __PRETTY_FUNCTION__; m_ui->toggleProgressIndicator(true); if (m_gps->isRunning()) - m_situareService->updateLocation(m_gps->lastPosition(), status, publish); + m_routingService->requestRoute(m_gps->lastPosition(), endPointCoordinates); else - m_situareService->updateLocation(m_mapEngine->centerGeoCoordinate(), status, publish); + m_routingService->requestRoute(m_mapEngine->centerGeoCoordinate(), endPointCoordinates); } -void SituareEngine::saveGPSPosition(QPointF position) +void SituareEngine::routeToCursor() { qDebug() << __PRETTY_FUNCTION__; - if ((fabs(m_lastUpdatedGPSPosition.x() - position.x()) > - USER_MOVEMENT_MINIMUM_LONGITUDE_DIFFERENCE) || - (fabs(m_lastUpdatedGPSPosition.y() - position.y()) > - USER_MOVEMENT_MINIMUM_LATITUDE_DIFFERENCE)) { + routeTo(m_mapEngine->centerGeoCoordinate()); +} - m_lastUpdatedGPSPosition = position; - m_userMoved = true; +void SituareEngine::setAutoCentering(bool enabled) +{ + qDebug() << __PRETTY_FUNCTION__ << enabled; + + m_ui->setIndicatorButtonEnabled(enabled); + m_mapEngine->setAutoCentering(enabled); + m_ui->setCrosshairVisibility(!enabled); + + if (enabled) { + setGPS(true); + m_gps->requestLastPosition(); } } -void SituareEngine::setFirstStartZoomLevel(QPointF latLonCoordinate, qreal accuracy) +void SituareEngine::setFirstStartZoomLevel() { qDebug() << __PRETTY_FUNCTION__; - Q_UNUSED(latLonCoordinate); - Q_UNUSED(accuracy); - - if (m_autoCenteringEnabled) // autocentering is disabled when map is scrolled + if (m_autoCenteringEnabled) // autocentering is disabled when map is scrolled m_mapEngine->setZoomLevel(DEFAULT_ZOOM_LEVEL_WHEN_GPS_IS_AVAILABLE); - disconnect(m_gps, SIGNAL(position(QPointF,qreal)), - this, SLOT(setFirstStartZoomLevel(QPointF,qreal))); + disconnect(m_gps, SIGNAL(position(GeoCoordinate, qreal)), + this, SLOT(setFirstStartZoomLevel())); +} + +void SituareEngine::setGPS(bool enabled) +{ + qDebug() << __PRETTY_FUNCTION__ << enabled; + + if (m_gps->isInitialized()) { + m_ui->setGPSButtonEnabled(enabled); + m_mapEngine->setGPSEnabled(enabled); + + if (enabled && !m_gps->isRunning()) { + m_gps->start(); + m_gps->requestLastPosition(); + + if(m_facebookAuthenticator->isLoggedIn()) + m_ui->readAutomaticLocationUpdateSettings(); + } + else if (!enabled && m_gps->isRunning()) { + m_gps->stop(); + changeAutoCenteringSetting(false); + enableAutomaticLocationUpdate(false); + } + } + else { + if (enabled) + m_ui->buildInformationBox(tr("Unable to start GPS")); + m_ui->setGPSButtonEnabled(false); + m_mapEngine->setGPSEnabled(false); + } +} + +void SituareEngine::setPowerSaving(bool enabled) +{ + qDebug() << __PRETTY_FUNCTION__ << enabled; + + m_gps->enablePowerSave(enabled); + + if(m_autoCenteringEnabled) + m_mapEngine->setAutoCentering(!enabled); +} + +void SituareEngine::showContactDialog(const QString &facebookId) +{ + qDebug() << __PRETTY_FUNCTION__; + + QString guid = m_contactManager->contactGuid(facebookId); + + if (!guid.isEmpty()) + m_ui->showContactDialog(guid); + else + m_ui->buildInformationBox(tr("Unable to find contact.\nAdd Facebook IM " + "account from Conversations to use this feature."), true); } void SituareEngine::signalsFromFacebookAuthenticator() { qDebug() << __PRETTY_FUNCTION__; - connect(m_facebookAuthenticator, SIGNAL(error(int)), - this, SLOT(error(int))); + connect(m_facebookAuthenticator, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); - connect(m_facebookAuthenticator, SIGNAL(credentialsReady(FacebookCredentials)), - m_situareService, SLOT(credentialsReady(FacebookCredentials))); + connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString, bool)), + m_situareService, SLOT(updateSession(QString))); - connect(m_facebookAuthenticator, SIGNAL(credentialsReady(FacebookCredentials)), - this, SLOT(loginOk())); + connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString, bool)), + this, SLOT(onLogin())); - connect(m_facebookAuthenticator, SIGNAL(newLoginRequest()), - m_ui, SLOT(startLoginProcess())); + connect(m_facebookAuthenticator, SIGNAL(loggedOut()), this, SLOT(onLogout())); +} - connect(m_facebookAuthenticator, SIGNAL(loginFailure()), - m_ui, SLOT(loginFailed())); +void SituareEngine::signalsFromGeocodingService() +{ + qDebug() << __PRETTY_FUNCTION__; - connect(m_facebookAuthenticator, SIGNAL(saveCookiesRequest()), - m_ui, SLOT(saveCookies())); + connect(m_geocodingService, SIGNAL(locationDataParsed(const QList&)), + m_ui, SIGNAL(locationDataParsed(const QList&))); - connect(m_facebookAuthenticator, SIGNAL(loginUsingCookies()), - m_ui, SLOT(loginUsingCookies())); + connect(m_geocodingService, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); } void SituareEngine::signalsFromGPS() { qDebug() << __PRETTY_FUNCTION__; - connect(m_gps, SIGNAL(position(QPointF,qreal)), - m_mapEngine, SLOT(gpsPositionUpdate(QPointF,qreal))); + connect(m_gps, SIGNAL(position(GeoCoordinate, qreal)), + m_mapEngine, SLOT(gpsPositionUpdate(GeoCoordinate, qreal))); connect(m_gps, SIGNAL(timeout()), m_ui, SLOT(gpsTimeout())); - connect(m_gps, SIGNAL(error(int)), - this, SLOT(error(int))); - - connect(m_gps, SIGNAL(position(QPointF,qreal)), - this, SLOT(saveGPSPosition(QPointF))); + connect(m_gps, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); } void SituareEngine::signalsFromMainWindow() { - qDebug() << __PRETTY_FUNCTION__; - - connect(m_ui, SIGNAL(error(int)), - this, SLOT(error(int))); + qDebug() << __PRETTY_FUNCTION__; - connect(m_ui, SIGNAL(fetchUsernameFromSettings()), - this, SLOT(fetchUsernameFromSettings())); + connect(m_ui, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); connect(m_ui, SIGNAL(loginActionPressed()), this, SLOT(loginActionPressed())); - connect(m_ui, SIGNAL(saveUsername(QString)), - m_facebookAuthenticator, SLOT(saveUsername(QString))); - - connect(m_ui, SIGNAL(updateCredentials(QUrl)), - m_facebookAuthenticator, SLOT(updateCredentials(QUrl))); - // signals from map view - connect(m_ui, SIGNAL(mapViewScrolled(QPoint)), - m_mapEngine, SLOT(setLocation(QPoint))); + connect(m_ui, SIGNAL(mapViewScrolled(SceneCoordinate)), + m_mapEngine, SLOT(setCenterPosition(SceneCoordinate))); connect(m_ui, SIGNAL(mapViewResized(QSize)), m_mapEngine, SLOT(viewResized(QSize))); @@ -506,46 +619,70 @@ void SituareEngine::signalsFromMainWindow() m_mapEngine, SLOT(zoomOut())); // signals from menu buttons - connect(m_ui, SIGNAL(autoCenteringTriggered(bool)), - this, SLOT(changeAutoCenteringSetting(bool))); - connect(m_ui, SIGNAL(gpsTriggered(bool)), - this, SLOT(enableGPS(bool))); - - //signals from dialogs - connect(m_ui, SIGNAL(cancelLoginProcess()), - this, SLOT(loginProcessCancelled())); + this, SLOT(setGPS(bool))); connect(m_ui, SIGNAL(requestReverseGeo()), this, SLOT(requestAddress())); - connect(m_ui, SIGNAL(statusUpdate(QString,bool)), + connect(m_ui, SIGNAL(locationUpdate(QString,bool)), this, SLOT(requestUpdateLocation(QString,bool))); connect(m_ui, SIGNAL(enableAutomaticLocationUpdate(bool, int)), - this, SLOT(enableAutomaticLocationUpdate(bool, int))); + this, SLOT(enableAutomaticLocationUpdate(bool, int))); // signals from user info tab connect(m_ui, SIGNAL(refreshUserData()), this, SLOT(refreshUserData())); - connect(m_ui, SIGNAL(findUser(QPointF)), - m_mapEngine, SLOT(setViewLocation(QPointF))); + connect(m_ui, SIGNAL(centerToCoordinates(GeoCoordinate)), + m_mapEngine, SLOT(centerToCoordinates(GeoCoordinate))); + + // routing signal from friend list tab & search location tab + connect(m_ui, SIGNAL(routeTo(const GeoCoordinate&)), + this, SLOT(routeTo(const GeoCoordinate&))); + + // signals from location search panel + connect(m_ui, + SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&)), + m_mapEngine, + SLOT(showMapArea(const GeoCoordinate&, const GeoCoordinate&))); + + connect(m_ui, SIGNAL(searchHistoryItemClicked(QString)), + this, SLOT(locationSearch(QString))); + + // signals from routing tab + connect(m_ui, SIGNAL(clearRoute()), + m_mapEngine, SLOT(clearRoute())); + + connect(m_ui, SIGNAL(routeToCursor()), + this, SLOT(routeToCursor())); - // signals from friend list tab - connect(m_ui, SIGNAL(findFriend(QPointF)), - m_mapEngine, SLOT(setViewLocation(QPointF))); + // signals from distance indicator button + connect(m_ui, SIGNAL(autoCenteringTriggered(bool)), + this, SLOT(changeAutoCenteringSetting(bool))); + + connect(m_ui, SIGNAL(draggingModeTriggered()), + this, SLOT(draggingModeTriggered())); + + // signal from search location dialog + connect(m_ui, SIGNAL(searchForLocation(QString)), + this, SLOT(locationSearch(QString))); + + // signal from friend list panel + connect(m_ui, SIGNAL(requestContactDialog(const QString &)), + this, SLOT(showContactDialog(const QString &))); } void SituareEngine::signalsFromMapEngine() { qDebug() << __PRETTY_FUNCTION__; - connect(m_mapEngine, SIGNAL(error(int)), - this, SLOT(error(int))); + connect(m_mapEngine, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); - connect(m_mapEngine, SIGNAL(locationChanged(QPoint)), - m_ui, SIGNAL(centerToSceneCoordinates(QPoint))); + connect(m_mapEngine, SIGNAL(locationChanged(SceneCoordinate)), + m_ui, SIGNAL(centerToSceneCoordinates(SceneCoordinate))); connect(m_mapEngine, SIGNAL(zoomLevelChanged(int)), m_ui, SIGNAL(zoomLevelChanged(int))); @@ -564,17 +701,37 @@ void SituareEngine::signalsFromMapEngine() connect(m_mapEngine, SIGNAL(newMapResolution(qreal)), m_ui, SIGNAL(newMapResolution(qreal))); + + connect(m_mapEngine, SIGNAL(directionIndicatorValuesUpdate(qreal, qreal, bool)), + m_ui, SIGNAL(directionIndicatorValuesUpdate(qreal, qreal, bool))); +} + +void SituareEngine::signalsFromRoutingService() +{ + qDebug() << __PRETTY_FUNCTION__; + + connect(m_routingService, SIGNAL(routeParsed(Route&)), + this, SLOT(routeParsed(Route&))); + + connect(m_routingService, SIGNAL(routeParsed(Route&)), + m_mapEngine, SLOT(setRoute(Route&))); + + connect(m_routingService, SIGNAL(routeParsed(Route&)), + m_ui, SIGNAL(routeParsed(Route&))); + + connect(m_routingService, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); } void SituareEngine::signalsFromSituareService() { qDebug() << __PRETTY_FUNCTION__; - connect(m_situareService, SIGNAL(error(int)), - this, SLOT(error(int))); + connect(m_situareService, SIGNAL(error(int, int)), + this, SLOT(error(int, int))); - connect(m_situareService, SIGNAL(error(int)), - m_ui, SIGNAL(messageSendingFailed(int))); + connect(m_situareService, SIGNAL(imageReady(User*)), + this, SLOT(imageReady(User*))); connect(m_situareService, SIGNAL(reverseGeoReady(QString)), m_ui, SIGNAL(reverseGeoReady(QString))); @@ -586,14 +743,32 @@ void SituareEngine::signalsFromSituareService() this, SLOT(updateWasSuccessful())); connect(m_situareService, SIGNAL(updateWasSuccessful()), - m_ui, SIGNAL(clearUpdateLocationDialogData())); + m_ui, SIGNAL(updateWasSuccessful())); +} + +void SituareEngine::startAutomaticUpdate() +{ + qDebug() << __PRETTY_FUNCTION__; + + m_gps->requestUpdate(); + m_automaticUpdateRequest = true; +} + +void SituareEngine::topmostWindowChanged(bool isMainWindow) +{ + qDebug() << __PRETTY_FUNCTION__; + + setPowerSaving(!isMainWindow); } void SituareEngine::updateWasSuccessful() { qDebug() << __PRETTY_FUNCTION__; - m_situareService->fetchLocations(); + if (m_networkAccessManager->isConnected()) + m_situareService->fetchLocations(); + else + error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError); } void SituareEngine::userDataChanged(User *user, QList &friendsList)