[vlc-devel] [PATCH] Qt: fix "last folder used" not remembered correctly
Pierre Lamot
pierre at videolabs.io
Fri Mar 2 19:11:34 CET 2018
On windows last used folder was stored by its URL, which cannot by
used QFileDialog::getXXXFileName.
This patch will store last used folder by its URL systematically and
use QFileDialog::getXXXURL. This allows to store non file location (ie: smb)
---
modules/gui/qt/components/extended_panels.cpp | 12 ++++++++----
modules/gui/qt/components/interface_widgets.cpp | 8 +++-----
modules/gui/qt/components/open_panels.cpp | 8 +++++---
modules/gui/qt/components/open_panels.hpp | 6 ++++--
modules/gui/qt/components/sout/sout_widgets.cpp | 6 ++++--
modules/gui/qt/dialogs_provider.cpp | 24 ++++++++++++++----------
modules/gui/qt/dialogs_provider.hpp | 8 ++++----
modules/gui/qt/qt.hpp | 3 ++-
modules/gui/qt/util/qt_dirs.hpp | 1 -
9 files changed, 44 insertions(+), 32 deletions(-)
diff --git a/modules/gui/qt/components/extended_panels.cpp b/modules/gui/qt/components/extended_panels.cpp
index 2433833a0b..bdd8bf1608 100644
--- a/modules/gui/qt/components/extended_panels.cpp
+++ b/modules/gui/qt/components/extended_panels.cpp
@@ -358,22 +358,26 @@ void ExtVideo::updateFilters()
void ExtVideo::browseLogo()
{
+ const QStringList schemes = QStringList(QStringLiteral("file"));
QString filter = QString( "%1 (*.png *.jpg);;%2 (*)" )
.arg( qtr("Image Files") )
.arg( TITLE_EXTENSIONS_ALL );
- QString file = QFileDialog::getOpenFileName( NULL, qtr( "Logo filenames" ),
- p_intf->p_sys->filepath, filter );
+ QString file = QFileDialog::getOpenFileUrl( NULL, qtr( "Logo filenames" ),
+ p_intf->p_sys->filepath, filter,
+ NULL, QFileDialog::Options(), schemes ).toLocalFile();
UPDATE_AND_APPLY_TEXT( logoFileText, file );
}
void ExtVideo::browseEraseFile()
{
+ const QStringList schemes = QStringList(QStringLiteral("file"));
QString filter = QString( "%1 (*.png *.jpg);;%2 (*)" )
.arg( qtr("Image Files") )
.arg( TITLE_EXTENSIONS_ALL );
- QString file = QFileDialog::getOpenFileName( NULL, qtr( "Image mask" ),
- p_intf->p_sys->filepath, filter );
+ QString file = QFileDialog::getOpenFileUrl( NULL, qtr( "Image mask" ),
+ p_intf->p_sys->filepath, filter,
+ NULL, QFileDialog::Options(), schemes ).toLocalFile();
UPDATE_AND_APPLY_TEXT( eraseMaskText, file );
}
diff --git a/modules/gui/qt/components/interface_widgets.cpp b/modules/gui/qt/components/interface_widgets.cpp
index 9f67e30ebe..575970c1b8 100644
--- a/modules/gui/qt/components/interface_widgets.cpp
+++ b/modules/gui/qt/components/interface_widgets.cpp
@@ -885,15 +885,13 @@ void CoverArtLabel::setArtFromFile()
if( !p_item )
return;
- QString filePath = QFileDialog::getOpenFileName( this, qtr( "Choose Cover Art" ),
+ QUrl fileUrl = QFileDialog::getOpenFileUrl( this, qtr( "Choose Cover Art" ),
p_intf->p_sys->filepath, qtr( "Image Files (*.gif *.jpg *.jpeg *.png)" ) );
- if( filePath.isEmpty() )
+ if( fileUrl.isEmpty() )
return;
- QString fileUrl = QUrl::fromLocalFile( filePath ).toString();
-
- THEMIM->getIM()->setArt( p_item, fileUrl );
+ THEMIM->getIM()->setArt( p_item, fileUrl.toString() );
}
void CoverArtLabel::clear()
diff --git a/modules/gui/qt/components/open_panels.cpp b/modules/gui/qt/components/open_panels.cpp
index ef52b8e52e..cb720dc5e4 100644
--- a/modules/gui/qt/components/open_panels.cpp
+++ b/modules/gui/qt/components/open_panels.cpp
@@ -233,7 +233,7 @@ void FileOpenPanel::browseFile()
);
item->setFlags( Qt::ItemIsEnabled );
ui.fileListWidg->addItem( item );
- savedirpathFromFile( file );
+ p_intf->p_sys->filepath = url;
}
updateButtons();
updateMRL();
@@ -633,8 +633,10 @@ void DiscOpenPanel::updateMRL()
void DiscOpenPanel::browseDevice()
{
- QString dir = QFileDialog::getExistingDirectory( this,
- qtr( I_DEVICE_TOOLTIP ), p_intf->p_sys->filepath );
+ const QStringList schemes = QStringList(QStringLiteral("file"));
+ QString dir = QFileDialog::getExistingDirectoryUrl( this,
+ qtr( I_DEVICE_TOOLTIP ), p_intf->p_sys->filepath,
+ QFileDialog::ShowDirsOnly, schemes ).toLocalFile();
if( !dir.isEmpty() )
{
ui.deviceCombo->addItem( toNativeSepNoSlash( dir ) );
diff --git a/modules/gui/qt/components/open_panels.hpp b/modules/gui/qt/components/open_panels.hpp
index 71a983141d..48044383a5 100644
--- a/modules/gui/qt/components/open_panels.hpp
+++ b/modules/gui/qt/components/open_panels.hpp
@@ -96,8 +96,10 @@ class FileOpenBox: public QFileDialog
Q_OBJECT
public:
FileOpenBox( QWidget *parent, const QString &caption,
- const QString &directory, const QString &filter ):
- QFileDialog( parent, caption, directory, filter ) {}
+ const QUrl &directory, const QString &filter ):
+ QFileDialog( parent, caption, "", filter ) {
+ setDirectoryUrl(directory);
+ }
public slots:
void accept(){}
void reject(){}
diff --git a/modules/gui/qt/components/sout/sout_widgets.cpp b/modules/gui/qt/components/sout/sout_widgets.cpp
index 19b54f55a7..8fb1b993dd 100644
--- a/modules/gui/qt/components/sout/sout_widgets.cpp
+++ b/modules/gui/qt/components/sout/sout_widgets.cpp
@@ -169,8 +169,10 @@ QString FileDestBox::getMRL( const QString& mux )
void FileDestBox::fileBrowse()
{
- QString fileName = QFileDialog::getSaveFileName( this, qtr( "Save file..." ),
- p_intf->p_sys->filepath, qtr( "Containers (*.ps *.ts *.mpg *.ogg *.asf *.mp4 *.mov *.wav *.raw *.flv *.webm)" ) );
+ const QStringList schemes = QStringList(QStringLiteral("file"));
+ QString fileName = QFileDialog::getSaveFileUrl( this, qtr( "Save file..." ),
+ p_intf->p_sys->filepath, qtr( "Containers (*.ps *.ts *.mpg *.ogg *.asf *.mp4 *.mov *.wav *.raw *.flv *.webm)" ),
+ nullptr, QFileDialog::Options(), schemes).toLocalFile();
fileEdit->setText( toNativeSeparators( fileName ) );
emit mrlUpdated();
}
diff --git a/modules/gui/qt/dialogs_provider.cpp b/modules/gui/qt/dialogs_provider.cpp
index edf42665aa..0484af8c59 100644
--- a/modules/gui/qt/dialogs_provider.cpp
+++ b/modules/gui/qt/dialogs_provider.cpp
@@ -116,12 +116,12 @@ DialogsProvider::~DialogsProvider()
QStringList DialogsProvider::getOpenURL( QWidget *parent,
const QString &caption,
- const QString &dir,
+ const QUrl &dir,
const QString &filter,
QString *selectedFilter )
{
QStringList res;
- QList<QUrl> urls = QFileDialog::getOpenFileUrls( parent, caption, QUrl::fromUserInput( dir ), filter, selectedFilter );
+ QList<QUrl> urls = QFileDialog::getOpenFileUrls( parent, caption, dir, filter, selectedFilter );
foreach( const QUrl& url, urls )
res.append( url.toEncoded() );
@@ -131,11 +131,12 @@ QStringList DialogsProvider::getOpenURL( QWidget *parent,
QString DialogsProvider::getSaveFileName( QWidget *parent,
const QString &caption,
- const QString &dir,
+ const QUrl &dir,
const QString &filter,
QString *selectedFilter )
{
- return QFileDialog::getSaveFileName( parent, caption, dir, filter, selectedFilter );
+ const QStringList schemes = QStringList(QStringLiteral("file"));
+ return QFileDialog::getSaveFileUrl( parent, caption, dir, filter, selectedFilter, QFileDialog::Options(), schemes).toLocalFile();
}
void DialogsProvider::quit()
@@ -404,9 +405,9 @@ void DialogsProvider::openFileGenericDialog( intf_dialog_args_t *p_arg )
foreach( const QString &uri, urls )
p_arg->psz_results[i++] = strdup( qtu( uri ) );
if(i == 0)
- p_intf->p_sys->filepath = QString::fromLatin1("");
+ p_intf->p_sys->filepath = "";
else
- p_intf->p_sys->filepath = qfu( p_arg->psz_results[i-1] );
+ p_intf->p_sys->filepath = QUrl::fromEncoded(p_arg->psz_results[i-1]);
}
/* Callback */
@@ -473,7 +474,7 @@ void DialogsProvider::MLAppendDialog( int tab )
***/
QStringList DialogsProvider::showSimpleOpen( const QString& help,
int filters,
- const QString& path )
+ const QUrl& path )
{
QString fileTypes = "";
if( filters & EXT_FILTER_MEDIA ) {
@@ -500,7 +501,8 @@ QStringList DialogsProvider::showSimpleOpen( const QString& help,
path.isEmpty() ? p_intf->p_sys->filepath : path,
fileTypes );
- if( !urls.isEmpty() ) savedirpathFromFile( urls.last() );
+ if( !urls.isEmpty() )
+ p_intf->p_sys->filepath = QUrl( urls.last() );
return urls;
}
@@ -570,8 +572,10 @@ static void openDirectory( intf_thread_t *p_intf, bool pl, bool go )
QString DialogsProvider::getDirectoryDialog( intf_thread_t *p_intf )
{
- QString dir = QFileDialog::getExistingDirectory( NULL,
- qtr( I_OP_DIR_WINTITLE ), p_intf->p_sys->filepath );
+ const QStringList schemes = QStringList(QStringLiteral("file"));
+ QString dir = QFileDialog::getExistingDirectoryUrl( NULL,
+ qtr( I_OP_DIR_WINTITLE ), p_intf->p_sys->filepath,
+ QFileDialog::ShowDirsOnly, schemes ).toLocalFile();
if( dir.isEmpty() ) return QString();
diff --git a/modules/gui/qt/dialogs_provider.hpp b/modules/gui/qt/dialogs_provider.hpp
index 4d65c7a599..6476dbe124 100644
--- a/modules/gui/qt/dialogs_provider.hpp
+++ b/modules/gui/qt/dialogs_provider.hpp
@@ -88,17 +88,17 @@ public:
int filters = EXT_FILTER_MEDIA |
EXT_FILTER_VIDEO | EXT_FILTER_AUDIO |
EXT_FILTER_PLAYLIST,
- const QString& path = QString() );
+ const QUrl& path = QUrl() );
bool isDying() { return b_isDying; }
static QString getDirectoryDialog( intf_thread_t *p_intf);
static QStringList getOpenURL(QWidget *parent = NULL,
const QString &caption = QString(),
- const QString &dir = QString(),
+ const QUrl &dir = QUrl(),
const QString &filter = QString(),
QString *selectedFilter = NULL );
- static QString getSaveFileName( QWidget *parent = NULL,
+ static QString getSaveFileName(QWidget *parent = NULL,
const QString &caption = QString(),
- const QString &dir = QString(),
+ const QUrl &dir = QUrl(),
const QString &filter = QString(),
QString *selectedFilter = NULL );
diff --git a/modules/gui/qt/qt.hpp b/modules/gui/qt/qt.hpp
index 727ca8cf6a..e59583ab71 100644
--- a/modules/gui/qt/qt.hpp
+++ b/modules/gui/qt/qt.hpp
@@ -41,6 +41,7 @@
#define QT_NO_CAST_TO_ASCII
#include <QString>
+#include <QUrl>
#if ( QT_VERSION < 0x050500 )
# error Update your Qt version to at least 5.5.0
@@ -71,7 +72,7 @@ struct intf_sys_t
class QSettings *mainSettings; /* Qt State settings not messing main VLC ones */
class PLModel *pl_model;
- QString filepath; /* Last path used in dialogs */
+ QUrl filepath; /* Last path used in dialogs */
unsigned voutWindowType; /* Type of vout_window_t provided */
bool b_isDialogProvider; /* Qt mode or Skins mode */
diff --git a/modules/gui/qt/util/qt_dirs.hpp b/modules/gui/qt/util/qt_dirs.hpp
index 641ed4d885..a10cc0d186 100644
--- a/modules/gui/qt/util/qt_dirs.hpp
+++ b/modules/gui/qt/util/qt_dirs.hpp
@@ -36,7 +36,6 @@ static inline QString removeTrailingSlash( QString s )
return s;
}
-#define savedirpathFromFile( a ) p_intf->p_sys->filepath = toNativeSeparators( QFileInfo( a ).path() )
#define toNativeSepNoSlash( a ) toNativeSeparators( removeTrailingSlash( a ) )
static inline QString colon_escape( QString s )
--
2.14.1
More information about the vlc-devel
mailing list