SVN commit 1217310 by lunakl: Backport r1216758. Make KFileDialog automatically choose file type from typed extension also when file types are specified manually and not as mimetypes. (http://svn.reviewboard.kde.org/r/6325) M +5 -0 kfilefiltercombo.cpp M +6 -0 kfilefiltercombo.h M +13 -1 kfilewidget.cpp --- branches/KDE/4.6/kdelibs/kfile/kfilefiltercombo.cpp #1217309:1217310 @@ -214,4 +214,9 @@ return d->defaultFilter; } +bool KFileFilterCombo::isMimeFilter() const +{ + return d->isMimeFilter; +} + #include "kfilefiltercombo.moc" --- branches/KDE/4.6/kdelibs/kfile/kfilefiltercombo.h #1217309:1217310 @@ -94,6 +94,12 @@ */ QStringList filters() const; + /** + * Returns true if the filter has been set using setMimeFilter(). + * @since 4.6.1 + */ + bool isMimeFilter() const; + protected: virtual bool eventFilter( QObject*, QEvent* ); --- branches/KDE/4.6/kdelibs/kfile/kfilewidget.cpp #1217309:1217310 @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -2294,18 +2295,29 @@ // kDebug(kfile_area); if ((operationMode == KFileWidget::Saving) && (ops->mode() & KFile::File) ) { - const QString urlStr = locationEditCurrentText(); + QString urlStr = locationEditCurrentText(); if (urlStr.isEmpty()) return; + if( filterWidget->isMimeFilter()) { KMimeType::Ptr mime = KMimeType::findByPath(urlStr, 0, true); if (mime && mime->name() != KMimeType::defaultMimeType()) { if (filterWidget->currentFilter() != mime->name() && filterWidget->filters().indexOf(mime->name()) != -1) filterWidget->setCurrentFilter(mime->name()); } + } else { + QString filename = urlStr.mid( urlStr.lastIndexOf( KDIR_SEPARATOR ) + 1 ); // only filename + foreach( const QString& filter, filterWidget->filters()) { + QString f = filter.left( filter.indexOf( '|' )); // '*.foo|Foo type' -> '*.foo' + if( KMimeType::matchFileName( filename, f )) { + filterWidget->setCurrentFilter( filter ); + break; } } + } + } +} // applies only to a file that doesn't already exist void KFileWidgetPrivate::appendExtension (KUrl &url)