From b589aa3732712c31da44523fa60fc5c4bc92ea9b Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Sun, 9 Aug 2009 15:37:57 +0100 Subject: Fix long-standing bug with a crash on quit after joining MUCs. diff --git a/Swift/Controllers/MUCController.cpp b/Swift/Controllers/MUCController.cpp index 37389a2..848f540 100644 --- a/Swift/Controllers/MUCController.cpp +++ b/Swift/Controllers/MUCController.cpp @@ -42,8 +42,7 @@ MUCController::MUCController ( MUCController::~MUCController() { delete muc_; - //don't crash on exit by masking this. FIXME. - //delete roster_; + delete roster_; } void MUCController::handleWindowClosed() { diff --git a/Swift/QtUI/Roster/QtTreeWidgetItem.cpp b/Swift/QtUI/Roster/QtTreeWidgetItem.cpp index 2c3b4b2..51784df 100644 --- a/Swift/QtUI/Roster/QtTreeWidgetItem.cpp +++ b/Swift/QtUI/Roster/QtTreeWidgetItem.cpp @@ -59,19 +59,32 @@ bool QtTreeWidgetItem::isShown() { QWidget* QtTreeWidgetItem::getCollapsedRosterWidget() { QWidget* widget = new QWidget(); - return widget; } QWidget* QtTreeWidgetItem::getExpandedRosterWidget() { QWidget* widget = new QWidget(); - return widget; } QtTreeWidgetItem::~QtTreeWidgetItem() { - parent_->removeChild(this); - qDeleteAll(children_); + //It's possible (due to the way the roster deletes items in unknown order when it is deleted) + // That the children will be deleted before the groups, or that the groups are deleted + // before the children. If the children are deleted first, they will let the parent know that + // They've been deleted. If the parent is deleted first, it must tell the children not to + // tell it when they're deleted. Everything will be deleted in the end, because all the + // widgets are owned by the Roster in Swiften. + if (parent_) { + parent_->removeChild(this); + } + + for (int i = 0; i < children_.size(); i++) { + children_[i]->parentItemHasBeenDeleted(); + } +} + +void QtTreeWidgetItem::parentItemHasBeenDeleted() { + parent_ = NULL; } QtTreeWidgetItem* QtTreeWidgetItem::getParentItem() { diff --git a/Swift/QtUI/Roster/QtTreeWidgetItem.h b/Swift/QtUI/Roster/QtTreeWidgetItem.h index 20e6f5d..1b898b0 100644 --- a/Swift/QtUI/Roster/QtTreeWidgetItem.h +++ b/Swift/QtUI/Roster/QtTreeWidgetItem.h @@ -40,6 +40,7 @@ class QtTreeWidgetItem : public QObject, public TreeWidgetItem { void setTextColor(unsigned long color); void setBackgroundColor(unsigned long color); void setExpanded(bool b); + void parentItemHasBeenDeleted(); void hide(); void show(); bool isShown(); diff --git a/Swiften/Roster/GroupRosterItem.h b/Swiften/Roster/GroupRosterItem.h index f96a868..4065fdb 100644 --- a/Swiften/Roster/GroupRosterItem.h +++ b/Swiften/Roster/GroupRosterItem.h @@ -18,8 +18,8 @@ class GroupRosterItem : public RosterItem { widget_ = factory->createTreeWidgetItem(tree); widget_->setExpanded(true); widget_->setText(name); - widget_->setTextColor(0xFFFFFF); - widget_->setBackgroundColor(0x969696); + widget_->setTextColor(0xFFFFFF); + widget_->setBackgroundColor(0x969696); } ~GroupRosterItem() { diff --git a/Swiften/Roster/Roster.cpp b/Swiften/Roster/Roster.cpp index b51d8eb..b09964c 100644 --- a/Swiften/Roster/Roster.cpp +++ b/Swiften/Roster/Roster.cpp @@ -20,9 +20,9 @@ Roster::Roster(TreeWidget *treeWidget, TreeWidgetFactory *widgetFactory) : treeW } Roster::~Roster() { - foreach (RosterItem* item, items_) { - delete item; - } + foreach (RosterItem* item, items_) { + delete item; + } delete treeWidget_; } -- cgit v0.10.2-6-g49f6