From 977a0c403746aeff9ee529aed01966b1fdeea95b Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 30 Jan 2018 14:32:53 +0100 Subject: [PATCH] Make it possible to select (not)native file dialogs at run time Add a new LyXRC variable use_native_filedialog (true by default) that allows to select the kind of FileDialog we want at runtime. (cherry picked from commit af795b80d8512926261e2457bc5f2e0ac017bec4) --- src/LyXRC.cpp | 16 +++ src/LyXRC.h | 3 + src/frontends/qt4/FileDialog.cpp | 163 +++++++++++++++---------------- status.23x | 5 + 4 files changed, 104 insertions(+), 83 deletions(-) diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp index 7cfa2a3445..fb01e7918a 100644 --- a/src/LyXRC.cpp +++ b/src/LyXRC.cpp @@ -195,6 +195,7 @@ LexerKeyword lyxrcTags[] = { { "\\use_converter_needauth", LyXRC::RC_USE_CONVERTER_NEEDAUTH }, { "\\use_converter_needauth_forbidden", LyXRC::RC_USE_CONVERTER_NEEDAUTH_FORBIDDEN }, { "\\use_lastfilepos", LyXRC::RC_USELASTFILEPOS }, + { "\\use_native_filedialog", LyXRC::RC_USE_NATIVE_FILEDIALOG }, { "\\use_pixmap_cache", LyXRC::RC_USE_PIXMAP_CACHE }, { "\\use_qimage", LyXRC::RC_USE_QIMAGE }, // compatibility with versions older than 1.4.0 only @@ -273,6 +274,7 @@ void LyXRC::setDefaults() num_lastfiles = 20; check_lastfiles = true; use_lastfilepos = true; + use_native_filedialog = true; load_session = false; make_backup = true; save_compressed = false; @@ -873,6 +875,9 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) case RC_ACCEPT_COMPOUND: lexrc >> spellchecker_accept_compound; break; + case RC_USE_NATIVE_FILEDIALOG: + lexrc >> use_native_filedialog; + break; case RC_USE_SYSTEM_COLORS: lexrc >> use_system_colors; break; @@ -2410,6 +2415,16 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c if (tag != RC_LAST) break; // fall through + case RC_USE_NATIVE_FILEDIALOG: + if (ignore_system_lyxrc || + use_native_filedialog != system_lyxrc.use_native_filedialog) { + os << "\\use_native_filedialog " + << convert(use_native_filedialog) + << '\n'; + } + if (tag != RC_LAST) + break; + // fall through case RC_USE_SYSTEM_COLORS: if (ignore_system_lyxrc || use_system_colors != system_lyxrc.use_system_colors) { @@ -3029,6 +3044,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_USE_CONVERTER_CACHE: case LyXRC::RC_USE_CONVERTER_NEEDAUTH_FORBIDDEN: case LyXRC::RC_USE_CONVERTER_NEEDAUTH: + case LyXRC::RC_USE_NATIVE_FILEDIALOG: case LyXRC::RC_USE_SYSTEM_COLORS: case LyXRC::RC_USE_TOOLTIP: case LyXRC::RC_USE_PIXMAP_CACHE: diff --git a/src/LyXRC.h b/src/LyXRC.h index f2b0ab73e6..7049bf8d5e 100644 --- a/src/LyXRC.h +++ b/src/LyXRC.h @@ -172,6 +172,7 @@ public: RC_USE_CONVERTER_CACHE, RC_USE_CONVERTER_NEEDAUTH_FORBIDDEN, RC_USE_CONVERTER_NEEDAUTH, + RC_USE_NATIVE_FILEDIALOG, RC_USE_SYSTEM_COLORS, RC_USE_TOOLTIP, RC_USE_PIXMAP_CACHE, @@ -333,6 +334,8 @@ public: bool use_tooltip; /// Use the colors from current system theme? bool use_system_colors; + /// use native file dialog or our own ? + bool use_native_filedialog; /// Use pixmap cache? bool use_pixmap_cache; /// Use QImage backend? diff --git a/src/frontends/qt4/FileDialog.cpp b/src/frontends/qt4/FileDialog.cpp index f1156348d4..ee5f3503da 100644 --- a/src/frontends/qt4/FileDialog.cpp +++ b/src/frontends/qt4/FileDialog.cpp @@ -16,6 +16,8 @@ #include "LyXFileDialog.h" #include "qt_helpers.h" +#include "LyXRC.h" + #include "support/debug.h" #include "support/FileName.h" #include "support/filetools.h" @@ -24,7 +26,9 @@ #include -/** when this is defined, the code will use +#include + +/** when LyXRC::use_native_filedialog is true, we use * QFileDialog::getOpenFileName and friends to create filedialogs. * Effects: * - the dialog does not use the quick directory buttons (Button @@ -35,13 +39,6 @@ * * Therefore there is a tradeoff in enabling or disabling this (JMarc) */ -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) -#define USE_NATIVE_FILEDIALOG 1 -#endif - -#ifdef USE_NATIVE_FILEDIALOG -#include -#endif namespace lyx { @@ -91,38 +88,38 @@ FileDialog::Result FileDialog::save(QString const & path, FileDialog::Result result; result.first = FileDialog::Chosen; -#ifdef USE_NATIVE_FILEDIALOG - QString const startsWith = makeAbsPath(suggested, path); - QString const name = - QFileDialog::getSaveFileName(qApp->focusWidget(), - title_, startsWith, filters.join(";;"), - selectedFilter, QFileDialog::DontConfirmOverwrite); - if (name.isNull()) - result.first = FileDialog::Later; - else - result.second = toqstr(os::internal_path(fromqstr(name))); -#else - LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2); - dlg.setFileMode(QFileDialog::AnyFile); - dlg.setAcceptMode(QFileDialog::AcceptSave); - dlg.setConfirmOverwrite(false); - if (selectedFilter != 0 && !selectedFilter->isEmpty()) - dlg.selectNameFilter(*selectedFilter); + if (lyxrc.use_native_filedialog) { + QString const startsWith = makeAbsPath(suggested, path); + QString const name = + QFileDialog::getSaveFileName(qApp->focusWidget(), + title_, startsWith, filters.join(";;"), + selectedFilter, QFileDialog::DontConfirmOverwrite); + if (name.isNull()) + result.first = FileDialog::Later; + else + result.second = toqstr(os::internal_path(fromqstr(name))); + } else { + LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setAcceptMode(QFileDialog::AcceptSave); + dlg.setConfirmOverwrite(false); + if (selectedFilter != 0 && !selectedFilter->isEmpty()) + dlg.selectNameFilter(*selectedFilter); - if (!suggested.isEmpty()) - dlg.selectFile(suggested); + if (!suggested.isEmpty()) + dlg.selectFile(suggested); - LYXERR(Debug::GUI, "Synchronous FileDialog: "); - int res = dlg.exec(); - LYXERR(Debug::GUI, "result " << res); - if (res == QDialog::Accepted) - result.second = internalPath(dlg.selectedFiles()[0]); - else - result.first = FileDialog::Later; - if (selectedFilter != 0) - *selectedFilter = dlg.selectedNameFilter(); - dlg.hide(); -#endif + LYXERR(Debug::GUI, "Synchronous FileDialog: "); + int res = dlg.exec(); + LYXERR(Debug::GUI, "result " << res); + if (res == QDialog::Accepted) + result.second = internalPath(dlg.selectedFiles()[0]); + else + result.first = FileDialog::Later; + if (selectedFilter != 0) + *selectedFilter = dlg.selectedNameFilter(); + dlg.hide(); + } return result; } @@ -143,29 +140,29 @@ FileDialog::Result FileDialog::open(QString const & path, FileDialog::Result result; result.first = FileDialog::Chosen; -#ifdef USE_NATIVE_FILEDIALOG - QString const startsWith = makeAbsPath(suggested, path); - QString const file = QFileDialog::getOpenFileName(qApp->focusWidget(), - title_, startsWith, filters.join(";;")); - if (file.isNull()) - result.first = FileDialog::Later; - else - result.second = internalPath(file); -#else - LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2); + if (lyxrc.use_native_filedialog) { + QString const startsWith = makeAbsPath(suggested, path); + QString const file = QFileDialog::getOpenFileName(qApp->focusWidget(), + title_, startsWith, filters.join(";;")); + if (file.isNull()) + result.first = FileDialog::Later; + else + result.second = internalPath(file); + } else { + LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2); - if (!suggested.isEmpty()) - dlg.selectFile(suggested); + if (!suggested.isEmpty()) + dlg.selectFile(suggested); - LYXERR(Debug::GUI, "Synchronous FileDialog: "); - int res = dlg.exec(); - LYXERR(Debug::GUI, "result " << res); - if (res == QDialog::Accepted) - result.second = internalPath(dlg.selectedFiles()[0]); - else - result.first = FileDialog::Later; - dlg.hide(); -#endif + LYXERR(Debug::GUI, "Synchronous FileDialog: "); + int res = dlg.exec(); + LYXERR(Debug::GUI, "result " << res); + if (res == QDialog::Accepted) + result.second = internalPath(dlg.selectedFiles()[0]); + else + result.first = FileDialog::Later; + dlg.hide(); + } return result; } @@ -178,33 +175,33 @@ FileDialog::Result FileDialog::opendir(QString const & path, FileDialog::Result result; result.first = FileDialog::Chosen; -#ifdef USE_NATIVE_FILEDIALOG - QString const startsWith = toqstr(makeAbsPath(fromqstr(suggested), - fromqstr(path)).absFileName()); - QString const dir = QFileDialog::getExistingDirectory(qApp->focusWidget(), - title_, startsWith); - if (dir.isNull()) - result.first = FileDialog::Later; - else - result.second = toqstr(os::internal_path(fromqstr(dir))); -#else - LyXFileDialog dlg(title_, path, QStringList(qt_("Directories")), - private_->b1, private_->b2); + if (lyxrc.use_native_filedialog) { + QString const startsWith = + toqstr(makeAbsPath(fromqstr(suggested), fromqstr(path)).absFileName()); + QString const dir = + QFileDialog::getExistingDirectory(qApp->focusWidget(), title_, startsWith); + if (dir.isNull()) + result.first = FileDialog::Later; + else + result.second = toqstr(os::internal_path(fromqstr(dir))); + } else { + LyXFileDialog dlg(title_, path, QStringList(qt_("Directories")), + private_->b1, private_->b2); - dlg.setFileMode(QFileDialog::DirectoryOnly); + dlg.setFileMode(QFileDialog::DirectoryOnly); - if (!suggested.isEmpty()) - dlg.selectFile(suggested); + if (!suggested.isEmpty()) + dlg.selectFile(suggested); - LYXERR(Debug::GUI, "Synchronous FileDialog: "); - int res = dlg.exec(); - LYXERR(Debug::GUI, "result " << res); - if (res == QDialog::Accepted) - result.second = internalPath(dlg.selectedFiles()[0]); - else - result.first = FileDialog::Later; - dlg.hide(); -#endif + LYXERR(Debug::GUI, "Synchronous FileDialog: "); + int res = dlg.exec(); + LYXERR(Debug::GUI, "result " << res); + if (res == QDialog::Accepted) + result.second = internalPath(dlg.selectedFiles()[0]); + else + result.first = FileDialog::Later; + dlg.hide(); + } return result; } diff --git a/status.23x b/status.23x index 849f36cb8d..d86dbd5bff 100644 --- a/status.23x +++ b/status.23x @@ -57,6 +57,11 @@ What's new snappier, especially on repeated events. As an added bonus, subpixel aliasing is honored in the work area. +- Use native file dialogs on all platforms by default. It is now + possible to switch to LyX custom dialogs (which have extra shortcuts + to relevant directories) by setting the preference + \use_native_filedialog true + - Handle properly top/bottom of inset with mac-like cursor movement (bug 10701).