Added routing feature to friend and location list.
authorJussi Laitinen <jupe@l3l7588.ixonos.local>
Fri, 13 Aug 2010 08:23:45 +0000 (11:23 +0300)
committerJussi Laitinen <jupe@l3l7588.ixonos.local>
Fri, 13 Aug 2010 08:23:45 +0000 (11:23 +0300)
14 files changed:
src/engine/engine.cpp
src/engine/engine.h
src/ui/friendlistpanel.cpp
src/ui/friendlistpanel.h
src/ui/friendlistview.cpp
src/ui/friendlistview.h
src/ui/listview.cpp
src/ui/listview.h
src/ui/locationlistview.cpp
src/ui/locationlistview.h
src/ui/mainwindow.cpp
src/ui/mainwindow.h
src/ui/routingpanel.cpp
src/ui/routingpanel.h

index 9f930f3..81455ee 100644 (file)
@@ -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&)));
 }
 
index f6c4cc3..9431a74 100644 (file)
@@ -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
index e21647b..33d031f 100644 (file)
@@ -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<FriendListItem *>(m_friendListView->selectedItem());
+
+    if (item)
+        emit routeToFriend(item->coordinates());
+}
+
 void FriendListPanel::showFriendsInList(const QList<QString> &userIDs)
 {
     qDebug() << __PRETTY_FUNCTION__;
index 3f49bc2..8a8738b 100644 (file)
@@ -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
 };
index a0ef305..a72f5af 100644 (file)
@@ -29,7 +29,7 @@ FriendListView::FriendListView(QWidget *parent)
     qDebug() << __PRETTY_FUNCTION__;
 }
 
-void FriendListView::listItemClicked(QListWidgetItem *item)
+void FriendListView::listItemClicked(ListItem *item)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
index eade9cc..f42d052 100644 (file)
@@ -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
index c070361..e2dfbee 100644 (file)
@@ -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<ListItem*>(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<ListItem*>(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__;
index 4cbb3d9..650175e 100644 (file)
@@ -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
index 9a3a52b..1e98580 100644 (file)
@@ -29,7 +29,7 @@ LocationListView::LocationListView(QWidget *parent)
     qDebug() << __PRETTY_FUNCTION__;
 }
 
-void LocationListView::listItemClicked(QListWidgetItem *item)
+void LocationListView::listItemClicked(ListItem *item)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
index eb8970c..a701ec9 100644 (file)
@@ -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:
     /**
index 570dc67..8a9a67d 100644 (file)
@@ -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()
index 75ee3af..687f047 100644 (file)
@@ -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
index fa7c09c..b3f9926 100644 (file)
@@ -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<Location> &locations)
@@ -74,6 +80,17 @@ void RoutingPanel::populateLocationListView(const QList<Location> &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<LocationListItem *>
+                             (m_locationListView->selectedItem());
+
+    if (item)
+        emit routeToLocation(item->coordinates());
+}
index 1877c6e..0857a23 100644 (file)
@@ -57,6 +57,13 @@ private slots:
     */
     void populateLocationListView(const QList<Location> &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
 };