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"