bool MailboxModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { Q_UNUSED(row); Q_UNUSED(column); if (action != Qt::CopyAction && action != Qt::MoveAction) return false; if (! parent.isValid()) return false; if (! static_cast<Model *>(sourceModel())->isNetworkAvailable()) return false; TreeItemMailbox *target = dynamic_cast<TreeItemMailbox *>(static_cast<TreeItem *>(parent.internalPointer())); Q_ASSERT(target); if (! target->isSelectable()) return false; QByteArray encodedData = data->data(QLatin1String("application/x-trojita-message-list")); QDataStream stream(&encodedData, QIODevice::ReadOnly); Q_ASSERT(! stream.atEnd()); QString origMboxName; stream >> origMboxName; TreeItemMailbox *origMbox = static_cast<Model *>(sourceModel())->findMailboxByName(origMboxName); if (! origMbox) { qDebug() << "Can't find original mailbox when performing a drag&drop on messages"; return false; } uint uidValidity; stream >> uidValidity; if (uidValidity != origMbox->syncState.uidValidity()) { qDebug() << "UID validity for original mailbox got changed, can't copy messages"; return false; } Imap::Uids uids; stream >> uids; static_cast<Model *>(sourceModel())->copyMoveMessages(origMbox, target->mailbox(), uids, (action == Qt::MoveAction) ? MOVE : COPY); return true; }
Qt::ItemFlags MailboxModel::flags(const QModelIndex &index) const { if (! index.isValid()) return QAbstractProxyModel::flags(index); TreeItemMailbox *mbox = dynamic_cast<TreeItemMailbox *>(static_cast<TreeItem *>(index.internalPointer())); Q_ASSERT(mbox); Qt::ItemFlags res = QAbstractProxyModel::flags(index); if (!mbox->isSelectable()) { res &= ~Qt::ItemIsSelectable; res |= Qt::ItemIsEnabled; } if (static_cast<Model *>(sourceModel())->isNetworkAvailable()) { res |= Qt::ItemIsDropEnabled; } return res; }