/* no comment */
[quassel.git] / src / client / buffermodel.cpp
index 3dfdc6d..328cede 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 
 #include "buffermodel.h"
 
-#include "networkmodel.h"
-#include "mappedselectionmodel.h"
-#include "buffer.h"
 #include <QAbstractItemView>
 
+#include "client.h"
+#include "networkmodel.h"
+#include "quassel.h"
+
 BufferModel::BufferModel(NetworkModel *parent)
   : QSortFilterProxyModel(parent),
     _selectionModelSynchronizer(this)
 {
   setSourceModel(parent);
+  if(Quassel::isOptionSet("debugbufferswitches")) {
+    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)));
 }
 
 bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) const {
@@ -43,31 +49,61 @@ bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) con
   return false;
 }
 
-void BufferModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) {
-  _selectionModelSynchronizer.addSelectionModel(selectionModel);
+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::synchronizeView(QAbstractItemView *view) {
-  MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(view->model());
-  _selectionModelSynchronizer.addSelectionModel(mappedSelectionModel);
-  Q_ASSERT(mappedSelectionModel);
-  delete view->selectionModel();
-  view->setSelectionModel(mappedSelectionModel);
+void BufferModel::networkConnectionChanged(Network::ConnectionState state) {
+  switch(state) {
+  case Network::Connecting:
+  case Network::Initializing:
+  case Network::Initialized:
+    if(currentIndex().isValid())
+      return;
+    {
+      Network *net = qobject_cast<Network *>(sender());
+      Q_ASSERT(net);
+      setCurrentIndex(mapFromSource(Client::networkModel()->networkIndex(net->networkId())));
+    }
+    break;
+  default:
+    return;
+  }
 }
 
-QModelIndex BufferModel::currentIndex() {
-  return standardSelectionModel()->currentIndex();
+void BufferModel::synchronizeView(QAbstractItemView *view) {
+  _selectionModelSynchronizer.synchronizeSelectionModel(view->selectionModel());
 }
 
 void BufferModel::setCurrentIndex(const QModelIndex &newCurrent) {
-  _selectionModelSynchronizer.selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
-  _selectionModelSynchronizer.selectionModel()->select(newCurrent, QItemSelectionModel::Current);
+  _selectionModelSynchronizer.selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Current);
+  _selectionModelSynchronizer.selectionModel()->select(newCurrent, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
 }
 
-void BufferModel::debug_currentChanged(QModelIndex current, QModelIndex previous) {
-  qDebug() << "New current:" << current << "(previous:" << previous << ")";
+void BufferModel::switchToBuffer(const BufferId &bufferId) {
+  QModelIndex source_index = Client::networkModel()->bufferIndex(bufferId);
+  setCurrentIndex(mapFromSource(source_index));
 }
 
-void BufferModel::debug_selectionChanged(QItemSelection current , QItemSelection previous) {
-  qDebug() << "new selection:" << current << "(previoius:" << previous << ")";
+void BufferModel::switchToBufferIndex(const QModelIndex &bufferIdx) {
+  // we accept indexes that directly belong to us or our parent - nothing else
+  if(bufferIdx.model() == this) {
+    setCurrentIndex(bufferIdx);
+    return;
+  }
+
+  if(bufferIdx.model() == sourceModel()) {
+    setCurrentIndex(mapFromSource(bufferIdx));
+    return;
+  }
+
+  qWarning() << "BufferModel::switchToBufferIndex(const QModelIndex &):" << bufferIdx << "does not belong to BufferModel or NetworkModel";
+}
+
+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>();
 }