From: Marcus Eggenberger Date: Wed, 27 Jun 2007 17:28:02 +0000 (+0000) Subject: minor fixes. now buffers can be removed via del/backspace from customviews X-Git-Tag: 0.1.0~189 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=d9398c1b8bfa66680d266bf968dc90f386c4ee7b minor fixes. now buffers can be removed via del/backspace from customviews --- diff --git a/src/qtgui/bufferview.cpp b/src/qtgui/bufferview.cpp index 0fae80d6..17f637b5 100644 --- a/src/qtgui/bufferview.cpp +++ b/src/qtgui/bufferview.cpp @@ -34,6 +34,8 @@ void BufferView::init() { header()->hideSection(1); expandAll(); + setAnimated(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 *))); - //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) { @@ -73,33 +74,29 @@ void BufferView::select(const QModelIndex ¤t) { } 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); } + // in the case that the filter did not accept the event or if it's a merge 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) { - if(parent.parent() == QModelIndex()) setExpanded(parent, true); + if(parent == QModelIndex()) + setExpanded(model()->index(start, 0, parent), true); QTreeView::rowsInserted(parent, start, end); } diff --git a/src/qtgui/bufferview.h b/src/qtgui/bufferview.h index b7b923e1..8a130d68 100644 --- a/src/qtgui/bufferview.h +++ b/src/qtgui/bufferview.h @@ -38,20 +38,17 @@ public: 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 *); + void removeBuffer(const QModelIndex &); void selectionChanged(const QModelIndex &, QItemSelectionModel::SelectionFlags); - //void dragEnter(); - //void dragLeave(); protected: void dropEvent(QDropEvent *); + void keyPressEvent(QKeyEvent *); void rowsInserted (const QModelIndex & parent, int start, int end); }; diff --git a/src/qtgui/bufferviewfilter.cpp b/src/qtgui/bufferviewfilter.cpp index 0e7fcab1..8c563902 100644 --- a/src/qtgui/bufferviewfilter.cpp +++ b/src/qtgui/bufferviewfilter.cpp @@ -58,44 +58,58 @@ void BufferViewFilter::doubleClickReceived(const QModelIndex &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(); + 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(); - 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(); } +} + +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; @@ -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(); - if((mode & SomeNets) && !networks.contains(net)) + if((mode & SomeNets) && !networks.contains(net)) { 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; + } } 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) { + // pretty interesting stuff here, eh? return QSortFilterProxyModel::lessThan(left, right); } diff --git a/src/qtgui/bufferviewfilter.h b/src/qtgui/bufferviewfilter.h index e5082b4f..4fc87ed4 100644 --- a/src/qtgui/bufferviewfilter.h +++ b/src/qtgui/bufferviewfilter.h @@ -53,9 +53,9 @@ public slots: void changeCurrent(const QModelIndex &, const QModelIndex &); void doubleClickReceived(const QModelIndex &); void select(const QModelIndex &); - //void enterDrag(); - //void leaveDrag(); void dropEvent(QDropEvent *); + void removeBuffer(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 &); - void addBuffer(const uint &, const QString &); + void addBuffer(const uint &); Modes mode; QStringList networks; diff --git a/src/qtgui/bufferviewwidget.h b/src/qtgui/bufferviewwidget.h index ef56ba76..8de20358 100644 --- a/src/qtgui/bufferviewwidget.h +++ b/src/qtgui/bufferviewwidget.h @@ -38,7 +38,7 @@ class BufferViewWidget : public QWidget { public: BufferViewWidget(QWidget *parent = 0); virtual QSize sizeHint () const; - BufferView *treeView() { return ui.treeView; } + BufferView *treeView(){ return ui.treeView; } private: Ui::BufferViewWidget ui; diff --git a/src/qtgui/mainwin.cpp b/src/qtgui/mainwin.cpp index d05de42c..772acab3 100644 --- a/src/qtgui/mainwin.cpp +++ b/src/qtgui/mainwin.cpp @@ -38,6 +38,7 @@ MainWin::MainWin() : QMainWindow() { ui.setupUi(this); + //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...")); + } 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 *))); - //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(); } -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); - 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()); - /* - 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) { @@ -206,6 +198,7 @@ void MainWin::showBuffer(Buffer *b) { currentBuffer = b->bufferId().groupId(); //emit bufferSelected(b); //qApp->processEvents(); + ui.bufferWidget->setBuffer(b); //emit bufferSelected(b); } diff --git a/src/qtgui/mainwin.h b/src/qtgui/mainwin.h index 123d5f45..e46e233e 100644 --- a/src/qtgui/mainwin.h +++ b/src/qtgui/mainwin.h @@ -29,13 +29,11 @@ #include "message.h" #include "chatwidget.h" #include "bufferviewfilter.h" -#include "bufferviewwidget.h" +#include "bufferview.h" class ServerListDlg; class CoreConnectDlg; -//class BufferViewDock; class Buffer; -class BufferWidget; 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(); - void registerBufferViewDock(BufferViewDock *); + void addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QStringList &); AbstractUiMsg *layoutMsg(const Message &); @@ -88,7 +86,7 @@ class MainWin : public QMainWindow, public AbstractUi { uint currentBuffer; - QList netViews; + QList netViews; };