Jürgen Spitzmüller wrote:
> Jesper, does your plan to implement export menu disabling still stand? 

Sorry, I could not resist.

The attached patch implements this feature. I've implemented in a way that is 
extensible (in case we want other UI configuration flags later).

The actual selection of formats that appear in the export menu by default is 
not in any way fixed, I've added what I think are the basic ones, but this 
list can be changed after the thing is in. I have not spent much time on this 
specific issue.

OK?

Jürgen
Index: src/Graph.h
===================================================================
--- src/Graph.h	(Revision 37596)
+++ src/Graph.h	(Arbeitskopie)
@@ -32,8 +32,9 @@
 	/// \return a vector of the vertices from which "to" can be reached
 	EdgePath const getReachableTo(int to, bool clear_visited);
 	/// \return a vector of the vertices that can be reached from "from"
-	EdgePath const
-		getReachable(int from, bool only_viewable, bool clear_visited);
+	EdgePath const getReachable(int from, bool only_viewable,
+				    bool clear_visited,
+				    bool export_menu = false);
 	/// can "from" be reached from "to"?
 	bool isReachable(int from, int to);
 	/// find a path from "from" to "to". always returns one of the
Index: src/Converter.h
===================================================================
--- src/Converter.h	(Revision 37596)
+++ src/Converter.h	(Arbeitskopie)
@@ -97,7 +97,7 @@
 	///
 	std::vector<Format const *> const
 	getReachable(std::string const & from, bool only_viewable,
-		     bool clear_visited);
+		     bool clear_visited, bool export_menu = false);
 
 	std::vector<Format const *> importableFormats();
 	std::vector<Format const *> exportableFormats(bool only_viewable);
Index: src/Buffer.h
===================================================================
--- src/Buffer.h	(Revision 37596)
+++ src/Buffer.h	(Arbeitskopie)
@@ -617,7 +617,8 @@
 	///
 	bool isExportable(std::string const & format) const;
 	///
-	std::vector<Format const *> exportableFormats(bool only_viewable) const;
+	std::vector<Format const *> exportableFormats(bool only_viewable,
+						      bool export_menu = false) const;
 	///
 	bool isExportableFormat(std::string const & format) const;
 	/// mark the buffer as busy exporting something, or not
Index: src/Format.h
===================================================================
--- src/Format.h	(Revision 37596)
+++ src/Format.h	(Arbeitskopie)
@@ -35,10 +35,16 @@
 		/// Set if this format can contain vector graphics.
 		vector = 2
 	};
+	/// UI behaviour
+	enum UiFlags {
+		no_flag = 0,
+		/// This format should  appear in the File > Export menu
+		export_menu = 1
+	};
 	///
 	Format(std::string const & n, std::string const & e, std::string const & p,
 	       std::string const & s, std::string const & v, std::string const & ed,
-	       int);
+	       int, int);
 	///
 	bool dummy() const;
 	/// Tell whether this format is a child format.
@@ -76,6 +82,10 @@
 	bool vectorFormat() const { return flags_ & vector; }
 	///
 	void setFlags(int v) { flags_ = v; }
+	///
+	bool inExportMenu() const { return uiflags_ & export_menu; }
+	///
+	void setUiFlags(int v) { uiflags_ = v; }
 private:
 	/// Internal name. Needs to be unique.
 	std::string name_;
@@ -97,6 +107,8 @@
 	std::string editor_;
 	///
 	int flags_;
+	///
+	int uiflags_;
 };
 
 
@@ -134,7 +146,7 @@
 	void add(std::string const & name, std::string const & extension,
 		 std::string const & prettyname, std::string const & shortcut,
 		 std::string const & viewer, std::string const & editor,
-		 int flags);
+		 int flags, int ui_flags);
 	///
 	void erase(std::string const & name);
 	///
Index: src/Converter.cpp
===================================================================
--- src/Converter.cpp	(Revision 37596)
+++ src/Converter.cpp	(Arbeitskopie)
@@ -684,12 +684,13 @@
 
 vector<Format const *> const
 Converters::getReachable(string const & from, bool const only_viewable,
-			 bool const clear_visited)
+			 bool const clear_visited, bool const export_menu)
 {
 	vector<int> const & reachables =
 		G_.getReachable(formats.getNumber(from),
 				only_viewable,
-				clear_visited);
+				clear_visited,
+				export_menu);
 
 	return intToFormat(reachables);
 }
Index: src/frontends/qt4/GuiPrefs.cpp
===================================================================
--- src/frontends/qt4/GuiPrefs.cpp	(Revision 37596)
+++ src/frontends/qt4/GuiPrefs.cpp	(Arbeitskopie)
@@ -1927,6 +1927,7 @@
 		toqstr(l10n_shortcut(f.prettyname(), f.shortcut())));
 	documentCB->setChecked((f.documentFormat()));
 	vectorCB->setChecked((f.vectorFormat()));
+	exportMenuCB->setChecked((f.inExportMenu()));
 	updateViewers();
 	updateEditors();
 }
@@ -2021,6 +2022,16 @@
 }
 
 
+void PrefFileformats::on_exportMenuCB_stateChanged(int state)
+{
+	if (state == Qt::Checked)
+		currentFormat().setUiFlags(Format::export_menu);
+	else
+		currentFormat().setUiFlags(Format::no_flag);
+	changed();
+}
+
+
 void PrefFileformats::updatePrettyname()
 {
 	QString const newname = formatsCB->currentText();
@@ -2129,7 +2140,7 @@
 
 void PrefFileformats::on_formatNewPB_clicked()
 {
-	form_->formats().add("", "", "", "", "", "", Format::none);
+	form_->formats().add("", "", "", "", "", "", Format::none, Format::no_flag);
 	updateView();
 	formatsCB->setCurrentIndex(0);
 	formatsCB->setFocus(Qt::OtherFocusReason);
Index: src/frontends/qt4/ui/PrefFileformatsUi.ui
===================================================================
--- src/frontends/qt4/ui/PrefFileformatsUi.ui	(Revision 37596)
+++ src/frontends/qt4/ui/PrefFileformatsUi.ui	(Arbeitskopie)
@@ -23,7 +23,7 @@
      </property>
     </widget>
    </item>
-   <item row="0" column="1" colspan="2">
+   <item row="0" column="1">
     <widget class="QComboBox" name="formatsCB">
      <property name="editable">
       <bool>true</bool>
@@ -159,7 +159,17 @@
    <item row="8" column="1" colspan="2">
     <widget class="QLineEdit" name="copierED"/>
    </item>
-   <item row="9" column="0" colspan="5">
+   <item row="9" column="0" colspan="3">
+    <widget class="QCheckBox" name="exportMenuCB">
+     <property name="toolTip">
+      <string>Check this to  ahow the current format in the File &gt; Export menu</string>
+     </property>
+     <property name="text">
+      <string>Sho&amp;w in export menu</string>
+     </property>
+    </widget>
+   </item>
+   <item row="10" column="0" colspan="5">
     <widget class="QGroupBox" name="defaultFormatGB">
      <property name="toolTip">
       <string>Specify the default output format when using (PDF)LaTeX</string>
@@ -200,7 +210,7 @@
      </layout>
     </widget>
    </item>
-   <item row="10" column="1" colspan="2">
+   <item row="11" column="1" colspan="3">
     <spacer>
      <property name="orientation">
       <enum>Qt::Vertical</enum>
Index: src/frontends/qt4/Menus.cpp
===================================================================
--- src/frontends/qt4/Menus.cpp	(Revision 37596)
+++ src/frontends/qt4/Menus.cpp	(Arbeitskopie)
@@ -1002,7 +1002,7 @@
 		action = LFUN_BUFFER_UPDATE;
 		break;
 	default:
-		formats = buf->exportableFormats(false);
+		formats = buf->exportableFormats(false, true);
 		action = LFUN_BUFFER_EXPORT;
 	}
 	sort(formats.begin(), formats.end(), &compareFormat);
Index: src/frontends/qt4/GuiPrefs.h
===================================================================
--- src/frontends/qt4/GuiPrefs.h	(Revision 37596)
+++ src/frontends/qt4/GuiPrefs.h	(Arbeitskopie)
@@ -373,6 +373,7 @@
 	void on_viewerCO_currentIndexChanged(int i);
 	void on_editorCO_currentIndexChanged(int i);
 	void setFlags();
+	void on_exportMenuCB_stateChanged(int);
 	void updatePrettyname();
 
 private:
Index: src/Format.cpp
===================================================================
--- src/Format.cpp	(Revision 37596)
+++ src/Format.cpp	(Arbeitskopie)
@@ -87,9 +87,9 @@
 
 Format::Format(string const & n, string const & e, string const & p,
 	       string const & s, string const & v, string const & ed,
-	       int flags)
+	       int flags, int ui_flags)
 	: name_(n), extension_(e), prettyname_(p), shortcut_(s), viewer_(v),
-	  editor_(ed), flags_(flags)
+	  editor_(ed), flags_(flags), uiflags_(ui_flags)
 {}
 
 
@@ -201,24 +201,24 @@
 {
 	if (!getFormat(name))
 		add(name, name, name, string(), string(), string(),
-		    Format::document);
+		    Format::document, Format::no_flag);
 }
 
 
 void Formats::add(string const & name, string const & extension,
 		  string const & prettyname, string const & shortcut,
 		  string const & viewer, string const & editor,
-		  int flags)
+		  int flags, int ui_flags)
 {
 	FormatList::iterator it =
 		find_if(formatlist.begin(), formatlist.end(),
 			FormatNamesEqual(name));
 	if (it == formatlist.end())
 		formatlist.push_back(Format(name, extension, prettyname,
-					    shortcut, viewer, editor, flags));
+					    shortcut, viewer, editor, flags, ui_flags));
 	else
 		*it = Format(name, extension, prettyname, shortcut, viewer,
-			     editor, flags);
+			     editor, flags, ui_flags);
 }
 
 
Index: src/LyXRC.cpp
===================================================================
--- src/LyXRC.cpp	(Revision 37596)
+++ src/LyXRC.cpp	(Arbeitskopie)
@@ -1083,6 +1083,7 @@
 				}
 			}
 			int flgs = Format::none;
+			int uiflgs = Format::no_flag;
 			while (!flags.empty()) {
 				string flag;
 				flags = split(flags, flag, ',');
@@ -1090,6 +1091,8 @@
 					flgs |= Format::document;
 				else if (flag == "vector")
 					flgs |= Format::vector;
+				else if (flag == "menu=export")
+					uiflgs = Format::export_menu;
 				else
 					LYXERR0("Ignoring unknown flag `"
 					       << flag << "' for format `"
@@ -1102,7 +1105,7 @@
 					formats.erase(format);
 			} else {
 				formats.add(format, extension, prettyname,
-					    shortcut, viewer, editor, flgs);
+					    shortcut, viewer, editor, flgs, uiflgs);
 			}
 			break;
 		}
Index: src/Graph.cpp
===================================================================
--- src/Graph.cpp	(Revision 37596)
+++ src/Graph.cpp	(Arbeitskopie)
@@ -83,7 +83,7 @@
 
 Graph::EdgePath const
 	Graph::getReachable(int from, bool only_viewable,
-		bool clear_visited)
+		bool clear_visited, bool export_menu)
 {
 	EdgePath result;
 	queue<int> Q;
@@ -94,13 +94,15 @@
 		int const current = Q.front();
 		Q.pop();
 		Format const & format = formats.get(current);
-		if (!only_viewable || !format.viewer().empty())
-			result.push_back(current);
-		else if (format.isChildFormat()) {
+		if (!only_viewable || !format.viewer().empty()) {
+			if (!export_menu || format.inExportMenu())
+				result.push_back(current);
+		} else if (format.isChildFormat()) {
 			Format const * const parent =
 				formats.getFormat(format.parentFormat());
 			if (parent && !parent->viewer().empty())
-				result.push_back(current);
+				if (!export_menu || format.inExportMenu())
+					result.push_back(current);
 		}
 
 		vector<Arrow *>::const_iterator cit =
Index: src/Buffer.cpp
===================================================================
--- src/Buffer.cpp	(Revision 37596)
+++ src/Buffer.cpp	(Arbeitskopie)
@@ -3701,15 +3701,15 @@
 }
 
 
-vector<Format const *> Buffer::exportableFormats(bool only_viewable) const
+vector<Format const *> Buffer::exportableFormats(bool only_viewable, bool export_menu) const
 {
 	vector<string> const backs = backends();
 	vector<Format const *> result =
-		theConverters().getReachable(backs[0], only_viewable, true);
+		theConverters().getReachable(backs[0], only_viewable, true, export_menu);
 	for (vector<string>::const_iterator it = backs.begin() + 1;
 	     it != backs.end(); ++it) {
 		vector<Format const *>  r =
-			theConverters().getReachable(*it, only_viewable, false);
+			theConverters().getReachable(*it, only_viewable, false, export_menu);
 		result.insert(result.end(), r.begin(), r.end());
 	}
 	return result;
Index: lib/configure.py
===================================================================
--- lib/configure.py	(Revision 37596)
+++ lib/configure.py	(Arbeitskopie)
@@ -498,19 +498,19 @@
 \Format asciiimage asc    "Plain text (image)"         "" ""	"%%"	""
 \Format asciixfig  asc    "Plain text (Xfig output)"   "" ""	"%%"	""
 \Format dateout    tmp    "date (output)"         "" ""	"%%"	""
-\Format docbook    sgml    DocBook                B  ""	"%%"	"document"
-\Format docbook-xml xml   "Docbook (XML)"         "" ""	"%%"	"document"
+\Format docbook    sgml    DocBook                B  ""	"%%"	"document,menu=export"
+\Format docbook-xml xml   "Docbook (XML)"         "" ""	"%%"	"document,menu=export"
 \Format dot        dot    "Graphviz Dot"          "" ""	"%%"	"vector"
-\Format platex     tex    "LaTeX (pLaTeX)"        "" "" "%%"    "document"
-\Format literate   nw      NoWeb                  N  ""	"%%"	"document"
-\Format sweave     Rnw    "Sweave"                S  "" "%%"    "document"
+\Format platex     tex    "LaTeX (pLaTeX)"        "" "" "%%"    "document,menu=export"
+\Format literate   nw      NoWeb                  N  ""	"%%"	"document,menu=export"
+\Format sweave     Rnw    "Sweave"                S  "" "%%"    "document,menu=export"
 \Format lilypond   ly     "LilyPond music"        "" ""	"%%"	"vector"
 \Format lilypond-book    lytex "LilyPond book (LaTeX)"   "" ""	"%%"	"document"
-\Format latex      tex    "LaTeX (plain)"         L  ""	"%%"	"document"
-\Format luatex     tex    "LaTeX (LuaTeX)"        "" ""	"%%"	"document"
-\Format pdflatex   tex    "LaTeX (pdflatex)"      "" ""	"%%"	"document"
-\Format xetex      tex    "LaTeX (XeTeX)"         "" ""	"%%"	"document"
-\Format text       txt    "Plain text"            a  ""	"%%"	"document"
+\Format latex      tex    "LaTeX (plain)"         L  ""	"%%"	"document,menu=export"
+\Format luatex     tex    "LaTeX (LuaTeX)"        "" ""	"%%"	"document,menu=export"
+\Format pdflatex   tex    "LaTeX (pdflatex)"      "" ""	"%%"	"document,menu=export"
+\Format xetex      tex    "LaTeX (XeTeX)"         "" ""	"%%"	"document,menu=export"
+\Format text       txt    "Plain text"            a  ""	"%%"	"document,menu=export"
 \Format text2      txt    "Plain text (pstotext)" "" ""	"%%"	"document"
 \Format text3      txt    "Plain text (ps2ascii)" "" ""	"%%"	"document"
 \Format text4      txt    "Plain text (catdvi)"   "" ""	"%%"	"document"
@@ -522,9 +522,9 @@
 \Format oocalc     ods    "OpenOffice spreadsheet" "" "" "%%"    "document"''']) 
  #
     path, xhtmlview = checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
-        rc_entry = [r'\Format xhtml      xhtml   "LyXHTML"              y "%%" ""    "document"'])
+        rc_entry = [r'\Format xhtml      xhtml   "LyXHTML"              y "%%" ""    "document,menu=export"'])
     if xhtmlview == "":
-        addToRC(r'\Format xhtml      xhtml   "LyXHTML"              y "" ""  "document"')
+        addToRC(r'\Format xhtml      xhtml   "LyXHTML"              y "" ""  "document,menu=export"')
  #
     checkEditor('a BibTeX editor', ['sensible-editor', 'jabref', 'JabRef', \
         'pybliographic', 'bibdesk', 'gbib', 'kbib', \
@@ -541,32 +541,32 @@
     # for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html
     checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
 		    'gv', 'ghostview'],
-        rc_entry = [r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"	""	"document,vector"
-\Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"	""	"document,vector"
-\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"	""	"document,vector"
-\Format pdf4       pdf    "PDF (XeTeX)"           X  "%%"	""	"document,vector"
-\Format pdf5       pdf    "PDF (LuaTeX)"          u  "%%"	""	"document,vector"'''])
+        rc_entry = [r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"	""	"document,vector,menu=export"
+\Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"	""	"document,vector,menu=export"
+\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"	""	"document,vector,menu=export"
+\Format pdf4       pdf    "PDF (XeTeX)"           X  "%%"	""	"document,vector,menu=export"
+\Format pdf5       pdf    "PDF (LuaTeX)"          u  "%%"	""	"document,vector,menu=export"'''])
     #
     checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'],
-        rc_entry = [r'''\Format dvi        dvi     DVI                    D  "%%"	""	"document,vector"
-\Format dvi3       dvi     "DVI (LuaTeX)"          V  "%%"	""	"document,vector"'''])
+        rc_entry = [r'''\Format dvi        dvi     DVI                    D  "%%"	""	"document,vector,menu=export"
+\Format dvi3       dvi     "DVI (LuaTeX)"          V  "%%"	""	"document,vector,menu=export"'''])
     if dtl_tools:
         # Windows only: DraftDVI
         addToRC(r'\Format dvi2       dvi     DraftDVI               ""	""	""	"vector"')
     #
     checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
-        rc_entry = [r'\Format html       html    HTML                   H  "%%"	""	"document"'])
+        rc_entry = [r'\Format html       html    HTML                   H  "%%"	""	"document,menu=export"'])
     #
     checkViewerEditor('Noteedit', ['noteedit'],
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"	"%%"	"vector"'])
     #
     checkViewerEditor('an OpenDocument/OpenOffice viewer', ['swriter', 'oowriter', 'abiword'],
-        rc_entry = [r'''\Format odt        odt     OpenDocument           "" "%%"	"%%"	"document,vector"
+        rc_entry = [r'''\Format odt        odt     OpenDocument           "" "%%"	"%%"	"document,vector,menu=export"
 \Format sxw        sxw    "OpenOffice.Org (sxw)"  "" ""	""	"document,vector"'''])
     # 
     checkViewerEditor('a Rich Text and Word viewer', ['swriter', 'oowriter', 'abiword'],
-        rc_entry = [r'''\Format rtf        rtf    "Rich Text Format"      "" "%%"	"%%"	"document,vector"
-\Format word       doc    "MS Word"               W  "%%"	"%%"	"document,vector"'''])
+        rc_entry = [r'''\Format rtf        rtf    "Rich Text Format"      "" "%%"	"%%"	"document,vector,menu=export"
+\Format word       doc    "MS Word"               W  "%%"	"%%"	"document,vector,menu=export"'''])
     #
     # entries that do not need checkProg
     addToRC(r'''\Format date       ""     "date command"          "" ""	""	""
@@ -576,7 +576,7 @@
 \Format lyx13x     13.lyx  "LyX 1.3.x"             "" ""	""	"document"
 \Format lyx14x     14.lyx  "LyX 1.4.x"             "" ""	""	"document"
 \Format lyx15x     15.lyx  "LyX 1.5.x"             "" ""	""	"document"
-\Format lyx16x     16.lyx  "LyX 1.6.x"             "" ""	""	"document"
+\Format lyx16x     16.lyx  "LyX 1.6.x"             "" ""	""	"document,menu=export"
 \Format clyx       cjklyx "CJK LyX 1.4.x (big5)"  "" ""	""	"document"
 \Format jlyx       cjklyx "CJK LyX 1.4.x (euc-jp)" "" ""	""	"document"
 \Format klyx       cjklyx "CJK LyX 1.4.x (euc-kr)" "" ""	""	"document"
@@ -873,10 +873,10 @@
     # So, we configure the appropriate version according to the platform.
     cmd = r'\converter lyx %s "python -tt $$s/scripts/lyxpak.py $$r/$$i" ""'
     if os.name == 'nt':
-        addToRC(r'\Format lyxzip     zip    "LyX Archive (zip)"     "" "" ""  "document"')
+        addToRC(r'\Format lyxzip     zip    "LyX Archive (zip)"     "" "" ""  "document,menu=export"')
         addToRC(cmd % "lyxzip")
     else:
-        addToRC(r'\Format lyxgz      gz     "LyX Archive (tar.gz)"  "" "" ""  "document"')
+        addToRC(r'\Format lyxgz      gz     "LyX Archive (tar.gz)"  "" "" ""  "document,menu=export"')
         addToRC(cmd % "lyxgz")
         
     #
Index: lib/ui/stdmenus.inc
===================================================================
--- lib/ui/stdmenus.inc	(Revision 37596)
+++ lib/ui/stdmenus.inc	(Arbeitskopie)
@@ -88,7 +88,7 @@
 
 	Menu "file_export"
 		ExportFormats
-		Item "Custom...|C" "buffer-export custom"
+		Item "More Formats & Options...|M" "buffer-export custom"
 	End
 
 #

Reply via email to