X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtgui%2Fbufferviewfilter.cpp;h=8dca8fa283430287d8f79feab064fe72145d7b84;hp=caa1fb382f4f363130927f6fa8bb2e776b82fa93;hb=902c95728306e5ba115de84800fc8d5d239c9d62;hpb=13b2affbdccd1d52479e49affdb81a77258392a6;ds=sidebyside diff --git a/src/qtgui/bufferviewfilter.cpp b/src/qtgui/bufferviewfilter.cpp index caa1fb38..8dca8fa2 100644 --- a/src/qtgui/bufferviewfilter.cpp +++ b/src/qtgui/bufferviewfilter.cpp @@ -23,24 +23,31 @@ /***************************************** * The Filter for the Tree View *****************************************/ -BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, Modes filtermode, QStringList nets, QObject *parent) : QSortFilterProxyModel(parent) { +BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, const Modes &filtermode, const QStringList &nets) : QSortFilterProxyModel(model) { setSourceModel(model); + setSortRole(BufferTreeModel::BufferNameRole); + setSortCaseSensitivity(Qt::CaseInsensitive); + mode = filtermode; networks = nets; connect(model, SIGNAL(invalidateFilter()), this, SLOT(invalidateMe())); - connect(model, SIGNAL(updateSelection(const QModelIndex &, QItemSelectionModel::SelectionFlags)), this, SLOT(select(const QModelIndex &, QItemSelectionModel::SelectionFlags))); - - connect(this, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), model, SLOT(changeCurrent(const QModelIndex &, const QModelIndex &))); - connect(this, SIGNAL(doubleClicked(const QModelIndex &)), model, SLOT(doubleClickReceived(const QModelIndex &))); + connect(model, SIGNAL(selectionChanged(const QModelIndex &)), + this, SLOT(select(const QModelIndex &))); + + connect(this, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), + model, SLOT(changeCurrent(const QModelIndex &, const QModelIndex &))); + + connect(this, SIGNAL(doubleClicked(const QModelIndex &)), + model, SLOT(doubleClickReceived(const QModelIndex &))); } void BufferViewFilter::invalidateMe() { invalidateFilter(); } -void BufferViewFilter::select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) { - emit updateSelection(mapFromSource(index), command); +void BufferViewFilter::select(const QModelIndex &index) { + emit selectionChanged(mapFromSource(index)); } void BufferViewFilter::changeCurrent(const QModelIndex ¤t, const QModelIndex &previous) { @@ -51,22 +58,112 @@ void BufferViewFilter::doubleClickReceived(const QModelIndex &clicked) { emit doubleClicked(mapToSource(clicked)); } -bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { - QModelIndex child = source_parent.child(source_row, 0); - if(!child.isValid()) - return true; // can't imagine this case but true sounds good :) +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/bufferInfo"))) + return; // whatever the drop is... it's not a buffer... + + event->accept(); + uint bufferuid = data->data("application/Quassel/BufferItem/bufferInfo").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) { + 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::BufferInfoRole).toUInt(); + if(customBuffers.contains(bufferuid)) { + beginRemoveRows(index.parent(), index.row(), index.row()); + customBuffers.removeAt(customBuffers.indexOf(bufferuid)); + endRemoveRows(); + invalidateFilter(); + } + +} + - Buffer::Type bufferType = (Buffer::Type) child.data(BufferTreeModel::BufferTypeRole).toInt(); +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; if((mode & NoQueries) && bufferType == Buffer::QueryBuffer) return false; if((mode & NoServers) && bufferType == Buffer::ServerBuffer) return false; - bool isActive = child.data(BufferTreeModel::BufferActiveRole).toBool(); + bool isActive = source_bufferIndex.data(BufferTreeModel::BufferActiveRole).toBool(); if((mode & NoActive) && isActive) return false; if((mode & NoInactive) && !isActive) return false; - QString net = child.data(Qt::DisplayRole).toString(); - if((mode & SomeNets) && !networks.contains(net)) return false; + if((mode & FullCustom)) { + uint bufferuid = source_bufferIndex.data(BufferTreeModel::BufferInfoRole).toUInt(); + if(!customBuffers.contains(bufferuid)) + return false; + } return true; } + +bool BufferViewFilter::filterAcceptNetwork(const QModelIndex &source_index) const { + QString net = source_index.data(Qt::DisplayRole).toString(); + if((mode & SomeNets) && !networks.contains(net)) { + return false; + } 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::BufferInfoRole).toUInt(); + if(customBuffers.contains(bufferuid)) + return true; + } + return false; + } else { + return true; + } +} + +bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { + QModelIndex child = sourceModel()->index(source_row, 0, source_parent); + + if(!child.isValid()) { + qDebug() << "filterAcceptsRow has been called with an invalid Child"; + return false; + } + + if(source_parent == QModelIndex()) + return filterAcceptNetwork(child); + else + return filterAcceptBuffer(child); +} + +bool BufferViewFilter::lessThan(const QModelIndex &left, const QModelIndex &right) { + // pretty interesting stuff here, eh? + return QSortFilterProxyModel::lessThan(left, right); +} +