-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfileselectionwidget.cpp
115 lines (103 loc) · 3.01 KB
/
fileselectionwidget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "fileselectionwidget.h"
#include "ui_fileselectionwidget.h"
#include <QMimeData>
#include <QDragEnterEvent>
#include <QFileDialog>
#include <QFileInfo>
namespace {
bool defaultFileChecker(const QString& path){
const QFileInfo info(path);
if (info.exists() && info.isFile()) {
return true;
}
return false;
}
bool defaultDirectoryChecker(const QString& path) {
const QFileInfo info(path);
if (info.exists() && info.isDir()) {
return true;
}
return false;
}
} // end anonymous namespace
FileSelectionWidget::FileSelectionWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::FileSelectionWidget)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &FileSelectionWidget::requestOpenDialog);
setAcceptDrops(true);
setDirectoryMode(isDirectoryMode);
}
void FileSelectionWidget::setDirectoryMode(bool v) {
isDirectoryMode = v;
if (isDirectoryMode) {
verifyCB = defaultDirectoryChecker;
} else {
verifyCB = defaultFileChecker;
}
}
std::function<bool(const QString&)> FileSelectionWidget::getDefaultVerifier(bool isDirectoryMode)
{
if (isDirectoryMode) {
return defaultDirectoryChecker;
} else {
return defaultFileChecker;
}
}
void FileSelectionWidget::updateLabelText()
{
if (currentPath.length() == 0) {
ui->pathLabel->setText(tr(u8"(%1: 未选择)").arg(fieldName));
} else {
ui->pathLabel->setText(currentPath);
}
}
FileSelectionWidget::~FileSelectionWidget()
{
delete ui;
}
void FileSelectionWidget::requestOpenDialog()
{
QString dialogTitle = tr(u8"请选择%1").arg(fieldName);
QFileDialog* dialog = new QFileDialog(this, dialogTitle, currentPath, filter);
if (isDirectoryMode) {
dialog->setFileMode(QFileDialog::Directory);
dialog->setOption(QFileDialog::ShowDirsOnly, true);
} else {
dialog->setFileMode(isExistingOnly? QFileDialog::ExistingFile : QFileDialog::AnyFile);
}
if (isOutputInsteadofInput) {
dialog->setAcceptMode(QFileDialog::AcceptSave);
} else {
dialog->setAcceptMode(QFileDialog::AcceptOpen);
}
connect(dialog, &QFileDialog::fileSelected, this, &FileSelectionWidget::setCurrentPath);
connect(dialog, &QFileDialog::finished, dialog, &QFileDialog::deleteLater);
dialog->show();
}
void FileSelectionWidget::setCurrentPath(const QString& newpath)
{
currentPath = newpath;
updateLabelText();
emit filePathUpdated(currentPath);
}
void FileSelectionWidget::dragEnterEvent(QDragEnterEvent *e)
{
if (e->mimeData()->hasUrls()) {
QString path = e->mimeData()->urls().first().toLocalFile();
if (!verifyCB || verifyCB(path)) {
e->acceptProposedAction();
}
}
}
void FileSelectionWidget::dropEvent(QDropEvent *event)
{
for (const QUrl &url : event->mimeData()->urls()) {
QString path = url.toLocalFile();
if (!verifyCB || verifyCB(path)) {
setCurrentPath(path);
return;
}
}
}