Properly clean up after disconnecting
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 9 Mar 2010 18:37:44 +0000 (19:37 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 9 Mar 2010 18:37:44 +0000 (19:37 +0100)
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
src/uisupport/graphicalui.cpp
src/uisupport/graphicalui.h
src/uisupport/networkmodelcontroller.h
src/uisupport/toolbaractionprovider.cpp
src/uisupport/toolbaractionprovider.h

index 0ae5cee..f3bb9a6 100644 (file)
@@ -93,6 +93,7 @@ void QtUi::connectedToCore() {
 
 void QtUi::disconnectedFromCore() {
   _mainWin->disconnectedFromCore();
+  GraphicalUi::disconnectedFromCore();
 }
 
 void QtUi::useSystemTrayChanged(const QVariant &v) {
index 8e5fe94..c2422b3 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "actioncollection.h"
 #include "contextmenuactionprovider.h"
+#include "toolbaractionprovider.h"
 
 #ifdef Q_WS_X11
 #  include <QX11Info>
@@ -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) {
index 6d6306e..5435d4e 100644 (file)
@@ -92,6 +92,9 @@ protected:
 
   virtual bool eventFilter(QObject *obj, QEvent *event);
 
+protected slots:
+  virtual void disconnectedFromCore();
+
 private:
   static inline GraphicalUi *instance();
 
index 8782187..4e84a6b 100644 (file)
@@ -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<QModelIndex> indexList() const;
index 89ad738..a560ea6 100644 (file)
@@ -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
index 2ee8271..11d911d 100644 (file)
@@ -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 *);