Friend list code reviewed.
authorJussi Laitinen <jupe@l3l7588.ixonos.local>
Mon, 24 May 2010 08:45:58 +0000 (11:45 +0300)
committerJussi Laitinen <jupe@l3l7588.ixonos.local>
Mon, 24 May 2010 08:45:58 +0000 (11:45 +0300)
Reviewed by: Henri Lampela

src/ui/friendlistitem.cpp
src/ui/friendlistitem.h
src/ui/friendlistpanel.cpp
src/ui/friendlistview.cpp
src/ui/friendlistview.h
tests/ui/friendlist/testfriendlist.cpp
tests/ui/friendlist/testfriendlist.pro

index 0755f19..4475583 100644 (file)
@@ -34,7 +34,7 @@
 #include "friendlistitem.h"
 #include "../user/user.h"
 #include "imagebutton.h"
-#include "common.h"
+#include "../common.h"
 
 const int BACKGROUND_TOP_HEIGHT = 20;
 const int BACKGROUND_BOTTOM_HEIGHT = 15;
@@ -175,17 +175,17 @@ void FriendListItem::setData(User *user)
     double value;
     user->distance(value, unit);
     m_distanceTextLabel->setText(QString::number(value) + " " + unit);
-    setDistanceIcon(value);
+    setDistanceIcon(value, unit);
 
     shortenTexts();
     setText(false);
 }
 
-void FriendListItem::setDistanceIcon(double value)
+void FriendListItem::setDistanceIcon(double value, const QString &unit)
 {
     QPixmap distanceImage;
 
-    if (value < WALK_DISTANCE)
+    if ((unit == "m") || (value < WALK_DISTANCE))
         distanceImage.load(":/res/images/walk_icon_gray.png");
     else if (value < CAR_DISTANCE)
         distanceImage.load(":/res/images/car_icon_gray.png");
index 31f000a..cc8496c 100644 (file)
@@ -94,8 +94,9 @@ private:
     * Icon is selected by distance.
     *
     * @param value distance value
+    * @param unit distance unit
     */
-    void setDistanceIcon(double value);
+    void setDistanceIcon(double value, const QString &unit);
 
     /**
     * @brief Set shortened or full-length text to labels.
index fbfe6fb..1cd3989 100644 (file)
@@ -51,17 +51,27 @@ void FriendListPanel::friendInfoReceived(QList<User *> &friendList)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_clearFilterButton->hide();
-    m_friendListView->clear();
+    QStringList newUserIDs;
 
     foreach (User *user, friendList) {
-        FriendListItem *item = new FriendListItem(m_friendListView);
-        item->setData(user);
-        m_friendListView->addWidget(user->userId(), item);
-
-        connect(item, SIGNAL(findFriend(QPointF)),
-            this, SIGNAL(findFriend(QPointF)));
+        FriendListItem *item = 0;
+        if (!m_friendListView->contains(user->userId())) {
+            item = new FriendListItem(m_friendListView);
+            item->setData(user);
+            m_friendListView->addWidget(user->userId(), item);
+
+            connect(item, SIGNAL(findFriend(QPointF)),
+                this, SIGNAL(findFriend(QPointF)));
+        }
+        else {
+            item = m_friendListView->widget(user->userId());
+            item->setData(user);
+        }
+
+        newUserIDs.append(user->userId());
     }
+
+    m_friendListView->clearUnused(newUserIDs);
 }
 
 void FriendListPanel::clearFriendListFilter()
index fe7dd86..3df3f22 100644 (file)
@@ -24,6 +24,8 @@
 #include <QLabel>
 
 #include "friendlistview.h"
+#include "friendlistitem.h"
+#include "../user/user.h"
 
 FriendListView::FriendListView(QWidget *parent)
     : QWidget(parent)
@@ -43,32 +45,36 @@ void FriendListView::addWidget(const QString &key, QWidget *widget)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (!widgets.contains(key)) {
+    if (!m_widgets.contains(key)) {
         m_friendListLayout->addWidget(widget);
-        widgets.insert(key, widget);
+        m_widgets.insert(key, widget);
     }
 }
 
-void FriendListView::clear()
+void FriendListView::clearUnused(const QStringList &userIDs)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    foreach (QWidget *widget, widgets) {
-        m_friendListLayout->removeWidget(widget);
-        disconnect(widget, 0, 0, 0);
-        delete widget;
-    }
+    foreach (QString key, m_widgets.keys()) {
+        if (!userIDs.contains(key)) {
+            QWidget *widget = m_widgets.value(key);
 
-    widgets.clear();
+            if (widget) {
+                m_friendListLayout->removeWidget(widget);
+                disconnect(widget, 0, 0, 0);
+                delete widget;
+            }
+        }
+    }
 }
 
 void FriendListView::filter(const QList<QString> &userIDs)
 {
-    foreach (QWidget *widget, widgets)
+    foreach (QWidget *widget, m_widgets)
         widget->hide();
 
     foreach (QString userID, userIDs) {
-        QWidget *widget = widgets.value(userID);
+        QWidget *widget = m_widgets.value(userID);
         if (widget)
             widget->show();
     }
@@ -76,6 +82,16 @@ void FriendListView::filter(const QList<QString> &userIDs)
 
 void FriendListView::clearFilter()
 {
-    foreach (QWidget *widget, widgets)
+    foreach (QWidget *widget, m_widgets)
         widget->show();
 }
+
+bool FriendListView::contains(const QString &userID)
+{
+    return m_widgets.contains(userID);
+}
+
+FriendListItem *FriendListView::widget(const QString &userID)
+{
+    return static_cast<FriendListItem*>(m_widgets.value(userID));
+}
index eaa588a..048cb73 100644 (file)
@@ -27,6 +27,8 @@
 
 class QVBoxLayout;
 class QLabel;
+class User;
+class FriendListItem;
 
 /**
 * @brief FriendListView shows items in list.
@@ -57,11 +59,13 @@ public:
     void addWidget(const QString &key, QWidget *widget);
 
     /**
-    * @brief Clear view.
+    * @brief Clear unused widgets from view.
     *
-    * Clears all items from the view and widget list.
+    * Clears items which are not in user ID's list from the view and widget list.
+    *
+    * @param userIDs list of new user ID's.
     */
-    void clear();
+    void clearUnused(const QStringList &userIDs);
 
     /**
     * @brief Clears filtering from list.
@@ -71,6 +75,14 @@ public:
     void clearFilter();
 
     /**
+    * @brief Checks if view contains widget with userID.
+    *
+    * @param userID user's ID
+    * @return true if view contains widget, false otherwise
+    */
+    bool contains(const QString &userID);
+
+    /**
     * @brief Sets filter to list.
     *
     * Hide all widgets that are not in the userIDs list.
@@ -79,12 +91,20 @@ public:
     */
     void filter(const QList<QString> &userIDs);
 
+    /**
+    * @brief Returns FriendListItem with userID.
+    *
+    * @param userID user's ID
+    * @return FriendListItem
+    */
+    FriendListItem *widget(const QString &userID);
+
 /******************************************************************************
 * DATA MEMBERS
 ******************************************************************************/
 private:
     QVBoxLayout *m_friendListLayout;    ///< Layout for this view
-    QHash<QString, QWidget *> widgets;  ///< List of widgets in this view. Key = user ID
+    QHash<QString, QWidget *> m_widgets;  ///< List of widgets in this view. Key = user ID
 };
 
 #endif // FRIENDLISTVIEW_H
index 780ed0f..351dbb2 100644 (file)
@@ -39,9 +39,9 @@ private slots:
 
 
     /**
-    * @brief Clear widgets from the view.
+    * @brief Clear unused widgets from the view.
     */
-    void friendListViewClear();
+    void friendListViewClearUnused();
 };
 
 void TestFriendList::friendListViewAddWidget()
@@ -50,60 +50,62 @@ void TestFriendList::friendListViewAddWidget()
 
     User *user1 = new User(QString("Address"), QPointF(12.22, 23.33), QString("Name"),
                            QString("Note"), QUrl("http://image.url"), QString("Timestamp"), true,
-                           QString("UserID"), QString("Units"), 44.12);
+                           QString("UserID1"), QString("Units"), 44.12);
     User *user2 = new User(QString("Address"), QPointF(12.22, 23.33), QString("Name"),
                            QString("Note"), QUrl("http://image.url"), QString("Timestamp"), true,
-                           QString("UserID"), QString("Units"), 44.12);
+                           QString("UserID2"), QString("Units"), 44.12);
 
     FriendListItem *item1 = new FriendListItem(view);
     item1->setData(user1);
     FriendListItem *item2 = new FriendListItem(view);
     item2->setData(user2);
 
-    view->addWidget(item1);
-    view->addWidget(item2);
+    view->addWidget(user1->userId(), item1);
+    view->addWidget(user2->userId(), item2);
 
     QCOMPARE(view->layout()->count(), 2);
 
     User *user3 = new User(QString("Address"), QPointF(12.22, 23.33), QString("Name"),
                            QString("Note"), QUrl("http://image.url"), QString("Timestamp"), true,
-                           QString("UserID"), QString("Units"), 44.12);
+                           QString("UserID3"), QString("Units"), 44.12);
 
     FriendListItem *item3 = new FriendListItem(view);
     item3->setData(user3);
-    view->addWidget(item3);
+    view->addWidget(user3->userId(), item3);
 
     QCOMPARE(view->layout()->count(), 3);
 
-    view->addWidget(item3);
+    view->addWidget(user3->userId(), item3);
 
     QCOMPARE(view->layout()->count(), 3);
 }
 
-void TestFriendList::friendListViewClear()
+void TestFriendList::friendListViewClearUnused()
 {
     FriendListView *view = new FriendListView();
 
     User *user1 = new User(QString("Address"), QPointF(12.22, 23.33), QString("Name"),
                            QString("Note"), QUrl("http://image.url"), QString("Timestamp"), true,
-                           QString("UserID"), QString("Units"), 44.12);
+                           QString("UserID1"), QString("Units"), 44.12);
     User *user2 = new User(QString("Address"), QPointF(12.22, 23.33), QString("Name"),
                            QString("Note"), QUrl("http://image.url"), QString("Timestamp"), true,
-                           QString("UserID"), QString("Units"), 44.12);
+                           QString("UserID2"), QString("Units"), 44.12);
 
     FriendListItem *item1 = new FriendListItem(view);
     item1->setData(user1);
     FriendListItem *item2 = new FriendListItem(view);
     item2->setData(user2);
 
-    view->addWidget(item1);
-    view->addWidget(item2);
+    view->addWidget(user1->userId(), item1);
+    view->addWidget(user2->userId(), item2);
 
     QCOMPARE(view->layout()->count(), 2);
 
-    view->clear();
+    QStringList newUserIDs;
+    newUserIDs.append(user2->userId());
+    view->clearUnused(newUserIDs);
 
-    QCOMPARE(view->layout()->count(), 0);
+    QCOMPARE(view->layout()->count(), 1);
 }
 
 
index 959e157..05e76b4 100644 (file)
@@ -2,9 +2,11 @@ CONFIG += qtestlib
 HEADERS += ../../../src/ui/friendlistview.h \
     ../../../src/ui/friendlistitem.h \
     ../../../src/user/user.h \
-    ../../../src/ui/avatarimage.h
+    ../../../src/ui/avatarimage.h \
+    ../../../src/ui/imagebutton.h
 SOURCES += ../../../src/ui/friendlistview.cpp \
     ../../../src/ui/friendlistitem.cpp \
     ../../../src/user/user.cpp \
     ../../../src/ui/avatarimage.cpp \
+    ../../../src/ui/imagebutton.cpp \
     testfriendlist.cpp