4 #include "../misc/desktoputils.h" 6 #include <c++utilities/io/path.h> 10 #include <QFileSystemModel> 11 #include <QHBoxLayout> 13 #include <QPushButton> 14 #include <QStringBuilder> 15 #ifndef QT_NO_CONTEXTMENU 16 #include <QContextMenuEvent> 31 QCompleter *PathSelection::m_completer =
nullptr;
36 PathSelection::PathSelection(QWidget *parent)
39 , m_button(new QPushButton(this))
40 , m_customMode(QFileDialog::Directory)
41 , m_customDialog(nullptr)
44 auto *fileSystemModel =
new QFileSystemModel(m_completer);
45 fileSystemModel->setRootPath(QString());
46 m_completer =
new QCompleter;
47 m_completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
48 m_completer->setModel(fileSystemModel);
51 m_lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
52 m_lineEdit->installEventFilter(
this);
53 m_lineEdit->setCompleter(m_completer);
54 m_button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
55 m_button->setText(tr(
"Select ..."));
57 auto *layout =
new QHBoxLayout(
this);
58 layout->setSpacing(3);
60 layout->addWidget(m_lineEdit);
61 layout->addWidget(m_button);
64 connect(m_button, &QPushButton::clicked,
this, &PathSelection::showFileDialog);
69 #ifndef QT_NO_CONTEXTMENU 70 if (obj == m_lineEdit) {
71 switch (event->type()) {
72 case QEvent::ContextMenu: {
73 unique_ptr<QMenu> menu(m_lineEdit->createStandardContextMenu());
75 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"document-open")), tr(
"Select ...")), &QAction::triggered,
this,
76 &PathSelection::showFileDialog);
77 QFileInfo fileInfo(m_lineEdit->text());
78 if (fileInfo.exists()) {
79 if (fileInfo.isFile()) {
80 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"system-run")), tr(
"Open")), &QAction::triggered,
82 }
else if (fileInfo.isDir()) {
83 connect(menu->addAction(QIcon::fromTheme(QStringLiteral(
"system-file-manager")), tr(
"Explore")), &QAction::triggered,
87 menu->exec(static_cast<QContextMenuEvent *>(event)->globalPos());
94 return QWidget::eventFilter(obj, event);
97 void PathSelection::showFileDialog()
100 QFileInfo fileInfo(m_lineEdit->text());
101 if (fileInfo.exists()) {
102 if (fileInfo.isFile()) {
103 directory = fileInfo.absoluteDir().absolutePath();
105 directory = fileInfo.absolutePath();
108 if (m_customDialog) {
109 m_customDialog->setDirectory(directory);
110 if (m_customDialog->exec() == QFileDialog::Accepted) {
111 m_lineEdit->selectAll();
112 m_lineEdit->insert(m_customDialog->selectedFiles().join(SEARCH_PATH_SEP_CHAR));
115 QFileDialog dialog(
this);
116 dialog.setDirectory(directory);
117 dialog.setFileMode(m_customMode);
119 dialog.setWindowTitle(tr(
"Select path") % QStringLiteral(
" - ") % window()->windowTitle());
121 dialog.setWindowTitle(tr(
"Select path"));
123 if (dialog.exec() == QFileDialog::Accepted) {
124 m_lineEdit->selectAll();
125 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.