Quassel no longer gets a nervous breakdown when you select too many buffers - fixes...
[quassel.git] / src / client / buffermodel.cpp
index ad4c51a..2c003f3 100644 (file)
 
 #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(new SelectionModelSynchronizer(this)),
-    _propertyMapper(new ModelPropertyMapper(this))
+    _selectionModelSynchronizer(this)
 {
   setSourceModel(parent);
-
-  // initialize the Property Mapper
-  _propertyMapper->setModel(this);
-  delete _propertyMapper->selectionModel();
-  MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(this);
-  _propertyMapper->setSelectionModel(mappedSelectionModel);
-  synchronizeSelectionModel(mappedSelectionModel);
-  
-  connect(_selectionModelSynchronizer, SIGNAL(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags)),
-         this, SLOT(setCurrentIndex(QModelIndex, QItemSelectionModel::SelectionFlags)));
-}
-
-BufferModel::~BufferModel() {
+  if(Quassel::isOptionSet("debugbufferswitches")) {
+    connect(_selectionModelSynchronizer.selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
+           this, SLOT(debug_currentChanged(const QModelIndex &, const QModelIndex &)));
+  }
 }
 
 bool BufferModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) const {
-  Q_UNUSED(sourceRow)
-    
-  if(parent.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType)
-    return false;
-  else
+  Q_UNUSED(sourceRow);
+  // only networks and buffers are allowed
+  if(!parent.isValid())
+    return true;
+  if(parent.data(NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType)
     return true;
-}
 
-void BufferModel::synchronizeSelectionModel(MappedSelectionModel *selectionModel) {
-  selectionModelSynchronizer()->addSelectionModel(selectionModel);
+  return false;
 }
 
 void BufferModel::synchronizeView(QAbstractItemView *view) {
-  MappedSelectionModel *mappedSelectionModel = new MappedSelectionModel(view->model());
-  selectionModelSynchronizer()->addSelectionModel(mappedSelectionModel);
-  Q_ASSERT(mappedSelectionModel);
-  delete view->selectionModel();
-  view->setSelectionModel(mappedSelectionModel);
+  _selectionModelSynchronizer.synchronizeSelectionModel(view->selectionModel());
+}
+
+void BufferModel::setCurrentIndex(const QModelIndex &newCurrent) {
+  _selectionModelSynchronizer.selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Current);
+  _selectionModelSynchronizer.selectionModel()->select(newCurrent, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
 }
 
-void BufferModel::mapProperty(int column, int role, QObject *target, const QByteArray &property) {
-  propertyMapper()->addMapping(column, role, target, property);
+void BufferModel::switchToBuffer(const BufferId &bufferId) {
+  QModelIndex source_index = Client::networkModel()->bufferIndex(bufferId);
+  setCurrentIndex(mapFromSource(source_index));
 }
 
-// This Slot indicates that the user has selected a different buffer in the gui
-void BufferModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) {
-  Q_UNUSED(command)
-  BufferId newCurrentBuffer;
-  if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType && currentBuffer != (newCurrentBuffer = index.data(NetworkModel::BufferIdRole).value<BufferId>())) {
-    currentBuffer = newCurrentBuffer;
-    // FIXME: to something like: index.setData(ActivitRole, NoActivity);
-    // networkModel->bufferActivity(BufferItem::NoActivity, currentBuffer);
-    emit selectionChanged(index);
+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";
 }
 
-QModelIndex BufferModel::currentIndex() {
-  return propertyMapper()->selectionModel()->currentIndex();
+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>();
 }