Skip to content

Commit 00931df

Browse files
committed
App: add drag and drop in favorite
1 parent b563fcc commit 00931df

4 files changed

Lines changed: 145 additions & 51 deletions

File tree

App/Client/Favorite/FavoriteModel.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,47 @@ bool CFavoriteModel::UpdateFavorite(
270270
return true;
271271
}
272272

273+
bool CFavoriteModel::Move(QModelIndex index, QModelIndex parentIndex)
274+
{
275+
if(!index.isValid()) return false;
276+
tree* ip = GetTree(index);
277+
if(!ip) return false;
278+
tree* ipParent = GetTree(parentIndex);
279+
if(!ipParent || ipParent->item.isFavorite()) return false;
280+
int nParentId = ipParent->item.id;
281+
auto& item = ip->item;
282+
bool bRet = false;
283+
if(item.isFavorite())
284+
bRet = m_pDatabase->Move(item.id, nParentId);
285+
else
286+
bRet = m_pDatabase->MoveNode(item.id, nParentId);
287+
if(!bRet) return false;
288+
bRet = MoveTree(ip->item, ipParent->item.id);
289+
return bRet;
290+
}
291+
292+
// TODO: not test!!!
293+
bool CFavoriteModel::Copy(QModelIndex index, QModelIndex parentIndex)
294+
{
295+
bool bRet = true;
296+
if(!index.isValid()) return false;
297+
tree* ip = GetTree(index);
298+
if(!ip) return false;
299+
tree* ipParent = GetTree(parentIndex);
300+
if(!ipParent || ipParent->item.isFavorite()) return false;
301+
int nParentId = ipParent->item.id;
302+
auto& item = ip->item;
303+
if(item.isFavorite())
304+
bRet = AddFavorite(item.szFile, item.szName, item.GetIcon(),
305+
item.szDescription, nParentId);
306+
else {
307+
bRet = m_pDatabase->AddNode(item.szName, nParentId);
308+
if(!bRet) return false;
309+
bRet = AddTree(item, nParentId);
310+
}
311+
return bRet;
312+
}
313+
273314
CFavoriteDatabase::Item CFavoriteModel::GetFavorite(const QString &szFile)
274315
{
275316
CFavoriteDatabase::Item item;

App/Client/Favorite/FavoriteModel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class CFavoriteModel : public QAbstractItemModel
2626
CFavoriteDatabase::Item GetFavorite(const QString& szFile);
2727
void Refresh();
2828

29+
bool Move(QModelIndex index, QModelIndex parentIndex);
30+
bool Copy(QModelIndex index, QModelIndex parentIndex);
2931
enum RoleType {
3032
RoleFile = Qt::UserRole,
3133
RoleNodeType,

App/Client/Favorite/FavoriteView.cpp

Lines changed: 99 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,14 @@ void CFavoriteView::setupTreeView(QLayout *layout)
185185
return;
186186
layout->addWidget(m_pTreeView);
187187

188+
//m_pTreeView->installEventFilter(this);
189+
m_pTreeView->viewport()->installEventFilter(this);
188190
m_pTreeView->setAcceptDrops(true);
191+
m_pTreeView->setDragEnabled(true);
192+
m_pTreeView->setDragDropMode(QTreeView::InternalMove);
193+
m_pTreeView->setDefaultDropAction(Qt::MoveAction);
194+
m_pTreeView->setDropIndicatorShown(true);
195+
189196
m_pTreeView->setUniformRowHeights(true);
190197
m_pTreeView->setHeaderHidden(true);
191198

@@ -508,77 +515,83 @@ void CFavoriteView::slotExport()
508515

509516
void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
510517
{
511-
qDebug(log) << "dragEnterEvent";
518+
qDebug(log) << Q_FUNC_INFO;
512519
const CFavoriteMimeData* pData =
513520
qobject_cast<const CFavoriteMimeData*>(event->mimeData());
514521
if (pData)
515522
{
516523
qDebug(log) << "dragEnterEvent acceptProposedAction";
517524
event->acceptProposedAction();
518-
}
525+
/*
526+
// 设置拖拽时的光标
527+
if (event->proposedAction() == Qt::MoveAction) {
528+
setCursor(Qt::DragMoveCursor);
529+
} else {
530+
setCursor(Qt::DragCopyCursor);
531+
}//*/
532+
} else
533+
event->ignore();
519534
}
520535

521536
void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
522537
{
538+
qDebug(log) << Q_FUNC_INFO;
539+
const CFavoriteMimeData* pData =
540+
qobject_cast<const CFavoriteMimeData*>(event->mimeData());
541+
if (!pData)
542+
{
543+
event->ignore();
544+
return;
545+
}
523546
}
524547

525548
void CFavoriteView::dropEvent(QDropEvent *event)
526549
{
527-
qDebug(log) << "dropEvent";
550+
qDebug(log) << Q_FUNC_INFO << "drop action:" << event->dropAction();
551+
528552
const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
529-
if(!pData) return;
530-
/*
531-
QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
532-
if(!pModel) return;
553+
if(!pData || pData->m_Items.isEmpty() || !m_pTreeView || !m_pModel) {
554+
event->ignore();
555+
return;
556+
}
557+
558+
bool bRet = false;
533559
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
534-
auto index = indexAt(event->position().toPoint());
560+
auto idxParent = m_pTreeView->indexAt(event->position().toPoint());
535561
#else
536-
auto index = indexAt(event->pos());
562+
auto idxParent = m_pTreeView->indexAt(event->pos());
537563
#endif
538-
if(index.isValid())
564+
565+
CFavoriteDatabase::Item item
566+
= m_pModel->data(idxParent, CFavoriteModel::RoleItem)
567+
.value<CFavoriteDatabase::Item>();
568+
if(0 < item.id && item.isFolder())
539569
{
540-
auto item = pModel->itemFromIndex(index);
541-
if(item->data().isNull())
542-
{
543-
foreach(auto i, pData->m_Items)
544-
{
545-
qDebug(log) << "dropEvent:" << item->text();
546-
547-
auto newItem = NewItem(i);
548-
item->appendRow(newItem);
549-
if(event->dropAction() == Qt::MoveAction)
550-
pModel->removeRow(i.row(), i.parent());
551-
}
552-
} else
553-
qWarning(log) << "Don't group node. the data:" << item->data();
554-
}else{
555570
foreach(auto i, pData->m_Items)
556571
{
557-
pModel->appendRow(NewItem(i));
558-
if(event->dropAction() == Qt::MoveAction)
559-
pModel->removeRow(i.row(), i.parent());
572+
if (event->dropAction() == Qt::MoveAction)
573+
bRet = m_pModel->Move(i, idxParent);
574+
else if (event->dropAction() == Qt::CopyAction)
575+
bRet = m_pModel->Copy(i, idxParent);
576+
if(!bRet) break;
560577
}
578+
} else {
579+
qWarning(log) << "Don't group node. the id:" << item.id
580+
<< " Folder:" << item.isFolder();
561581
}
562-
//*/
563-
event->accept();
564-
}
565-
/*
566-
QStandardItem* CFavoriteView::NewItem(const QModelIndex &index)
567-
{
568-
QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
569-
if(!pModel) return nullptr;
570-
auto item = pModel->itemFromIndex(index);
571-
if(!item) return nullptr;
572-
auto ri = new QStandardItem(item->text());
573-
ri->setData(item->data());
574-
return ri;
582+
583+
if(bRet)
584+
event->accept();
585+
else
586+
event->ignore();
575587
}
576588

577589
void CFavoriteView::mousePressEvent(QMouseEvent *event)
578590
{
591+
qDebug(log) << "mousePressEvent";
579592
if (event->button() == Qt::LeftButton)
580593
m_DragStartPosition = event->pos();
581-
QTreeView::mousePressEvent(event);
594+
QWidget::mousePressEvent(event);
582595
}
583596

584597
void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
@@ -591,22 +604,61 @@ void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
591604
< QApplication::startDragDistance())
592605
break;
593606
qDebug(log) << "mouseMoveEvent drag";
607+
// 获取选中的索引
608+
QModelIndexList indexes = m_pTreeView->selectionModel()->selectedIndexes();
609+
if (indexes.isEmpty()) {
610+
break;
611+
}
594612
QDrag *drag = new QDrag(this);
595613
CFavoriteMimeData *pData = new CFavoriteMimeData();
596-
pData->m_Items = this->selectionModel()->selectedIndexes();
614+
pData->m_Items = indexes;
597615
drag->setMimeData(pData);
598-
599616
Qt::DropAction dropAction = Qt::MoveAction;
600-
if(event->modifiers() & Qt::ControlModifier)
617+
/*
618+
if(event->modifiers() & Qt::ControlModifier) {
601619
dropAction = Qt::CopyAction;
620+
// 设置拖拽时的光标
621+
// QIcon icon = QIcon::fromTheme("edit-copy");
622+
// QSize size(16, 16);
623+
// if(!icon.availableSizes().isEmpty())
624+
// size = icon.availableSizes().at(0);
625+
// drag->setDragCursor(icon.pixmap(size), Qt::MoveAction);
626+
}//*/
602627
drag->exec(dropAction);
603628
} while (false);
604629

605-
QTreeView::mouseMoveEvent(event);
630+
QWidget::mouseMoveEvent(event);
606631
}
607-
//*/
632+
608633
bool CFavoriteView::eventFilter(QObject *watched, QEvent *event)
609634
{
635+
// 处理 treeview 的事件
636+
if (watched == m_pTreeView->viewport()) { // 处理 viewport 的事件
637+
qDebug(log) << Q_FUNC_INFO << "Viewport event:" << event->type();
638+
639+
switch (event->type()) {
640+
case QEvent::DragEnter:
641+
dragEnterEvent(static_cast<QDragEnterEvent*>(event));
642+
return true;
643+
case QEvent::DragMove:
644+
dragMoveEvent(static_cast<QDragMoveEvent*>(event));
645+
return true;
646+
case QEvent::Drop:
647+
dropEvent(static_cast<QDropEvent*>(event));
648+
return true;
649+
case QEvent::MouseButtonPress:
650+
mousePressEvent(static_cast<QMouseEvent*>(event));
651+
// 不返回true,让 viewport 也处理
652+
break;
653+
case QEvent::MouseMove:
654+
mouseMoveEvent(static_cast<QMouseEvent*>(event));
655+
// 不返回true,让 viewport 也处理
656+
break;
657+
default:
658+
break;
659+
}
660+
}
661+
610662
return QWidget::eventFilter(watched, event);
611663
}
612664

App/Client/Favorite/FavoriteView.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,20 @@ public Q_SLOTS:
3535
const QString& szName = QString(),
3636
const QString& szDescription = QString(),
3737
const QIcon& icon = QIcon());
38-
virtual bool eventFilter(QObject *watched, QEvent *event) override;
3938

4039
Q_SIGNALS:
4140
void sigStart(const QString &szFile, bool bOpenSettings);
4241
void sigFavorite();
4342

44-
// QWidget interface
4543
protected:
44+
virtual bool eventFilter(QObject *watched, QEvent *event) override;
4645
virtual void dragEnterEvent(QDragEnterEvent *event) override;
4746
virtual void dragMoveEvent(QDragMoveEvent *event) override;
4847
virtual void dropEvent(QDropEvent *event) override;
49-
/*
48+
5049
virtual void mousePressEvent(QMouseEvent *event) override;
5150
virtual void mouseMoveEvent(QMouseEvent *event) override;
52-
*/
51+
5352
private slots:
5453
void slotFavrtieClicked(const QModelIndex &index);
5554
void slotFavortiedoubleClicked(const QModelIndex &index);

0 commit comments

Comments
 (0)