From 647215f1dd8ea6fdb6e4fb747c5dc3e19c4ec3fc Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 9 Mar 2010 19:37:44 +0100 Subject: [PATCH] Properly clean up after disconnecting Mainly this fixes a crash on reconnect, because ToolBarActionProvider didn't clean up its state after disconnecting. Now the relevant classes have slots for connecting and disconnecting that can be reimplemented if necessary. A better solution is probably polling Client's state rather than using slots, but for now this should be ok. --- src/qtui/qtui.cpp | 1 + src/uisupport/graphicalui.cpp | 7 +++++++ src/uisupport/graphicalui.h | 3 +++ src/uisupport/networkmodelcontroller.h | 4 ++++ src/uisupport/toolbaractionprovider.cpp | 6 ++++++ src/uisupport/toolbaractionprovider.h | 3 +++ 6 files changed, 24 insertions(+) diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index 0ae5ceea..f3bb9a6d 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -93,6 +93,7 @@ void QtUi::connectedToCore() { void QtUi::disconnectedFromCore() { _mainWin->disconnectedFromCore(); + GraphicalUi::disconnectedFromCore(); } void QtUi::useSystemTrayChanged(const QVariant &v) { diff --git a/src/uisupport/graphicalui.cpp b/src/uisupport/graphicalui.cpp index 8e5fe943..c2422b3e 100644 --- a/src/uisupport/graphicalui.cpp +++ b/src/uisupport/graphicalui.cpp @@ -25,6 +25,7 @@ #include "actioncollection.h" #include "contextmenuactionprovider.h" +#include "toolbaractionprovider.h" #ifdef Q_WS_X11 # include @@ -83,6 +84,12 @@ void GraphicalUi::setUiStyle(UiStyle *style) { _uiStyle = style; } +void GraphicalUi::disconnectedFromCore() { + _contextMenuActionProvider->disconnectedFromCore(); + _toolBarActionProvider->disconnectedFromCore(); + AbstractUi::disconnectedFromCore(); +} + bool GraphicalUi::eventFilter(QObject *obj, QEvent *event) { #ifdef Q_WS_WIN if(obj == mainWidget() && event->type() == QEvent::ActivationChange) { diff --git a/src/uisupport/graphicalui.h b/src/uisupport/graphicalui.h index 6d6306ed..5435d4e8 100644 --- a/src/uisupport/graphicalui.h +++ b/src/uisupport/graphicalui.h @@ -92,6 +92,9 @@ protected: virtual bool eventFilter(QObject *obj, QEvent *event); +protected slots: + virtual void disconnectedFromCore(); + private: static inline GraphicalUi *instance(); diff --git a/src/uisupport/networkmodelcontroller.h b/src/uisupport/networkmodelcontroller.h index 8782187d..4e84a6b7 100644 --- a/src/uisupport/networkmodelcontroller.h +++ b/src/uisupport/networkmodelcontroller.h @@ -116,6 +116,10 @@ public: }; Q_DECLARE_FLAGS(ItemActiveStates, ItemActiveState) +public slots: + virtual void connectedToCore() {} + virtual void disconnectedFromCore() {} + protected: inline ActionCollection *actionCollection() const; inline QList indexList() const; diff --git a/src/uisupport/toolbaractionprovider.cpp b/src/uisupport/toolbaractionprovider.cpp index 89ad738d..a560ea6d 100644 --- a/src/uisupport/toolbaractionprovider.cpp +++ b/src/uisupport/toolbaractionprovider.cpp @@ -69,6 +69,12 @@ ToolBarActionProvider::~ToolBarActionProvider() { } +void ToolBarActionProvider::disconnectedFromCore() { + _currentBuffer = QModelIndex(); + updateStates(); + NetworkModelController::disconnectedFromCore(); +} + void ToolBarActionProvider::updateStates() { action(BufferPart)->setEnabled(_currentBuffer.isValid() && _currentBuffer.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer diff --git a/src/uisupport/toolbaractionprovider.h b/src/uisupport/toolbaractionprovider.h index 2ee82711..11d911d8 100644 --- a/src/uisupport/toolbaractionprovider.h +++ b/src/uisupport/toolbaractionprovider.h @@ -40,6 +40,9 @@ public: void addActions(QToolBar *, ToolBarType type); +public slots: + virtual void disconnectedFromCore(); + protected: virtual void handleNetworkAction(ActionType, QAction *); virtual void handleBufferAction(ActionType, QAction *); -- 2.20.1