6#include <private/qgenericunixservices_p.h>
7#include <private/qguiapplication_p.h>
8#include <qpa/qplatformintegration.h>
10#include <QDBusConnection>
11#include <QDBusMessage>
12#include <QDBusPendingCall>
13#include <QDBusPendingCallWatcher>
14#include <QDBusPendingReply>
15#include <QDBusMetaType>
22#include <QMimeDatabase>
23#include <QRandomGenerator>
25#include <QRegularExpression>
46 filterCondition.
pattern = filterPattern;
65 arg >>
name >> filterConditions;
67 filter.filterConditions = filterConditions;
106 if (
d->nativeFileDialog) {
119void QXdgDesktopPortalFileDialog::initializeDialog()
123 if (
d->nativeFileDialog)
124 d->nativeFileDialog->setOptions(
options());
127 d->multipleFiles =
true;
130 d->directoryMode =
true;
141 if (!
options()->nameFilters().isEmpty())
147 if (!
options()->initiallySelectedMimeTypeFilter().isEmpty())
150 if (!
options()->initiallySelectedNameFilter().isEmpty())
161 "/org/freedesktop/portal/desktop"_L1,
162 "org.freedesktop.portal.FileChooser"_L1,
163 d->saveFile ?
"SaveFile"_L1 :
"OpenFile"_L1);
165 if (!
d->acceptLabel.isEmpty())
166 options.insert(
"accept_label"_L1,
d->acceptLabel);
169 options.insert(
"multiple"_L1,
d->multipleFiles);
170 options.insert(
"directory"_L1,
d->directoryMode);
173 if (!
d->directory.isEmpty())
176 if (!
d->selectedFiles.isEmpty()) {
180 QFileInfo selectedFileInfo(
d->selectedFiles.first());
181 if (selectedFileInfo.exists())
183 options.insert(
"current_name"_L1, selectedFileInfo.fileName());
188 qDBusRegisterMetaType<FilterCondition>();
189 qDBusRegisterMetaType<FilterConditionList>();
190 qDBusRegisterMetaType<Filter>();
191 qDBusRegisterMetaType<FilterList>();
194 auto selectedFilterIndex = filterList.size() - 1;
196 d->userVisibleToNameFilter.clear();
198 if (!
d->mimeTypesFilters.isEmpty()) {
199 for (
const QString &mimeTypefilter :
d->mimeTypesFilters) {
204 FilterCondition filterCondition;
206 filterCondition.pattern = mimeTypefilter;
210 filterConditions << filterCondition;
215 filter.filterConditions = filterConditions;
219 if (!
d->selectedMimeTypeFilter.isEmpty() &&
d->selectedMimeTypeFilter == mimeTypefilter)
220 selectedFilterIndex = filterList.size() - 1;
222 }
else if (!
d->nameFilters.isEmpty()) {
223 for (
const QString &nameFilter :
d->nameFilters) {
228 if (
match.hasMatch()) {
232 if (filterStrings.isEmpty()) {
233 qWarning() <<
"Filter " << userVisibleName <<
" is empty and will be ignored.";
238 for (
const QString &filterString : filterStrings) {
239 FilterCondition filterCondition;
241 filterCondition.pattern = filterString;
242 filterConditions << filterCondition;
246 filter.name = userVisibleName;
247 filter.filterConditions = filterConditions;
251 d->userVisibleToNameFilter.insert(userVisibleName, nameFilter);
253 if (!
d->selectedNameFilter.isEmpty() &&
d->selectedNameFilter == nameFilter)
254 selectedFilterIndex = filterList.size() - 1;
259 if (!filterList.isEmpty())
262 if (selectedFilterIndex != -1)
272 if (
parent && unixServices)
284 d->failedToOpen =
reply.isError();
285 if (
d->failedToOpen) {
286 if (d->nativeFileDialog) {
287 d->nativeFileDialog->show(windowFlags, windowModality, parent);
288 if (d->loop.isRunning())
289 d->nativeFileDialog->exec();
295 reply.value().path(),
296 "org.freedesktop.portal.Request"_L1,
314 if (
d->nativeFileDialog) {
315 d->nativeFileDialog->setOptions(
options());
326 if (
d->nativeFileDialog && useNativeFileDialog())
327 return d->nativeFileDialog->directory();
336 if (
d->nativeFileDialog) {
337 d->nativeFileDialog->setOptions(
options());
338 d->nativeFileDialog->selectFile(filename);
341 d->selectedFiles << filename.
path();
348 if (
d->nativeFileDialog && useNativeFileDialog())
349 return d->nativeFileDialog->selectedFiles();
362 if (
d->nativeFileDialog) {
363 d->nativeFileDialog->setOptions(
options());
364 d->nativeFileDialog->setFilter();
371 if (
d->nativeFileDialog) {
372 d->nativeFileDialog->setOptions(
options());
373 d->nativeFileDialog->selectMimeTypeFilter(
filter);
380 return d->selectedMimeTypeFilter;
387 if (
d->nativeFileDialog) {
388 d->nativeFileDialog->setOptions(
options());
389 d->nativeFileDialog->selectNameFilter(
filter);
396 return d->selectedNameFilter;
403 if (
d->nativeFileDialog && useNativeFileDialog()) {
404 d->nativeFileDialog->exec();
416 if (
d->nativeFileDialog)
417 d->nativeFileDialog->hide();
426 if (
d->nativeFileDialog && useNativeFileDialog(
OpenFallback))
427 return d->nativeFileDialog->show(windowFlags, windowModality,
parent);
429 openPortal(windowFlags, windowModality,
parent);
444 if (!selectedFilter.filterConditions.empty() && selectedFilter.filterConditions[0].type ==
MimeType) {
446 d->selectedMimeTypeFilter = selectedFilter.filterConditions[0].pattern;
447 d->selectedNameFilter.clear();
449 d->selectedNameFilter =
d->userVisibleToNameFilter.value(selectedFilter.name);
450 d->selectedMimeTypeFilter.clear();
466 if (
d->fileChooserPortalVersion < 3) {
478#include "moc_qxdgdesktopportalfiledialog_p.cpp"
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
Connects the signal specified by the service, path, interface and name parameters to the slot slot in...
static QDBusConnection sessionBus()
Returns a QDBusConnection object opened with the session bus.
QDBusPendingCall asyncCall(const QDBusMessage &message, int timeout=-1) const
static QDBusMessage createMethodCall(const QString &destination, const QString &path, const QString &interface, const QString &method)
Constructs a new DBus message representing a method call.
void finished(QDBusPendingCallWatcher *self=nullptr)
This signal is emitted when the pending call has finished and its reply is available.
QStringList mimeTypeFilters() const
QString initiallySelectedNameFilter() const
QString labelText(DialogLabel label) const
QStringList nameFilters() const
QString windowTitle() const
QString initiallySelectedMimeTypeFilter() const
\inmodule QtCore \reentrant
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
virtual QString portalWindowIdentifier(QWindow *window)
static QPlatformIntegration * platformIntegration()
T value(qsizetype i) const
QMimeType mimeTypeForName(const QString &nameOrAlias) const
Returns a MIME type for nameOrAlias or an invalid one if none found.
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static Q_DECL_CONST_FUNCTION QRandomGenerator * global()
\threadsafe
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
QStringList selectedFiles
QMap< QString, QString > userVisibleToNameFilter
uint fileChooserPortalVersion
QString selectedMimeTypeFilter
std::unique_ptr< QPlatformFileDialogHelper > nativeFileDialog
QXdgDesktopPortalFileDialogPrivate(QPlatformFileDialogHelper *nativeFileDialog, uint fileChooserPortalVersion)
QString selectedNameFilter
QStringList mimeTypesFilters
QString selectedNameFilter() const override
void selectNameFilter(const QString &filter) override
QString selectedMimeTypeFilter() const override
QList< FilterCondition > FilterConditionList
void setFilter() override
bool defaultNameFilterDisables() const override
bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) override
void selectMimeTypeFilter(const QString &filter) override
~QXdgDesktopPortalFileDialog()
void setDirectory(const QUrl &directory) override
void selectFile(const QUrl &filename) override
QUrl directory() const override
QXdgDesktopPortalFileDialog(QPlatformFileDialogHelper *nativeFileDialog=nullptr, uint fileChooserPortalVersion=0)
QList< QUrl > selectedFiles() const override
QList< Filter > FilterList
Combined button and popup list for selecting options.
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint GLsizei const GLchar * message
#define QStringLiteral(str)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
static QT_BEGIN_NAMESPACE QString windowTitle(HWND hwnd)
QDBusArgument & operator<<(QDBusArgument &arg, const QXdgDesktopPortalFileDialog::FilterCondition &filterCondition)
const QDBusArgument & operator>>(const QDBusArgument &arg, QXdgDesktopPortalFileDialog::FilterCondition &filterCondition)
QFutureWatcher< int > watcher
QStringList mimeTypeFilters({"image/jpeg", "image/png", "application/octet-stream" })
[12]
bool contains(const AT &t) const noexcept
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent