Qt Utilities  5.6.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 <QHBoxLayout>
9 #include <QPushButton>
10 #include <QFileDialog>
11 #include <QMenu>
12 #include <QCompleter>
13 #include <QFileSystemModel>
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 
30 QCompleter *PathSelection::m_completer = nullptr;
31 
35 PathSelection::PathSelection(QWidget *parent) :
36  QWidget(parent),
37  m_lineEdit(new ClearLineEdit(this)),
38  m_button(new QPushButton(this)),
39  m_customMode(QFileDialog::Directory),
40  m_customDialog(nullptr)
41 {
42  if(!m_completer) {
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);
48  }
49 
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 ..."));
55 
56  auto *layout = new QHBoxLayout(this);
57  layout->setSpacing(3);
58  layout->setMargin(0);
59  layout->addWidget(m_lineEdit);
60  layout->addWidget(m_button);
61  setLayout(layout);
62 
63  connect(m_button, &QPushButton::clicked, this, &PathSelection::showFileDialog);
64 }
65 
66 bool PathSelection::eventFilter(QObject *obj, QEvent *event)
67 {
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());
73  menu->addSeparator();
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()));
81  }
82  }
83  menu->exec(static_cast<QContextMenuEvent *>(event)->globalPos());
84  }
85  return true;
86  default:
87  ;
88  }
89  }
90 #endif
91  return QWidget::eventFilter(obj, event);
92 }
93 
94 void PathSelection::showFileDialog()
95 {
96  QString directory;
97  QFileInfo fileInfo(m_lineEdit->text());
98  if(fileInfo.exists()) {
99  if(fileInfo.isFile()) {
100  directory = fileInfo.absoluteDir().absolutePath();
101  } else {
102  directory = fileInfo.absolutePath();
103  }
104  }
105  if(m_customDialog) {
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));
110  }
111  } else {
112  QFileDialog dialog(this);
113  dialog.setDirectory(directory);
114  dialog.setFileMode(m_customMode);
115  if(window()) {
116  dialog.setWindowTitle(tr("Select path") % QStringLiteral(" - ") % window()->windowTitle());
117  } else {
118  dialog.setWindowTitle(tr("Select path"));
119  }
120  if(dialog.exec() == QFileDialog::Accepted) {
121  m_lineEdit->selectAll();
122  m_lineEdit->insert(dialog.selectedFiles().join(SEARCH_PATH_SEP_CHAR));
123  }
124  }
125 }
126 
127 }
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