summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/QtUI')
-rw-r--r--Swift/QtUI/Roster/QtTreeWidgetItem.cpp21
-rw-r--r--Swift/QtUI/Roster/QtTreeWidgetItem.h1
2 files changed, 18 insertions, 4 deletions
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();