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 > Export menu</string> + </property> + <property name="text"> + <string>Sho&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 #