4 #include "headerlistitemdelegate.h"
5 #include "personlistitem.h"
6 #include "friendlistitemdelegate.h"
7 #include "personlistview.h"
8 #include "imagebutton.h"
9 #include "panelcommon.h"
10 #include "../user/user.h"
12 #include "meetpeoplepanel.h"
14 MeetPeoplePanel::MeetPeoplePanel(QWidget *parent)
16 m_headerListItemDelegate(0)
18 qDebug() << __PRETTY_FUNCTION__;
20 QVBoxLayout *meetPeopleLayout = new QVBoxLayout;
21 meetPeopleLayout->setMargin(0);
22 meetPeopleLayout->setSpacing(0);
23 setLayout(meetPeopleLayout);
25 m_personListView = new PersonListView(this);
26 m_personListItemDelegate = new FriendListItemDelegate(this);
28 connect(m_personListView, SIGNAL(listItemSelectionChanged()),
29 this, SLOT(listItemSelectionHandler()));
30 connect(m_personListView, SIGNAL(personItemClicked(GeoCoordinate)),
31 this, SIGNAL(findPerson(GeoCoordinate)));
33 QVBoxLayout *listViewLayout = new QVBoxLayout;
34 listViewLayout->setContentsMargins(PANEL_MARGIN_LEFT, PANEL_MARGIN_TOP,
35 PANEL_MARGIN_RIGHT, PANEL_MARGIN_BOTTOM);
36 listViewLayout->addWidget(m_personListView);
37 meetPeopleLayout->addLayout(listViewLayout);
39 ImageButton *refreshInterestingPeopleButton = new ImageButton(":/res/images/refresh.png",
40 ":/res/images/refresh_s.png",
42 connect(refreshInterestingPeopleButton, SIGNAL(clicked()),
43 this, SIGNAL(requestInterestingPeople()));
45 ImageButton *searchPeopleButton = new ImageButton(":/res/images/search.png",
46 ":/res/images/search_s.png", "", this);
47 connect(searchPeopleButton, SIGNAL(clicked()),
48 this, SIGNAL(requestInterestingPeopleSearch()));
50 m_friendListButton = new ImageButton(":/res/images/friend_list_btn.png",
51 ":/res/images/friend_list_btn_s.png",
52 ":/res/images/friend_list_btn_d.png", this);
53 connect(m_friendListButton, SIGNAL(clicked()),
54 this, SLOT(showFriend()));
56 ImageButton *messageButton = new ImageButton(":/res/images/chat_btn.png",
57 ":/res/images/chat_btn_s.png",
58 ":/res/images/chat_btn_d.png", this);
59 connect(messageButton, SIGNAL(clicked()),
60 this, SLOT(messageButtonPressed()));
62 m_genericButtonsLayout->addWidget(refreshInterestingPeopleButton);
63 m_genericButtonsLayout->addWidget(searchPeopleButton);
64 m_itemButtonsLayout->addWidget(m_friendListButton);
65 m_itemButtonsLayout->addWidget(messageButton);
68 void MeetPeoplePanel::addHeaderItem(const QString &key, const QString &title)
70 m_personListView->setItemDelegateForRow(m_personListView->count(), m_headerListItemDelegate);
71 ExtendedListItem *friendsHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
72 friendsHeaderItem->setTitle(title);
73 m_personListView->addListItem(key, friendsHeaderItem);
76 void MeetPeoplePanel::anyPanelClosed()
78 qDebug() << __PRETTY_FUNCTION__;
80 m_personListView->clearItemSelection();
83 bool MeetPeoplePanel::friendDistanceLessThan(const User &user1, const User &user2)
90 user1.distance(user1Value, user1Unit);
91 user2.distance(user2Value, user2Unit);
93 static int KM_FACTOR = 1000;
95 if (user1Unit == "km")
96 user1Value *= KM_FACTOR;
97 if (user2Unit == "km")
98 user2Value *= KM_FACTOR;
100 return user1Value < user2Value;
103 QList<QList<User> > MeetPeoplePanel::groupFriendsByDistance(const QList<User> &friends)
105 const int AEROPLANE_DISTANCE = 5000;///< Aeroplane distance limit
106 const int CAR_DISTANCE = 500; ///< Car distance limit
107 const int WALK_DISTANCE = 5; ///< Walk distance limit
109 QList<QList<User> > groupedFriends;
110 QList<User> walkingDistanceUsers;
111 QList<User> drivingDistanceUsers;
112 QList<User> flyingDistanceUsers;
113 QList<User> rocketDistanceUsers;
115 foreach (const User user, friends) {
118 user.distance(value, unit);
120 if ((unit == "m") || (value < WALK_DISTANCE))
121 walkingDistanceUsers.append(user);
122 else if (value < CAR_DISTANCE)
123 drivingDistanceUsers.append(user);
124 else if (value < AEROPLANE_DISTANCE)
125 flyingDistanceUsers.append(user);
127 rocketDistanceUsers.append(user);
130 qSort(walkingDistanceUsers.begin(), walkingDistanceUsers.end(), friendDistanceLessThan);
131 qSort(drivingDistanceUsers.begin(), drivingDistanceUsers.end(), friendDistanceLessThan);
132 qSort(flyingDistanceUsers.begin(), flyingDistanceUsers.end(), friendDistanceLessThan);
133 qSort(rocketDistanceUsers.begin(), rocketDistanceUsers.end(), friendDistanceLessThan);
135 groupedFriends.append(walkingDistanceUsers);
136 groupedFriends.append(drivingDistanceUsers);
137 groupedFriends.append(flyingDistanceUsers);
138 groupedFriends.append(rocketDistanceUsers);
140 return groupedFriends;
143 void MeetPeoplePanel::hideEvent(QHideEvent *event)
145 qDebug() << __PRETTY_FUNCTION__;
147 QWidget::hideEvent(event);
149 m_personListView->clearItemSelection();
152 void MeetPeoplePanel::initItemDelegates()
154 qDebug() << __PRETTY_FUNCTION__;
156 m_personListView->setItemDelegate(m_personListItemDelegate);
158 if (m_headerListItemDelegate)
159 delete m_headerListItemDelegate;
160 m_headerListItemDelegate = new HeaderListItemDelegate(this);
163 void MeetPeoplePanel::listItemSelectionHandler()
165 qDebug() << __PRETTY_FUNCTION__;
167 PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
170 if (personItem->isFriend())
171 m_friendListButton->setEnabled(true);
173 m_friendListButton->setDisabled(true);
175 m_friendListButton->setDisabled(true);
178 onListItemSelectionChanged();
181 void MeetPeoplePanel::messageButtonPressed()
183 qDebug() << __PRETTY_FUNCTION__;
185 PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
188 m_personListView->clearItemSelection();
189 emit requestMessageDialog(QPair<QString, QString>(personItem->facebookId(),
190 personItem->title()));
194 void MeetPeoplePanel::setImage(const QString &id, const QPixmap &image)
196 qDebug() << __PRETTY_FUNCTION__;
198 PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->listItem(id));
200 personItem->setAvatarImage(image);
203 void MeetPeoplePanel::showFriend()
205 qDebug() << __PRETTY_FUNCTION__;
207 PersonListItem *personItem = dynamic_cast<PersonListItem*>(m_personListView->selectedItem());
209 m_personListView->clearItemSelection();
210 QList<QString> userIds;
211 userIds.append(personItem->facebookId());
212 emit requestShowFriend(userIds);
216 void MeetPeoplePanel::populateInterestingPeopleListView(QList<User> &friends, QList<User> &others)
218 qDebug() << __PRETTY_FUNCTION__;
220 m_personListView->clearList();
223 if (friends.count() > 0) {
225 headers.append(tr("Walking distance:"));
226 headers.append(tr("Driving distance:"));
227 headers.append(tr("Flying distance:"));
228 headers.append(tr("Rocket distance:"));
230 QList<QList<User> > groupedFriends = groupFriendsByDistance(friends);
232 foreach (QList<User> group, groupedFriends) {
233 QString header = headers.takeFirst();
234 if (group.count() > 0) {
235 addHeaderItem(header, header);
237 foreach (User user, group) {
238 PersonListItem *item = new PersonListItem();
239 item->setPersonData(user, true);
240 m_personListView->addListItem(user.userId(), item);
246 if (others.count() > 0) {
247 addHeaderItem("othersHeader", tr("Unknown distance:"));
249 foreach (User user, others) {
250 PersonListItem *item = new PersonListItem();
251 item->setPersonData(user, false);
252 m_personListView->addListItem(user.userId(), item);
256 m_personListView->scrollToTop();