From 36b2b9680ff608f41c681b8c23865abb06a2464c Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Fri, 30 Nov 2007 18:48:42 +0000 Subject: [PATCH 1/1] Prevent Quassel from crashing upon core dis- and reconnect and make the NickListWidgets behave sanely in that situation as well. --- src/client/treemodel.cpp | 1 + src/qtopia/nicklistwidget.cpp | 11 +++++++++++ src/qtopia/nicklistwidget.h | 3 +++ src/qtui/bufferwidget.cpp | 14 +++++++++++--- src/qtui/bufferwidget.h | 3 ++- src/qtui/nicklistwidget.cpp | 10 ++++++++++ src/qtui/nicklistwidget.h | 3 +++ 7 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index 5783f034..fda1df4d 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -260,4 +260,5 @@ bool TreeModel::removeRows(int row, int count, const QModelIndex &parent) { void TreeModel::clear() { removeRows(0, rowCount()); + reset(); } diff --git a/src/qtopia/nicklistwidget.cpp b/src/qtopia/nicklistwidget.cpp index 17c47f18..7c8361f9 100644 --- a/src/qtopia/nicklistwidget.cpp +++ b/src/qtopia/nicklistwidget.cpp @@ -53,6 +53,7 @@ void NickListWidget::setBuffer(Buffer *buf) { nickViews[buf] = view; ui.stackedWidget->addWidget(view); ui.stackedWidget->setCurrentWidget(view); + connect(buf, SIGNAL(destroyed(QObject *)), this, SLOT(bufferDestroyed(QObject *))); } } } @@ -62,4 +63,14 @@ void NickListWidget::reset() { ui.stackedWidget->removeWidget(view); view->deleteLater(); } + nickViews.clear(); } + +void NickListWidget::bufferDestroyed(QObject *buf) { + if(nickViews.contains((Buffer *)buf)) { + NickView *view = nickViews.take((Buffer *)buf); + ui.stackedWidget->removeWidget(view); + view->deleteLater(); + } +} + diff --git a/src/qtopia/nicklistwidget.h b/src/qtopia/nicklistwidget.h index 35904d02..fe9a10e4 100644 --- a/src/qtopia/nicklistwidget.h +++ b/src/qtopia/nicklistwidget.h @@ -39,6 +39,9 @@ class NickListWidget : public QDialog { void setBuffer(Buffer *); void reset(); + private slots: + void bufferDestroyed(QObject *); + private: Ui::NickListWidget ui; QHash nickViews; diff --git a/src/qtui/bufferwidget.cpp b/src/qtui/bufferwidget.cpp index 3a900d1a..c647461c 100644 --- a/src/qtui/bufferwidget.cpp +++ b/src/qtui/bufferwidget.cpp @@ -59,8 +59,8 @@ void BufferWidget::setBuffer(Buffer *buf) { // ui.ownNick->addItem(state->ownNick); ChatWidget *chatWidget; - if(_chatWidgets.contains(buf->uid())) { - chatWidget = _chatWidgets[buf->uid()]; + if(_chatWidgets.contains(buf)) { + chatWidget = _chatWidgets[buf]; } else { chatWidget = new ChatWidget(this); chatWidget->init(buf->networkName(), buf->name()); @@ -70,9 +70,10 @@ void BufferWidget::setBuffer(Buffer *buf) { lines.append(dynamic_cast(msg)); } chatWidget->setContents(lines); + connect(buf, SIGNAL(destroyed(QObject *)), this, SLOT(bufferDestroyed(QObject *))); connect(buf, SIGNAL(msgAppended(AbstractUiMsg *)), chatWidget, SLOT(appendMsg(AbstractUiMsg *))); connect(buf, SIGNAL(msgPrepended(AbstractUiMsg *)), chatWidget, SLOT(prependMsg(AbstractUiMsg *))); - _chatWidgets[buf->uid()] = chatWidget; + _chatWidgets[buf] = chatWidget; ui.stackedWidget->addWidget(chatWidget); } ui.stackedWidget->setCurrentWidget(chatWidget); @@ -84,6 +85,12 @@ void BufferWidget::setBuffer(Buffer *buf) { // ui.ownNick->addItem(state->ownNick); } +void BufferWidget::bufferDestroyed(QObject *buf) { + QWidget *widget = _chatWidgets[(Buffer*)buf]; + ui.stackedWidget->removeWidget(widget); + widget->deleteLater(); +} + void BufferWidget::saveState() { } @@ -110,6 +117,7 @@ void BufferWidget::setActive(bool act) { } + /* void BufferWidget::displayMsg(Message msg) { chatWidget->appendMsg(msg); diff --git a/src/qtui/bufferwidget.h b/src/qtui/bufferwidget.h index d36f19a6..b9884845 100644 --- a/src/qtui/bufferwidget.h +++ b/src/qtui/bufferwidget.h @@ -55,12 +55,13 @@ public slots: private slots: void enterPressed(); void setActive(bool act = true); + void bufferDestroyed(QObject *); private: Ui::BufferWidget ui; //QHash _chatViews; - QHash _chatWidgets; + QHash _chatWidgets; bool active; QString _networkName; diff --git a/src/qtui/nicklistwidget.cpp b/src/qtui/nicklistwidget.cpp index 29a7d9b7..f2c51306 100644 --- a/src/qtui/nicklistwidget.cpp +++ b/src/qtui/nicklistwidget.cpp @@ -44,6 +44,7 @@ void NickListWidget::setBuffer(Buffer *buf) { nickViews[buf] = view; ui.stackedWidget->addWidget(view); ui.stackedWidget->setCurrentWidget(view); + connect(buf, SIGNAL(destroyed(QObject *)), this, SLOT(bufferDestroyed(QObject *))); } } } @@ -53,4 +54,13 @@ void NickListWidget::reset() { ui.stackedWidget->removeWidget(view); view->deleteLater(); } + nickViews.clear(); +} + +void NickListWidget::bufferDestroyed(QObject *buf) { + if(nickViews.contains((Buffer *)buf)) { + NickView *view = nickViews.take((Buffer *)buf); + ui.stackedWidget->removeWidget(view); + view->deleteLater(); + } } diff --git a/src/qtui/nicklistwidget.h b/src/qtui/nicklistwidget.h index 05f3235b..5a091b8c 100644 --- a/src/qtui/nicklistwidget.h +++ b/src/qtui/nicklistwidget.h @@ -38,6 +38,9 @@ class NickListWidget : public QWidget { void setBuffer(Buffer *); void reset(); + private slots: + void bufferDestroyed(QObject *); + private: Ui::NickListWidget ui; QHash nickViews; -- 2.20.1