diff options
-rw-r--r-- | Swift/Controllers/RosterController.cpp | 1 | ||||
-rw-r--r-- | Swift/Controllers/UIInterfaces/MainWindow.h | 1 | ||||
-rw-r--r-- | Swift/QtUI/Roster/RosterModel.cpp | 17 |
3 files changed, 14 insertions, 5 deletions
diff --git a/Swift/Controllers/RosterController.cpp b/Swift/Controllers/RosterController.cpp index ed311d9..038a883 100644 --- a/Swift/Controllers/RosterController.cpp +++ b/Swift/Controllers/RosterController.cpp @@ -72,6 +72,7 @@ RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, Avata RosterController::~RosterController() { delete offlineFilter_; delete expandiness_; + mainWindow_->setRosterModel(NULL); if (mainWindow_->canDelete()) { delete mainWindow_; } diff --git a/Swift/Controllers/UIInterfaces/MainWindow.h b/Swift/Controllers/UIInterfaces/MainWindow.h index 3f37fc8..0d33466 100644 --- a/Swift/Controllers/UIInterfaces/MainWindow.h +++ b/Swift/Controllers/UIInterfaces/MainWindow.h @@ -29,6 +29,7 @@ namespace Swift { virtual void setMyAvatarPath(const String& path) = 0; virtual void setMyStatusText(const String& status) = 0; virtual void setMyStatusType(StatusShow::Type type) = 0; + /** Must be able to cope with NULL to clear the roster */ virtual void setRosterModel(Roster* roster) = 0; virtual void setConnecting() = 0; diff --git a/Swift/QtUI/Roster/RosterModel.cpp b/Swift/QtUI/Roster/RosterModel.cpp index c2d4147..a6f40bb 100644 --- a/Swift/QtUI/Roster/RosterModel.cpp +++ b/Swift/QtUI/Roster/RosterModel.cpp @@ -30,15 +30,19 @@ RosterModel::~RosterModel() { void RosterModel::setRoster(Roster* roster) { roster_ = roster; - if (!roster_) return; - roster->onChildrenChanged.connect(boost::bind(&RosterModel::handleChildrenChanged, this, _1)); - roster->onDataChanged.connect(boost::bind(&RosterModel::handleDataChanged, this, _1)); + if (roster_) { + roster->onChildrenChanged.connect(boost::bind(&RosterModel::handleChildrenChanged, this, _1)); + roster->onDataChanged.connect(boost::bind(&RosterModel::handleDataChanged, this, _1)); + } reLayout(); } void RosterModel::reLayout() { //emit layoutChanged(); reset(); + if (!roster_) { + return; + } foreach (RosterItem* item, roster_->getRoot()->getDisplayedChildren()) { GroupRosterItem* child = dynamic_cast<GroupRosterItem*>(item); if (!child) continue; @@ -161,6 +165,9 @@ QIcon RosterModel::getPresenceIcon(RosterItem* item) const { QModelIndex RosterModel::index(int row, int column, const QModelIndex& parent) const { + if (!roster_) { + return QModelIndex(); + } GroupRosterItem* parentItem; if (!parent.isValid()) { //top level @@ -177,7 +184,7 @@ QModelIndex RosterModel::index(RosterItem* item) const { /* Recursive check that it's ok to create such an item Assuming there are more contacts in a group than groups in a group, this could save a decent chunk of search time at startup.*/ - if (parent == NULL || (parent != roster_->getRoot() && !index(parent).isValid())) { + if (parent == NULL || roster_ == NULL || (parent != roster_->getRoot() && !index(parent).isValid())) { return QModelIndex(); } for (size_t i = 0; i < parent->getDisplayedChildren().size(); i++) { @@ -189,7 +196,7 @@ QModelIndex RosterModel::index(RosterItem* item) const { } QModelIndex RosterModel::parent(const QModelIndex& child) const { - if (!child.isValid()) { + if (!roster_ || !child.isValid()) { return QModelIndex(); } |