1111#include < QMessageBox>
1212#include < QInputDialog>
1313#include < QApplication>
14+ #include < QHeaderView>
15+ #include < QMimeData>
1416
1517Tree::Tree (QSplitter *splitter)
1618 : QObject(splitter),
1719 m_iconProvider(std::make_unique<QFileIconProvider>()),
1820 m_model(std::make_unique<QFileSystemModel>()),
1921 m_tree(std::make_unique<QTreeView>(splitter))
2022{
21- connect (m_tree.get (), &QTreeView::doubleClicked , this , &Tree::openFile);
23+ connect (m_tree.get (), &QTreeView::clicked , this , &Tree::openFile);
2224}
2325
2426Tree::~Tree () {}
@@ -34,6 +36,7 @@ void Tree::setupModel(const QString &directory)
3436 m_model->setRootPath (directory);
3537 m_model->setIconProvider (m_iconProvider.get ());
3638 m_model->setFilter (QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot);
39+ m_model->setReadOnly (false );
3740}
3841
3942void Tree::setupTree ()
@@ -53,13 +56,52 @@ void Tree::setupTree()
5356 m_tree->setHeaderHidden (true );
5457 m_tree->setUniformRowHeights (true );
5558
59+ // Configure file/folder drag & drop
60+ m_tree->setDragDropMode (QAbstractItemView::InternalMove);
61+ m_tree->setDragEnabled (true );
62+ m_tree->setAcceptDrops (true );
63+ m_tree->setDropIndicatorShown (true );
64+ m_tree->setDefaultDropAction (Qt::MoveAction);
65+ m_tree->setEditTriggers (QAbstractItemView::NoEditTriggers);
66+
5667 for (int i = 1 ; i <= m_model->columnCount (); ++i)
5768 {
5869 m_tree->setColumnHidden (i, true );
5970 }
6071
6172 m_tree->setContextMenuPolicy (Qt::CustomContextMenu);
6273 connect (m_tree.get (), &QTreeView::customContextMenuRequested, this , &Tree::showContextMenu);
74+
75+ // Connect to dragEnter and dragMove events
76+ m_tree->installEventFilter (this );
77+ }
78+
79+ bool Tree::eventFilter (QObject *obj, QEvent *event)
80+ {
81+ if (obj == m_tree.get ())
82+ {
83+ if (event->type () == QEvent::DragEnter)
84+ {
85+ QDragEnterEvent *dragEvent = static_cast <QDragEnterEvent *>(event);
86+ if (dragEvent->mimeData ()->hasUrls ())
87+ {
88+ dragEvent->acceptProposedAction ();
89+ return true ;
90+ }
91+ }
92+
93+ else if (event->type () == QEvent::DragMove)
94+ {
95+ QDragMoveEvent *dragEvent = static_cast <QDragMoveEvent *>(event);
96+ if (dragEvent->mimeData ()->hasUrls ())
97+ {
98+ dragEvent->acceptProposedAction ();
99+ return true ;
100+ }
101+ }
102+ }
103+
104+ return QObject::eventFilter (obj, event);
63105}
64106
65107void Tree::openFile (const QModelIndex &index)
0 commit comments