summaryrefslogtreecommitdiffstats
path: root/src/plugins/platformthemes
diff options
context:
space:
mode:
authorJan Grulich <jgrulich@redhat.com>2018-05-23 09:06:46 +0200
committerJan Grulich <jgrulich@redhat.com>2018-05-24 15:55:38 +0000
commitb743835f50914df594f79ae06968d1b2bb7a855c (patch)
treefcbfa90e48ab4401917f1e7591ab2168f9250728 /src/plugins/platformthemes
parentf82e5085169876e0ec7c1b744d021b068c281cfe (diff)
Open native file dialog inside sandbox when opening directories
Flatpak FileChooser portal doesn't support opening and exporting directories to the sandbox as it's not technically possible. Files are simply exported through document-portal, but directories are a different story. We have to, in case we want to open a directory, use native file dialog provided by platform theme we have loaded into flatpak platform theme. Applications which need to open directories to be able to work, like IDEs, music players, will have enabled access ho host's filesystem anyway so it's fine to open a file dialog inside sandbox. [ChangeLog][Linux] QFileDialog will use the native dialogs provided by the platform theme instead of trying to use Flatpak portal to select directories. Change-Id: I0716193bb9878aa621b8ca88506f87c72f690887 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/plugins/platformthemes')
-rw-r--r--src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp56
-rw-r--r--src/plugins/platformthemes/flatpak/qflatpakfiledialog_p.h2
-rw-r--r--src/plugins/platformthemes/flatpak/qflatpaktheme.cpp6
3 files changed, 56 insertions, 8 deletions
diff --git a/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp b/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp
index c31b326357..ce835eaa23 100644
--- a/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp
+++ b/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp
@@ -101,6 +101,10 @@ const QDBusArgument &operator >>(const QDBusArgument &arg, QFlatpakFileDialog::F
class QFlatpakFileDialogPrivate
{
public:
+ QFlatpakFileDialogPrivate(QPlatformFileDialogHelper *nativeFileDialog)
+ : nativeFileDialog(nativeFileDialog)
+ { }
+
WId winId = 0;
bool modal = false;
bool multipleFiles = false;
@@ -111,12 +115,19 @@ public:
QStringList nameFilters;
QStringList mimeTypesFilters;
QStringList selectedFiles;
+ QPlatformFileDialogHelper *nativeFileDialog = nullptr;
};
-QFlatpakFileDialog::QFlatpakFileDialog()
+QFlatpakFileDialog::QFlatpakFileDialog(QPlatformFileDialogHelper *nativeFileDialog)
: QPlatformFileDialogHelper()
- , d_ptr(new QFlatpakFileDialogPrivate)
+ , d_ptr(new QFlatpakFileDialogPrivate(nativeFileDialog))
{
+ Q_D(QFlatpakFileDialog);
+
+ if (d->nativeFileDialog) {
+ connect(d->nativeFileDialog, SIGNAL(accept()), this, SIGNAL(accept()));
+ connect(d->nativeFileDialog, SIGNAL(reject()), this, SIGNAL(reject()));
+ }
}
QFlatpakFileDialog::~QFlatpakFileDialog()
@@ -127,6 +138,9 @@ void QFlatpakFileDialog::initializeDialog()
{
Q_D(QFlatpakFileDialog);
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->setOptions(options());
+
if (options()->fileMode() == QFileDialogOptions::ExistingFiles)
d->multipleFiles = true;
@@ -265,6 +279,9 @@ void QFlatpakFileDialog::setDirectory(const QUrl &directory)
{
Q_D(QFlatpakFileDialog);
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->setDirectory(directory);
+
d->directory = directory.path();
}
@@ -272,6 +289,9 @@ QUrl QFlatpakFileDialog::directory() const
{
Q_D(const QFlatpakFileDialog);
+ if (d->nativeFileDialog && options()->fileMode() == QFileDialogOptions::Directory)
+ return d->nativeFileDialog->directory();
+
return d->directory;
}
@@ -279,6 +299,9 @@ void QFlatpakFileDialog::selectFile(const QUrl &filename)
{
Q_D(QFlatpakFileDialog);
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->selectFile(filename);
+
d->selectedFiles << filename.path();
}
@@ -286,6 +309,9 @@ QList<QUrl> QFlatpakFileDialog::selectedFiles() const
{
Q_D(const QFlatpakFileDialog);
+ if (d->nativeFileDialog && options()->fileMode() == QFileDialogOptions::Directory)
+ return d->nativeFileDialog->selectedFiles();
+
QList<QUrl> files;
for (const QString &file : d->selectedFiles) {
files << QUrl(file);
@@ -295,13 +321,18 @@ QList<QUrl> QFlatpakFileDialog::selectedFiles() const
void QFlatpakFileDialog::setFilter()
{
- // TODO
+ Q_D(QFlatpakFileDialog);
+
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->setFilter();
}
void QFlatpakFileDialog::selectNameFilter(const QString &filter)
{
- Q_UNUSED(filter);
- // TODO
+ Q_D(QFlatpakFileDialog);
+
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->selectNameFilter(filter);
}
QString QFlatpakFileDialog::selectedNameFilter() const
@@ -312,6 +343,13 @@ QString QFlatpakFileDialog::selectedNameFilter() const
void QFlatpakFileDialog::exec()
{
+ Q_D(QFlatpakFileDialog);
+
+ if (d->nativeFileDialog && options()->fileMode() == QFileDialogOptions::Directory) {
+ d->nativeFileDialog->exec();
+ return;
+ }
+
// HACK we have to avoid returning until we emit that the dialog was accepted or rejected
QEventLoop loop;
loop.connect(this, SIGNAL(accept()), SLOT(quit()));
@@ -321,18 +359,24 @@ void QFlatpakFileDialog::exec()
void QFlatpakFileDialog::hide()
{
+ Q_D(QFlatpakFileDialog);
+
+ if (d->nativeFileDialog)
+ d->nativeFileDialog->hide();
}
bool QFlatpakFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
{
Q_D(QFlatpakFileDialog);
- Q_UNUSED(windowFlags);
initializeDialog();
d->modal = windowModality != Qt::NonModal;
d->winId = parent ? parent->winId() : 0;
+ if (d->nativeFileDialog && options()->fileMode() == QFileDialogOptions::Directory)
+ return d->nativeFileDialog->show(windowFlags, windowModality, parent);
+
openPortal();
return true;
diff --git a/src/plugins/platformthemes/flatpak/qflatpakfiledialog_p.h b/src/plugins/platformthemes/flatpak/qflatpakfiledialog_p.h
index f3e195faa0..bd1dae209d 100644
--- a/src/plugins/platformthemes/flatpak/qflatpakfiledialog_p.h
+++ b/src/plugins/platformthemes/flatpak/qflatpakfiledialog_p.h
@@ -69,7 +69,7 @@ public:
};
typedef QVector<Filter> FilterList;
- QFlatpakFileDialog();
+ QFlatpakFileDialog(QPlatformFileDialogHelper *nativeFileDialog = nullptr);
~QFlatpakFileDialog();
bool defaultNameFilterDisables() const override;
diff --git a/src/plugins/platformthemes/flatpak/qflatpaktheme.cpp b/src/plugins/platformthemes/flatpak/qflatpaktheme.cpp
index 6c5e1389cf..142d91a00b 100644
--- a/src/plugins/platformthemes/flatpak/qflatpaktheme.cpp
+++ b/src/plugins/platformthemes/flatpak/qflatpaktheme.cpp
@@ -130,8 +130,12 @@ QPlatformDialogHelper* QFlatpakTheme::createPlatformDialogHelper(DialogType type
{
Q_D(const QFlatpakTheme);
- if (type == FileDialog)
+ if (type == FileDialog) {
+ if (d->baseTheme->usePlatformNativeDialog(type))
+ return new QFlatpakFileDialog(static_cast<QPlatformFileDialogHelper*>(d->baseTheme->createPlatformDialogHelper(type)));
+
return new QFlatpakFileDialog;
+ }
return d->baseTheme->createPlatformDialogHelper(type);
}