From ee9b9d9fd9a714f97ed8f7e26404c2f113588e9c Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 27 Aug 2013 14:10:45 +0200 Subject: QFileDialog: add MIME Type filters Currently just a convenience method for setNameFilters(), it uses QMimeType to create a name filter from the glob patterns and description defined in each MIME type. In the longer term, this API could be used to do proper mimetype-based filtering using QMimeDatabase::mimeTypeForFile() in the builtin QFileDialog (aka "not native"), instead of only looking at globs via the name filters. Change-Id: I0edccf5f30c514481b47cd100d743d1ed7a24024 Reviewed-by: Frederik Gladhorn --- tests/manual/dialogs/filedialogpanel.cpp | 37 +++++++++++++++++++++++++++----- tests/manual/dialogs/filedialogpanel.h | 4 ++++ 2 files changed, 36 insertions(+), 5 deletions(-) (limited to 'tests/manual') diff --git a/tests/manual/dialogs/filedialogpanel.cpp b/tests/manual/dialogs/filedialogpanel.cpp index 000d755cef..e234835cdb 100644 --- a/tests/manual/dialogs/filedialogpanel.cpp +++ b/tests/manual/dialogs/filedialogpanel.cpp @@ -162,6 +162,7 @@ FileDialogPanel::FileDialogPanel(QWidget *parent) , m_defaultSuffix(new QLineEdit(this)) , m_directory(new QLineEdit(this)) , m_selectedFileName(new QLineEdit(this)) + , m_useMimeTypeFilters(new QCheckBox(this)) , m_nameFilters(new QPlainTextEdit) , m_selectedNameFilter(new QLineEdit(this)) , m_deleteNonModalDialogButton(0) @@ -183,10 +184,11 @@ FileDialogPanel::FileDialogPanel(QWidget *parent) // Files QGroupBox *filesGroupBox = new QGroupBox(tr("Files / Filters")); - QFormLayout *filesLayout = new QFormLayout(filesGroupBox); + filesLayout = new QFormLayout(filesGroupBox); filesLayout->addRow(tr("Default Suffix:"), m_defaultSuffix); filesLayout->addRow(tr("Directory:"), m_directory); filesLayout->addRow(tr("Selected file:"), m_selectedFileName); + filesLayout->addRow(tr("Use mime type filters:"), m_useMimeTypeFilters); m_nameFilters->setMaximumHeight(80); filesLayout->addRow(tr("Name filters:"), m_nameFilters); filesLayout->addRow(tr("Selected name filter:"), m_selectedNameFilter); @@ -236,6 +238,8 @@ FileDialogPanel::FileDialogPanel(QWidget *parent) gridLayout->addWidget(labelsGroupBox, 1, 0); gridLayout->addWidget(buttonsGroupBox, 1, 1); + connect(m_useMimeTypeFilters, SIGNAL(toggled(bool)), this, SLOT(useMimeTypeFilters(bool))); + enableDeleteModalDialogButton(); enableDeleteNonModalDialogButton(); restoreDefaults(); @@ -461,7 +465,8 @@ void FileDialogPanel::restoreDefaults() m_customDirIcons->setChecked(d.testOption(QFileDialog::DontUseCustomDirectoryIcons)); m_directory->setText(QDir::homePath()); m_defaultSuffix->setText(QLatin1String("txt")); - m_nameFilters->setPlainText(QLatin1String("Any files (*)\nImage files (*.png *.xpm *.jpg)\nText files (*.txt)")); + m_useMimeTypeFilters->setChecked(false); + useMimeTypeFilters(false); m_selectedFileName->setText(QString()); m_selectedNameFilter->setText(QString()); foreach (LabelLineEdit *l, m_labelLineEdits) @@ -481,14 +486,36 @@ void FileDialogPanel::applySettings(QFileDialog *d) const const QString file = m_selectedFileName->text().trimmed(); if (!file.isEmpty()) d->selectFile(file); - d->setNameFilters(m_nameFilters->toPlainText().trimmed().split(QLatin1Char('\n'), QString::SkipEmptyParts)); const QString filter = m_selectedNameFilter->text().trimmed(); - if (!filter.isEmpty()) - d->selectNameFilter(filter); + const QStringList filters = m_nameFilters->toPlainText().trimmed().split(QLatin1Char('\n'), QString::SkipEmptyParts); + if (!m_useMimeTypeFilters->isChecked()) { + d->setNameFilters(filters); + if (!filter.isEmpty()) + d->selectNameFilter(filter); + } else { + d->setMimeTypeFilters(filters); + if (!filter.isEmpty()) + d->selectMimeTypeFilter(filter); + } foreach (LabelLineEdit *l, m_labelLineEdits) l->apply(d); } +void FileDialogPanel::useMimeTypeFilters(bool b) +{ + QWidget *textEdit = filesLayout->labelForField(m_nameFilters); + if (QLabel *label = qobject_cast(textEdit)) + label->setText(b ? tr("Mime type filters:") : tr("Name filters:")); + QWidget *w = filesLayout->labelForField(m_selectedNameFilter); + if (QLabel *label = qobject_cast(w)) + label->setText(b ? tr("Selected mime type filter:") : tr("Selected name filter:")); + + if (b) + m_nameFilters->setPlainText(QLatin1String("image/jpeg\nimage/png\ntext/plain\napplication/octet-stream")); + else + m_nameFilters->setPlainText(QLatin1String("Any files (*)\nImage files (*.png *.xpm *.jpg)\nText files (*.txt)")); +} + void FileDialogPanel::accepted() { const QFileDialog *d = qobject_cast(sender()); diff --git a/tests/manual/dialogs/filedialogpanel.h b/tests/manual/dialogs/filedialogpanel.h index 2e1d5d4de9..1e86e0f18e 100644 --- a/tests/manual/dialogs/filedialogpanel.h +++ b/tests/manual/dialogs/filedialogpanel.h @@ -52,6 +52,7 @@ class QCheckBox; class QComboBox; class QLineEdit; class QPlainTextEdit; +class QFormLayout; QT_END_NAMESPACE class LabelLineEdit; @@ -82,6 +83,7 @@ public slots: private slots: void enableDeleteNonModalDialogButton(); void enableDeleteModalDialogButton(); + void useMimeTypeFilters(bool); private: QString filterString() const; @@ -89,6 +91,7 @@ private: QStringList allowedSchemes() const; void applySettings(QFileDialog *d) const; + QFormLayout *filesLayout; QCheckBox *m_readOnly; QCheckBox *m_confirmOverWrite; QCheckBox *m_nameFilterDetailsVisible; @@ -103,6 +106,7 @@ private: QLineEdit *m_directory; QLineEdit *m_selectedFileName; QList m_labelLineEdits; + QCheckBox *m_useMimeTypeFilters; QPlainTextEdit *m_nameFilters; QLineEdit *m_selectedNameFilter; QPushButton *m_deleteNonModalDialogButton; -- cgit v1.2.3