summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2009-08-09 14:37:57 (GMT)
committerKevin Smith <git@kismith.co.uk>2009-08-09 14:37:57 (GMT)
commitb589aa3732712c31da44523fa60fc5c4bc92ea9b (patch)
tree8874c488a7d3f40669a69276dcbbdebb2fa3cd97
parentfdb63d1c161ff951969244906a77be016d9b2f02 (diff)
downloadswift-b589aa3732712c31da44523fa60fc5c4bc92ea9b.zip
swift-b589aa3732712c31da44523fa60fc5c4bc92ea9b.tar.bz2
Fix long-standing bug with a crash on quit after joining MUCs.
-rw-r--r--Swift/Controllers/MUCController.cpp3
-rw-r--r--Swift/QtUI/Roster/QtTreeWidgetItem.cpp21
-rw-r--r--Swift/QtUI/Roster/QtTreeWidgetItem.h1
-rw-r--r--Swiften/Roster/GroupRosterItem.h4
-rw-r--r--Swiften/Roster/Roster.cpp6
5 files changed, 24 insertions, 11 deletions
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_;
}