SituareEngine* q_ptr;
public:
+ FilteredFriendModel friendProxyModel;
FriendModel friendModel;
RouteModel routeModel;
#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"));
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(),
public:
GeoMapPrivate()
: friendModel(0),
+ friendFilterModel(0),
gpsLocationMapObject(0)
{}
FriendModel* friendModel;
+ FilteredFriendModel* friendFilterModel;
QGeoMapPixmapObject* gpsLocationMapObject;
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()));
}
}
}
// 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)
using namespace QtMobility;
class FriendModel;
+class FilteredFriendModel;
class GeoMapPrivate;
double gpsLocationLatitude() const;
double gpsLocationLongitude() const;
- void setFriendModel(FriendModel* friendModel);
+ void setFriendModels(FriendModel* friendModel, FilteredFriendModel* friendFilterModel);
signals:
void positionChanged();
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();
}
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();
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;
+}
#define FRIENDMODEL_H
#include <QAbstractListModel>
+#include <QSortFilterProxyModel>
#include "user.h"
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