Currently native file dialogs are used on windows and Mac. It is possible to select them on unix with cmake, but not autoconf.

The following patch allows to select the type of file dialog at runtime (see ticket http://www.lyx.org/trac/ticket/11003 for why I am doing that).

Currently all platforms default to true (native). Where can we go from there? Ideas:

1/ apply this patch, maybe with a default of "false" and value "true" set in mac and windows lyxrc.dist files. This would give us the same behavior as before, but configurable

2/ the same, but also add a 100th checkbox to our crowded preference dialog so that people can toggle it at ease

3/ remove support for our custom file dialog and always use the native one (this would lose the Document/Example buttons)

4/ remove support for our custom file dialog and always use the Qt custom file dialog, and try to make setSidebarUrl work, so that we have our Documents/Examples links in the side bar; this cannot work with a native file dialog.

Does somebody use the custom Documents/Examples buttons? Are they really needed?

JMarc


From 2bf8eecb41c8af81a5988ba032f567936ad99662 Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <lasgout...@lyx.org>
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.
---
 src/LyXRC.cpp                    |  16 ++++
 src/LyXRC.h                      |   3 +
 src/frontends/qt4/FileDialog.cpp | 177 +++++++++++++++++++--------------------
 3 files changed, 106 insertions(+), 90 deletions(-)

diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp
index 9e42857..6a58f34 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 },
 	// 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:
diff --git a/src/LyXRC.h b/src/LyXRC.h
index 3da93ac..5376673 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,
@@ -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
diff --git a/src/frontends/qt4/FileDialog.cpp b/src/frontends/qt4/FileDialog.cpp
index f115634..ee5f350 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 <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 (!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
+	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);
+
+		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 (!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
+	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);
+
+		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);
-
-	dlg.setFileMode(QFileDialog::DirectoryOnly);
-
-	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
+	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);
+
+		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();
+	}
 	return result;
 }
 
-- 
2.7.4

Reply via email to