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.
This commit is contained in:
Jean-Marc Lasgouttes 2018-01-30 14:32:53 +01:00
parent 61db4af82d
commit af795b80d8
3 changed files with 99 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 },
// compatibility with versions older than 1.4.0 only
{ "\\use_system_colors", LyXRC::RC_USE_SYSTEM_COLORS },
@ -272,6 +273,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;
@ -871,6 +873,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;
@ -2405,6 +2410,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) {
@ -3015,6 +3030,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,
@ -332,6 +333,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;
/// Spellchecker engine: aspell, hunspell, etc

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;
}