summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Maudsley <richard.maudsley@isode.com>2014-04-09 07:53:12 (GMT)
committerSwift Review <review@swift.im>2014-04-22 21:12:21 (GMT)
commita7fb55381ab4a5c470bf891b31ac6e201611a2c1 (patch)
tree475b3b7fc0142946863580506b00aa250ef8ca14 /Swift/QtUI/UserSearch/ContactListModel.cpp
parent4444aeb255f8d1712b794c31166f362bb3ec335a (diff)
downloadswift-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.zip
swift-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.tar.bz2
Fix crash in QtUserSearchWindow.
Avoid storing pointers to items in vectors. Using shared_ptr for Contact items. Change-Id: I3baa05fc058011b2beca14dc620ab794988a2b37
Diffstat (limited to 'Swift/QtUI/UserSearch/ContactListModel.cpp')
-rw-r--r--Swift/QtUI/UserSearch/ContactListModel.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/Swift/QtUI/UserSearch/ContactListModel.cpp b/Swift/QtUI/UserSearch/ContactListModel.cpp
index 907142f..ef6383c 100644
--- a/Swift/QtUI/UserSearch/ContactListModel.cpp
+++ b/Swift/QtUI/UserSearch/ContactListModel.cpp
@@ -52,16 +52,20 @@ QDataStream& operator >>(QDataStream& in, StatusShow::Type& e){
ContactListModel::ContactListModel(bool editable) : QAbstractItemModel(), editable_(editable) {
}
-void ContactListModel::setList(const std::vector<Contact>& list) {
+void ContactListModel::setList(const std::vector<Contact::ref>& list) {
emit layoutAboutToBeChanged();
contacts_ = list;
emit layoutChanged();
}
-const std::vector<Contact>& ContactListModel::getList() const {
+const std::vector<Contact::ref>& ContactListModel::getList() const {
return contacts_;
}
+Contact::ref ContactListModel::getContact(const size_t i) const {
+ return contacts_[i];
+}
+
Qt::ItemFlags ContactListModel::flags(const QModelIndex& index) const {
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
if (index.isValid()) {
@@ -78,9 +82,9 @@ int ContactListModel::columnCount(const QModelIndex&) const {
QVariant ContactListModel::data(const QModelIndex& index, int role) const {
if (boost::numeric_cast<size_t>(index.row()) < contacts_.size()) {
- const Contact& contact = contacts_[index.row()];
+ const Contact::ref& contact = contacts_[index.row()];
if (role == Qt::EditRole) {
- return P2QSTRING(contact.jid.toString());
+ return P2QSTRING(contact->jid.toString());
}
return dataForContact(contact, role);
} else {
@@ -93,7 +97,7 @@ QModelIndex ContactListModel::index(int row, int column, const QModelIndex& pare
return QModelIndex();
}
- return boost::numeric_cast<size_t>(row) < contacts_.size() ? createIndex(row, column, (void*)&(contacts_[row])) : QModelIndex();
+ return boost::numeric_cast<size_t>(row) < contacts_.size() ? createIndex(row, column, contacts_[row].get()) : QModelIndex();
}
QModelIndex ContactListModel::parent(const QModelIndex& index) const {
@@ -118,18 +122,18 @@ bool ContactListModel::removeRows(int row, int /*count*/, const QModelIndex& /*p
return false;
}
-QVariant ContactListModel::dataForContact(const Contact& contact, int role) const {
+QVariant ContactListModel::dataForContact(const Contact::ref& contact, int role) const {
switch (role) {
- case Qt::DisplayRole: return P2QSTRING(contact.name);
- case DetailTextRole: return P2QSTRING(contact.jid.toString());
- case AvatarRole: return QVariant(P2QSTRING(pathToString(contact.avatarPath)));
+ case Qt::DisplayRole: return P2QSTRING(contact->name);
+ case DetailTextRole: return P2QSTRING(contact->jid.toString());
+ case AvatarRole: return QVariant(P2QSTRING(pathToString(contact->avatarPath)));
case PresenceIconRole: return getPresenceIconForContact(contact);
default: return QVariant();
}
}
-QIcon ContactListModel::getPresenceIconForContact(const Contact& contact) const {
- return QIcon(statusShowTypeToIconPath(contact.statusType));
+QIcon ContactListModel::getPresenceIconForContact(const Contact::ref& contact) const {
+ return QIcon(statusShowTypeToIconPath(contact->statusType));
}
}