File indexing completed on 2024-04-28 15:39:50

0001 // SPDX-FileCopyrightText: 2003-2022 Jesper K. Pedersen <blackie@kde.org>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 #include "DragableTreeWidget.h"
0006 
0007 #include "CheckDropItem.h"
0008 
0009 #include <DB/Category.h>
0010 
0011 #include <QDragMoveEvent>
0012 
0013 CategoryListView::DragableTreeWidget::DragableTreeWidget(const DB::CategoryPtr &category, QWidget *parent)
0014     : QTreeWidget(parent)
0015     , m_category(category)
0016 {
0017     setDragEnabled(true);
0018     setDragDropMode(DragDrop);
0019     viewport()->setAcceptDrops(true);
0020     setDropIndicatorShown(true);
0021     setSelectionMode(ExtendedSelection);
0022 }
0023 
0024 DB::CategoryPtr CategoryListView::DragableTreeWidget::category() const
0025 {
0026     return m_category;
0027 }
0028 
0029 void CategoryListView::DragableTreeWidget::emitItemsChanged()
0030 {
0031     Q_EMIT itemsChanged();
0032 }
0033 
0034 QMimeData *CategoryListView::DragableTreeWidget::mimeData(const QList<QTreeWidgetItem *> items) const
0035 {
0036     CategoryListView::DragItemInfoSet selected;
0037     for (QTreeWidgetItem *item : items) {
0038         QTreeWidgetItem *parent = item->parent();
0039         QString parentText = parent ? parent->text(0) : QString();
0040         selected.insert(CategoryListView::DragItemInfo(parentText, item->text(0)));
0041     }
0042 
0043     QByteArray data;
0044     QDataStream stream(&data, QIODevice::WriteOnly);
0045     stream << selected;
0046 
0047     QMimeData *mime = new QMimeData;
0048     mime->setData(QString::fromUtf8("x-kphotoalbum/x-categorydrag"), data);
0049     return mime;
0050 }
0051 
0052 QStringList CategoryListView::DragableTreeWidget::mimeTypes() const
0053 {
0054     return QStringList(QString::fromUtf8("x-kphotoalbum/x-categorydrag"));
0055 }
0056 
0057 bool CategoryListView::DragableTreeWidget::dropMimeData(QTreeWidgetItem *parent, int, const QMimeData *data, Qt::DropAction)
0058 {
0059     CheckDropItem *targetItem = static_cast<CheckDropItem *>(parent);
0060     if (targetItem == nullptr) {
0061         // This can happen when an item is dropped between two other items and not
0062         // onto an item, which leads to a crash when calling dataDropped(data).
0063         return false;
0064     } else {
0065         return targetItem->dataDropped(data);
0066     }
0067 }
0068 
0069 void CategoryListView::DragableTreeWidget::dragMoveEvent(QDragMoveEvent *event)
0070 {
0071     // Call super class in any case as it may scroll, which we want even if we reject
0072     QTreeWidget::dragMoveEvent(event);
0073 
0074     if (event->source() != this)
0075         event->ignore();
0076 
0077     QTreeWidgetItem *item = itemAt(event->pos());
0078     if (item && static_cast<CheckDropItem *>(item)->isSelfDrop(event->mimeData()))
0079         event->ignore();
0080 }
0081 
0082 // vi:expandtab:tabstop=4 shiftwidth=4:
0083 
0084 #include "moc_DragableTreeWidget.cpp"