[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [flatpak-kde-runtime/qt5.9lts] /: FileChooser portal: use native dialog for directories
From:       Jan Grulich <null () kde ! org>
Date:       2018-05-24 12:51:21
Message-ID: E1fLpiD-00033R-Ck () code ! kde ! org
[Download RAW message or body]

Git commit 9870ee160e5a776ed141f9e54f466b5543f467e8 by Jan Grulich.
Committed on 24/05/2018 at 12:51.
Pushed by grulich into branch 'qt5.9lts'.

FileChooser portal: use native dialog for directories

M  +4    -0    org.kde.Sdk.json
A  +200  -0    patch/qtbase-flatpak-portals-filechooser-use-native-for-directories.patch


https://commits.kde.org/flatpak-kde-runtime/9870ee160e5a776ed141f9e54f466b5543f467e8

diff --git a/org.kde.Sdk.json b/org.kde.Sdk.json
index 94f9303..61a6070 100644
--- a/org.kde.Sdk.json
+++ b/org.kde.Sdk.json
@@ -147,6 +147,10 @@
                     "type": "patch",
                     "path": "patch/qtbase-portal-openuri.patch"
                 },
+                {
+                    "type": "patch",
+                    "path": \
"patch/qtbase-flatpak-portals-filechooser-use-native-for-directories.patch" +         \
},  {
                     "type": "script",
                     "commands": [
diff --git a/patch/qtbase-flatpak-portals-filechooser-use-native-for-directories.patch \
b/patch/qtbase-flatpak-portals-filechooser-use-native-for-directories.patch new file \
mode 100644 index 0000000..d9059d8
--- /dev/null
+++ b/patch/qtbase-flatpak-portals-filechooser-use-native-for-directories.patch
@@ -0,0 +1,200 @@
+From 528c5a461684d03e59cc01769e24ab115f030c5a Mon Sep 17 00:00:00 2001
+From: Jan Grulich <jgrulich@redhat.com>
+Date: Wed, 23 May 2018 09:06:46 +0200
+Subject: 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
+
+diff --git a/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp \
b/src/plugins/platformthemes/flatpak/qflatpakfiledialog.cpp +index \
186084abd4..d352294972 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);
+ }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic