+bool BufferViewFilter::bufferLessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
+ BufferId leftBufferId = sourceModel()->data(source_left, NetworkModel::BufferIdRole).value<BufferId>();
+ BufferId rightBufferId = sourceModel()->data(source_right, NetworkModel::BufferIdRole).value<BufferId>();
+ if(config()) {
+ int leftPos = config()->bufferList().indexOf(leftBufferId);
+ int rightPos = config()->bufferList().indexOf(rightBufferId);
+ if(leftPos == -1 && rightPos == -1)
+ return QSortFilterProxyModel::lessThan(source_left, source_right);
+ if(leftPos == -1 || rightPos == -1)
+ return !(leftPos < rightPos);
+ return leftPos < rightPos;
+ } else
+ return bufferIdLessThan(leftBufferId, rightBufferId);
+}
+
+bool BufferViewFilter::networkLessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
+ NetworkId leftNetworkId = sourceModel()->data(source_left, NetworkModel::NetworkIdRole).value<NetworkId>();
+ NetworkId rightNetworkId = sourceModel()->data(source_right, NetworkModel::NetworkIdRole).value<NetworkId>();
+
+ return QSortFilterProxyModel::lessThan(source_left, source_right);
+}
+
+QVariant BufferViewFilter::data(const QModelIndex &index, int role) const {
+ switch(role) {
+ case Qt::DecorationRole:
+ return icon(index);
+ case Qt::CheckStateRole:
+ return checkedState(index);
+ default:
+ return QSortFilterProxyModel::data(index, role);
+ }
+}
+
+QVariant BufferViewFilter::icon(const QModelIndex &index) const {
+ if(!_showUserStateIcons || (config() && config()->disableDecoration()))
+ return QVariant();
+
+ if(index.column() != 0)
+ return QVariant();
+
+ QModelIndex source_index = mapToSource(index);
+ if(sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt() != NetworkModel::BufferItemType)
+ return QVariant();
+
+ if(sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt() != BufferInfo::QueryBuffer)
+ return QVariant();
+
+ if(!sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool())
+ return _userOfflineIcon;
+
+ if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool())
+ return _userAwayIcon;
+ else
+ return _userOnlineIcon;
+
+ return QVariant();
+}
+
+QVariant BufferViewFilter::checkedState(const QModelIndex &index) const {
+ if(!_editMode || !config())
+ return QVariant();
+
+ QModelIndex source_index = mapToSource(index);
+ if(source_index == QModelIndex() || sourceModel()->data(source_index, NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType)
+ return QVariant();
+
+ BufferId bufferId = sourceModel()->data(source_index, NetworkModel::BufferIdRole).value<BufferId>();
+ if(_toAdd.contains(bufferId))
+ return Qt::Checked;
+
+ if(_toTempRemove.contains(bufferId))
+ return Qt::PartiallyChecked;
+
+ if(_toRemove.contains(bufferId))
+ return Qt::Unchecked;
+
+ if(config()->bufferList().contains(bufferId))
+ return Qt::Checked;
+
+ if(config()->temporarilyRemovedBuffers().contains(bufferId))
+ return Qt::PartiallyChecked;
+
+ return Qt::Unchecked;
+}
+
+bool BufferViewFilter::setData(const QModelIndex &index, const QVariant &value, int role) {
+ switch(role) {
+ case Qt::CheckStateRole:
+ return setCheckedState(index, Qt::CheckState(value.toInt()));
+ default:
+ return QSortFilterProxyModel::setData(index, value, role);
+ }
+}
+
+bool BufferViewFilter::setCheckedState(const QModelIndex &index, Qt::CheckState state) {
+ QModelIndex source_index = mapToSource(index);
+ BufferId bufferId = sourceModel()->data(source_index, NetworkModel::BufferIdRole).value<BufferId>();
+ if(!bufferId.isValid())
+ return false;
+
+ switch(state) {
+ case Qt::Unchecked:
+ _toAdd.remove(bufferId);
+ _toTempRemove.remove(bufferId);
+ _toRemove << bufferId;
+ break;
+ case Qt::PartiallyChecked:
+ _toAdd.remove(bufferId);
+ _toTempRemove << bufferId;
+ _toRemove.remove(bufferId);
+ break;
+ case Qt::Checked:
+ _toAdd << bufferId;
+ _toTempRemove.remove(bufferId);
+ _toRemove.remove(bufferId);
+ break;
+ default:
+ return false;
+ }
+ emit dataChanged(index, index);
+ return true;
+}
+
+void BufferViewFilter::checkPreviousCurrentForRemoval(const QModelIndex ¤t, const QModelIndex &previous) {
+ Q_UNUSED(current);
+ if(previous.isValid())
+ QCoreApplication::postEvent(this, new CheckRemovalEvent(previous));
+}
+
+void BufferViewFilter::customEvent(QEvent *event) {
+ if(event->type() != QEvent::User)
+ return;
+
+ CheckRemovalEvent *removalEvent = static_cast<CheckRemovalEvent *>(event);
+ checkItemForRemoval(removalEvent->index);
+
+ event->accept();
+}
+
+void BufferViewFilter::checkItemsForRemoval(const QModelIndex &topLeft, const QModelIndex &bottomRight) {
+ QModelIndex source_topLeft = mapToSource(topLeft);
+ QModelIndex source_bottomRight = mapToSource(bottomRight);
+ emit _dataChanged(source_topLeft, source_bottomRight);
+}
+
+bool BufferViewFilter::bufferIdLessThan(const BufferId &left, const BufferId &right) {
+ Q_CHECK_PTR(Client::networkModel());
+ if(!Client::networkModel())
+ return true;
+
+ QModelIndex leftIndex = Client::networkModel()->bufferIndex(left);
+ QModelIndex rightIndex = Client::networkModel()->bufferIndex(right);
+
+ int leftType = Client::networkModel()->data(leftIndex, NetworkModel::BufferTypeRole).toInt();
+ int rightType = Client::networkModel()->data(rightIndex, NetworkModel::BufferTypeRole).toInt();