<file>res/images/gps_pos_accurate.png</file>
<file>res/images/gps_pos_coarse.png</file>
<file>res/images/friend_group.png</file>
+ <file>res/images/sight.png</file>
</qresource>
</RCC>
SituareEngine::SituareEngine(QMainWindow *parent)
: QObject(parent),
m_autoCenteringEnabled(false),
- m_gpsEnabled(false)
+ m_gpsEnabled(false),
+ m_latestLocation()
{
qDebug() << __PRETTY_FUNCTION__;
m_ui = new MainWindow;
enableGPS(gpsEnabled.toBool());
enableAutoCentering(autoCenteringEnabled.toBool());
+ connect(this, SIGNAL(requestOwnLocation()),
+ m_ui, SIGNAL(requestOwnLocation()));
+ connect(m_ui, SIGNAL(ownLocation(QPointF)),
+ this, SLOT(receiveOwnLocation(QPointF)));
+
m_facebookAuthenticator->start();
}
{
qDebug() << __PRETTY_FUNCTION__;
- QPointF coordinates;
-
- if (m_gpsEnabled)
- coordinates = m_gps->lastPosition();
- else
- coordinates = QPointF(0, 0); //Manual position from map
-
- m_situareService->reverseGeo(coordinates);
+ if (m_gpsEnabled) {
+ m_latestLocation = m_gps->lastPosition();
+ m_situareService->reverseGeo(m_latestLocation);
+ }
+ else {
+ emit requestOwnLocation();
+ m_situareService->reverseGeo(m_latestLocation);
+ }
}
void SituareEngine::requestUpdateLocation(const QString &status, bool publish)
m_ui->toggleProgressIndicator(true);
- QPointF coordinates;
-
- if (m_gpsEnabled)
- coordinates = m_gps->lastPosition();
- else
- coordinates = QPointF(0, 0); //Manual position from map
-
- m_situareService->updateLocation(coordinates, status, publish);
+ if (m_gpsEnabled) {
+ m_latestLocation = m_gps->lastPosition();
+ m_situareService->updateLocation(m_latestLocation, status, publish);
+ }
+ else {
+ emit requestOwnLocation();
+ m_situareService->updateLocation(m_latestLocation, status, publish);
+ }
}
void SituareEngine::updateWasSuccessful()
void SituareEngine::enableGPS(bool enabled)
{
qDebug() << __PRETTY_FUNCTION__;
+ emit requestOwnLocation();
m_gpsEnabled = enabled;
m_ui->autoCenteringEnabled(false);
}
}
+
+void SituareEngine::receiveOwnLocation(QPointF ownLocation)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ m_latestLocation = ownLocation;
+}
* MEMBER FUNCTIONS AND SLOTS
******************************************************************************/
public slots:
-
/**
* @brief Slot to intercept error signal from ImageFetcher and SituareService
*
void loginOk();
/**
+ * @brief Slot to receive location of crosshair
+ *
+ * @param ownLocation (Latitude and Longitude)
+ */
+ void receiveOwnLocation(QPointF ownLocation);
+
+ /**
* @brief Calls reverseGeo from SituareService to translate coordinates to street address
*
*/
* SIGNALS
******************************************************************************/
signals:
- /**
- * @brief Signals when new user data is ready
- *
- * @param user Instance of User
- */
- void userLocationReady(User *user);
/**
* @brief Signals when new friends data is ready
*/
void friendsLocationsReady(QList<User *> &friendList);
+ /**
+ * @brief Signal causes mapengine to send updated location of crosshair.
+ *
+ */
+ void requestOwnLocation();
+
+ /**
+ * @brief Signals when new user data is ready
+ *
+ * @param user Instance of User
+ */
+ void userLocationReady(User *user);
+
/*******************************************************************************
* DATA MEMBERS
******************************************************************************/
GPSPositionInterface *m_gps; ///< Instance of the gps position
MainWindow *m_ui; ///< Instance of the MainWindow UI
SituareService *m_situareService; ///< Instance of the situare server communication service
+ QPointF m_latestLocation; ///< Placeholder for user's latest asked location
};
#endif // ENGINE_H
m_autoCenteringEnabled = enabled;
}
+
void MapEngine::gpsEnabled(bool enabled)
{
m_gpsLocationItem->setEnabled(enabled);
}
+
+QPointF MapEngine::convertSceneCoordinateToLatLon(int zoomLevel, QPoint sceneCoordinate)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ double tileFactor = 1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel);
+ double xFactor = (sceneCoordinate.x() / (TILE_SIZE_X*tileFactor));
+ double yFactor = (sceneCoordinate.y() / (TILE_SIZE_Y*tileFactor));
+
+ tileFactor = 1 << zoomLevel;
+ double longitude = xFactor / tileFactor * 360.0 - 180;
+
+ double n = M_PI - 2.0 * M_PI * yFactor / tileFactor;
+ double latitude = 180.0 / M_PI * atan(0.5 * (exp(n) - exp(-n)));
+
+ return QPointF(longitude, latitude);
+}
+
+void MapEngine::ownLocation()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ emit requestToGetViewPortContents();
+ QPointF ownLatitudeLongitudeLocation =
+ convertSceneCoordinateToLatLon(m_zoomLevel, m_viewArea.center());
+ emit ownLocation(ownLatitudeLongitudeLocation);
+}
+
+void MapEngine::receiveViewSceneRect(QRect viewSceneRect)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_viewArea = viewSceneRect;
+}
*/
static QString tilePath(int zoomLevel, int x, int y);
+ /**
+ * @brief converts scene coordinates to latitude and longitude
+ *
+ * @param current zoom level
+ * @param sceneCoordinate that will be converted
+ */
+ QPointF convertSceneCoordinateToLatLon(int zoomLevel, QPoint sceneCoordinate);
+
public slots:
/**
* @brief Slot for setting current view location
void viewResized(const QSize &size);
/**
+ * @brief Returns own location crosshair's latitude and longitude coordinates
+ *
+ */
+ void ownLocation();
+
+ /**
* @brief Slot to catch user own location data
*
* @param user User info
*/
- void receiveOwnLocation(User *user);
+ void receiveOwnLocation(User *user);
+
+ /**
+ * @brief Slot to receive visible area of map scene
+ *
+ * @param visible area of map scene
+ */
+ void receiveViewSceneRect(QRect viewSceneRect);
private:
/**
void minZoomLevelReached();
/**
+ * @brief Signal request mapView to update view port contents
+ */
+ void requestToGetViewPortContents();
+
+ /**
+ * @brief Signal sends location of crosshair
+ *
+ * @param ownLocation location of crosshair (Latitude, Longitude)
+ */
+ void ownLocation(const QPointF ownLocation);
+
+ /**
* @brief Signal for zoom level change
*
* @param newZoomLevel New zoom level
QSize m_viewSize; ///< Current view size
bool m_zoomedIn; ///< Flag for checking if zoomed in when zoom is finished
int m_zoomLevel; ///< Current zoom level
+ QRect m_viewArea; ///< Visible area of map scene
};
#endif // MAPENGINE_H
emit viewResized(event->size());
emit viewResizedNewSize(viewport()->width(), viewport()->height());
}
+
+
+void MapView::updateViewPortContent()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ QPoint topLeft = mapToScene(viewport()->contentsRect().topLeft()).toPoint();
+ QPoint bottomRight = mapToScene(viewport()->contentsRect().bottomRight()).toPoint();
+ //emit viewContentChanged(QRect(topLeft, bottomRight));
+}
+
+QRect MapView::viewportContent()
+{
+ QPoint topLeft = mapToScene(viewport()->contentsRect().topLeft()).toPoint();
+ QPoint bottomRight = mapToScene(viewport()->contentsRect().bottomRight()).toPoint();
+ emit updateViewContent(QRect(topLeft, bottomRight));
+
+ return QRect(topLeft, bottomRight);
+}
+
*/
void setZoomLevel(int zoomLevel);
+ /**
+ * @brief updates view ports content
+ */
+ void updateViewPortContent();
+
+ /**
+ * @brief Slot for catching request to get view port contents.
+ * implementation of this slot sends signal that includes visble area of view port.
+ */
+ QRect viewportContent();
+
private:
/**
* @brief Set new view scale
void viewZoomFinished();
/**
+ * @brief Signal for updating view content
+ *
+ * Signal is emitted when view content needs an update.
+ * @param viewTopLeft Scene coordinate of the viewport top left corner
+ */
+ void viewContentChanged(QPoint viewTopLeft);
+
+ /**
+ * @brief Signal that sends visible area of map scene
+ *
+ * @param viewArea visible area of map scene
+ */
+ void updateViewContent(QRect viewArea);
+
+ /**
* @brief Signal for drawing OSM license
*
* Signal is emitted when view is resized.
setCentralWidget(m_mapViewScreen);
createMenus();
setWindowTitle(tr("Situare"));
- show();
+ show();
m_locationDialog = new UpdateLocationDialog(this);
connect(this, SIGNAL(zoomOutKeyPressed()),
m_mapViewScreen, SIGNAL(zoomOutKeyPressed()));
+ connect(this, SIGNAL(requestOwnLocation()),
+ m_mapViewScreen, SIGNAL(requestOwnLocation()));
+ connect(m_mapViewScreen, SIGNAL(ownLocation(QPointF)),
+ this, SIGNAL(ownLocation(QPointF)));
+
this->toggleProgressIndicator(true);
grabZoomKeys(true);
m_gpsToggleAct->setChecked(true);
connect(m_gpsToggleAct, SIGNAL(toggled(bool)),
this, SLOT(gpsToggled(bool)));
+ connect(m_gpsToggleAct, SIGNAL(toggled(bool)),
+ m_mapViewScreen, SLOT(setOwnLocationCrosshairVisibility(bool)));
m_autoCenteringAct = new QAction(tr("Auto centering"), this);
m_autoCenteringAct->setCheckable(true);
m_autoCenteringAct->setChecked(true);
m_viewMenu = menuBar()->addMenu(tr("Main"));
m_viewMenu->addAction(m_toSettingsAct);
- m_viewMenu->addAction(m_gpsToggleAct);
+ m_viewMenu->addAction(m_gpsToggleAct);
m_viewMenu->addAction(m_autoCenteringAct);
m_viewMenu->setObjectName(tr("Menu"));
}
void friendsLocationsReady(QList<User *> &friendsList);
/**
+ * @brief Signal from MapEngine to SituareEngine is travelling here
+ */
+ void ownLocation(QPointF ownLatitudeLongitudeLocation);
+
+ /**
* @brief Signal for gps position.
*
* @param position longitude and latitude values
void refreshUserData();
/**
+ * @brief Signal from SituareEngine to MapEngine is travelling here
+ */
+ void requestOwnLocation();
+
+ /**
* @brief Signal for requesting reverseGeo from SituareEngine
*
*/
void userLocationReady(User *user);
/**
- * @brief Signal for HW increase button
- */
+ * @brief Signal for HW increase button
+ */
void zoomInKeyPressed();
/**
- * @brief Signal for HW decrease button
- */
+ * @brief Signal for HW decrease button
+ */
void zoomOutKeyPressed();
/*******************************************************************************
PanelSideBar *friendsListPanelSidebar = new PanelSideBar(this, RIGHT);
m_zoomButtonPanel = new ZoomButtonPanel(this, ZOOM_BUTTON_PANEL_POSITION_X,
- ZOOM_BUTTON_PANEL_POSITION_Y);
+ ZOOM_BUTTON_PANEL_POSITION_Y);
+
+ m_ownLocationCrosshair = 0;
connect(mapView, SIGNAL(viewScrolled(QPoint)),
m_mapEngine, SLOT(setLocation(QPoint)));
mapView, SLOT(setZoomLevel(int)));
connect(mapView, SIGNAL(viewResized(QSize)),
m_mapEngine, SLOT(viewResized(QSize)));
+ connect(mapView, SIGNAL(updateViewContent(QRect)),
+ m_mapEngine, SLOT(receiveViewSceneRect(QRect)));
connect(mapView, SIGNAL(viewZoomFinished()),
m_mapEngine, SLOT(viewZoomFinished()));
connect(this, SIGNAL(gpsEnabled(bool)),
m_mapEngine, SLOT(gpsEnabled(bool)));
+ connect(mapView, SIGNAL(viewResizedNewSize(int, int)),
+ this, SLOT(drawOwnLocationCrosshair(int, int)));
+
+ connect(mapView, SIGNAL(viewResizedNewSize(int, int)),
+ this, SLOT(setViewPortSize(int, int)));
+
+ connect(m_mapEngine, SIGNAL(requestToGetViewPortContents()),
+ mapView, SLOT(viewportContent()));
+ connect(mapView, SIGNAL(updateViewContent(QRect)),
+ m_mapEngine, SLOT(receiveViewSceneRect(QRect)));
+ connect(this, SIGNAL(requestOwnLocation()),
+ m_mapEngine, SLOT(ownLocation()));
+ connect(m_mapEngine, SIGNAL(ownLocation(QPointF)),
+ this, SIGNAL(ownLocation(QPointF)));
+
QHBoxLayout *mapViewLayout = new QHBoxLayout;
m_osmLicense = new QLabel(this);
height - m_osmLicense->fontMetrics().height());
}
+
+void MapViewScreen::drawOwnLocationCrosshair(int width, int height)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if (m_drawOwnLocationCrosshair) {
+ m_ownLocationCrosshair->move(width/2 - m_ownLocationCrosshair->pixmap()->width()/2,
+ height/2 - m_ownLocationCrosshair->pixmap()->height()/2);
+ }
+}
+
+void MapViewScreen::setOwnLocationCrosshairVisibility(bool visibility)
+{
+ if (visibility == false) {
+
+ if (m_ownLocationCrosshair == 0) {
+ m_ownLocationCrosshair = new QLabel(this);
+ QPixmap crosshairImage(":/res/images/sight.png");
+ m_ownLocationCrosshair->setPixmap(crosshairImage);
+ m_ownLocationCrosshair->setFixedSize(crosshairImage.size());
+ }
+
+ m_ownLocationCrosshair->show();
+ m_drawOwnLocationCrosshair = true;
+ drawOwnLocationCrosshair(m_viewPortWidth, m_viewPortHeight);
+ }
+
+ else {
+ m_ownLocationCrosshair->hide();
+ m_drawOwnLocationCrosshair = false;
+ }
+}
+
+void MapViewScreen::setViewPortSize(int width, int height)
+{
+ m_viewPortWidth = width;
+ m_viewPortHeight = height;
+}
/*******************************************************************************
* MEMBER FUNCTIONS AND SLOTS
******************************************************************************/
+public slots:
+ /**
+ * @brief Slot for setting own location crosshair visibility
+ *
+ * @param visibility false <-> show, true <-> hide
+ */
+ void setOwnLocationCrosshairVisibility(bool visibility);
+
private slots:
/**
* @brief Slot for drawing the Open Street Map license text
*/
void drawOsmLicense(int width, int height);
+ /**
+ * @brief Slot for drawing the own location crosshair
+ *
+ * @param width Width of the viewport
+ * @param height Height of the viewport
+ */
+ void drawOwnLocationCrosshair(int width, int height);
+
+// /**
+// * @brief Slot for map location change.
+// */
+// void locationChanged();
+
+ /**
+ * @brief Set correnct view port size to datamembers
+ *
+ * @param width Width of the viewport
+ * @param height Height of the viewport
+ */
+ void setViewPortSize(const int width, const int height);
+
/*******************************************************************************
* SIGNALS
******************************************************************************/
void positionReceived(QPointF position, qreal accuracy);
/**
+ * @brief Signal from MapEngine to SituareEngine is travelling here
+ */
+ void ownLocation(QPointF ownLatitudeLongitudeLocation);
+
+ /**
+ * @brief Signal from SituareEngine to MapEngine is travelling here
+ */
+ void requestOwnLocation();
+
+ /**
* @brief Signal when user location is fetched
*
* @param user User data
* DATA MEMBERS
******************************************************************************/
private:
- FriendListPanel *m_friendsListPanel; ///< Instance of friends list panel
- MapEngine *m_mapEngine; ///< MapEngine
- QLabel *m_osmLicense; ///< Label for Open Street Map license
- UserInfoPanel *m_userPanel; ///< Instance of the user information panel
- ZoomButtonPanel *m_zoomButtonPanel; ///< Instance of zoom button panel
+ bool m_drawOwnLocationCrosshair; ///< Flag for making ownLocationCrosshair visible or not
+ FriendListPanel *m_friendsListPanel; ///< Instance of friends list panel
+ MapEngine *m_mapEngine; ///< MapEngine
+ QLabel *m_osmLicense; ///< Label for Open Street Map license
+ QLabel *m_ownLocationCrosshair; ///< Label that show ownLocationCrosshair
+ UserInfoPanel *m_userPanel; ///< Instance of the user information panel
+ int m_viewPortHeight; ///< Height of view port
+ int m_viewPortWidth; ///< Width of view port
+ ZoomButtonPanel *m_zoomButtonPanel; ///< Instance of zoom button panel
};
#endif // MAPVIEWTAB_H