Fix opening of flatpak FileChooser portal

My assumption before was that show() method calls exec(), but it seems
to be vice-versa and so QML applications using QFileDialog were not able
to open dialogs as they use visible property, which in turn calls show()
method. I made the show() method to call new openPortal() method where
I moved the actuall DBus call from exec() method. The exec() method now
internally calls show(), at least this is my assumption and it seems to
behave like that from my testing.

Change-Id: I27a5b0198e9ff1a9ea031f9ae45b57ceae99c6ae
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Jan Grulich 2018-01-15 08:40:36 +01:00
parent ac0ad5c69c
commit e8bf3a2ce7
2 changed files with 61 additions and 55 deletions

View File

@ -147,61 +147,7 @@ void QFlatpakFileDialog::initializeDialog()
setDirectory(options()->initialDirectory());
}
bool QFlatpakFileDialog::defaultNameFilterDisables() const
{
return false;
}
void QFlatpakFileDialog::setDirectory(const QUrl &directory)
{
Q_D(QFlatpakFileDialog);
d->directory = directory.path();
}
QUrl QFlatpakFileDialog::directory() const
{
Q_D(const QFlatpakFileDialog);
return d->directory;
}
void QFlatpakFileDialog::selectFile(const QUrl &filename)
{
Q_D(QFlatpakFileDialog);
d->selectedFiles << filename.path();
}
QList<QUrl> QFlatpakFileDialog::selectedFiles() const
{
Q_D(const QFlatpakFileDialog);
QList<QUrl> files;
for (const QString &file : d->selectedFiles) {
files << QUrl(file);
}
return files;
}
void QFlatpakFileDialog::setFilter()
{
// TODO
}
void QFlatpakFileDialog::selectNameFilter(const QString &filter)
{
Q_UNUSED(filter);
// TODO
}
QString QFlatpakFileDialog::selectedNameFilter() const
{
// TODO
return QString();
}
void QFlatpakFileDialog::exec()
void QFlatpakFileDialog::openPortal()
{
Q_D(const QFlatpakFileDialog);
@ -305,7 +251,64 @@ void QFlatpakFileDialog::exec()
SLOT(gotResponse(uint,QVariantMap)));
}
});
}
bool QFlatpakFileDialog::defaultNameFilterDisables() const
{
return false;
}
void QFlatpakFileDialog::setDirectory(const QUrl &directory)
{
Q_D(QFlatpakFileDialog);
d->directory = directory.path();
}
QUrl QFlatpakFileDialog::directory() const
{
Q_D(const QFlatpakFileDialog);
return d->directory;
}
void QFlatpakFileDialog::selectFile(const QUrl &filename)
{
Q_D(QFlatpakFileDialog);
d->selectedFiles << filename.path();
}
QList<QUrl> QFlatpakFileDialog::selectedFiles() const
{
Q_D(const QFlatpakFileDialog);
QList<QUrl> files;
for (const QString &file : d->selectedFiles) {
files << QUrl(file);
}
return files;
}
void QFlatpakFileDialog::setFilter()
{
// TODO
}
void QFlatpakFileDialog::selectNameFilter(const QString &filter)
{
Q_UNUSED(filter);
// TODO
}
QString QFlatpakFileDialog::selectedNameFilter() const
{
// TODO
return QString();
}
void QFlatpakFileDialog::exec()
{
// 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()));
@ -327,6 +330,8 @@ bool QFlatpakFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality wi
d->modal = windowModality != Qt::NonModal;
d->winId = parent ? parent->winId() : 0;
openPortal();
return true;
}

View File

@ -90,6 +90,7 @@ private Q_SLOTS:
private:
void initializeDialog();
void openPortal();
QScopedPointer<QFlatpakFileDialogPrivate> d_ptr;
};