mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-20 13:24:33 -05:00
120 lines
3.2 KiB
C++
120 lines
3.2 KiB
C++
|
/*******************************************************************************
|
||
|
* plugins/FeedReader/gui/FeedTreeWidget.cpp *
|
||
|
* *
|
||
|
* Copyright (C) 2012 RetroShare Team <retroshare.project@gmail.com> *
|
||
|
* *
|
||
|
* 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 <https://www.gnu.org/licenses/>. *
|
||
|
* *
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include <QDropEvent>
|
||
|
#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);
|
||
|
}
|