Friend filtering redone
authorJanne Kiiski <janne.kiiski@ixonos.com>
Wed, 17 Nov 2010 11:00:53 +0000 (13:00 +0200)
committerJanne Kiiski <janne.kiiski@ixonos.com>
Wed, 17 Nov 2010 11:15:38 +0000 (13:15 +0200)
src/engine/engine.cpp
src/qmlui/geomap.cpp
src/qmlui/geomap.h
src/user/friendmodel.cpp
src/user/friendmodel.h

index 85866df..376ef53 100644 (file)
@@ -66,6 +66,7 @@ class SituareEnginePrivate
     SituareEngine* q_ptr;
 
 public:
+    FilteredFriendModel friendProxyModel;
     FriendModel friendModel;
     RouteModel routeModel;
 
@@ -188,11 +189,14 @@ SituareEngine::SituareEngine()
 #ifdef Q_WS_MAEMO_5
 //    d->ui->setAttribute(Qt::WA_Maemo5AutoOrientation, true);
 #endif
+
+    d->friendProxyModel.setSourceModel(&d->friendModel);
+
     Rotation *rotation = new Rotation();
     d->ui->rootContext()->setContextProperty("deviceRotation", static_cast<QObject *>(rotation));
     d->ui->rootContext()->setContextProperty("facebookAuthenticator", m_facebookAuthenticator);
     d->ui->rootContext()->setContextProperty("routingModel", &d->routeModel);
-    d->ui->rootContext()->setContextProperty("friendModel", &d->friendModel);
+    d->ui->rootContext()->setContextProperty("friendModel", &d->friendProxyModel);
     d->ui->rootContext()->setContextProperty("engine", this);
 
     d->ui->setSource(QUrl("qrc:/Main.qml"));
@@ -201,7 +205,7 @@ SituareEngine::SituareEngine()
 
     GeoMap* geoMap = qobject_cast<GeoMap*>(d->ui->rootObject()->findChild<QObject*>("geoMap"));
     Q_ASSERT(geoMap);
-    geoMap->setFriendModel(&d->friendModel);
+    geoMap->setFriendModels(&d->friendModel, &d->friendProxyModel);
 
 
     connect(d->ui->engine()->networkAccessManager(),
index 27b8737..29b12c3 100644 (file)
@@ -12,10 +12,12 @@ class GeoMapPrivate
 public:
     GeoMapPrivate()
         : friendModel(0),
+          friendFilterModel(0),
           gpsLocationMapObject(0)
     {}
 
     FriendModel* friendModel;
+    FilteredFriendModel* friendFilterModel;
 
     QGeoMapPixmapObject* gpsLocationMapObject;
 
@@ -93,11 +95,13 @@ double GeoMap::gpsLocationLongitude() const
     return prevGpsLocation.longitude();
 }
 
-void GeoMap::setFriendModel(FriendModel* friendModel)
+void GeoMap::setFriendModels(FriendModel* friendModel, FilteredFriendModel* friendFilterModel)
 {
     Q_D(GeoMap);
-    if (friendModel) {
+    Q_ASSERT(friendModel && friendFilterModel);
+    if (friendModel && friendFilterModel) {
         d->friendModel = friendModel;
+        d->friendFilterModel = friendFilterModel;
         connect(d->friendModel, SIGNAL(modelReset()), this, SLOT(onFriendModelReset()));
     }
 }
@@ -164,7 +168,7 @@ void GeoMap::onClicked(qreal mouseX, qreal mouseY)
     }
     // TODO: reset filter only if it contains at least one entry
     //if (!filter.isEmpty())
-        d->friendModel->filter(filter);
+        d->friendFilterModel->setFilter(filter);
 }
 
 void GeoMap::positionUpdated(const QGeoPositionInfo& positionInfo)
index 19dc5d2..fa92ccf 100644 (file)
@@ -8,6 +8,7 @@
 
 using namespace QtMobility;
 class FriendModel;
+class FilteredFriendModel;
 
 class GeoMapPrivate;
 
@@ -36,7 +37,7 @@ public:
     double gpsLocationLatitude() const;
     double gpsLocationLongitude() const;
 
-    void setFriendModel(FriendModel* friendModel);
+    void setFriendModels(FriendModel* friendModel, FilteredFriendModel* friendFilterModel);
 
 signals:
     void positionChanged();
index be9edcd..f725501 100644 (file)
@@ -48,25 +48,10 @@ void FriendModel::addFriend(const User &singleFriend)
     endInsertRows();
 }
 
-namespace {
-    QList<User *> filtered(const QList<User *>& all_friends, const QList<User *>& filter)
-    {
-        QList<User *> result = all_friends;
-        if (!filter.isEmpty()) {
-            foreach(User* user, all_friends) {
-                if (!filter.contains(user))
-                    result.removeAll(user);
-            }
-        }
-        return result;
-    }
-}
-
 void FriendModel::setFriends(const QList<User *>& friends)
 {
     beginResetModel();
-    m_all_friends = friends;
-    m_friends = filtered(m_all_friends, m_filter);
+    m_friends = friends;
     endResetModel();
 }
 
@@ -76,22 +61,6 @@ void FriendModel::resetFriends()
     endResetModel();
 }
 
-void FriendModel::filter(const QList<User*>& friends)
-{
-    beginResetModel();
-    m_filter = friends;
-    m_friends = filtered(m_all_friends, m_filter);
-    endResetModel();
-}
-
-void FriendModel::resetFilter()
-{
-    beginResetModel();
-    m_filter.clear();
-    m_friends = m_all_friends;
-    endResetModel();
-}
-
 int FriendModel::rowCount(const QModelIndex & parent) const {
     Q_UNUSED(parent);
     return m_friends.count();
@@ -139,3 +108,28 @@ QVariant FriendModel::data(const QModelIndex & index, int role) const {
             return QVariant();
     }
 }
+
+FilteredFriendModel::FilteredFriendModel(QObject *parent)
+    : QSortFilterProxyModel(parent)
+{}
+
+void FilteredFriendModel::setFilter(const QList<User*>& filter)
+{
+    m_filter = filter;
+    invalidateFilter();
+}
+
+void FilteredFriendModel::resetFilter()
+{
+    setFilter(QList<User*>());
+}
+
+bool FilteredFriendModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
+{
+    Q_UNUSED(source_parent);
+    const QModelIndex index = sourceModel()->index(source_row, 0);
+    User* user = static_cast<User*>(sourceModel()->data(index, FriendModel::UserRole).value<void*>());
+    if (!m_filter.isEmpty())
+        return m_filter.contains(user);
+    return true;
+}
index edd117f..9ec88fb 100644 (file)
@@ -24,6 +24,7 @@
 #define FRIENDMODEL_H
 
 #include <QAbstractListModel>
+#include <QSortFilterProxyModel>
 
 #include "user.h"
 
@@ -51,16 +52,29 @@ public:
     void setFriends(const QList<User *>& friends);
     void resetFriends();
 
-    void filter(const QList<User*>& friends);
-    Q_INVOKABLE void resetFilter();
-
     int rowCount(const QModelIndex & parent = QModelIndex()) const;
     QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
 
 private:
-    QList<User *> m_all_friends;
-    QList<User *> m_filter;
     QList<User *> m_friends;
 };
 
+class FilteredFriendModel : public QSortFilterProxyModel
+{
+    Q_OBJECT
+
+public:
+    explicit FilteredFriendModel(QObject *parent = 0);
+
+    void setFilter(const QList<User*>& filter);
+
+    Q_INVOKABLE void resetFilter();
+
+protected:
+    virtual bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const;
+
+private:
+    QList<User *> m_filter;
+};
+
 #endif // FRIENDMODEL_H