Header text changed.
[situare] / src / ui / meetpeoplepanel.cpp
index 330126e..3f53b53 100644 (file)
@@ -1,19 +1,19 @@
 #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 "messagelistitem.h"
-#include "messagelistview.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__;
 
@@ -22,88 +22,236 @@ MeetPeoplePanel::MeetPeoplePanel(QWidget *parent)
     meetPeopleLayout->setSpacing(0);
     setLayout(meetPeopleLayout);
 
-    m_messageListView = new MessageListView(this);
-    m_messageListView->setItemDelegate(new ExtendedListItemDelegate(this));
-
-    m_interestingPeopleListView = new FriendListView(this);
-    m_interestingPeopleListView->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_messageListView);
-    listViewLayout->addWidget(m_interestingPeopleListView);
+    listViewLayout->addWidget(m_personListView);
     meetPeopleLayout->addLayout(listViewLayout);
 
-    m_chatButton = new ImageButton(":/res/images/chat_btn.png",
-                                   ":/res/images/chat_btn_s.png",
-                                   ":/res/images/chat_btn_d", this);
-
-    m_contextButtonLayout->addWidget(m_chatButton);
-
-    connect(m_chatButton, SIGNAL(clicked()),
-            this, SLOT(openChatMessageDialog()));
-
-    QList<Message> messages;
-    Message m1;
-    m1.setSenderId("123");
-    m1.setSenderName("Jane Doe");
-    m1.setText("Hello world!");
-    Message m2;
-    m2.setSenderId("123");
-    m2.setSenderName("Jane Doe");
-    m2.setText("Hello world again!");
-    Message m3;
-    m3.setSenderId("456");
-    m3.setSenderName("John Doe");
-    m3.setText("Piss off!");
-
-    messages.append(m1);
-    messages.append(m2);
-    messages.append(m3);
-    populateMessageListView(messages);
+    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::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::friendImageReady(User *user)
+void MeetPeoplePanel::anyPanelClosed()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    FriendListItem *item =
-            static_cast<FriendListItem*>(m_interestingPeopleListView->listItem(user->userId()));
+    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);
 
-    if (item)
-        item->setAvatarImage(user->profileImage());
+    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)
 {
-    qDebug() << __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_interestingPeopleListView->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_interestingPeopleListView->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::populateMessageListView(QList<Message> &messages)
+void MeetPeoplePanel::hideEvent(QHideEvent *event)
 {
-    qDebug() << __PRETTY_FUNCTION__ ;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    foreach (Message message, messages) {
-        MessageListItem *messageItem = new MessageListItem();
-        messageItem->setMessageData(message);
-        m_messageListView->addListItem(messageItem->messageSenderId(), messageItem);
+    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::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);
     }
 
-    m_messageListView->scrollToTop();
+    onListItemSelectionChanged();
 }
 
-void MeetPeoplePanel::setChatButtonDisabled()
+void MeetPeoplePanel::messageButtonPressed()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_chatButton->setDisabled(m_interestingPeopleListView->selectedItems().isEmpty());
+    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();
 }