/******************************************************************************* * plugins/FeedReader/gui/FeedTreeWidget.cpp * * * * Copyright (C) 2012 RetroShare Team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Affero General Public License for more details. * * * * You should have received a copy of the GNU Affero General Public License * * along with this program. If not, see . * * * *******************************************************************************/ #include #include "FeedTreeWidget.h" FeedTreeWidget::FeedTreeWidget(QWidget *parent) : RSTreeWidget(parent) { mDraggedItem = NULL; } void FeedTreeWidget::dragEnterEvent(QDragEnterEvent *event) { mDraggedItem = currentItem(); RSTreeWidget::dragEnterEvent(event); } void FeedTreeWidget::dragLeaveEvent(QDragLeaveEvent *event) { RSTreeWidget::dragLeaveEvent(event); mDraggedItem = NULL; } bool FeedTreeWidget::canDrop(QDropEvent *event, QTreeWidgetItem **dropItem) { if (dropItem) { *dropItem = NULL; } if (!mDraggedItem) { /* no drag item */ return false; } QModelIndex droppedIndex = indexAt(event->pos()); if (!droppedIndex.isValid()) { /* no drop target */ return false; } QTreeWidgetItem *dropItemIntern = itemFromIndex(droppedIndex); if (!dropItemIntern) { /* no drop item */ return false; } if ((dropItemIntern->flags() & Qt::ItemIsDropEnabled) == 0) { /* drop is disabled */ return false; } if (dropItemIntern == mDraggedItem->parent()) { /* drag item parent */ return false; } if (dropItem) { *dropItem = dropItemIntern; } return true; } void FeedTreeWidget::dragMoveEvent(QDragMoveEvent *event) { if (!canDrop(event)) { event->ignore(); return; } RSTreeWidget::dragMoveEvent(event); } void FeedTreeWidget::dropEvent(QDropEvent *event) { QTreeWidgetItem *dropItem; if (!canDrop(event, &dropItem)) { event->ignore(); return; } if (!mDraggedItem) { /* no drag item */ event->ignore(); return; } QTreeWidgetItem *draggedParent = mDraggedItem->parent(); if (!draggedParent) { /* no drag item parent */ event->ignore(); return; } if (!dropItem) { /* no drop item */ event->ignore(); return; } emit feedReparent(mDraggedItem, dropItem); }