35 #include <QApplication>
36 #include <QCoreApplication>
37 #include <QFileDialog>
38 #include <QHBoxLayout>
40 #include <QToolButton>
54 return QCoreApplication::translate(
"FileSystemPathEdit",
source,
comment);
59 QT_TRANSLATE_NOOP3(
"FileSystemPathEdit",
"...",
"Launch file dialog button text (brief)");
61 QT_TRANSLATE_NOOP3(
"FileSystemPathEdit",
"&Browse...",
"Launch file dialog button text (full)");
63 QT_TRANSLATE_NOOP3(
"FileSystemPathEdit",
"Choose a file",
"Caption for file open/save dialog");
65 QT_TRANSLATE_NOOP3(
"FileSystemPathEdit",
"Choose a folder",
"Caption for directory open dialog");
80 std::unique_ptr<Private::FileEditorWithCompletion>
m_editor;
94 , m_browseAction {new QAction(q)}
95 , m_browseBtn {new QToolButton(q)}
97 , m_validator {new
Private::FileSystemPathValidator(q)}
114 QString filter = q->fileNameFilter();
115 QString directory = q->currentDirectory().isEmpty() ? QDir::homePath() : q->currentDirectory();
121 selectedPath = QFileDialog::getOpenFileName(q, dialogCaptionOrDefault(), directory, filter);
124 selectedPath = QFileDialog::getSaveFileName(q, dialogCaptionOrDefault(), directory, filter, &filter);
128 selectedPath = QFileDialog::getExistingDirectory(q, dialogCaptionOrDefault(),
129 directory, QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly);
132 throw std::logic_error(
"Unknown FileSystemPathEdit mode");
140 if (!m_dialogCaption.isEmpty())
141 return m_dialogCaption;
152 throw std::logic_error(
"Unknown FileSystemPathEdit mode");
158 bool showDirsOnly =
false;
163 showDirsOnly =
false;
170 throw std::logic_error(
"Unknown FileSystemPathEdit mode");
172 m_browseAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon));
173 m_editor->completeDirectoriesOnly(showDirsOnly);
186 editor->
widget()->setParent(
this);
188 auto *layout =
new QHBoxLayout(
this);
189 layout->setContentsMargins(0, 0, 0, 0);
190 layout->addWidget(editor->
widget());
191 layout->addWidget(d->m_browseBtn);
193 connect(d->m_browseAction, &QAction::triggered,
this, [
this]() { this->d_func()->browseActionTriggered(); });
210 d->m_editor->widget()->setToolTip(val);
216 return d->m_fileNameFilter;
222 d->m_fileNameFilter = val;
228 const int openBracePos = val.indexOf(QLatin1Char(
'('), 0);
229 const int closeBracePos = val.indexOf(QLatin1Char(
')'), openBracePos + 1);
230 if ((openBracePos > 0) && (closeBracePos > 0) && (closeBracePos > openBracePos + 2))
232 QString filterString = val.mid(openBracePos + 1, closeBracePos - openBracePos - 1);
233 if (filterString == QLatin1String(
"*"))
235 d->m_editor->setFilenameFilters({});
239 QStringList filters = filterString.split(QLatin1Char(
' '), Qt::SkipEmptyParts);
240 d->m_editor->setFilenameFilters(filters);
245 d->m_editor->setFilenameFilters({});
253 return d->m_editor->placeholder();
259 d->m_editor->setPlaceholder(val);
278 if (newPath != d->m_lastSignaledPath)
281 d->m_lastSignaledPath = newPath;
302 return d->m_dialogCaption;
308 d->m_dialogCaption = caption;
313 return QFileInfo(
selectedPath()).absoluteDir().absolutePath();
319 return d->m_editor->widget();
332 return editWidget<WidgetType>()->text();
337 editWidget<WidgetType>()->clear();
342 editWidget<WidgetType>()->setText(text);
349 editWidget<WidgetType>()->setEditable(
true);
356 editWidget<WidgetType>()->clear();
361 return editWidget<WidgetType>()->count();
381 return editWidget<WidgetType>()->currentIndex();
386 editWidget<WidgetType>()->setCurrentIndex(index);
391 return editWidget<WidgetType>()->maxVisibleItems();
396 editWidget<WidgetType>()->setMaxVisibleItems(maxItems);
401 return editWidget<WidgetType>()->currentText();
406 editWidget<WidgetType>()->setCurrentText(text);
FileSystemPathComboEdit(QWidget *parent=nullptr)
QString item(int index) const
void addItem(const QString &text)
void insertItem(int index, const QString &text)
void setEditWidgetText(const QString &text) override
int maxVisibleItems() const
void setCurrentIndex(int index)
QString editWidgetText() const override
void setMaxVisibleItems(int maxItems)
QToolButton * m_browseBtn
FileSystemPathEditPrivate(FileSystemPathEdit *q, Private::FileEditorWithCompletion *editor)
QString m_lastSignaledPath
QString dialogCaptionOrDefault() const
std::unique_ptr< Private::FileEditorWithCompletion > m_editor
Private::FileSystemPathValidator * m_validator
void browseActionTriggered()
FileSystemPathEdit * q_ptr
Widget for editing strings which are paths in filesystem.
FileSystemPathEditPrivate * d_ptr
virtual QString editWidgetText() const =0
void setPlaceholder(const QString &val)
@ DirectoryOpen
selecting existing directories
@ FileOpen
opening files, shows open file dialog
@ FileSave
saving files, shows save file dialog
@ DirectorySave
selecting directories for saving
FileSystemPathEdit(Private::FileEditorWithCompletion *editor, QWidget *parent)
bool briefBrowseButtonCaption() const
The browse button caption is "..." if true, and "Browse" otherwise.
QWidget * editWidgetImpl() const
void setFileNameFilter(const QString &val)
virtual void setEditWidgetText(const QString &text)=0
void setDialogCaption(const QString &caption)
QString placeholder() const
void selectedPathChanged(const QString &path)
QString currentDirectory() const
void setSelectedPath(const QString &val)
void setBriefBrowseButtonCaption(bool brief)
~FileSystemPathEdit() override
QString editWidgetText() const override
void setEditWidgetText(const QString &text) override
FileSystemPathLineEdit(QWidget *parent=nullptr)
virtual QWidget * widget()=0
void setStrictMode(bool v)
QString toUniformPath(const QString &path)
QString toNativePath(const QString &path)
constexpr TrStringWithComment browseButtonFullText
constexpr TrStringWithComment browseButtonBriefText
constexpr TrStringWithComment defaultDialogCaptionForFile
constexpr TrStringWithComment defaultDialogCaptionForDirectory