Fixed disconnect from Core. Dis- and reconnecting should now work as expected.
authorManuel Nickschas <sputnick@quassel-irc.org>
Fri, 10 Aug 2007 18:06:10 +0000 (18:06 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Fri, 10 Aug 2007 18:06:10 +0000 (18:06 +0000)
I had to add some dirty hack in BufferTreeModel for this -> EgS, please check :)

Oh, and I removed the reaaally obsolete ircwidget.ui from svn. This has been rotting
there for months.

Quassel.kdevelop.filelist
src/client/buffer.cpp
src/client/buffertreemodel.cpp
src/client/buffertreemodel.h
src/client/client.cpp
src/client/client.h
src/client/treemodel.h
src/qtgui/CMakeLists.txt
src/qtgui/mainwin.cpp
src/qtgui/ui/ircwidget.ui [deleted file]

index e908824..78be97a 100644 (file)
@@ -90,7 +90,6 @@ src/qtgui/ui/coreconnectdlg.ui
 src/qtgui/ui/coresettingspage.ui
 src/qtgui/ui/identitiesdlg.ui
 src/qtgui/ui/identitieseditdlg.ui
-src/qtgui/ui/ircwidget.ui
 src/qtgui/ui/mainwin.ui
 src/qtgui/ui/networkeditdlg.ui
 src/qtgui/ui/nickeditdlg.ui
index 7afc15b..7f4d885 100644 (file)
@@ -43,7 +43,6 @@ Buffer::Buffer(BufferId bufid) {
 }
 
 Buffer::~Buffer() {
-  //qDebug() << "destroying buffer";
   //delete widget;
   /*
   QSettings s;
index 3f0a2ad..37fe63b 100644 (file)
@@ -145,13 +145,13 @@ QModelIndex BufferTreeModel::getOrCreateNetworkItemIndex(Buffer *buffer) {
 
 QModelIndex BufferTreeModel::getOrCreateBufferItemIndex(Buffer *buffer) {
   QModelIndex networkItemIndex = getOrCreateNetworkItemIndex(buffer);
-  
+
   if(bufferItem.contains(buffer)) {
     return index(bufferItem[buffer]->row(), 0, networkItemIndex);
   } else {
     // first we determine the parent of the new Item
     TreeItem *networkItem = static_cast<TreeItem*>(networkItemIndex.internalPointer());
-
+    Q_ASSERT(networkItem);
     int nextRow = networkItem->childCount();
 
     beginInsertRows(networkItemIndex, nextRow, nextRow);
@@ -257,3 +257,11 @@ void BufferTreeModel::selectBuffer(Buffer *buffer) {
   QModelIndex index = getOrCreateBufferItemIndex(buffer);
   emit selectionChanged(index);
 }
+
+// EgS: check if this makes sense!
+void BufferTreeModel::clear() {
+  TreeModel::clear();
+  networkItem.clear();
+  bufferItem.clear();
+}
+
index 23471ad..91fe43d 100644 (file)
@@ -67,6 +67,7 @@ public:
   virtual Qt::ItemFlags flags(const QModelIndex &index) const;
   
 //  void clearActivity(Buffer *buffer);
+  void clear();  // EgS: check this
   
 public slots:
   void bufferUpdated(Buffer *);    
index 938d107..85096c7 100644 (file)
@@ -114,9 +114,9 @@ void Client::init() {
 Client::~Client() {
   //delete mainUi;
   //delete _bufferModel;
-  foreach(Buffer *buf, buffers.values()) delete buf;
+  foreach(Buffer *buf, buffers.values()) delete buf; // this is done by disconnectFromCore()!
   ClientProxy::destroy();
-
+  Q_ASSERT(!buffers.count());
 }
 
 BufferTreeModel *Client::bufferModel() {
@@ -150,14 +150,6 @@ void Client::disconnectFromCore() {
     disconnectFromLocalCore();
     coreSocketDisconnected();
   }
-  /* Clear internal data. Hopefully nothing relies on it at this point. */
-  coreConnectionInfo.clear();
-  sessionData.clear();
-  //foreach(Buffer *buf, buffers.values()) delete buf;
-  qDebug() << "barfoo";
-  _bufferModel->clear();
-  //qDeleteAll(buffers);
-  qDebug() << "foobar";
 }
 
 void Client::coreSocketConnected() {
@@ -173,6 +165,21 @@ void Client::coreSocketConnected() {
 void Client::coreSocketDisconnected() {
   connectedToCore = false;
   emit disconnected();
+  /* Clear internal data. Hopefully nothing relies on it at this point. */
+  _bufferModel->clear();
+  // Buffers, if deleted, send a signal that causes their removal from buffers and bufferIds.
+  // So we cannot simply go through the array in a loop (or use qDeleteAll) for deletion...
+  while(buffers.count()) { delete buffers.take(buffers.keys()[0]); }
+  Q_ASSERT(!buffers.count());   // should be empty now!
+  Q_ASSERT(!bufferIds.count());
+  coreConnectionInfo.clear();
+  sessionData.clear();
+  nicks.clear();
+  netConnected.clear();
+  netsAwaitingInit.clear();
+  ownNick.clear();
+  layoutQueue.clear();
+  layoutTimer->stop();
 }
 
 void Client::recvCoreState(const QVariant &state) {
@@ -308,6 +315,7 @@ Buffer * Client::buffer(BufferId id) {
     connect(b, SIGNAL(userInput(BufferId, QString)), client, SLOT(userInput(BufferId, QString)));
     connect(b, SIGNAL(bufferUpdated(Buffer *)), client, SIGNAL(bufferUpdated(Buffer *)));
     connect(b, SIGNAL(bufferDestroyed(Buffer *)), client, SIGNAL(bufferDestroyed(Buffer *)));
+    connect(b, SIGNAL(bufferDestroyed(Buffer *)), client, SLOT(removeBuffer(Buffer *)));
     buffers[id] = b;
     emit client->bufferUpdated(b);
   }
@@ -318,6 +326,11 @@ QList<BufferId> Client::allBufferIds() {
   return buffers.keys();
 }
 
+void Client::removeBuffer(Buffer *b) {
+  buffers.remove(b->bufferId());
+  bufferIds.remove(b->bufferId().uid());
+}
+
 void Client::recvNetworkState(QString net, QVariant state) {
   netsAwaitingInit.removeAll(net);
   netConnected[net] = true;
index a974978..a55a92b 100644 (file)
@@ -116,6 +116,8 @@ class Client : public QObject {
     void recvBacklogData(BufferId, const QList<QVariant> &, bool);
     void updateBufferId(BufferId);
 
+    void removeBuffer(Buffer *);
+
     void layoutMsg();
 
   private:
index 2b7928c..d73b8fc 100644 (file)
@@ -71,7 +71,7 @@ public:
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
-  void clear();
+  virtual void clear();
 
 protected:
   bool removeRow(int row, const QModelIndex &parent = QModelIndex());
index d50af80..dd5a73c 100644 (file)
@@ -4,7 +4,7 @@ SET(qtgui_HDRS style.h)
 SET(qtgui_MOCS bufferview.h bufferviewfilter.h bufferwidget.h channelwidgetinput.h chatline.h chatwidget.h coreconnectdlg.h
               guisettings.h identities.h mainwin.h qtgui.h serverlist.h settingsdlg.h settingspages.h tabcompleter.h)
 SET(qtgui_UICS identitiesdlg.ui identitieseditdlg.ui networkeditdlg.ui mainwin.ui
-             nickeditdlg.ui serverlistdlg.ui servereditdlg.ui coreconnectdlg.ui ircwidget.ui
+             nickeditdlg.ui serverlistdlg.ui servereditdlg.ui coreconnectdlg.ui
              bufferviewwidget.ui bufferwidget.ui settingsdlg.ui
              buffermgmntsettingspage.ui connectionsettingspage.ui)
 
index 5b19614..0824c81 100644 (file)
@@ -149,6 +149,7 @@ void MainWin::connectedToCore() {
 
   ui.menuViews->setEnabled(true);
   ui.menuCore->setEnabled(true);
+  ui.actionConnectCore->setEnabled(false);
   ui.actionDisconnectCore->setEnabled(true);
   ui.actionNetworkList->setEnabled(true);
   ui.bufferWidget->show();
diff --git a/src/qtgui/ui/ircwidget.ui b/src/qtgui/ui/ircwidget.ui
deleted file mode 100644 (file)
index 5ddc795..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<ui version="4.0" >
- <class>IrcWidget</class>
- <widget class="QWidget" name="IrcWidget" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>733</width>
-    <height>531</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" >
-   <property name="margin" >
-    <number>9</number>
-   </property>
-   <property name="spacing" >
-    <number>6</number>
-   </property>
-   <item>
-    <widget class="QTabWidget" name="tabWidget" >
-     <property name="tabPosition" >
-      <enum>QTabWidget::South</enum>
-     </property>
-     <property name="tabShape" >
-      <enum>QTabWidget::Rounded</enum>
-     </property>
-     <property name="currentIndex" >
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab" >
-      <attribute name="title" >
-       <string>No connection</string>
-      </attribute>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>