From 808984e4222952e1af28380c18a3baed7d71e24f Mon Sep 17 00:00:00 2001 From: Jussi Laitinen Date: Fri, 13 Aug 2010 11:23:45 +0300 Subject: [PATCH] Added routing feature to friend and location list. --- src/engine/engine.cpp | 28 +++++++++++++++++++++++++++ src/engine/engine.h | 16 +++++++++++++++ src/ui/friendlistpanel.cpp | 16 +++++++++++++++ src/ui/friendlistpanel.h | 15 +++++++++++++++ src/ui/friendlistview.cpp | 2 +- src/ui/friendlistview.h | 4 ++-- src/ui/listview.cpp | 45 +++++++++++++++++++++++++++++++------------ src/ui/listview.h | 25 +++++++++++++++++++++++- src/ui/locationlistview.cpp | 2 +- src/ui/locationlistview.h | 4 ++-- src/ui/mainwindow.cpp | 6 ++++++ src/ui/mainwindow.h | 7 +++++++ src/ui/routingpanel.cpp | 19 +++++++++++++++++- src/ui/routingpanel.h | 21 ++++++++++++++++++-- 14 files changed, 188 insertions(+), 22 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 9f930f3..81455ee 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -490,6 +490,27 @@ void SituareEngine::requestAutomaticUpdateIfMoved(GeoCoordinate position) } } +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_routingService->requestRoute(m_gps->lastPosition(), endPointCoordinates); + else + m_routingService->requestRoute(m_mapEngine->centerGeoCoordinate(), endPointCoordinates); +} + void SituareEngine::setAutoCentering(bool enabled) { qDebug() << __PRETTY_FUNCTION__ << enabled; @@ -653,6 +674,7 @@ void SituareEngine::signalsFromMainWindow() connect(m_ui, SIGNAL(findFriend(GeoCoordinate)), m_mapEngine, SLOT(centerToCoordinates(GeoCoordinate))); + // signals from routing tab connect(m_ui, SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&)), @@ -668,6 +690,9 @@ void SituareEngine::signalsFromMainWindow() connect(m_ui, SIGNAL(draggingModeTriggered()), this, SLOT(draggingModeTriggered())); + + connect(m_ui, SIGNAL(routeTo(const GeoCoordinate&)), + this, SLOT(routeTo(const GeoCoordinate&))); } void SituareEngine::signalsFromMapEngine() @@ -707,6 +732,9 @@ 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&))); } diff --git a/src/engine/engine.h b/src/engine/engine.h index f6c4cc3..9431a74 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -45,6 +45,7 @@ class MainWindow; class MapEngine; class MCE; class NetworkAccessManager; +class Route; class RoutingService; class SituareService; class User; @@ -250,6 +251,21 @@ private slots: void requestAutomaticUpdateIfMoved(GeoCoordinate position); /** + * @brief Route is parsed and is ready for further processing. + * + * @param route Route item containing parsed route details + */ + void routeParsed(Route &route); + + /** + * @brief Routes to geo coordinates. + * + * Uses map center coordinates as start point. + * @param endPointCoordinates end point geo coordinates + */ + void routeTo(const GeoCoordinate &endPointCoordinates); + + /** * @brief Slot for setting auto centering state. * * Calls gps to send last known position diff --git a/src/ui/friendlistpanel.cpp b/src/ui/friendlistpanel.cpp index e21647b..33d031f 100644 --- a/src/ui/friendlistpanel.cpp +++ b/src/ui/friendlistpanel.cpp @@ -48,6 +48,8 @@ FriendListPanel::FriendListPanel(QWidget *parent) m_friendListHeaderWidget->setLayout(filterLayout); m_friendListHeaderWidget->setAutoFillBackground(true); + m_routeButton = new QPushButton("Route to friend"); + QPalette labelPalette = m_friendListHeaderWidget->palette(); labelPalette.setColor(QPalette::Background, Qt::black); @@ -66,6 +68,7 @@ FriendListPanel::FriendListPanel(QWidget *parent) listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, 0, PANEL_MARGIN_RIGHT, 0); listViewLayout->addWidget(m_friendListView); + friendListPanelLayout->addWidget(m_routeButton); friendListPanelLayout->addWidget(m_friendListHeaderWidget); friendListPanelLayout->addLayout(listViewLayout); @@ -74,6 +77,9 @@ FriendListPanel::FriendListPanel(QWidget *parent) connect(m_clearFilterButton, SIGNAL(clicked()), this, SLOT(clearFriendListFilter())); + + connect(m_routeButton, SIGNAL(clicked()), + this, SLOT(routeToSelectedFriend())); } void FriendListPanel::friendImageReady(User *user) @@ -122,6 +128,16 @@ void FriendListPanel::clearFriendListFilter() m_friendListView->clearFilter(); } +void FriendListPanel::routeToSelectedFriend() +{ + qDebug() << __PRETTY_FUNCTION__; + + FriendListItem *item = dynamic_cast(m_friendListView->selectedItem()); + + if (item) + emit routeToFriend(item->coordinates()); +} + void FriendListPanel::showFriendsInList(const QList &userIDs) { qDebug() << __PRETTY_FUNCTION__; diff --git a/src/ui/friendlistpanel.h b/src/ui/friendlistpanel.h index 3f49bc2..8a8738b 100644 --- a/src/ui/friendlistpanel.h +++ b/src/ui/friendlistpanel.h @@ -80,6 +80,13 @@ private slots: void clearFriendListFilter(); /** + * @brief Routes to selected friend. + * + * Emits routeToFriend if friend is selected from list. + */ + void routeToSelectedFriend(); + + /** * @brief Slot to show friends in list. * * Shows only friends that are on userIDs list. @@ -98,6 +105,13 @@ signals: */ void findFriend(const GeoCoordinate &coordinates); + /** + * @brief Signal for routing to friend. + * + * @param coordinates friend's geo coordinates + */ + void routeToFriend(const GeoCoordinate &coordinates); + /******************************************************************************* * DATA MEMBERS ******************************************************************************/ @@ -107,6 +121,7 @@ private: QLabel *m_friendListLabel; ///< Friend list label QPushButton *m_clearFilterButton; ///< Button to clear list filtering + QPushButton *m_routeButton; ///< Button to route to friend FriendListView *m_friendListView; ///< Friend list view }; diff --git a/src/ui/friendlistview.cpp b/src/ui/friendlistview.cpp index a0ef305..a72f5af 100644 --- a/src/ui/friendlistview.cpp +++ b/src/ui/friendlistview.cpp @@ -29,7 +29,7 @@ FriendListView::FriendListView(QWidget *parent) qDebug() << __PRETTY_FUNCTION__; } -void FriendListView::listItemClicked(QListWidgetItem *item) +void FriendListView::listItemClicked(ListItem *item) { qDebug() << __PRETTY_FUNCTION__; diff --git a/src/ui/friendlistview.h b/src/ui/friendlistview.h index eade9cc..f42d052 100644 --- a/src/ui/friendlistview.h +++ b/src/ui/friendlistview.h @@ -49,9 +49,9 @@ public slots: /** * @brief Slot for list item clicked. * - * @param item QListWidgetItem + * @param item ListItem */ - void listItemClicked(QListWidgetItem *item); + void listItemClicked(ListItem *item); /****************************************************************************** * SIGNALS diff --git a/src/ui/listview.cpp b/src/ui/listview.cpp index c070361..e2dfbee 100644 --- a/src/ui/listview.cpp +++ b/src/ui/listview.cpp @@ -31,6 +31,7 @@ ListView::ListView(QWidget *parent) { qDebug() << __PRETTY_FUNCTION__; + setSelectionMode(QAbstractItemView::SingleSelection); setAutoFillBackground(false); viewport()->setAutoFillBackground(false); @@ -131,24 +132,30 @@ ListItem *ListView::takeListItemFromView(const QString &itemID) return item; } -void ListView::listItemClicked(QListWidgetItem *item) +void ListView::listItemClicked(ListItem *item) { qDebug() << __PRETTY_FUNCTION__; - ListItem *currentItem = dynamic_cast(item); - - if (currentItem) { - if (m_previousItem == currentItem) { - currentItem->toggleSelection(); + if (m_previousItem == item) { + item->toggleSelection(); - } else { - if (m_previousItem) - m_previousItem->setSelected(false); + } else { + if (m_previousItem) + m_previousItem->setSelected(false); - currentItem->setSelected(true); - } - m_previousItem = currentItem; + item->setSelected(true); } + m_previousItem = item; +} + +void ListView::listItemClicked(QListWidgetItem *item) +{ + qDebug() << __PRETTY_FUNCTION__; + + ListItem *currentItem = dynamic_cast(item); + + if (currentItem) + listItemClicked(currentItem); } ListItem *ListView::listItem(const QString &itemID) @@ -178,6 +185,20 @@ ListItem *ListView::listItemAt(int index) return item; } +ListItem *ListView::selectedItem() +{ + qDebug() << __PRETTY_FUNCTION__; + + return m_previousItem; +} + +void ListView::setSelectedItem(ListItem *item) +{ + qDebug() << __PRETTY_FUNCTION__; + + listItemClicked(item); +} + ListView::~ListView() { qDebug() << __PRETTY_FUNCTION__; diff --git a/src/ui/listview.h b/src/ui/listview.h index 4cbb3d9..650175e 100644 --- a/src/ui/listview.h +++ b/src/ui/listview.h @@ -148,13 +148,36 @@ public: */ ListItem *listItemAt(int index); + /** + * @brief Returns selected ListItem. + * + * @return ListItem if there is selected, 0 otherwise + */ + ListItem *selectedItem(); + + /** + * @brief Sets selected item. + * + * @param item ListItem to select + */ + void setSelectedItem(ListItem *item); + protected slots: /** * @brief Slot for list item clicked. * * Toggles items selection state and emits listItemClicked signal. */ - virtual void listItemClicked(QListWidgetItem *item); + virtual void listItemClicked(ListItem *item); + +private slots: + /** + * @brief Slot for list item clicked. + * + * Toggles items selection state and emits listItemClicked signal. + */ + void listItemClicked(QListWidgetItem *item); + /******************************************************************************* * DATA MEMBERS diff --git a/src/ui/locationlistview.cpp b/src/ui/locationlistview.cpp index 9a3a52b..1e98580 100644 --- a/src/ui/locationlistview.cpp +++ b/src/ui/locationlistview.cpp @@ -29,7 +29,7 @@ LocationListView::LocationListView(QWidget *parent) qDebug() << __PRETTY_FUNCTION__; } -void LocationListView::listItemClicked(QListWidgetItem *item) +void LocationListView::listItemClicked(ListItem *item) { qDebug() << __PRETTY_FUNCTION__; diff --git a/src/ui/locationlistview.h b/src/ui/locationlistview.h index eb8970c..a701ec9 100644 --- a/src/ui/locationlistview.h +++ b/src/ui/locationlistview.h @@ -45,9 +45,9 @@ public slots: /** * @brief Slot for list item clicked. * - * @param item QListWidgetItem + * @param item ListItem */ - void listItemClicked(QListWidgetItem *item); + void listItemClicked(ListItem *item); signals: /** diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 570dc67..8a9a67d 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -176,6 +176,9 @@ void MainWindow::buildFriendListPanel() connect(this, SIGNAL(friendImageReady(User*)), m_friendsListPanel, SLOT(friendImageReady(User*))); + + connect(m_friendsListPanel, SIGNAL(routeToFriend(const GeoCoordinate&)), + this, SIGNAL(routeTo(const GeoCoordinate&))); } void MainWindow::buildIndicatorButtonPanel() @@ -341,6 +344,9 @@ void MainWindow::buildRoutingPanel() SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&)), this, SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&))); + + connect(m_routingPanel, SIGNAL(routeToLocation(const GeoCoordinate&)), + this, SIGNAL(routeTo(const GeoCoordinate&))); } void MainWindow::buildUserInfoPanel() diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 75ee3af..687f047 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -580,6 +580,13 @@ signals: void reverseGeoReady(const QString &address); /** + * @brief Signal for routing to geo coordinates. + * + * @param coordinates destination geo coordinates + */ + void routeTo(const GeoCoordinate &coordinates); + + /** * @brief Signal to save username to settings * * @param username Username diff --git a/src/ui/routingpanel.cpp b/src/ui/routingpanel.cpp index fa7c09c..b3f9926 100644 --- a/src/ui/routingpanel.cpp +++ b/src/ui/routingpanel.cpp @@ -24,6 +24,8 @@ RoutingPanel::RoutingPanel(QWidget *parent) QVBoxLayout *listViewLayout = new QVBoxLayout; listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, 0, PANEL_MARGIN_RIGHT, 0); + m_routeButton = new QPushButton("Route to location"); + m_locationListHeaderWidget = new QWidget(); m_locationListHeaderWidget->setLayout(headerLayout); m_locationListHeaderWidget->setAutoFillBackground(true); @@ -41,6 +43,7 @@ RoutingPanel::RoutingPanel(QWidget *parent) listViewLayout->addWidget(m_locationListView); + routingLayout->addWidget(m_routeButton); routingLayout->addWidget(m_locationListHeaderWidget); routingLayout->addLayout(listViewLayout); @@ -48,6 +51,9 @@ RoutingPanel::RoutingPanel(QWidget *parent) SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&)), this, SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&))); + + connect(m_routeButton, SIGNAL(clicked()), + this, SLOT(routeToSelectedLocation())); } void RoutingPanel::populateLocationListView(const QList &locations) @@ -74,6 +80,17 @@ void RoutingPanel::populateLocationListView(const QList &locations) ListItem *item = m_locationListView->listItemAt(FIRST_LOCATION_ITEM_INDEX); if (item) - m_locationListView->listItemClicked(item); + m_locationListView->setSelectedItem(item); } } + +void RoutingPanel::routeToSelectedLocation() +{ + qDebug() << __PRETTY_FUNCTION__; + + LocationListItem *item = dynamic_cast + (m_locationListView->selectedItem()); + + if (item) + emit routeToLocation(item->coordinates()); +} diff --git a/src/ui/routingpanel.h b/src/ui/routingpanel.h index 1877c6e..0857a23 100644 --- a/src/ui/routingpanel.h +++ b/src/ui/routingpanel.h @@ -57,6 +57,13 @@ private slots: */ void populateLocationListView(const QList &locations); + /** + * @brief Routes to selected location. + * + * Emits routeToLocation if location is selected from list. + */ + void routeToSelectedLocation(); + /******************************************************************************* * SIGNALS ******************************************************************************/ @@ -69,12 +76,22 @@ signals: */ void locationItemClicked(const GeoCoordinate &swBound, const GeoCoordinate &neBound); + /** + * @brief Signal for routing to location. + * + * @param coordinates location's geo coordinates + */ + void routeToLocation(const GeoCoordinate &coordinates); + /******************************************************************************* * DATA MEMBERS ******************************************************************************/ private: - QLabel *m_locationListLabel; ///< Location list label - QWidget *m_locationListHeaderWidget; ///< Location list header widget + QLabel *m_locationListLabel; ///< Location list label + + QPushButton *m_routeButton; ///< Route to location button + + QWidget *m_locationListHeaderWidget; ///< Location list header widget LocationListView *m_locationListView; ///< Location list view }; -- 1.7.9.5