minor fixes. now buffers can be removed via del/backspace from customviews
authorMarcus Eggenberger <egs@quassel-irc.org>
Wed, 27 Jun 2007 17:28:02 +0000 (17:28 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Wed, 27 Jun 2007 17:28:02 +0000 (17:28 +0000)
src/qtgui/bufferview.cpp
src/qtgui/bufferview.h
src/qtgui/bufferviewfilter.cpp
src/qtgui/bufferviewfilter.h
src/qtgui/bufferviewwidget.h
src/qtgui/mainwin.cpp
src/qtgui/mainwin.h

index 0fae80d..17f637b 100644 (file)
@@ -34,6 +34,8 @@ void BufferView::init() {
   header()->hideSection(1);
   expandAll();
   
   header()->hideSection(1);
   expandAll();
   
+  setAnimated(true);
+  
   setDragEnabled(true);
   setAcceptDrops(true);
   setDropIndicatorShown(true);
   setDragEnabled(true);
   setAcceptDrops(true);
   setDropIndicatorShown(true);
@@ -59,8 +61,7 @@ void BufferView::setFilteredModel(QAbstractItemModel *model, BufferViewFilter::M
   BufferViewFilter *filter = new BufferViewFilter(model, mode, nets);
   setModel(filter);
   connect(this, SIGNAL(eventDropped(QDropEvent *)), filter, SLOT(dropEvent(QDropEvent *)));
   BufferViewFilter *filter = new BufferViewFilter(model, mode, nets);
   setModel(filter);
   connect(this, SIGNAL(eventDropped(QDropEvent *)), filter, SLOT(dropEvent(QDropEvent *)));
-  //connect(this, SIGNAL(dragEnter()), filter, SLOT(enterDrag()));
-  //connect(this, SIGNAL(dragLeave()), filter, SLOT(leaveDrag()));
+  connect(this, SIGNAL(removeBuffer(const QModelIndex &)), filter, SLOT(removeBuffer(const QModelIndex &)));
 }
 
 void BufferView::setModel(QAbstractItemModel *model) {
 }
 
 void BufferView::setModel(QAbstractItemModel *model) {
@@ -73,33 +74,29 @@ void BufferView::select(const QModelIndex &current) {
 }
 
 void BufferView::dropEvent(QDropEvent *event) {
 }
 
 void BufferView::dropEvent(QDropEvent *event) {
-  if(event->source() == this) {
-    // this is either a merge or a sort operation... 
-    // currently only merges are supported
-  } else {
+  if(event->source() != this) {
+    // another view(?) or widget is the source. maybe it's a drag 'n drop 
+    // view customization -> we tell our friend the filter:
     emit eventDropped(event);
   }
     emit eventDropped(event);
   }
+  // in the case that the filter did not accept the event or if it's a merge
   QTreeView::dropEvent(event);    
   QTreeView::dropEvent(event);    
-  
 }
 
 }
 
-/*
- done prettier now..
-// dragEnterEvent and dragLeaveEvent are needed to keep track of the active
-// view when customizing them via drag and drop
-void BufferView::dragEnterEvent(QDragEnterEvent *event) {
-  emit dragEnter();
-  QTreeView::dragEnterEvent(event);
-}
-
-void BufferView::dragLeaveEvent(QDragLeaveEvent *event) {
-  emit dragLeave();
-  QTreeView::dragLeaveEvent(event);
+void BufferView::keyPressEvent(QKeyEvent *event) {
+  if(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) {
+    event->accept();
+    QModelIndex index = selectionModel()->selectedIndexes().first();
+    if(index.isValid()) {
+      emit removeBuffer(index);
+    }
+  }
+  QTreeView::keyPressEvent(event);
 }
 }
-*/
 
 // ensure that newly inserted network nodes are expanded per default
 void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) {
 
 // ensure that newly inserted network nodes are expanded per default
 void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) {
-  if(parent.parent() == QModelIndex()) setExpanded(parent, true);
+  if(parent == QModelIndex())
+    setExpanded(model()->index(start, 0, parent), true);
   QTreeView::rowsInserted(parent, start, end);
 }
   QTreeView::rowsInserted(parent, start, end);
 }
index b7b923e..8a130d6 100644 (file)
@@ -38,20 +38,17 @@ public:
   void setModel(QAbstractItemModel *model);
   void setFilteredModel(QAbstractItemModel *model, BufferViewFilter::Modes mode, QStringList nets);
   
   void setModel(QAbstractItemModel *model);
   void setFilteredModel(QAbstractItemModel *model, BufferViewFilter::Modes mode, QStringList nets);
   
-  //void dragEnterEvent(QDragEnterEvent *);
-  //void dragLeaveEvent(QDragLeaveEvent *);
-  
 public slots:
   void select(const QModelIndex &);
     
 signals:
   void eventDropped(QDropEvent *);
 public slots:
   void select(const QModelIndex &);
     
 signals:
   void eventDropped(QDropEvent *);
+  void removeBuffer(const QModelIndex &);
   void selectionChanged(const QModelIndex &, QItemSelectionModel::SelectionFlags);
   void selectionChanged(const QModelIndex &, QItemSelectionModel::SelectionFlags);
-  //void dragEnter();
-  //void dragLeave();
   
 protected:
   void dropEvent(QDropEvent *);
   
 protected:
   void dropEvent(QDropEvent *);
+  void keyPressEvent(QKeyEvent *);
   void rowsInserted (const QModelIndex & parent, int start, int end);
 };
 
   void rowsInserted (const QModelIndex & parent, int start, int end);
 };
 
index 0e7fcab..8c56390 100644 (file)
@@ -58,44 +58,58 @@ void BufferViewFilter::doubleClickReceived(const QModelIndex &clicked) {
   emit doubleClicked(mapToSource(clicked));
 }
 
   emit doubleClicked(mapToSource(clicked));
 }
 
-/*
-void BufferViewFilter::enterDrag() {
-  connect(sourceModel(), SIGNAL(addBuffer(const uint &, const QString &)),
-          this, SLOT(addBuffer(const uint &, const QString &)));
-}
-
-void BufferViewFilter::leaveDrag() {
-  disconnect(sourceModel(), SIGNAL(addBuffer(const uint &, const QString &)),
-             this, SLOT(addBuffer(const uint &, const QString &)));
-}
-*/
-
 void BufferViewFilter::dropEvent(QDropEvent *event) {
   const QMimeData *data = event->mimeData();
 void BufferViewFilter::dropEvent(QDropEvent *event) {
   const QMimeData *data = event->mimeData();
+  if(!(mode & FullCustom))
+    return; // only custom buffers can be customized... obviously... :)
+  
   if(!(data->hasFormat("application/Quassel/BufferItem/row")
        && data->hasFormat("application/Quassel/BufferItem/network")
        && data->hasFormat("application/Quassel/BufferItem/bufferId")))
     return; // whatever the drop is... it's not a buffer...
   
   event->accept();
   if(!(data->hasFormat("application/Quassel/BufferItem/row")
        && data->hasFormat("application/Quassel/BufferItem/network")
        && data->hasFormat("application/Quassel/BufferItem/bufferId")))
     return; // whatever the drop is... it's not a buffer...
   
   event->accept();
-  uint bufferid = data->data("application/Quassel/BufferItem/bufferId").toUInt();
-  QString network = QString::fromUtf8(data->data("application/Quassel/BufferItem/network"));
-  addBuffer(bufferid, network);
+  uint bufferuid = data->data("application/Quassel/BufferItem/bufferId").toUInt();
+  QString networkname = QString::fromUtf8("application/Quassel/BufferItem/network");
+  
+  for(int rowid = 0; rowid < rowCount(); rowid++) {
+    QModelIndex networkindex = index(rowid, 0);
+    if(networkindex.data(Qt::DisplayRole) == networkname) {
+      addBuffer(bufferuid);
+      return;
+    }
+  }
+  beginInsertRows(QModelIndex(), rowCount(), rowCount());
+  addBuffer(bufferuid);
+  endInsertRows();
 }
 
 
 }
 
 
-void BufferViewFilter::addBuffer(const uint &bufferuid, const QString &network) {
-  if(!networks.contains(network)) {
-    networks << network;
-  }
-  
+void BufferViewFilter::addBuffer(const uint &bufferuid) {
   if(!customBuffers.contains(bufferuid)) {
     customBuffers << bufferuid;
     invalidateFilter();
   }
   if(!customBuffers.contains(bufferuid)) {
     customBuffers << bufferuid;
     invalidateFilter();
   }
+}
+
+void BufferViewFilter::removeBuffer(const QModelIndex &index) {
+  if(!(mode & FullCustom))
+    return; // only custom buffers can be customized... obviously... :)
+  
+  if(index.parent() == QModelIndex())
+    return; // only child elements can be deleted
+  
+  uint bufferuid = index.data(BufferTreeModel::BufferIdRole).toUInt();
+  if(customBuffers.contains(bufferuid)) {
+    beginRemoveRows(index.parent(), index.row(), index.row());
+    customBuffers.removeAt(customBuffers.indexOf(bufferuid));
+    endRemoveRows();
+    invalidateFilter();
+  }
   
 }
 
   
 }
 
+
 bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const {
   Buffer::Type bufferType = (Buffer::Type) source_bufferIndex.data(BufferTreeModel::BufferTypeRole).toInt();
   if((mode & NoChannels) && bufferType == Buffer::ChannelBuffer) return false;
 bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const {
   Buffer::Type bufferType = (Buffer::Type) source_bufferIndex.data(BufferTreeModel::BufferTypeRole).toInt();
   if((mode & NoChannels) && bufferType == Buffer::ChannelBuffer) return false;
@@ -117,10 +131,21 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex)
 
 bool BufferViewFilter::filterAcceptNetwork(const QModelIndex &source_index) const {
   QString net = source_index.data(Qt::DisplayRole).toString();
 
 bool BufferViewFilter::filterAcceptNetwork(const QModelIndex &source_index) const {
   QString net = source_index.data(Qt::DisplayRole).toString();
-  if((mode & SomeNets) && !networks.contains(net))
+  if((mode & SomeNets) && !networks.contains(net)) {
     return false;
     return false;
-  else
+  } else if(mode & FullCustom) {
+    // let's check if we got a child that want's to show off
+    int childcount = sourceModel()->rowCount(source_index);
+    for(int rowid = 0; rowid < childcount; rowid++) {
+      QModelIndex child = sourceModel()->index(rowid, 0, source_index);
+      uint bufferuid = child.data(BufferTreeModel::BufferIdRole).toUInt();
+      if(customBuffers.contains(bufferuid))
+        return true;
+    }
+    return false;
+  } else {
     return true;
     return true;
+  }
 }
 
 bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
 }
 
 bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
@@ -138,6 +163,7 @@ bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &sourc
 }
 
 bool BufferViewFilter::lessThan(const QModelIndex &left, const QModelIndex &right) {
 }
 
 bool BufferViewFilter::lessThan(const QModelIndex &left, const QModelIndex &right) {
+  // pretty interesting stuff here, eh?
   return QSortFilterProxyModel::lessThan(left, right);
 }
 
   return QSortFilterProxyModel::lessThan(left, right);
 }
 
index e5082b4..4fc87ed 100644 (file)
@@ -53,9 +53,9 @@ public slots:
   void changeCurrent(const QModelIndex &, const QModelIndex &);
   void doubleClickReceived(const QModelIndex &);
   void select(const QModelIndex &);
   void changeCurrent(const QModelIndex &, const QModelIndex &);
   void doubleClickReceived(const QModelIndex &);
   void select(const QModelIndex &);
-  //void enterDrag();
-  //void leaveDrag();
   void dropEvent(QDropEvent *);
   void dropEvent(QDropEvent *);
+  void removeBuffer(const QModelIndex &);
+
   
 signals:
   void currentChanged(const QModelIndex &, const QModelIndex &);
   
 signals:
   void currentChanged(const QModelIndex &, const QModelIndex &);
@@ -67,7 +67,7 @@ private:
   bool filterAcceptNetwork(const QModelIndex &) const;
   bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
   bool lessThan(const QModelIndex &, const QModelIndex &);
   bool filterAcceptNetwork(const QModelIndex &) const;
   bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
   bool lessThan(const QModelIndex &, const QModelIndex &);
-  void addBuffer(const uint &, const QString &);
+  void addBuffer(const uint &);
   
   Modes mode;
   QStringList networks;
   
   Modes mode;
   QStringList networks;
index ef56ba7..8de2035 100644 (file)
@@ -38,7 +38,7 @@ class BufferViewWidget : public QWidget {
 public:
   BufferViewWidget(QWidget *parent = 0);
   virtual QSize sizeHint () const;
 public:
   BufferViewWidget(QWidget *parent = 0);
   virtual QSize sizeHint () const;
-  BufferView *treeView() { return ui.treeView; }  
+  BufferView *treeView(){ return ui.treeView; }  
 
 private:
   Ui::BufferViewWidget ui;
 
 private:
   Ui::BufferViewWidget ui;
index d05de42..772acab 100644 (file)
@@ -38,6 +38,7 @@
 
 MainWin::MainWin() : QMainWindow() {
   ui.setupUi(this);
 
 MainWin::MainWin() : QMainWindow() {
   ui.setupUi(this);
+  
   //widget = 0;
   //qDebug() << "Available DB drivers: " << QSqlDatabase::drivers ();
   setWindowTitle("Quassel IRC");
   //widget = 0;
   //qDebug() << "Available DB drivers: " << QSqlDatabase::drivers ();
   setWindowTitle("Quassel IRC");
@@ -48,6 +49,7 @@ MainWin::MainWin() : QMainWindow() {
   //workspace = new QWorkspace(this);
   //setCentralWidget(workspace);
   statusBar()->showMessage(tr("Waiting for core..."));
   //workspace = new QWorkspace(this);
   //setCentralWidget(workspace);
   statusBar()->showMessage(tr("Waiting for core..."));
+  
 }
 
 void MainWin::init() {
 }
 
 void MainWin::init() {
@@ -124,41 +126,31 @@ void MainWin::setupViews() {
   
   BufferTreeModel *model = Client::bufferModel(); // FIXME Where is the delete for that? :p
   connect(model, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *)));
   
   BufferTreeModel *model = Client::bufferModel(); // FIXME Where is the delete for that? :p
   connect(model, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *)));
-  //connect(this, SIGNAL(bufferSelected(Buffer *)), model, SLOT(selectBuffer(Buffer *)));
-  //connect(this, SIGNAL(bufferUpdated(Buffer *)), model, SLOT(bufferUpdated(Buffer *)));
-  //connect(this, SIGNAL(bufferActivity(Buffer::ActivityLevel, Buffer *)), model, SLOT(bufferActivity(Buffer::ActivityLevel, Buffer *)));
   
   
-  BufferViewDock *all = new BufferViewDock(model, tr("All Buffers"), BufferViewFilter::AllNets, QStringList(), this);
-  registerBufferViewDock(all);
+  addBufferView(tr("All Buffers"), model, BufferViewFilter::AllNets, QStringList());
+  addBufferView(tr("All Channels"), model, BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers, QStringList());
+  addBufferView(tr("All Queries"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers, QStringList());
+  addBufferView(tr("All Networks"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries, QStringList());
+  addBufferView(tr("Full Custom"), model, BufferViewFilter::FullCustom, QStringList());
   
   
-  BufferViewDock *allchans = new BufferViewDock(model, tr("All Channels"), BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers, QStringList(), this);
-  registerBufferViewDock(allchans);
-  
-  BufferViewDock *allqrys = new BufferViewDock(model, tr("All Queries"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers, QStringList(), this);
-  registerBufferViewDock(allqrys);
-
-  
-  BufferViewDock *allnets = new BufferViewDock(model, tr("All Networks"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries, QStringList(), this);
-  registerBufferViewDock(allnets);
-
-  BufferViewDock *fullCustom = new BufferViewDock(model, tr("Full Custom"), BufferViewFilter::FullCustom|BufferViewFilter::SomeNets, QStringList(), this);
-  registerBufferViewDock(fullCustom);
-
   ui.menuViews->addSeparator();
 }
 
   ui.menuViews->addSeparator();
 }
 
-void MainWin::registerBufferViewDock(BufferViewDock *dock) {
-  addDockWidget(Qt::LeftDockWidgetArea, dock);
+void MainWin::addBufferView(const QString &viewname, QAbstractItemModel *model, const BufferViewFilter::Modes &mode, const QStringList &nets) {
+  QDockWidget *dock = new QDockWidget(viewname, this);
+  dock->setObjectName(QString("ViewDock-" + viewname)); // should be unique for mainwindow state!
   dock->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
   dock->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
-  netViews.append(dock);
+  //dock->setContentsMargins(4,4,4,4);
+
+  //create the view and initialize it's filter
+  BufferView *view = new BufferView(dock);
+  view->setFilteredModel(model, mode, nets);
+  dock->setWidget(view);
+  
+  addDockWidget(Qt::LeftDockWidgetArea, dock);
   ui.menuViews->addAction(dock->toggleViewAction());
   
   ui.menuViews->addAction(dock->toggleViewAction());
   
-  /*
-  connect(this, SIGNAL(bufferSelected(Buffer *)), view, SLOT(selectBuffer(Buffer *)));
-  connect(this, SIGNAL(bufferDestroyed(Buffer *)), view, SLOT(bufferDestroyed(Buffer *)));
-  connect(view, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *)));
-  view->setBuffers(buffers.values());
-   */
+  netViews.append(dock);
 }
 
 AbstractUiMsg *MainWin::layoutMsg(const Message &msg) {
 }
 
 AbstractUiMsg *MainWin::layoutMsg(const Message &msg) {
@@ -206,6 +198,7 @@ void MainWin::showBuffer(Buffer *b) {
   currentBuffer = b->bufferId().groupId();
   //emit bufferSelected(b);
   //qApp->processEvents();
   currentBuffer = b->bufferId().groupId();
   //emit bufferSelected(b);
   //qApp->processEvents();
+      
   ui.bufferWidget->setBuffer(b);
   //emit bufferSelected(b);
 }
   ui.bufferWidget->setBuffer(b);
   //emit bufferSelected(b);
 }
index 123d5f4..e46e233 100644 (file)
 #include "message.h"
 #include "chatwidget.h"
 #include "bufferviewfilter.h"
 #include "message.h"
 #include "chatwidget.h"
 #include "bufferviewfilter.h"
-#include "bufferviewwidget.h"
+#include "bufferview.h"
 
 class ServerListDlg;
 class CoreConnectDlg;
 
 class ServerListDlg;
 class CoreConnectDlg;
-//class BufferViewDock;
 class Buffer;
 class Buffer;
-class BufferWidget;
 class SettingsDlg;
 
 //!\brief The main window and central object of Quassel GUI.
 class SettingsDlg;
 
 //!\brief The main window and central object of Quassel GUI.
@@ -51,7 +49,7 @@ class MainWin : public QMainWindow, public AbstractUi {
     virtual ~MainWin();
 
     void init();
     virtual ~MainWin();
 
     void init();
-    void registerBufferViewDock(BufferViewDock *);
+    void addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QStringList &);
 
     AbstractUiMsg *layoutMsg(const Message &);
 
 
     AbstractUiMsg *layoutMsg(const Message &);
 
@@ -88,7 +86,7 @@ class MainWin : public QMainWindow, public AbstractUi {
 
     uint currentBuffer;
 
 
     uint currentBuffer;
 
-    QList<BufferViewDock *> netViews;
+    QList<QDockWidget *> netViews;
 
 };
 
 
 };