Merge branch 'master' into new_panels_with_context_buttons
authorPekka Nissinen <pekka.nissinen@ixonos.com>
Thu, 19 Aug 2010 11:27:53 +0000 (14:27 +0300)
committerPekka Nissinen <pekka.nissinen@ixonos.com>
Thu, 19 Aug 2010 11:27:53 +0000 (14:27 +0300)
Conflicts:
src/ui/routingpanel.cpp

14 files changed:
src/ui/extendedlistitem.cpp
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/routewaypointlistview.cpp
src/ui/routewaypointlistview.h
src/ui/routingpanel.cpp
src/ui/routingpanel.h

index 4709de3..7e0b859 100644 (file)
@@ -132,6 +132,7 @@ void ExtendedListItem::setSelected(bool selected)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    QListWidgetItem::setSelected(selected);
     m_selected = selected;
     setData(ITEM_EXPANDED_INDEX, m_selected);
 
index dc492fd..fe7acfa 100644 (file)
@@ -63,6 +63,7 @@ FriendListPanel::FriendListPanel(QWidget *parent)
     m_friendListHeaderWidget->setAutoFillBackground(true);
 
     m_routeButton = new QPushButton(tr("Route to friend"));
+    m_routeButton->setDisabled(true);
 
     QPalette labelPalette = m_friendListHeaderWidget->palette();
     labelPalette.setColor(QPalette::Background, Qt::black);
@@ -79,7 +80,8 @@ FriendListPanel::FriendListPanel(QWidget *parent)
     m_friendListView->setItemDelegate(new FriendListItemDelegate(this));
 
     QVBoxLayout *listViewLayout = new QVBoxLayout;
-    listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, 0, PANEL_MARGIN_RIGHT, 0);
+    listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, PANEL_MARGIN_TOP,
+                                       PANEL_MARGIN_RIGHT, PANEL_MARGIN_BOTTOM);
     listViewLayout->addWidget(m_friendListView);
 
     friendListPanelLayout->addWidget(m_routeButton);
@@ -95,6 +97,9 @@ FriendListPanel::FriendListPanel(QWidget *parent)
     connect(m_routeButton, SIGNAL(clicked()),
             this, SLOT(routeToSelectedFriend()));
 
+    connect(m_friendListView, SIGNAL(listItemSelectionChanged()),
+            this, SLOT(setRouteButtonDisabled()));
+
     /// @todo remove old filterLayout when new panel are merged
 
     //////////////////////////////////////////////////////////////////////////
@@ -135,6 +140,9 @@ void FriendListPanel::anyPanelClosed()
     updateKeyboardGrabbing();
 
     clearFiltering();
+
+    m_friendListView->clearItemSelection();
+    setRouteButtonDisabled();
 }
 
 void FriendListPanel::anyPanelOpened()
@@ -219,6 +227,9 @@ void FriendListPanel::hideEvent(QHideEvent *event)
     QWidget::hideEvent(event);
     updateKeyboardGrabbing();
     clearFiltering();
+
+    m_friendListView->clearItemSelection();
+    setRouteButtonDisabled();
 }
 
 void FriendListPanel::routeToSelectedFriend()
@@ -252,6 +263,13 @@ void FriendListPanel::updateKeyboardGrabbing()
     }
 }
 
+void FriendListPanel::setRouteButtonDisabled()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_routeButton->setDisabled(m_friendListView->selectedItems().isEmpty());
+}
+
 void FriendListPanel::showEvent(QShowEvent *event)
 {
     qDebug() << __PRETTY_FUNCTION__;
index 8dcbb1d..e8fbda1 100644 (file)
@@ -168,6 +168,13 @@ private slots:
     void routeToSelectedFriend();
 
     /**
+    * @brief Sets route button disabled.
+    *
+    * Disabled if there isn't any list item selected.
+    */
+    void setRouteButtonDisabled();
+
+    /**
      * @brief Slot to show friends in list.
      *
      * Shows only friends that are on userIDs list
index a72f5af..cebff3b 100644 (file)
@@ -29,14 +29,16 @@ FriendListView::FriendListView(QWidget *parent)
     qDebug() << __PRETTY_FUNCTION__;
 }
 
-void FriendListView::listItemClicked(ListItem *item)
+bool FriendListView::listItemClicked(ListItem *item)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    ListView::listItemClicked(item);
+    bool selected = ListView::listItemClicked(item);
 
     FriendListItem *friendListItem = dynamic_cast<FriendListItem*>(item);
 
-    if (friendListItem)
+    if (friendListItem && selected)
         emit friendItemClicked(friendListItem->coordinates());
+
+    return selected;
 }
index f42d052..efcd072 100644 (file)
@@ -50,8 +50,9 @@ public slots:
     * @brief Slot for list item clicked.
     *
     * @param item ListItem
+    * @return true if item was selected, false otherwise
     */
-    void listItemClicked(ListItem *item);
+    bool listItemClicked(ListItem *item);
 
 /******************************************************************************
 * SIGNALS
index c1b8ca9..c571837 100644 (file)
@@ -27,7 +27,7 @@
 
 ListView::ListView(QWidget *parent)
     : QListWidget(parent),
-      m_previousItem(0)
+      m_currentItem(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -56,6 +56,14 @@ void ListView::addListItemToView(ListItem *item)
     addItem(item);
 }
 
+void ListView::clearItemSelection()
+{
+    clearSelection();
+
+    if (m_currentItem)
+        m_currentItem->setSelected(false);
+}
+
 void ListView::clearList()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -64,7 +72,7 @@ void ListView::clearList()
     m_listItems.clear();
     clear();
 
-    m_previousItem = 0;
+    m_currentItem = 0;
 }
 
 void ListView::clearUnused(const QStringList &itemIDs)
@@ -76,8 +84,8 @@ void ListView::clearUnused(const QStringList &itemIDs)
             ListItem *item = m_listItems.take(key);
             if (item) {
                 takeItem(row(item));
-                if (m_previousItem == item)
-                    m_previousItem = 0;
+                if (m_currentItem == item)
+                    m_currentItem = 0;
                 delete item;
             }
         }
@@ -90,9 +98,6 @@ void ListView::clearFilter()
 
     m_filteredItemIDs.clear();
 
-    if (m_previousItem)
-        m_previousItem->setSelected(false);
-
     foreach (ListItem *item, m_listItems)
         setItemHidden(item, false);
 }
@@ -112,10 +117,12 @@ void ListView::filter(const QList<QString> &itemIDs)
 
     foreach (ListItem *item, m_listItems) {
         if (itemIDs.contains(m_listItems.key(item)))
-            setItemHidden(item, false);
+            item->setHidden(false);
         else
-            setItemHidden(item, true);
+            item->setHidden(true);
     }
+
+    emit listItemSelectionChanged();
 }
 
 void ListView::filter(const QString &pattern)
@@ -124,22 +131,28 @@ void ListView::filter(const QString &pattern)
 
     if (m_filteredItemIDs.isEmpty()) {
         foreach (ListItem *item, m_listItems) {
-            if (item->title().contains(pattern, Qt::CaseInsensitive))
-                setItemHidden(item, false);
-            else
-                setItemHidden(item, true);
+            if (item->title().contains(pattern, Qt::CaseInsensitive)) {
+                item->setHidden(false);
+            } else {
+                item->setSelected(false);
+                item->setHidden(true);
+            }
         }
     } else {
         foreach (QString key, m_filteredItemIDs) {
             ListItem *item = m_listItems.value(key);
             if (item) {
-                if (item->title().contains(pattern, Qt::CaseInsensitive))
-                    setItemHidden(item, false);
-                else
-                    setItemHidden(item, true);
+                if (item->title().contains(pattern, Qt::CaseInsensitive)) {
+                    item->setHidden(false);
+                } else {
+                    item->setSelected(false);
+                    item->setHidden(true);
+                }
             }
         }
     }
+
+    emit listItemSelectionChanged();
 }
 
 ListItem *ListView::takeListItemFromView(const QString &itemID)
@@ -151,20 +164,23 @@ ListItem *ListView::takeListItemFromView(const QString &itemID)
     return item;
 }
 
-void ListView::listItemClicked(ListItem *item)
+bool ListView::listItemClicked(ListItem *clickedItem)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_previousItem == item) {
-        item->toggleSelection();
-
+    if (m_currentItem == clickedItem) {
+        clickedItem->toggleSelection();
     } else {
-        if (m_previousItem)
-            m_previousItem->setSelected(false);
+        if (m_currentItem)
+            m_currentItem->setSelected(false);
 
-        item->setSelected(true);
+        clickedItem->setSelected(true);
     }
-    m_previousItem = item;
+    m_currentItem = clickedItem;
+
+    emit listItemSelectionChanged();
+
+    return clickedItem->isSelected();
 }
 
 void ListView::listItemClicked(QListWidgetItem *item)
@@ -208,7 +224,12 @@ ListItem *ListView::selectedItem()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    return m_previousItem;
+    QList<QListWidgetItem *> selectedListItems = selectedItems();
+
+    if (!selectedListItems.isEmpty())
+        return dynamic_cast<ListItem *>(selectedListItems.first());
+    else
+        return 0;
 }
 
 void ListView::setSelectedItem(ListItem *item)
index 6c7b25a..6da9b6b 100644 (file)
@@ -90,6 +90,11 @@ public:
     void clearFilter();
 
     /**
+    * @brief Deselects all selected items.
+    */
+    void clearItemSelection();
+
+    /**
     * @brief Clears list.
     *
     * Items are removed from view and item list.
@@ -167,17 +172,22 @@ protected slots:
     * @brief Slot for list item clicked.
     *
     * Toggles items selection state and emits listItemClicked signal.
+    * @param clickedItem clicked ListItem
+    * @return true if item was selected, false otherwise
     */
-    virtual void listItemClicked(ListItem *item);
+    virtual bool listItemClicked(ListItem *clickedItem);
 
 private slots:
     /**
     * @brief Slot for list item clicked.
     *
-    * Toggles items selection state and emits listItemClicked signal.
+    * Calls listItemClicked(ListItem *item)
+    * @param item QListWidgetItem
     */
     void listItemClicked(QListWidgetItem *item);
 
+signals:
+    void listItemSelectionChanged();
 
 /*******************************************************************************
  * DATA MEMBERS
@@ -187,7 +197,7 @@ private:
 
     QList<QString> m_filteredItemIDs;       ///< List of filtered item IDs
 
-    ListItem *m_previousItem;               ///< Previously selected item
+    ListItem *m_currentItem;               ///< Previously selected item
 };
 
 #endif // LISTVIEW_H
index 1e98580..50a429a 100644 (file)
@@ -29,18 +29,20 @@ LocationListView::LocationListView(QWidget *parent)
     qDebug() << __PRETTY_FUNCTION__;
 }
 
-void LocationListView::listItemClicked(ListItem *item)
+bool LocationListView::listItemClicked(ListItem *item)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    ListView::listItemClicked(item);
+    bool selected = ListView::listItemClicked(item);
 
     LocationListItem *locationItem = dynamic_cast<LocationListItem*>(item);
 
-    if (locationItem) {
+    if (locationItem && selected) {
         GeoCoordinate swBound;
         GeoCoordinate neBound;
         locationItem->bounds(swBound, neBound);
         emit locationItemClicked(swBound, neBound);
     }
+
+    return selected;
 }
index a701ec9..4bd6770 100644 (file)
@@ -46,8 +46,9 @@ public slots:
     * @brief Slot for list item clicked.
     *
     * @param item ListItem
+    * @return true if item was selected, false otherwise
     */
-    void listItemClicked(ListItem *item);
+    bool listItemClicked(ListItem *item);
 
 signals:
     /**
index dbd1e64..18c5f85 100644 (file)
@@ -79,31 +79,25 @@ MainWindow::MainWindow(QWidget *parent)
 
     buildMap();
 
-    // build main layout
-    QHBoxLayout *layout = new QHBoxLayout;
-    layout->addWidget(m_mapView);
-    layout->setMargin(0);
-    layout->setSpacing(0);
-
-    setCentralWidget(new QWidget());
-    centralWidget()->setLayout(layout);
+    // map view is the only widget which size & location is handled automatically by the system
+    // default functionality
+    setCentralWidget(m_mapView);
 
     buildPanels();
 
     createMenus();
     setWindowTitle(tr("Situare"));
 
-    // set stacking order of widgets
-    m_zoomButtonPanel->stackUnder(m_tabbedPanel);
-    if(m_fullScreenButton) {
-        m_fullScreenButton->stackUnder(m_zoomButtonPanel);
-        m_osmLicense->stackUnder(m_fullScreenButton);
-    } else {
-        m_osmLicense->stackUnder(m_zoomButtonPanel);
+    // set stacking order of widgets (from top to bottom)
+    // if the fullscreen button exists, then it is the topmost one, otherwise the tabbed panel is
+    if (m_fullScreenButton) {
+        m_tabbedPanel->stackUnder(m_fullScreenButton);
     }
-    m_ownLocationCrosshair->stackUnder(m_osmLicense);
-    m_indicatorButtonPanel->stackUnder(m_ownLocationCrosshair);
-    m_mapScale->stackUnder(m_indicatorButtonPanel);
+    m_ownLocationCrosshair->stackUnder(m_tabbedPanel);
+    m_zoomButtonPanel->stackUnder(m_ownLocationCrosshair);
+    m_indicatorButtonPanel->stackUnder(m_zoomButtonPanel);
+    m_osmLicense->stackUnder(m_indicatorButtonPanel);
+    m_mapScale->stackUnder(m_osmLicense);
     m_mapView->stackUnder(m_mapScale);
 
     grabZoomKeys(true);
@@ -342,6 +336,9 @@ void MainWindow::buildPanels()
 
     connect(m_tabbedPanel, SIGNAL(panelOpened()),
             m_friendsListPanel, SLOT(anyPanelOpened()));
+
+    connect(m_tabbedPanel, SIGNAL(panelClosed()),
+            m_routingPanel, SLOT(clearListsSelections()));
 }
 
 void MainWindow::buildRoutingPanel()
index 9bdfa8e..c18577d 100644 (file)
@@ -10,14 +10,16 @@ RouteWaypointListView::RouteWaypointListView(QWidget *parent)
     qDebug() << __PRETTY_FUNCTION__;
 }
 
-void RouteWaypointListView::listItemClicked(ListItem *item)
+bool RouteWaypointListView::listItemClicked(ListItem *item)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    ListView::listItemClicked(item);
+    bool selected = ListView::listItemClicked(item);
 
     RouteWaypointListItem *routeWaypointItem = dynamic_cast<RouteWaypointListItem*>(item);
 
-    if (routeWaypointItem)
+    if (routeWaypointItem && selected)
         emit routeWaypointItemClicked(routeWaypointItem->coordinates());
+
+    return selected;
 }
index 42fbc34..90cfafb 100644 (file)
@@ -50,8 +50,9 @@ public slots:
     * @brief Slot for list item clicked.
     *
     * @param item ListItem
+    * @return true if item was selected, false otherwise
     */
-    void listItemClicked(ListItem *item);
+    bool listItemClicked(ListItem *item);
 
 /******************************************************************************
 * SIGNALS
index 7ad9016..017c10e 100644 (file)
@@ -22,11 +22,12 @@ RoutingPanel::RoutingPanel(QWidget *parent)
     setLayout(routingLayout);
 
     QHBoxLayout *headerLayout = new QHBoxLayout();
-    headerLayout->setContentsMargins(PANEL_MARGIN_LEFT, 0,
-                                     PANEL_MARGIN_RIGHT, 0);
+    headerLayout->setContentsMargins(PANEL_MARGIN_LEFT, PANEL_MARGIN_TOP,
+                                     PANEL_MARGIN_RIGHT, PANEL_MARGIN_BOTTOM);
 
     QVBoxLayout *listViewLayout = new QVBoxLayout;
-    listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, 0, PANEL_MARGIN_RIGHT, 0);
+    listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, PANEL_MARGIN_TOP,
+                                       PANEL_MARGIN_RIGHT, PANEL_MARGIN_BOTTOM);
 
     ImageButton *searchLocationButton = new ImageButton(0, ":/res/images/search.png",
                                                              ":/res/images/search_s.png");
@@ -34,6 +35,7 @@ RoutingPanel::RoutingPanel(QWidget *parent)
     m_contextButtonList.append(searchLocationButton);
 
     m_routeButton = new QPushButton(tr("Route to location"));
+    m_routeButton->setDisabled(true);
     m_routeButton->hide();
 
     m_locationListHeaderWidget = new QWidget();
@@ -68,16 +70,38 @@ RoutingPanel::RoutingPanel(QWidget *parent)
             this,
             SIGNAL(locationItemClicked(const GeoCoordinate&, const GeoCoordinate&)));
 
-    connect(m_routeButton, SIGNAL(clicked()),
-            this, SLOT(routeToSelectedLocation()));
+    connect(m_locationListView, SIGNAL(listItemSelectionChanged()),
+            this, SLOT(setRouteButtonDisabled()));
 
     connect(m_routeWaypointListView, SIGNAL(routeWaypointItemClicked(GeoCoordinate)),
             this, SIGNAL(routeWaypointItemClicked(GeoCoordinate)));
 
+    connect(m_routeButton, SIGNAL(clicked()),
+            this, SLOT(routeToSelectedLocation()));
+
     connect(searchLocationButton, SIGNAL(clicked()),
             this, SIGNAL(requestSearchLocation()));
 }
 
+void RoutingPanel::clearListsSelections()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_locationListView->clearItemSelection();
+    m_routeWaypointListView->clearItemSelection();
+
+    setRouteButtonDisabled();
+}
+
+void RoutingPanel::hideEvent(QHideEvent *event)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QWidget::hideEvent(event);
+
+    clearListsSelections();
+}
+
 void RoutingPanel::populateLocationListView(const QList<Location> &locations)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -148,3 +172,10 @@ void RoutingPanel::setRoute(Route &route)
 
     emit showPanelRequested(this);
 }
+
+void RoutingPanel::setRouteButtonDisabled()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_routeButton->setDisabled(m_locationListView->selectedItems().isEmpty());
+}
index 29b56a9..55fe2a4 100644 (file)
@@ -51,10 +51,30 @@ public:
     RoutingPanel(QWidget *parent = 0);
 
 /*******************************************************************************
+ * BASE CLASS INHERITED AND REIMPLEMENTED MEMBER FUNCTIONS
+ ******************************************************************************/
+protected:
+    /**
+    * @brief Re-implemented from QWidget::hideEvent()
+    *
+    * Calls clearListsSelections()
+    *
+    * @param event
+    */
+    void hideEvent(QHideEvent *event);
+
+/*******************************************************************************
  * MEMBER FUNCTIONS AND SLOTS
  ******************************************************************************/
 private slots:
     /**
+    * @brief Clears lists' selections.
+    *
+    * Does call setRouteButtonDisabled().
+    */
+    void clearListsSelections();
+
+    /**
     * @brief Populates location list view.
     *
     * @param locations list of Location objects
@@ -76,6 +96,13 @@ private slots:
     */
     void setRoute(Route &route);
 
+    /**
+    * @brief Sets route button disabled.
+    *
+    * Disabled if there isn't any list item selected.
+    */
+    void setRouteButtonDisabled();
+
 /*******************************************************************************
  * SIGNALS
  ******************************************************************************/