X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=5b58ee5618709f80731053724e00ca481da40547;hp=dfad3c21affe14b628b5cc64a5abb4fb704b6181;hb=bbff8b7b37e35f61279b1e8b06a97969fe87f2a6;hpb=7401b1e634438ea9cafd195a79a804b42cc9f135 diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index dfad3c21..5b58ee56 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -28,6 +28,7 @@ #include "buffermodel.h" #include "buffersettings.h" #include "client.h" +#include "clientbufferviewconfig.h" #include "iconloader.h" #include "networkmodel.h" @@ -44,6 +45,8 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig * : QSortFilterProxyModel(model), _config(0), _sortOrder(Qt::AscendingOrder), + _channelJoinedIcon(SmallIcon("irc-channel-active")), + _channelPartedIcon(SmallIcon("irc-channel-inactive")), _userOfflineIcon(SmallIcon("im-user-offline")), _userAwayIcon(SmallIcon("im-user-away")), _userOnlineIcon(SmallIcon("im-user")), @@ -138,13 +141,8 @@ void BufferViewFilter::enableEditMode(bool enable) { return; if(enable == false) { - int numBuffers = config()->bufferList().count(); + addBuffers(QList::fromSet(_toAdd)); QSet::const_iterator iter; - for(iter = _toAdd.constBegin(); iter != _toAdd.constEnd(); iter++) { - if(config()->bufferList().contains(*iter)) - continue; - config()->requestAddBuffer(*iter, numBuffers); - } for(iter = _toTempRemove.constBegin(); iter != _toTempRemove.constEnd(); iter++) { if(config()->temporarilyRemovedBuffers().contains(*iter)) continue; @@ -167,12 +165,23 @@ void BufferViewFilter::enableEditMode(bool enable) { Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const { QModelIndex source_index = mapToSource(index); Qt::ItemFlags flags = sourceModel()->flags(source_index); - if(_config) { - if(source_index == QModelIndex() || sourceModel()->data(source_index, NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType) { + if(config()) { + NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt(); + BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt(); + if(source_index == QModelIndex() || itemType == NetworkModel::NetworkItemType) { flags |= Qt::ItemIsDropEnabled; } else if(_editMode) { flags |= Qt::ItemIsUserCheckable | Qt::ItemIsTristate; } + + // prohibit dragging of most items. and most drop places + // only query to query is allowed for merging + if(bufferType != BufferInfo::QueryBuffer) { + ClientBufferViewConfig *clientConf = qobject_cast(config()); + if(clientConf && clientConf->isLocked()) { + flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled); + } + } } return flags; } @@ -198,7 +207,7 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action row = 0; if(row < rowCount(parent)) { - QModelIndex source_child = sourceModel()->index(row, 0, parent); + QModelIndex source_child = mapToSource(index(row, 0, parent)); BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value(); pos = config()->bufferList().indexOf(beforeBufferId); if(_sortOrder == Qt::DescendingOrder) @@ -210,10 +219,12 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action pos = 0; } - if(config()->bufferList().contains(bufferId)) { + if(config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) { if(config()->bufferList().indexOf(bufferId) < pos) pos--; - config()->requestMoveBuffer(bufferId, pos); + ClientBufferViewConfig *clientConf = qobject_cast(config()); + if(!clientConf || !clientConf->isLocked()) + config()->requestMoveBuffer(bufferId, pos); } else { config()->requestAddBuffer(bufferId, pos); } @@ -250,6 +261,33 @@ void BufferViewFilter::addBuffer(const BufferId &bufferId) const { config()->requestAddBuffer(bufferId, pos); } +void BufferViewFilter::addBuffers(const QList &bufferIds) const { + if(!config()) + return; + + QList bufferList = config()->bufferList(); + foreach(BufferId bufferId, bufferIds) { + if(bufferList.contains(bufferId)) + continue; + + int pos = bufferList.count(); + bool lt; + for(int i = 0; i < bufferList.count(); i++) { + if(config() && config()->sortAlphabetically()) + lt = bufferIdLessThan(bufferId, bufferList[i]); + else + lt = bufferId < config()->bufferList()[i]; + + if(lt) { + pos = i; + bufferList.insert(pos, bufferId); + break; + } + } + config()->requestAddBuffer(bufferId, pos); + } +} + bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const { // no config -> "all buffers" -> accept everything if(!config()) @@ -262,7 +300,8 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) if(!config()->bufferList().contains(bufferId) && !_editMode) { // add the buffer if... - if(config()->isInitialized() && !config()->removedBuffers().contains(bufferId) // it hasn't been manually removed and either + if(config()->isInitialized() + && !config()->removedBuffers().contains(bufferId) // it hasn't been manually removed and either && ((config()->addNewBuffersAutomatically() && !config()->temporarilyRemovedBuffers().contains(bufferId)) // is totally unknown to us (a new buffer)... || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us. addBuffer(bufferId); @@ -313,10 +352,15 @@ bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &sourc return false; } - if(!source_parent.isValid()) + NetworkModel::ItemType childType = (NetworkModel::ItemType)sourceModel()->data(child, NetworkModel::ItemTypeRole).toInt(); + switch(childType) { + case NetworkModel::NetworkItemType: return filterAcceptNetwork(child); - else + case NetworkModel::BufferItemType: return filterAcceptBuffer(child); + default: + return false; + } } bool BufferViewFilter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { @@ -352,10 +396,7 @@ bool BufferViewFilter::networkLessThan(const QModelIndex &source_left, const QMo NetworkId leftNetworkId = sourceModel()->data(source_left, NetworkModel::NetworkIdRole).value(); NetworkId rightNetworkId = sourceModel()->data(source_right, NetworkModel::NetworkIdRole).value(); - if(config() && config()->sortAlphabetically()) - return QSortFilterProxyModel::lessThan(source_left, source_right); - else - return leftNetworkId < rightNetworkId; + return QSortFilterProxyModel::lessThan(source_left, source_right); } QVariant BufferViewFilter::data(const QModelIndex &index, int role) const { @@ -377,18 +418,29 @@ QVariant BufferViewFilter::icon(const QModelIndex &index) const { return QVariant(); QModelIndex source_index = mapToSource(index); - if(sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt() != BufferInfo::QueryBuffer) - return QVariant(); - - if(!sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool()) - return _userOfflineIcon; + NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt(); + BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt(); + bool isActive = sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool(); - if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool()) - return _userAwayIcon; - else - return _userOnlineIcon; + if(itemType != NetworkModel::BufferItemType) + return QVariant(); - return QVariant(); + switch(bufferType) { + case BufferInfo::ChannelBuffer: + if(isActive) + return _channelJoinedIcon; + else + return _channelPartedIcon; + case BufferInfo::QueryBuffer: + if(!isActive) + return _userOfflineIcon; + if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool()) + return _userAwayIcon; + else + return _userOnlineIcon; + default: + return QVariant(); + } } QVariant BufferViewFilter::checkedState(const QModelIndex &index) const {