Qt Utilities  5.7.0
Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models
pathselection.cpp
Go to the documentation of this file.
1 #include "./pathselection.h"
2 #include "./clearlineedit.h"
3 
4 #include "../misc/desktoputils.h"
5 
6 #include <c++utilities/io/path.h>
7 
8 #include <QCompleter>
9 #include <QFileDialog>
10 #include <QFileSystemModel>
11 #include <QHBoxLayout>
12 #include <QMenu>
13 #include <QPushButton>
14 #include <QStringBuilder>
15 #ifndef QT_NO_CONTEXTMENU
16 #include <QContextMenuEvent>
17 #endif
18 
19 #include <memory>
20 
21 using namespace std;
22 
23 namespace Widgets {
24 
31 QCompleter *PathSelection::m_completer = nullptr;
32 
36 PathSelection::PathSelection(QWidget *parent)
37  : QWidget(parent)
38  , m_lineEdit(new ClearLineEdit(this))
39  , m_button(new QPushButton(this))
40  , m_customMode(QFileDialog::Directory)
41  , m_customDialog(nullptr)
42 {
43  if (!m_completer) {
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);
49  }
50 
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 ..."));
56 
57  auto *layout = new QHBoxLayout(this);
58  layout->setSpacing(3);
59  layout->setMargin(0);
60  layout->addWidget(m_lineEdit);
61  layout->addWidget(m_button);
62  setLayout(layout);
63 
64  connect(m_button, &QPushButton::clicked, this, &PathSelection::showFileDialog);
65 }
66 
67 bool PathSelection::eventFilter(QObject *obj, QEvent *event)
68 {
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());
74  menu->addSeparator();
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,
81  bind(&DesktopUtils::openLocalFileOrDir, m_lineEdit->text()));
82  } else if (fileInfo.isDir()) {
83  connect(menu->addAction(QIcon::fromTheme(QStringLiteral("system-file-manager")), tr("Explore")), &QAction::triggered,
84  bind(&DesktopUtils::openLocalFileOrDir, m_lineEdit->text()));
85  }
86  }
87  menu->exec(static_cast<QContextMenuEvent *>(event)->globalPos());
88  }
89  return true;
90  default:;
91  }
92  }
93 #endif
94  return QWidget::eventFilter(obj, event);
95 }
96 
97 void PathSelection::showFileDialog()
98 {
99  QString directory;
100  QFileInfo fileInfo(m_lineEdit->text());
101  if (fileInfo.exists()) {
102  if (fileInfo.isFile()) {
103  directory = fileInfo.absoluteDir().absolutePath();
104  } else {
105  directory = fileInfo.absolutePath();
106  }
107  }
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));
113  }
114  } else {
115  QFileDialog dialog(this);
116  dialog.setDirectory(directory);
117  dialog.setFileMode(m_customMode);
118  if (window()) {
119  dialog.setWindowTitle(tr("Select path") % QStringLiteral(" - ") % window()->windowTitle());
120  } else {
121  dialog.setWindowTitle(tr("Select path"));
122  }
123  if (dialog.exec() == QFileDialog::Accepted) {
124  m_lineEdit->selectAll();
125  m_lineEdit->insert(dialog.selectedFiles().join(SEARCH_PATH_SEP_CHAR));
126  }
127  }
128 }
129 }
bool eventFilter(QObject *obj, QEvent *event)
STL namespace.
bool QT_UTILITIES_EXPORT openLocalFileOrDir(const QString &path)
Shows the specified file or directory using the default file browser.
Provides a set of extended widgets such as ClearLineEdit and ClearComboBox.
Definition: buttonoverlay.h:13
A QLineEdit with an embedded button for clearing its contents.
Definition: clearlineedit.h:14