diff --git a/plugins/projectmanagerview/projecttreeview.h b/plugins/projectmanagerview/projecttreeview.h --- a/plugins/projectmanagerview/projecttreeview.h +++ b/plugins/projectmanagerview/projecttreeview.h @@ -23,13 +23,15 @@ #include #include +#include class QAbstractProxyModel; namespace KDevelop { class IProject; class ProjectBaseItem; +class ProjectFolderItem; class Path; } @@ -58,6 +60,8 @@ protected: void keyPressEvent(QKeyEvent *event) override; + void timerEvent(QTimerEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent* event) override; void drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const override; @@ -68,6 +72,8 @@ KDevelop::IProject* getCurrentProject(); QPointer m_previousSelection; + QBasicTimer expandTimer; + KDevelop::ProjectFolderItem *curExpandTarget; }; #endif // KDEVPLATFORM_PLUGIN_PROJECTTREEVIEW_H diff --git a/plugins/projectmanagerview/projecttreeview.cpp b/plugins/projectmanagerview/projecttreeview.cpp --- a/plugins/projectmanagerview/projecttreeview.cpp +++ b/plugins/projectmanagerview/projecttreeview.cpp @@ -146,6 +146,37 @@ return indexAt(pos).data(ProjectModel::ProjectItemRole).value(); } +void ProjectTreeView::timerEvent(QTimerEvent *event) { + if (event->timerId() == expandTimer.timerId()) { + expandTimer.stop(); + expand(mapFromItem(curExpandTarget)); + curExpandTarget = nullptr; + } else { + QTreeView::timerEvent(event); + } +} + +void ProjectTreeView::dragMoveEvent(QDragMoveEvent *event) +{ + ProjectBaseItem *destItem = itemAtPos(event->pos()); + if (destItem && dropIndicatorPosition() == OnItem) { + ProjectFolderItem *folder = destItem->folder(); + bool canExpand = folder && !isExpanded(mapFromItem(folder)) && autoExpandDelay() >= 0; + bool expandTargetNotChanged = folder && folder == curExpandTarget; + if (folder != curExpandTarget && canExpand) { + curExpandTarget = folder; + expandTimer.start(autoExpandDelay(), this); + } else if (!expandTargetNotChanged) { + expandTimer.stop(); + curExpandTarget = nullptr; + } + } else { + expandTimer.stop(); + curExpandTarget = nullptr; + } + QAbstractItemView::dragMoveEvent(event); +} + void ProjectTreeView::dropEvent(QDropEvent* event) { ProjectItemContext* selectionCtxt =