X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FToolbars.cpp;h=b03b110d13e56ae8bbd1d271824d28770a15b645;hb=5a46224f7311067cda747e0cae32d22dd919f179;hp=99ece2f2b1440f925f3c9271871e31e97a4c9c84;hpb=033c3df44c6588bf1e341914bc9d47e1ba76e312;p=lyx.git diff --git a/src/frontends/qt4/Toolbars.cpp b/src/frontends/qt4/Toolbars.cpp index 99ece2f2b1..b03b110d13 100644 --- a/src/frontends/qt4/Toolbars.cpp +++ b/src/frontends/qt4/Toolbars.cpp @@ -12,15 +12,18 @@ #include #include "Toolbars.h" +#include "Converter.h" +#include "Format.h" #include "FuncRequest.h" #include "Lexer.h" #include "LyXAction.h" -#include "support/lstrings.h" +#include "qt_helpers.h" #include "support/debug.h" #include "support/gettext.h" +#include "support/lstrings.h" -#include +#include "support/bind.h" #include @@ -30,22 +33,6 @@ using namespace lyx::support; namespace lyx { namespace frontend { -namespace { - -class ToolbarNamesEqual -{ -public: - ToolbarNamesEqual(string const & name) : name_(name) {} - bool operator()(ToolbarInfo const & tbinfo) const - { - return tbinfo.name == name_; - } -private: - string name_; -}; - -} // namespace anon - ///////////////////////////////////////////////////////////////////////// // @@ -65,14 +52,10 @@ ToolbarItem::ToolbarItem(Type type, string const & name, docstring const & label } -ToolbarItem::~ToolbarItem() -{} - - void ToolbarInfo::add(ToolbarItem const & item) { items.push_back(item); - items.back().func_.origin = FuncRequest::TOOLBAR; + items.back().func_.setOrigin(FuncRequest::TOOLBAR); } @@ -86,18 +69,28 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) TO_MINIBUFFER, TO_TABLEINSERT, TO_POPUPMENU, + TO_STICKYPOPUPMENU, TO_ICONPALETTE, + TO_EXPORTFORMATS, + TO_IMPORTFORMATS, + TO_UPDATEFORMATS, + TO_VIEWFORMATS, }; struct LexerKeyword toolTags[] = { { "end", TO_ENDTOOLBAR }, + { "exportformats", TO_EXPORTFORMATS }, { "iconpalette", TO_ICONPALETTE }, + { "importformats", TO_IMPORTFORMATS }, { "item", TO_COMMAND }, { "layouts", TO_LAYOUTS }, { "minibuffer", TO_MINIBUFFER }, { "popupmenu", TO_POPUPMENU }, { "separator", TO_SEPARATOR }, - { "tableinsert", TO_TABLEINSERT } + { "stickypopupmenu", TO_STICKYPOPUPMENU }, + { "tableinsert", TO_TABLEINSERT }, + { "updateformats", TO_UPDATEFORMATS }, + { "viewformats", TO_VIEWFORMATS }, }; //consistency check @@ -110,7 +103,7 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) name = lex.getString(); lex.next(true); - gui_name = lex.getString(); + gui_name = _(lex.getString()); // FIXME what to do here? if (!lex) { @@ -127,7 +120,8 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) lex.printTable(lyxerr); while (lex.isOK() && !quit) { - switch (lex.lex()) { + int const code = lex.lex(); + switch (code) { case TO_COMMAND: if (lex.next(true)) { docstring const tooltip = translateIfPossible(lex.getDocString()); @@ -161,6 +155,15 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) } break; + case TO_STICKYPOPUPMENU: + if (lex.next(true)) { + string const name = lex.getString(); + lex.next(true); + docstring const label = lex.getDocString(); + add(ToolbarItem(ToolbarItem::STICKYPOPUPMENU, name, label)); + } + break; + case TO_ICONPALETTE: if (lex.next(true)) { string const name = lex.getString(); @@ -187,6 +190,53 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) quit = true; break; + case TO_EXPORTFORMATS: + case TO_IMPORTFORMATS: + case TO_UPDATEFORMATS: + case TO_VIEWFORMATS: { + vector formats = (code == TO_IMPORTFORMATS) ? + theConverters().importableFormats() : + theConverters().exportableFormats(code != TO_EXPORTFORMATS); + sort(formats.begin(), formats.end()); + vector::const_iterator fit = formats.begin(); + vector::const_iterator end = formats.end(); + for (; fit != end ; ++fit) { + if ((*fit)->dummy()) + continue; + if (code != TO_IMPORTFORMATS && + !(*fit)->documentFormat()) + continue; + + docstring const prettyname = + from_utf8((*fit)->prettyname()); + docstring tooltip; + FuncCode lfun = LFUN_NOACTION; + switch (code) { + case TO_EXPORTFORMATS: + lfun = LFUN_BUFFER_EXPORT; + tooltip = _("Export %1$s"); + break; + case TO_IMPORTFORMATS: + lfun = LFUN_BUFFER_IMPORT; + tooltip = _("Import %1$s"); + break; + case TO_UPDATEFORMATS: + lfun = LFUN_BUFFER_UPDATE; + tooltip = _("Update %1$s"); + break; + case TO_VIEWFORMATS: + lfun = LFUN_BUFFER_VIEW; + tooltip = _("View %1$s"); + break; + } + FuncRequest func(lfun, (*fit)->name(), + FuncRequest::TOOLBAR); + add(ToolbarItem(ToolbarItem::COMMAND, func, + bformat(tooltip, prettyname))); + } + break; + } + default: lex.printError("ToolbarInfo::read: " "Unknown toolbar tag: `$$Token'"); @@ -206,10 +256,10 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) // ///////////////////////////////////////////////////////////////////////// - -Toolbars::Toolbars() +void Toolbars::reset() { - fullScreenWindows = 0; + toolbar_info_.clear(); + toolbar_visibility_.clear(); } @@ -242,7 +292,7 @@ void Toolbars::readToolbars(Lexer & lex) case TO_TOOLBAR: { ToolbarInfo tbinfo; tbinfo.read(lex); - toolbars.push_back(tbinfo); + toolbar_info_.push_back(tbinfo); break; } case TO_ENDTOOLBARSET: @@ -276,19 +326,7 @@ void Toolbars::readToolbarSettings(Lexer & lex) if (!compare_ascii_no_case(name, "end")) return; - Infos::iterator tcit = toolbars.begin(); - Infos::iterator tend = toolbars.end(); - for (; tcit != tend; ++tcit) { - if (tcit->name == name) - break; - } - - if (tcit == tend) { - LYXERR0("Toolbars: undefined toolbar " << name); - return; - } - - tcit->flags = static_cast(0); + int visibility = 0; string flagstr = lex.getString(); lex.next(true); vector flags = getVectorFromString(flagstr); @@ -297,58 +335,74 @@ void Toolbars::readToolbarSettings(Lexer & lex) vector::const_iterator end = flags.end(); for (; cit != end; ++cit) { - int flag = 0; + Visibility flag = ON; if (!compare_ascii_no_case(*cit, "off")) - flag = ToolbarInfo::OFF; + flag = OFF; else if (!compare_ascii_no_case(*cit, "on")) - flag = ToolbarInfo::ON; + flag = ON; else if (!compare_ascii_no_case(*cit, "math")) - flag = ToolbarInfo::MATH; + flag = MATH; else if (!compare_ascii_no_case(*cit, "table")) - flag = ToolbarInfo::TABLE; + flag = TABLE; else if (!compare_ascii_no_case(*cit, "mathmacrotemplate")) - flag = ToolbarInfo::MATHMACROTEMPLATE; + flag = MATHMACROTEMPLATE; else if (!compare_ascii_no_case(*cit, "review")) - flag = ToolbarInfo::REVIEW; + flag = REVIEW; else if (!compare_ascii_no_case(*cit, "top")) - flag = ToolbarInfo::TOP; + flag = TOP; else if (!compare_ascii_no_case(*cit, "bottom")) - flag = ToolbarInfo::BOTTOM; + flag = BOTTOM; else if (!compare_ascii_no_case(*cit, "left")) - flag = ToolbarInfo::LEFT; + flag = LEFT; else if (!compare_ascii_no_case(*cit, "right")) - flag = ToolbarInfo::RIGHT; + flag = RIGHT; else if (!compare_ascii_no_case(*cit, "auto")) - flag = ToolbarInfo::AUTO; + flag = AUTO; + else if (!compare_ascii_no_case(*cit, "samerow")) + flag = SAMEROW; else { LYXERR(Debug::ANY, "Toolbars::readToolbarSettings: unrecognised token:`" << *cit << '\''); + continue; } - tcit->flags = static_cast(tcit->flags | flag); + visibility |= flag; } + toolbar_visibility_[name] = visibility; - usedtoolbars.push_back(*tcit); + if (visibility >= MATH) { + if (ToolbarInfo const * ti = info(name)) + const_cast(ti)->gui_name += + " (" + _("auto") + ")"; + } } } -ToolbarInfo const * Toolbars::getDefinedToolbarInfo(string const & name) const +ToolbarInfo const * Toolbars::info(std::string const & name) const +{ + Infos::const_iterator end = toolbar_info_.end(); + for (Infos::const_iterator it = toolbar_info_.begin(); it != end; ++it) + if (it->name == name) + return &(*it); + return 0; +} + + +int Toolbars::defaultVisibility(std::string const & name) const { - Infos::const_iterator it = find_if(toolbars.begin(), toolbars.end(), ToolbarNamesEqual(name)); - if (it == toolbars.end()) - return 0; - return &(*it); + map::const_iterator it = toolbar_visibility_.find(name); + if (it != toolbar_visibility_.end()) + return it->second; + return OFF | BOTTOM; } -ToolbarInfo * Toolbars::getUsedToolbarInfo(string const &name) +bool Toolbars::isMainToolbar(std::string const & name) const { - Infos::iterator it = find_if(usedtoolbars.begin(), usedtoolbars.end(), ToolbarNamesEqual(name)); - if (it == usedtoolbars.end()) - return 0; - return &(*it); + return toolbar_visibility_.find(name) != toolbar_visibility_.end(); } + } // namespace frontend } // namespace lyx