Skip to content

Commit f395579

Browse files
committed
[improvement] update Tree class to support drag & drop functionality and modify click behavior
1 parent 3028825 commit f395579

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

include/Tree.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,7 @@ class Tree : public QObject
4242
std::unique_ptr<QFileIconProvider> m_iconProvider;
4343
std::unique_ptr<QFileSystemModel> m_model;
4444
std::unique_ptr<QTreeView> m_tree;
45+
46+
protected:
47+
bool eventFilter(QObject *obj, QEvent *event) override;
4548
};

src/Tree.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@
1111
#include <QMessageBox>
1212
#include <QInputDialog>
1313
#include <QApplication>
14+
#include <QHeaderView>
15+
#include <QMimeData>
1416

1517
Tree::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

2426
Tree::~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

3942
void 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

65107
void Tree::openFile(const QModelIndex &index)

0 commit comments

Comments
 (0)