Store the type of the current tab completion (user or channel) in the TabCompleter...
[quassel.git] / src / client / buffermodel.cpp
index e6bafd7..57441a9 100644 (file)
@@ -35,6 +35,8 @@ BufferModel::BufferModel(NetworkModel *parent)
     connect(_selectionModelSynchronizer.selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
            this, SLOT(debug_currentChanged(const QModelIndex &, const QModelIndex &)));
   }
+  connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(newNetwork(NetworkId)));
+  connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(newBuffers(const QModelIndex &, int, int)));
 }
 
 bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) const {
@@ -48,6 +50,30 @@ bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) con
   return false;
 }
 
+void BufferModel::newNetwork(NetworkId id) {
+  const Network *net = Client::network(id);
+  Q_ASSERT(net);
+  connect(net, SIGNAL(connectionStateSet(Network::ConnectionState)),
+         this, SLOT(networkConnectionChanged(Network::ConnectionState)));
+}
+
+void BufferModel::networkConnectionChanged(Network::ConnectionState state) {
+  switch(state) {
+  case Network::Connecting:
+  case Network::Initializing:
+    if(currentIndex().isValid())
+      return;
+    {
+      Network *net = qobject_cast<Network *>(sender());
+      Q_ASSERT(net);
+      setCurrentIndex(mapFromSource(Client::networkModel()->networkIndex(net->networkId())));
+    }
+    break;
+  default:
+    return;
+  }
+}
+
 void BufferModel::synchronizeView(QAbstractItemView *view) {
   _selectionModelSynchronizer.synchronizeSelectionModel(view->selectionModel());
 }
@@ -77,7 +103,46 @@ void BufferModel::switchToBufferIndex(const QModelIndex &bufferIdx) {
   qWarning() << "BufferModel::switchToBufferIndex(const QModelIndex &):" << bufferIdx << "does not belong to BufferModel or NetworkModel";
 }
 
+void BufferModel::switchToOrJoinBuffer(NetworkId networkId, const QString &name, bool isQuery) {
+  BufferId bufId = Client::networkModel()->bufferId(networkId, name);
+  if(bufId.isValid()) {
+    QModelIndex targetIdx = Client::networkModel()->bufferIndex(bufId);
+    switchToBuffer(bufId);
+    if(!targetIdx.data(NetworkModel::ItemActiveRole).toBool()) {
+      qDebug() << "switchToOrJoinBuffer failed to switch even though bufId:" << bufId << "is valid.";
+      Client::userInput(BufferInfo::fakeStatusBuffer(networkId), QString(isQuery ? "/QUERY %1" : "/JOIN %1").arg(name));
+    }
+  } else {
+    _bufferToSwitchTo = qMakePair(networkId, name);
+    Client::userInput(BufferInfo::fakeStatusBuffer(networkId), QString(isQuery ? "/QUERY %1" : "/JOIN %1").arg(name));
+  }
+}
+
 void BufferModel::debug_currentChanged(QModelIndex current, QModelIndex previous) {
   Q_UNUSED(previous);
   qDebug() << "Switched current Buffer: " << current << current.data().toString() << "Buffer:" << current.data(NetworkModel::BufferIdRole).value<BufferId>();
 }
+
+void BufferModel::newBuffers(const QModelIndex &parent, int start, int end) {
+  if(parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType)
+    return;
+
+  for(int row = start; row <= end; row++) {
+    QModelIndex child = parent.child(row, 0);
+    newBuffer(child.data(NetworkModel::BufferIdRole).value<BufferId>());
+  }
+}
+
+void BufferModel::newBuffer(BufferId bufferId) {
+  BufferInfo bufferInfo = Client::networkModel()->bufferInfo(bufferId);
+  if(_bufferToSwitchTo.first == bufferInfo.networkId()
+      && _bufferToSwitchTo.second == bufferInfo.bufferName()) {
+    _bufferToSwitchTo.first = 0;
+    _bufferToSwitchTo.second.clear();
+    switchToBuffer(bufferId);
+  }
+}
+
+void BufferModel::switchToBufferAfterCreation(NetworkId network, const QString &name) {
+  _bufferToSwitchTo = qMakePair(network, name);
+}