Fixing BR # 204 - double click on the sender column in the chatmonitor to switch...
[quassel.git] / src / client / networkmodel.cpp
index d6c18d7..777e809 100644 (file)
@@ -705,6 +705,10 @@ QString IrcUserItem::toolTip(int column) const {
 NetworkModel::NetworkModel(QObject *parent)
   : TreeModel(NetworkModel::defaultHeader(), parent)
 {
+  connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)),
+         this, SLOT(checkForNewBuffers(const QModelIndex &, int, int)));
+  connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)),
+         this, SLOT(checkForRemovedBuffers(const QModelIndex &, int, int)));
 }
 
 QList<QVariant >NetworkModel::defaultHeader() {
@@ -770,11 +774,10 @@ void NetworkModel::networkRemoved(const NetworkId &networkId) {
 }
 
 QModelIndex NetworkModel::bufferIndex(BufferId bufferId) {
-  BufferItem *bufferItem = findBufferItem(bufferId);
-  if(bufferItem)
-    return indexByItem(bufferItem);
-  else
+  if(!_bufferItemCache.contains(bufferId))
     return QModelIndex();
+
+  return indexByItem(_bufferItemCache[bufferId]);
 }
 
 BufferItem *NetworkModel::findBufferItem(const BufferInfo &bufferInfo) {
@@ -951,3 +954,59 @@ const Network *NetworkModel::networkByIndex(const QModelIndex &index) const {
   return Client::network(networkId);
 }
 
+
+
+void NetworkModel::checkForRemovedBuffers(const QModelIndex &parent, int start, int end) {
+  if(parent.data(ItemTypeRole) != NetworkItemType)
+    return;
+  
+  for(int row = start; row <= end; row++) {
+    _bufferItemCache.remove(parent.child(row, 0).data(BufferIdRole).value<BufferId>());
+  }
+}
+
+void NetworkModel::checkForNewBuffers(const QModelIndex &parent, int start, int end) {
+  if(parent.data(ItemTypeRole) != NetworkItemType)
+    return;
+
+  for(int row = start; row <= end; row++) {
+    QModelIndex child = parent.child(row, 0);
+    _bufferItemCache[child.data(BufferIdRole).value<BufferId>()] = static_cast<BufferItem *>(child.internalPointer());
+  }
+}
+
+QString NetworkModel::bufferName(BufferId bufferId) {
+  if(!_bufferItemCache.contains(bufferId))
+    return QString();
+
+  return _bufferItemCache[bufferId]->bufferName();
+}
+
+NetworkId NetworkModel::networkId(BufferId bufferId) {
+  if(!_bufferItemCache.contains(bufferId))
+    return NetworkId();
+
+  NetworkItem *netItem = qobject_cast<NetworkItem *>(_bufferItemCache[bufferId]->parent());
+  if(netItem)
+    return netItem->networkId();
+  else
+    return NetworkId();
+}
+
+QString NetworkModel::networkName(BufferId bufferId) {
+  if(!_bufferItemCache.contains(bufferId))
+    return QString();
+
+  NetworkItem *netItem = qobject_cast<NetworkItem *>(_bufferItemCache[bufferId]->parent());
+  if(netItem)
+    return netItem->networkName();
+  else
+    return QString();
+}
+
+BufferInfo::Type NetworkModel::bufferType(BufferId bufferId) {
+  if(!_bufferItemCache.contains(bufferId))
+    return BufferInfo::InvalidBuffer;
+
+  return _bufferItemCache[bufferId]->bufferType();
+}