diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-04-09 07:53:12 (GMT) |
|---|---|---|
| committer | Swift Review <review@swift.im> | 2014-04-22 21:12:21 (GMT) |
| commit | a7fb55381ab4a5c470bf891b31ac6e201611a2c1 (patch) | |
| tree | 475b3b7fc0142946863580506b00aa250ef8ca14 /Swift/QtUI/UserSearch/ContactListModel.cpp | |
| parent | 4444aeb255f8d1712b794c31166f362bb3ec335a (diff) | |
| download | swift-contrib-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.zip swift-contrib-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.cpp | 26 |
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 @@ -46,60 +46,64 @@ QDataStream& operator >>(QDataStream& in, StatusShow::Type& e){ e = StatusShow::None; break; } return in; } 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()) { flags = flags & ~Qt::ItemIsDropEnabled; } else { flags = Qt::ItemIsDropEnabled | flags; } return flags; } int ContactListModel::columnCount(const QModelIndex&) const { return editable_ ? 2 : 1; } 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 { return QVariant(); } } QModelIndex ContactListModel::index(int row, int column, const QModelIndex& parent) const { if (!hasIndex(row, column, parent)) { 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 { if (!index.isValid()) { return QModelIndex(); } return QModelIndex(); } @@ -112,24 +116,24 @@ bool ContactListModel::removeRows(int row, int /*count*/, const QModelIndex& /*p emit layoutAboutToBeChanged(); contacts_.erase(contacts_.begin() + row); emit layoutChanged(); onListChanged(getList()); return true; } 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)); } } |
Swift