Header text changed.
[situare] / src / ui / meetpeoplepanel.cpp
index 95e94f6..3f53b53 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "headerlistitemdelegate.h"
 #include "personlistitem.h"
-#include "extendedlistitemdelegate.h"
+#include "friendlistitemdelegate.h"
 #include "personlistview.h"
 #include "imagebutton.h"
 #include "panelcommon.h"
@@ -23,7 +23,7 @@ MeetPeoplePanel::MeetPeoplePanel(QWidget *parent)
     setLayout(meetPeopleLayout);
 
     m_personListView = new PersonListView(this);
-    m_personListItemDelegate = new ExtendedListItemDelegate(this);
+    m_personListItemDelegate = new FriendListItemDelegate(this);
     initItemDelegates();
     connect(m_personListView, SIGNAL(listItemSelectionChanged()),
             this, SLOT(listItemSelectionHandler()));
@@ -65,6 +65,14 @@ MeetPeoplePanel::MeetPeoplePanel(QWidget *parent)
     m_itemButtonsLayout->addWidget(messageButton);
 }
 
+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__;
@@ -72,6 +80,66 @@ void MeetPeoplePanel::anyPanelClosed()
     m_personListView->clearItemSelection();
 }
 
+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;
+}
+
+QList<QList<User> > MeetPeoplePanel::groupFriendsByDistance(const QList<User> &friends)
+{
+    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 (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);
+    }
+
+    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__;
@@ -147,30 +215,36 @@ void MeetPeoplePanel::showFriend()
 
 void MeetPeoplePanel::populateInterestingPeopleListView(QList<User> &friends, QList<User> &others)
 {
-    qDebug() << __PRETTY_FUNCTION__ ;
+    qDebug() << __PRETTY_FUNCTION__;
 
     m_personListView->clearList();
     initItemDelegates();
 
     if (friends.count() > 0) {
-        m_personListView->setItemDelegateForRow(0, m_headerListItemDelegate);
-        ExtendedListItem *friendsHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
-        friendsHeaderItem->setTitle(tr("Friends:"));
-        m_personListView->addListItem(QString("friendsHeader"), friendsHeaderItem);
-
-        foreach (User user, friends) {
-            PersonListItem *item = new PersonListItem();
-            item->setPersonData(user, true);
-            m_personListView->addListItem(user.userId(), item);
+        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) {
-        m_personListView->setItemDelegateForRow(m_personListView->count(),
-                                                m_headerListItemDelegate);
-        ExtendedListItem *othersHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
-        othersHeaderItem->setTitle(tr("Others:"));
-        m_personListView->addListItem(QString("othersHeader"), othersHeaderItem);
+        addHeaderItem("othersHeader", tr("Unknown distance:"));
 
         foreach (User user, others) {
             PersonListItem *item = new PersonListItem();