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 af795b80d8)
This commit is contained in:
Jean-Marc Lasgouttes 2018-01-30 14:32:53 +01:00
parent d9314d15dc
commit 977a0c4037
4 changed files with 104 additions and 83 deletions

View File

@ -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<string>(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:

View File

@ -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?

View File

@ -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 <string>
/** when this is defined, the code will use
#include <QApplication>
/** 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 <QApplication>
#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;
}

View File

@ -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).