+QList<QAction*> BufferViewFilter::actions(const QModelIndex& index)
+{
+ Q_UNUSED(index)
+ QList<QAction*> actionList;
+ actionList << &_enableEditMode;
+ return actionList;
+}
+
+void BufferViewFilter::setFilterString(const QString string)
+{
+ beginResetModel();
+ _filterString = string;
+ endResetModel();
+ enableEditMode(!string.isEmpty());
+}
+
+void BufferViewFilter::enableEditMode(bool enable)
+{
+ if (_editMode == enable) {
+ return;
+ }
+ _editMode = enable;
+
+ if (!config())
+ return;
+
+ if (enable == false) {
+ addBuffers(_toAdd.values());
+ QSet<BufferId>::const_iterator iter;
+ for (iter = _toTempRemove.constBegin(); iter != _toTempRemove.constEnd(); ++iter) {
+ if (config()->temporarilyRemovedBuffers().contains(*iter))
+ continue;
+ config()->requestRemoveBuffer(*iter);
+ }
+ for (iter = _toRemove.constBegin(); iter != _toRemove.constEnd(); ++iter) {
+ if (config()->removedBuffers().contains(*iter))
+ continue;
+ config()->requestRemoveBufferPermanently(*iter);
+ }
+ }
+ _toAdd.clear();
+ _toTempRemove.clear();
+ _toRemove.clear();
+
+ invalidate();
+}
+
+Qt::ItemFlags BufferViewFilter::flags(const QModelIndex& index) const
+{
+ QModelIndex source_index = mapToSource(index);
+ Qt::ItemFlags flags = sourceModel()->flags(source_index);
+ if (config()) {
+ BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt();
+
+ // We need Status Buffers to be a drop target, to allow for rearranging buffers.
+ // The Status Buffer "owns" the space between Channel/Query buffers in the tree.
+ // This DOES mean that it looks like you can merge a buffer into the Status buffer, but that is restricted in BufferView::dropEvent().
+ if (bufferType == BufferInfo::StatusBuffer) {
+ // But only if the layout isn't locked!
+ auto* clientConf = qobject_cast<ClientBufferViewConfig*>(config());
+ if (clientConf && !clientConf->isLocked()) {
+ flags |= Qt::ItemIsDropEnabled;
+ }
+ }
+
+ // If we're in Edit Mode, everything except Status Buffers should be hideable.
+ if (_editMode && bufferType != BufferInfo::StatusBuffer) {
+ flags |= Qt::ItemIsUserCheckable | Qt::ItemIsTristate;
+ }
+ }
+ return flags;
+}
+
+bool BufferViewFilter::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent)
+{
+ if (!config() || !NetworkModel::mimeContainsBufferList(data))
+ return QSortFilterProxyModel::dropMimeData(data, action, row, column, parent);
+
+ NetworkId droppedNetworkId;
+ QModelIndex source_parent = mapToSource(parent);
+ if (sourceModel()->data(source_parent, NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType)
+ droppedNetworkId = sourceModel()->data(source_parent, NetworkModel::NetworkIdRole).value<NetworkId>();
+
+ QList<QPair<NetworkId, BufferId>> bufferList = NetworkModel::mimeDataToBufferList(data);
+ BufferId bufferId;
+ NetworkId networkId;
+ int pos;
+ for (int i = 0; i < bufferList.count(); i++) {
+ networkId = bufferList[i].first;
+ bufferId = bufferList[i].second;
+ if (droppedNetworkId == networkId) {
+ if (row < 0)
+ row = 0;
+
+ if (row < rowCount(parent)) {
+ QModelIndex source_child = mapToSource(index(row, 0, parent));
+ BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value<BufferId>();
+ pos = config()->bufferList().indexOf(beforeBufferId);
+ if (_sortOrder == Qt::DescendingOrder)
+ pos++;
+ }
+ else {
+ if (_sortOrder == Qt::AscendingOrder)
+ pos = config()->bufferList().count();
+ else
+ pos = 0;
+ }
+
+ if (config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) {
+ if (config()->bufferList().indexOf(bufferId) < pos)
+ pos--;
+ auto* clientConf = qobject_cast<ClientBufferViewConfig*>(config());
+ if (!clientConf || !clientConf->isLocked())
+ config()->requestMoveBuffer(bufferId, pos);
+ }
+ else {
+ config()->requestAddBuffer(bufferId, pos);
+ }
+ }
+ else {
+ addBuffer(bufferId);
+ }
+ }
+ return true;
+}
+
+void BufferViewFilter::sort(int column, Qt::SortOrder order)
+{
+ _sortOrder = order;
+ QSortFilterProxyModel::sort(column, order);