4 #include "../misc/desktoputils.h" 6 #include <c++utilities/io/path.h> 10 #include <QFileDialog> 13 #include <QFileSystemModel> 14 #include <QStringBuilder> 15 #ifndef QT_NO_CONTEXTMENU 16 # include <QContextMenuEvent> 30 QCompleter *PathSelection::m_completer =
nullptr;
35 PathSelection::PathSelection(QWidget *parent) :
38 m_button(new QPushButton(this)),
39 m_customMode(QFileDialog::Directory),
40 m_customDialog(nullptr)
43 auto *fileSystemModel =
new QFileSystemModel(m_completer);
44 fileSystemModel->setRootPath(QString());
45 m_completer =
new QCompleter;
46 m_completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
47 m_completer->setModel(fileSystemModel);
50 m_lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
51 m_lineEdit->installEventFilter(
this);
52 m_lineEdit->setCompleter(m_completer);
53 m_button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
54 m_button->setText(tr(
"Select ..."));
56 auto *layout =
new QHBoxLayout(
this);
57 layout->setSpacing(3);
59 layout->addWidget(m_lineEdit);
60 layout->addWidget(m_button);
63 connect(m_button, &QPushButton::clicked,
this, &PathSelection::showFileDialog);
68 #ifndef QT_NO_CONTEXTMENU 69 if(obj == m_lineEdit) {
70 switch(event->type()) {
71 case QEvent::ContextMenu: {
72 unique_ptr<QMenu> menu(m_lineEdit->createStandardContextMenu());
74 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"document-open")), tr(
"Select ...")), &QAction::triggered,
this, &PathSelection::showFileDialog);
75 QFileInfo fileInfo(m_lineEdit->text());
76 if(fileInfo.exists()) {
77 if(fileInfo.isFile()) {
78 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"system-run")), tr(
"Open")), &QAction::triggered, bind(&
DesktopUtils::openLocalFileOrDir, m_lineEdit->text()));
79 }
else if(fileInfo.isDir()) {
80 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"system-file-manager")), tr(
"Explore")), &QAction::triggered, bind(&
DesktopUtils::openLocalFileOrDir, m_lineEdit->text()));
83 menu->exec(static_cast<QContextMenuEvent *>(event)->globalPos());
91 return QWidget::eventFilter(obj, event);
94 void PathSelection::showFileDialog()
97 QFileInfo fileInfo(m_lineEdit->text());
98 if(fileInfo.exists()) {
99 if(fileInfo.isFile()) {
100 directory = fileInfo.absoluteDir().absolutePath();
102 directory = fileInfo.absolutePath();
106 m_customDialog->setDirectory(directory);
107 if(m_customDialog->exec() == QFileDialog::Accepted) {
108 m_lineEdit->selectAll();
109 m_lineEdit->insert(m_customDialog->selectedFiles().join(SEARCH_PATH_SEP_CHAR));
112 QFileDialog dialog(
this);
113 dialog.setDirectory(directory);
114 dialog.setFileMode(m_customMode);
116 dialog.setWindowTitle(tr(
"Select path") % QStringLiteral(
" - ") % window()->windowTitle());
118 dialog.setWindowTitle(tr(
"Select path"));
120 if(dialog.exec() == QFileDialog::Accepted) {
121 m_lineEdit->selectAll();
122 m_lineEdit->insert(dialog.selectedFiles().join(SEARCH_PATH_SEP_CHAR));
bool QT_UTILITIES_EXPORT openLocalFileOrDir(const QString &path)
Shows the specified file or directory using the default file browser.