summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swift/Controllers/RosterController.cpp1
-rw-r--r--Swift/Controllers/UIInterfaces/MainWindow.h1
-rw-r--r--Swift/QtUI/Roster/RosterModel.cpp17
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();
}