#include <QDebug>
#include <QVBoxLayout>
-#include "friendlistitem.h"
+#include "headerlistitemdelegate.h"
+#include "personlistitem.h"
#include "friendlistitemdelegate.h"
-#include "friendlistview.h"
+#include "personlistview.h"
#include "imagebutton.h"
#include "panelcommon.h"
-#include "user/user.h"
+#include "../user/user.h"
#include "meetpeoplepanel.h"
MeetPeoplePanel::MeetPeoplePanel(QWidget *parent)
- : PanelBase(parent)
+ : PanelBase(parent),
+ m_headerListItemDelegate(0)
{
qDebug() << __PRETTY_FUNCTION__;
meetPeopleLayout->setSpacing(0);
setLayout(meetPeopleLayout);
- m_nearbyFriendListView = new FriendListView(this);
- m_nearbyFriendListView->setItemDelegate(new FriendListItemDelegate(this));
+ m_personListView = new PersonListView(this);
+ m_personListItemDelegate = new FriendListItemDelegate(this);
+ initItemDelegates();
+ connect(m_personListView, SIGNAL(listItemSelectionChanged()),
+ this, SLOT(listItemSelectionHandler()));
+ connect(m_personListView, SIGNAL(personItemClicked(GeoCoordinate)),
+ this, SIGNAL(findPerson(GeoCoordinate)));
QVBoxLayout *listViewLayout = new QVBoxLayout;
listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, PANEL_MARGIN_TOP,
PANEL_MARGIN_RIGHT, PANEL_MARGIN_BOTTOM);
- listViewLayout->addWidget(m_nearbyFriendListView);
+ listViewLayout->addWidget(m_personListView);
meetPeopleLayout->addLayout(listViewLayout);
+
+ ImageButton *refreshInterestingPeopleButton = new ImageButton(":/res/images/refresh.png",
+ ":/res/images/refresh_s.png",
+ "", this);
+ connect(refreshInterestingPeopleButton, SIGNAL(clicked()),
+ this, SIGNAL(requestInterestingPeople()));
+
+ ImageButton *searchPeopleButton = new ImageButton(":/res/images/search.png",
+ ":/res/images/search_s.png", "", this);
+ connect(searchPeopleButton, SIGNAL(clicked()),
+ this, SIGNAL(requestInterestingPeopleSearch()));
+
+ m_friendListButton = new ImageButton(":/res/images/friend_list_btn.png",
+ ":/res/images/friend_list_btn_s.png",
+ ":/res/images/friend_list_btn_d.png", this);
+ connect(m_friendListButton, SIGNAL(clicked()),
+ this, SLOT(showFriend()));
+
+ ImageButton *messageButton = new ImageButton(":/res/images/chat_btn.png",
+ ":/res/images/chat_btn_s.png",
+ ":/res/images/chat_btn_d.png", this);
+ connect(messageButton, SIGNAL(clicked()),
+ this, SLOT(messageButtonPressed()));
+
+ m_genericButtonsLayout->addWidget(refreshInterestingPeopleButton);
+ m_genericButtonsLayout->addWidget(searchPeopleButton);
+ m_itemButtonsLayout->addWidget(m_friendListButton);
+ m_itemButtonsLayout->addWidget(messageButton);
}
-void MeetPeoplePanel::friendImageReady(User *user)
+void MeetPeoplePanel::addHeaderItem(const QString &key, const QString &title)
+{
+ m_personListView->setItemDelegateForRow(m_personListView->count(), m_headerListItemDelegate);
+ ExtendedListItem *friendsHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
+ friendsHeaderItem->setTitle(title);
+ m_personListView->addListItem(key, friendsHeaderItem);
+}
+
+void MeetPeoplePanel::anyPanelClosed()
{
qDebug() << __PRETTY_FUNCTION__;
- FriendListItem *item =
- static_cast<FriendListItem*>(m_nearbyFriendListView->listItem(user->userId()));
+ m_personListView->clearItemSelection();
+}
- if (item)
- item->setAvatarImage(user->profileImage());
+bool MeetPeoplePanel::friendDistanceLessThan(const User &user1, const User &user2)
+{
+ double user1Value;
+ QString user1Unit;
+ double user2Value;
+ QString user2Unit;
+
+ user1.distance(user1Value, user1Unit);
+ user2.distance(user2Value, user2Unit);
+
+ static int KM_FACTOR = 1000;
+
+ if (user1Unit == "km")
+ user1Value *= KM_FACTOR;
+ if (user2Unit == "km")
+ user2Value *= KM_FACTOR;
+
+ return user1Value < user2Value;
}
-void MeetPeoplePanel::populateInterestingPeopleListView(QList<User *> &interestingPeople)
+QList<QList<User> > MeetPeoplePanel::groupFriendsByDistance(const QList<User> &friends)
{
- qWarning() << __PRETTY_FUNCTION__ ;
+ const int AEROPLANE_DISTANCE = 5000;///< Aeroplane distance limit
+ const int CAR_DISTANCE = 500; ///< Car distance limit
+ const int WALK_DISTANCE = 5; ///< Walk distance limit
+
+ QList<QList<User> > groupedFriends;
+ QList<User> walkingDistanceUsers;
+ QList<User> drivingDistanceUsers;
+ QList<User> flyingDistanceUsers;
+ QList<User> rocketDistanceUsers;
- foreach (User *interestingPerson, interestingPeople) {
- FriendListItem *item = new FriendListItem();
- item->setUserData(interestingPerson);
- m_nearbyFriendListView->addListItem(interestingPerson->userId(), item);
+ foreach (const User user, friends) {
+ double value;
+ QString unit;
+ user.distance(value, unit);
+
+ if ((unit == "m") || (value < WALK_DISTANCE))
+ walkingDistanceUsers.append(user);
+ else if (value < CAR_DISTANCE)
+ drivingDistanceUsers.append(user);
+ else if (value < AEROPLANE_DISTANCE)
+ flyingDistanceUsers.append(user);
+ else
+ rocketDistanceUsers.append(user);
}
- m_nearbyFriendListView->scrollToTop();
+ qSort(walkingDistanceUsers.begin(), walkingDistanceUsers.end(), friendDistanceLessThan);
+ qSort(drivingDistanceUsers.begin(), drivingDistanceUsers.end(), friendDistanceLessThan);
+ qSort(flyingDistanceUsers.begin(), flyingDistanceUsers.end(), friendDistanceLessThan);
+ qSort(rocketDistanceUsers.begin(), rocketDistanceUsers.end(), friendDistanceLessThan);
+
+ groupedFriends.append(walkingDistanceUsers);
+ groupedFriends.append(drivingDistanceUsers);
+ groupedFriends.append(flyingDistanceUsers);
+ groupedFriends.append(rocketDistanceUsers);
+
+ return groupedFriends;
+}
+
+void MeetPeoplePanel::hideEvent(QHideEvent *event)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ QWidget::hideEvent(event);
+
+ m_personListView->clearItemSelection();
+}
+
+void MeetPeoplePanel::initItemDelegates()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_personListView->setItemDelegate(m_personListItemDelegate);
+
+ if (m_headerListItemDelegate)
+ delete m_headerListItemDelegate;
+ m_headerListItemDelegate = new HeaderListItemDelegate(this);
}
-void MeetPeoplePanel::setChatButtonDisabled()
+void MeetPeoplePanel::listItemSelectionHandler()
{
qDebug() << __PRETTY_FUNCTION__;
- //
+ PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
+
+ if (personItem) {
+ if (personItem->isFriend())
+ m_friendListButton->setEnabled(true);
+ else
+ m_friendListButton->setDisabled(true);
+ } else {
+ m_friendListButton->setDisabled(true);
+ }
+
+ onListItemSelectionChanged();
+}
+
+void MeetPeoplePanel::messageButtonPressed()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
+
+ if (personItem) {
+ m_personListView->clearItemSelection();
+ emit requestMessageDialog(QPair<QString, QString>(personItem->facebookId(),
+ personItem->title()));
+ }
+}
+
+void MeetPeoplePanel::setImage(const QString &id, const QPixmap &image)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->listItem(id));
+ if (personItem)
+ personItem->setAvatarImage(image);
+}
+
+void MeetPeoplePanel::showFriend()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
+ if (personItem) {
+ m_personListView->clearItemSelection();
+ QList<QString> userIds;
+ userIds.append(personItem->facebookId());
+ emit requestShowFriend(userIds);
+ }
+}
+
+void MeetPeoplePanel::populateInterestingPeopleListView(QList<User> &friends, QList<User> &others)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_personListView->clearList();
+ initItemDelegates();
+
+ if (friends.count() > 0) {
+ QStringList headers;
+ headers.append(tr("Walking distance:"));
+ headers.append(tr("Driving distance:"));
+ headers.append(tr("Flying distance:"));
+ headers.append(tr("Rocket distance:"));
+
+ QList<QList<User> > groupedFriends = groupFriendsByDistance(friends);
+
+ foreach (QList<User> group, groupedFriends) {
+ QString header = headers.takeFirst();
+ if (group.count() > 0) {
+ addHeaderItem(header, header);
+
+ foreach (User user, group) {
+ PersonListItem *item = new PersonListItem();
+ item->setPersonData(user, true);
+ m_personListView->addListItem(user.userId(), item);
+ }
+ }
+ }
+ }
+
+ if (others.count() > 0) {
+ addHeaderItem("othersHeader", tr("Unknown distance:"));
+
+ foreach (User user, others) {
+ PersonListItem *item = new PersonListItem();
+ item->setPersonData(user, false);
+ m_personListView->addListItem(user.userId(), item);
+ }
+ }
+
+ m_personListView->scrollToTop();
}