{
qDebug() << __PRETTY_FUNCTION__;
+ QListWidgetItem::setSelected(selected);
m_selected = selected;
setData(ITEM_EXPANDED_INDEX, m_selected);
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);
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);
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
//////////////////////////////////////////////////////////////////////////
updateKeyboardGrabbing();
clearFiltering();
+
+ m_friendListView->clearItemSelection();
+ setRouteButtonDisabled();
}
void FriendListPanel::anyPanelOpened()
QWidget::hideEvent(event);
updateKeyboardGrabbing();
clearFiltering();
+
+ m_friendListView->clearItemSelection();
+ setRouteButtonDisabled();
}
void FriendListPanel::routeToSelectedFriend()
}
}
+void FriendListPanel::setRouteButtonDisabled()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_routeButton->setDisabled(m_friendListView->selectedItems().isEmpty());
+}
+
void FriendListPanel::showEvent(QShowEvent *event)
{
qDebug() << __PRETTY_FUNCTION__;
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
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;
}
* @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
ListView::ListView(QWidget *parent)
: QListWidget(parent),
- m_previousItem(0)
+ m_currentItem(0)
{
qDebug() << __PRETTY_FUNCTION__;
addItem(item);
}
+void ListView::clearItemSelection()
+{
+ clearSelection();
+
+ if (m_currentItem)
+ m_currentItem->setSelected(false);
+}
+
void ListView::clearList()
{
qDebug() << __PRETTY_FUNCTION__;
m_listItems.clear();
clear();
- m_previousItem = 0;
+ m_currentItem = 0;
}
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;
}
}
m_filteredItemIDs.clear();
- if (m_previousItem)
- m_previousItem->setSelected(false);
-
foreach (ListItem *item, m_listItems)
setItemHidden(item, false);
}
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)
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)
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)
{
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)
void clearFilter();
/**
+ * @brief Deselects all selected items.
+ */
+ void clearItemSelection();
+
+ /**
* @brief Clears list.
*
* Items are removed from view and item list.
* @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
QList<QString> m_filteredItemIDs; ///< List of filtered item IDs
- ListItem *m_previousItem; ///< Previously selected item
+ ListItem *m_currentItem; ///< Previously selected item
};
#endif // LISTVIEW_H
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;
}
* @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:
/**
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);
connect(m_tabbedPanel, SIGNAL(panelOpened()),
m_friendsListPanel, SLOT(anyPanelOpened()));
+
+ connect(m_tabbedPanel, SIGNAL(panelClosed()),
+ m_routingPanel, SLOT(clearListsSelections()));
}
void MainWindow::buildRoutingPanel()
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;
}
* @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
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");
m_contextButtonList.append(searchLocationButton);
m_routeButton = new QPushButton(tr("Route to location"));
+ m_routeButton->setDisabled(true);
m_routeButton->hide();
m_locationListHeaderWidget = new QWidget();
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__;
emit showPanelRequested(this);
}
+
+void RoutingPanel::setRouteButtonDisabled()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_routeButton->setDisabled(m_locationListView->selectedItems().isEmpty());
+}
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
*/
void setRoute(Route &route);
+ /**
+ * @brief Sets route button disabled.
+ *
+ * Disabled if there isn't any list item selected.
+ */
+ void setRouteButtonDisabled();
+
/*******************************************************************************
* SIGNALS
******************************************************************************/