Hi!Is there any chance to make toolbars customizable directly in LyX? Just looked through the Qt documentation. Either I just didn't see it or there is nothing like that, a toolbar customize dialog?!
Schimmi
the attached patch refactors the current toolbarbackend into toolbaritems, toolbar(info) and backendcomments? Index: lib/ui/stdtoolbars.inc =================================================================== --- lib/ui/stdtoolbars.inc (revision 17731) +++ lib/ui/stdtoolbars.inc (working copy) @@ -30,6 +30,8 @@ # # Minibuffer adds the command buffer (Qt only, only one may exist) # +# TableInsert adds a special widget for quick inserting of tables +# # The icons are found in the lib/image direcory under the name # action.xpm or action_parameter.xpm, except for math-insert, which # is e.g. lib/image/math/sum.xpm. Note that some characters are @@ -39,135 +41,183 @@ # # This is the default toolbar: -Toolbar "standard" "Standard" - Layouts - Item "New document" "buffer-new" - Item "Open document" "file-open" - Item "Save document" "buffer-write" - Item "Print document" "dialog-show print" - Separator - Item "Undo" "undo" - Item "Redo" "redo" - Item "Cut" "cut" - Item "Copy" "copy" - Item "Paste" "paste" - Item "Find and replace" "dialog-show findreplace" - Separator - Item "Toggle emphasis" "font-emph" - Item "Toggle noun" "font-noun" - Item "Apply last" "font-free-apply" - Separator - Item "Insert math" "math-mode" - Item "Insert graphics" "dialog-show-new-inset graphics" - Item "Insert table" "tabular-insert" -End +ToolbarSet -Toolbar "extra" "Extra" - Item "Default" "layout" - Item "Numbered list" "layout Enumerate" - Item "Itemized list" "layout Itemize" - Item "List" "layout List" - Item "Description" "layout Description" - Item "Increase depth" "depth-increment" - Item "Decrease depth" "depth-decrement" - Separator - Item "Insert figure float" "float-insert figure" - Item "Insert table float" "float-insert table" - Item "Insert label" "label-insert" - Item "Insert cross-reference" "dialog-show-new-inset ref" - Item "Insert citation" "dialog-show-new-inset citation" - Item "Insert index entry" "index-insert" - Item "Insert glossary entry" "nomencl-insert" - Separator - Item "Insert footnote" "footnote-insert" - Item "Insert margin note" "marginalnote-insert" - Item "Insert note" "note-insert" - Item "Insert URL" "url-insert" - Item "Insert TeX code" "ert-insert" - Item "Include file" "dialog-show-new-inset include" - Separator - Item "Text style" "dialog-show character" - Item "Paragraph settings" "layout-paragraph" - Item "Table of contents" "toc-view" - Item "Check spelling" "dialog-show spellchecker" - Item "Thesaurus" "thesaurus-entry" -End + Toolbar "standard" "Standard" + Layouts + Item "New document" "buffer-new" + Item "Open document" "file-open" + Item "Save document" "buffer-write" + Item "Print document" "dialog-show print" + Separator + Item "Undo" "undo" + Item "Redo" "redo" + Item "Cut" "cut" + Item "Copy" "copy" + Item "Paste" "paste" + Item "Find and replace" "dialog-show findreplace" + Separator + Item "Toggle emphasis" "font-emph" + Item "Toggle noun" "font-noun" + Item "Apply last" "font-free-apply" + Separator + Item "Insert math" "math-mode" + Item "Insert graphics" "dialog-show-new-inset graphics" + TableInsert + End + + Toolbar "extra" "Extra" + Item "Default" "layout" + Item "Numbered list" "layout Enumerate" + Item "Itemized list" "layout Itemize" + Item "List" "layout List" + Item "Description" "layout Description" + Item "Increase depth" "depth-increment" + Item "Decrease depth" "depth-decrement" + Separator + Item "Insert figure float" "float-insert figure" + Item "Insert table float" "float-insert table" + Item "Insert label" "label-insert" + Item "Insert cross-reference" "dialog-show-new-inset ref" + Item "Insert citation" "dialog-show-new-inset citation" + Item "Insert index entry" "index-insert" + Item "Insert glossary entry" "nomencl-insert" + Separator + Item "Insert footnote" "footnote-insert" + Item "Insert margin note" "marginalnote-insert" + Item "Insert note" "note-insert" + Item "Insert URL" "url-insert" + Item "Insert TeX code" "ert-insert" + Item "Include file" "dialog-show-new-inset include" + Separator + Item "Text style" "dialog-show character" + Item "Paragraph settings" "layout-paragraph" + Item "Table of contents" "toc-view" + Item "Check spelling" "dialog-show spellchecker" + Item "Thesaurus" "thesaurus-entry" + End + + Toolbar "table" "Table" + Item "Add row" "tabular-feature append-row" + Item "Add column" "tabular-feature append-column" + Item "Delete row" "tabular-feature delete-row" + Item "Delete column" "tabular-feature delete-column" + Separator + Item "Set top line" "tabular-feature toggle-line-top" + Item "Set bottom line" "tabular-feature toggle-line-bottom" + Item "Set left line" "tabular-feature toggle-line-left" + Item "Set right line" "tabular-feature toggle-line-right" + Item "Set all lines" "tabular-feature set-all-lines" + Item "Unset all lines" "tabular-feature unset-all-lines" + Separator + Item "Align left" "tabular-feature align-left" + Item "Align center" "tabular-feature align-center" + Item "Align right" "tabular-feature align-right" + Separator + Item "Align top" "tabular-feature valign-top" + Item "Align middle" "tabular-feature valign-middle" + Item "Align bottom" "tabular-feature valign-bottom" + Separator + Item "Rotate cell" "tabular-feature set-rotate-cell" + Item "Rotate table" "tabular-feature set-rotate-tabular" + Item "Set multi-column" "tabular-feature multicolumn" + End + + Toolbar "math" "Math" + Item "Show math panel" "dialog-show mathpanel" + Item "Set display mode" "math-display" + Item "Subscript" "math-subscript" + Item "Superscript" "math-superscript" + Item "Insert root" "math-insert \root" + Item "Insert square root" "math-insert \sqrt" + Item "Insert sum" "math-insert \sum" + Item "Insert integral" "math-insert \int" + Item "Insert product" "math-insert \prod" + Separator + Item "Insert standard fraction" "math-insert \frac" + Item "Delimiters" "dialog-show mathdelimiter" + Item "Insert ( )" "math-delim ( )" + Item "Insert [ ]" "math-delim [ ]" + Item "Insert { }" "math-delim { }" + Separator + Item "Insert matrix" "math-matrix 2 2" + Item "Insert cases environment" "math-insert \cases" + Item "Add row" "tabular-feature append-row" + Item "Add column" "tabular-feature append-column" + Item "Delete row" "tabular-feature delete-row" + Item "Delete column" "tabular-feature delete-column" + End + + Toolbar "minibuffer" "Command Buffer" + Minibuffer + End + + Toolbar "review" "Review" + Item "Track changes" "changes-track" + Item "Show changes in output" "changes-output" + Separator + Item "Next change" "change-next" + Item "Accept change" "change-accept" + Item "Reject change" "change-reject" + Separator + Item "Merge changes" "changes-merge" + Item "Accept all changes" "all-changes-accept" + Item "Reject all changes" "all-changes-reject" + Separator + Item "Insert note" "note-insert" + Item "Next note" "note-next" + End + + Toolbar "view/update" "View/Update" + Item "View DVI" "buffer-view dvi" + Item "Update DVI" "buffer-update dvi" + Item "View PDF (pdflatex)" "buffer-view pdf2" + Item "Update PDF (pdflatex)" "buffer-update pdf2" + Item "View PostScript" "buffer-view ps" + Item "Update PostScript" "buffer-update ps" + End + + Toolbar "space" "Spacing" + Item "Thin space \\," "math-insert \\," + Item "Medium space \\:" "math-insert \\:" + Item "Thick space \\;" "math-insert \\;" + Item "Quadratin space \\quad" "math-insert \\quad" + Item "Double quadratin space \\qquad" "math-insert \\qquad" + Item "Negative space \\!" "math-insert \\!" + End + + Toolbar "sqrt-square" "Roots" + Item "Square root \\sqrt" "math-insert \\sqrt" + Item "Other root \\root" "math-insert \\root" + End + + Toolbar "style" "Styles" + Item "Display style \\displaystyle" "displaystyle" + Item "Normal text style \\textstyle" "textstyle" + Item "Script (small) style \\scriptstyle" "scriptstyle"+ Item "Scriptscript (smaller) style \\scriptscriptstyle" "scriptscriptstyle"+ End + + Toolbar "frac-square" "Fractions" + Item "Standard \\frac" "math-insert \\frac" + Item "No hor. line \\atop" "math-insert \\atop" + Item "Nice \\nicefrac" "math-insert \\nicefrac" + Item "Text frac (amsmath) \\tfrac" "math-insert \\tfrac" + Item "Display frac (amsmath) \\dfrac" "math-insert \\dfrac" + Item "Binomial \\choose" "math-insert \\choose" + End + + Toolbar "font" "Fonts" + Item "Roman \\mathrm" "math-insert \\mathrm" + Item "Bold \\mathbf" "math-insert \\mathbf" + Item "Bold symbol \\boldsymbol" "math-insert \\boldsymbol" + Item "Sans serif \\mathsf" "math-insert \\mathsf" + Item "Italic \\mathit" "math-insert \\mathit" + Item "Typewriter \\mathtt" "math-insert \\mathtt" + Item "Blackboard \\mathbb" "math-insert \\mathbb" + Item "Fraktur \\mathfrak" "math-insert \\mathfrak" + Item "Calligraphic \\mathcal" "math-insert \\mathcal" + Item "Normal text mode \\textrm" "math-insert \\textrm" + End -Toolbar "table" "Table" - Item "Add row" "tabular-feature append-row" - Item "Add column" "tabular-feature append-column" - Item "Delete row" "tabular-feature delete-row" - Item "Delete column" "tabular-feature delete-column" - Separator - Item "Set top line" "tabular-feature toggle-line-top" - Item "Set bottom line" "tabular-feature toggle-line-bottom" - Item "Set left line" "tabular-feature toggle-line-left" - Item "Set right line" "tabular-feature toggle-line-right" - Item "Set all lines" "tabular-feature set-all-lines" - Item "Unset all lines" "tabular-feature unset-all-lines" - Separator - Item "Align left" "tabular-feature align-left" - Item "Align center" "tabular-feature align-center" - Item "Align right" "tabular-feature align-right" - Separator - Item "Align top" "tabular-feature valign-top" - Item "Align middle" "tabular-feature valign-middle" - Item "Align bottom" "tabular-feature valign-bottom" - Separator - Item "Rotate cell" "tabular-feature set-rotate-cell" - Item "Rotate table" "tabular-feature set-rotate-tabular" - Item "Set multi-column" "tabular-feature multicolumn" End - -Toolbar "math" "Math" - Item "Show math panel" "dialog-show mathpanel" - Item "Set display mode" "math-display" - Item "Subscript" "math-subscript" - Item "Superscript" "math-superscript" - Item "Insert root" "math-insert \root" - Item "Insert square root" "math-insert \sqrt" - Item "Insert sum" "math-insert \sum" - Item "Insert integral" "math-insert \int" - Item "Insert product" "math-insert \prod" - Separator - Item "Insert standard fraction" "math-insert \frac" - Item "Insert ( )" "math-delim ( )" - Item "Insert [ ]" "math-delim [ ]" - Item "Insert { }" "math-delim { }" - Separator - Item "Insert matrix" "math-matrix 2 2" - Item "Insert cases environment" "math-insert \cases" - Item "Add row" "tabular-feature append-row" - Item "Add column" "tabular-feature append-column" - Item "Delete row" "tabular-feature delete-row" - Item "Delete column" "tabular-feature delete-column" -End - -Toolbar "minibuffer" "Command Buffer" - Minibuffer -End - -Toolbar "review" "Review" - Item "Track changes" "changes-track" - Item "Show changes in output" "changes-output" - Separator - Item "Next change" "change-next" - Item "Accept change" "change-accept" - Item "Reject change" "change-reject" - Separator - Item "Merge changes" "changes-merge" - Item "Accept all changes" "all-changes-accept" - Item "Reject all changes" "all-changes-reject" - Separator - Item "Insert note" "note-insert" - Item "Next note" "note-next" -End - -Toolbar "view/update" "View/Update" - Item "View DVI" "buffer-view dvi" - Item "Update DVI" "buffer-update dvi" - Item "View PDF (pdflatex)" "buffer-view pdf2" - Item "Update PDF (pdflatex)" "buffer-update pdf2" - Item "View PostScript" "buffer-view ps" - Item "Update PostScript" "buffer-update ps" -End Index: src/frontends/LyXView.C =================================================================== --- src/frontends/LyXView.C (revision 17731) +++ src/frontends/LyXView.C (working copy) @@ -342,7 +342,7 @@ } -ToolbarBackend::Flags LyXView::getToolbarState(string const & name) +ToolbarInfo::Flags LyXView::getToolbarState(string const & name) { return toolbars_->getToolbarState(name); } Index: src/frontends/LyXView.h =================================================================== --- src/frontends/LyXView.h (revision 17731) +++ src/frontends/LyXView.h (working copy) @@ -112,7 +112,7 @@ /// show busy cursor virtual void busy(bool) = 0;- virtual Toolbars::ToolbarPtr makeToolbar(ToolbarBackend::Toolbar const & tbb, bool newline) = 0; + virtual Toolbars::ToolbarPtr makeToolbar(ToolbarInfo const & tbb, bool newline) = 0;//@{ generic accessor functions @@ -154,7 +154,7 @@ /// update the toolbar void updateToolbars(); /// get toolbar state - ToolbarBackend::Flags getToolbarState(std::string const & name); + ToolbarInfo::Flags getToolbarState(std::string const & name); /// toggle toolbar state void toggleToolbarState(std::string const & name); /// update the menubar Index: src/frontends/qt4/GuiView.C =================================================================== --- src/frontends/qt4/GuiView.C (revision 17731) +++ src/frontends/qt4/GuiView.C (working copy) @@ -694,17 +694,17 @@ }-Toolbars::ToolbarPtr GuiView::makeToolbar(ToolbarBackend::Toolbar const & tbb, bool newline) +Toolbars::ToolbarPtr GuiView::makeToolbar(ToolbarInfo const & tbb, bool newline){ QLToolbar * Tb = new QLToolbar(tbb, *this); - if (tbb.flags & ToolbarBackend::TOP) { + if (tbb.flags & ToolbarInfo::TOP) { if (newline) addToolBarBreak(Qt::TopToolBarArea); addToolBar(Qt::TopToolBarArea, Tb); } - if (tbb.flags & ToolbarBackend::BOTTOM) { + if (tbb.flags & ToolbarInfo::BOTTOM) { // Qt < 4.2.2 cannot handle ToolBarBreak on non-TOP dock. #if (QT_VERSION >= 0x040202) if (newline) @@ -713,7 +713,7 @@ addToolBar(Qt::BottomToolBarArea, Tb); } - if (tbb.flags & ToolbarBackend::LEFT) { + if (tbb.flags & ToolbarInfo::LEFT) { // Qt < 4.2.2 cannot handle ToolBarBreak on non-TOP dock. #if (QT_VERSION >= 0x040202) if (newline) @@ -722,7 +722,7 @@ addToolBar(Qt::LeftToolBarArea, Tb); } - if (tbb.flags & ToolbarBackend::RIGHT) { + if (tbb.flags & ToolbarInfo::RIGHT) { // Qt < 4.2.2 cannot handle ToolBarBreak on non-TOP dock. #if (QT_VERSION >= 0x040202) if (newline) Index: src/frontends/qt4/GuiView.h =================================================================== --- src/frontends/qt4/GuiView.h (revision 17731) +++ src/frontends/qt4/GuiView.h (working copy) @@ -67,7 +67,7 @@ virtual void saveGeometry(); virtual void busy(bool);/// add toolbar, if newline==true, add a toolbar break before the toolbar - Toolbars::ToolbarPtr makeToolbar(ToolbarBackend::Toolbar const & tbb, bool newline); + Toolbars::ToolbarPtr makeToolbar(ToolbarInfo const & tbb, bool newline);virtual void updateStatusBar(); virtual void message(lyx::docstring const & str); virtual void clearMessage(); Index: src/frontends/qt4/QLToolbar.C =================================================================== --- src/frontends/qt4/QLToolbar.C (revision 17731) +++ src/frontends/qt4/QLToolbar.C (working copy) @@ -24,9 +24,13 @@ #include "GuiView.h" #include "QLToolbar.h" +#include "LyXAction.h" #include "Action.h" #include "qt_helpers.h" #include "InsertTableWidget.h" +#include "support/filetools.h" +#include "support/lstrings.h" +#include "controllers/ControlMath.h" #include <QComboBox> #include <QToolBar> @@ -38,6 +42,10 @@ using std::string; namespace lyx { + +using support::libFileSearch; +using support::subst; + namespace frontend { namespace { @@ -146,7 +154,7 @@ }-QLToolbar::QLToolbar(ToolbarBackend::Toolbar const & tbb, GuiView & owner)+QLToolbar::QLToolbar(ToolbarInfo const & tbb, GuiView & owner) : QToolBar(qt_(tbb.gui_name), &owner), owner_(owner) { // give visual separation between adjacent toolbars @@ -155,32 +163,32 @@ // TODO: save toolbar position setMovable(true); - ToolbarBackend::item_iterator it = tbb.items.begin(); - ToolbarBackend::item_iterator end = tbb.items.end(); + ToolbarInfo::item_iterator it = tbb.items.begin(); + ToolbarInfo::item_iterator end = tbb.items.end(); for (; it != end; ++it) - add(it->first, it->second); + add(*it); }-void QLToolbar::add(FuncRequest const & func, docstring const & tooltip)+void QLToolbar::add(ToolbarItem const & item) { - switch (func.action) { - case ToolbarBackend::SEPARATOR: + switch (item.type_) { + case ToolbarItem::SEPARATOR: addSeparator(); break; - case ToolbarBackend::LAYOUTS: + case ToolbarItem::LAYOUTS: layout_.reset(new QLayoutBox(this, owner_)); break; - case ToolbarBackend::MINIBUFFER: + case ToolbarItem::MINIBUFFER: owner_.addCommandBuffer(this); /// \todo find a Qt4 equivalent to setHorizontalStretchable(true); //setHorizontalStretchable(true); break; - case LFUN_TABULAR_INSERT: { + case ToolbarItem::TABLEINSERT: { QToolButton * tb = new QToolButton; tb->setCheckable(true); - tb->setIcon(QPixmap(toqstr(toolbarbackend.getIcon(func)))); - tb->setToolTip(toqstr(tooltip));+ tb->setIcon(QPixmap(toqstr(getIcon(FuncRequest (LFUN_TABULAR_INSERT)))));+ tb->setToolTip(toqstr(item.label_)); tb->setFocusPolicy(Qt::NoFocus); InsertTableWidget * iv = new InsertTableWidget(owner_, tb); connect(tb, SIGNAL(clicked(bool)), iv, SLOT(show(bool))); @@ -190,14 +198,14 @@ break; } default: { - if (lyx::getStatus(func).unknown()) + if (lyx::getStatus(item.func_).unknown()) break; Action * action = new Action(owner_, - toolbarbackend.getIcon(func), - tooltip, - func, - tooltip); + getIcon(item.func_), + item.label_, + item.func_, + item.label_); addAction(action); ActionVector.push_back(action); break; @@ -261,6 +269,49 @@ } +string const getIcon(FuncRequest const & f) +{ + using frontend::find_xpm; + + string fullname; + + switch (f.action) { + case LFUN_MATH_INSERT: + if (!f.argument().empty()) + fullname = find_xpm(to_utf8(f.argument()).substr(1)); + break; + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: + fullname = find_xpm(to_utf8(f.argument())); + break; + default: + string const name = lyxaction.getActionName(f.action); + string xpm_name(name); + + if (!f.argument().empty()) + xpm_name = subst(name + ' ' + to_utf8(f.argument()), ' ', '_'); + + fullname = libFileSearch("images", xpm_name, "xpm").absFilename(); + + if (fullname.empty()) { + // try without the argument + fullname = libFileSearch("images", name, "xpm").absFilename(); + } + } + + if (!fullname.empty()) { + LYXERR(Debug::GUI) << "Full icon name is `" + << fullname << '\'' << endl; + return fullname; + } + + LYXERR(Debug::GUI) << "Cannot find icon for command \"" + << lyxaction.getActionName(f.action) + << '(' << to_utf8(f.argument()) << ")\"" << endl; + return libFileSearch("images", "unknown", "xpm").absFilename(); +} + + } // namespace frontend } // namespace lyx Index: src/frontends/qt4/QLToolbar.h =================================================================== --- src/frontends/qt4/QLToolbar.h (revision 17731) +++ src/frontends/qt4/QLToolbar.h (working copy) @@ -26,6 +26,7 @@ class QComboBox; namespace lyx { +class FuncRequest; namespace frontend { class QLayoutBox; @@ -61,11 +62,11 @@ class QLToolbar : public QToolBar, public Toolbar { Q_OBJECT public: - QLToolbar(ToolbarBackend::Toolbar const &, GuiView &); + QLToolbar(ToolbarInfo const &, GuiView &); //~QLToolbar(); - void add(FuncRequest const & func, lyx::docstring const & tooltip); + void add(ToolbarItem const & item); void hide(bool); void show(bool); void saveInfo(ToolbarSection::ToolbarInfo & info); @@ -85,6 +86,9 @@ boost::scoped_ptr<QLayoutBox> layout_; }; +/// return a full path of an XPM for the given action +std::string const getIcon(FuncRequest const & f); + } // namespace frontend } // namespace lyx Index: src/frontends/Toolbars.C =================================================================== --- src/frontends/Toolbars.C (revision 17731) +++ src/frontends/Toolbars.C (working copy) @@ -37,10 +37,10 @@ last_textclass_(-1) {} -#define TurnOnFlag(x) flags |= ToolbarBackend::x -#define TurnOffFlag(x) flags &= ~ToolbarBackend::x +#define TurnOnFlag(x) flags |= ToolbarInfo::x +#define TurnOffFlag(x) flags &= ~ToolbarInfo::x -void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb) +void Toolbars::initFlags(ToolbarInfo & tbb) {ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars ().load(tbb.name);@@ -99,7 +99,7 @@ << std::endl; */ // now set the flags - tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags); + tbb.flags = static_cast<lyx::ToolbarInfo::Flags>(flags); } @@ -159,7 +159,7 @@ TurnOnFlag(OFF); TurnOnFlag(ON); } - cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags); + cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags); displayToolbar(*cit, show); return; } @@ -170,7 +170,7 @@ } -ToolbarBackend::Flags Toolbars::getToolbarState(string const & name) +ToolbarInfo::Flags Toolbars::getToolbarState(string const & name) {ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end(); @@ -184,7 +184,7 @@ << name << endl; // return dummy for msvc - return ToolbarBackend::OFF; + return ToolbarInfo::OFF; } @@ -197,15 +197,15 @@ if (cit->name == name) { int flags = cit->flags; // off -> on - if (flags & ToolbarBackend::OFF) { + if (flags & ToolbarInfo::OFF) { TurnOffFlag(OFF); TurnOnFlag(ON); // auto -> off - } else if (flags & ToolbarBackend::AUTO) { + } else if (flags & ToolbarInfo::AUTO) { TurnOffFlag(AUTO); TurnOnFlag(OFF);- } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)- || (flags & ToolbarBackend::REVIEW)) {+ } else if ((flags & ToolbarInfo::MATH) || (flags & ToolbarInfo::TABLE)+ || (flags & ToolbarInfo::REVIEW)) { // for math etc, toggle from on -> auto TurnOffFlag(ON); TurnOnFlag(AUTO); @@ -214,7 +214,7 @@ TurnOffFlag(ON); TurnOnFlag(OFF); } - cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags); + cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags); return; } } @@ -234,15 +234,15 @@ ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end(); for (; cit != end; ++cit) { - if (cit->flags & ToolbarBackend::ON) + if (cit->flags & ToolbarInfo::ON) displayToolbar(*cit, true); - else if (cit->flags & ToolbarBackend::OFF) + else if (cit->flags & ToolbarInfo::OFF) displayToolbar(*cit, false);- else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH)) + else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATH))displayToolbar(*cit, in_math);- else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE)) + else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::TABLE))displayToolbar(*cit, in_table);- else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW)) + else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::REVIEW))displayToolbar(*cit, review); } } @@ -258,23 +258,23 @@ BOOST_ASSERT(it != toolbars_.end()); // get toolbar info from session. ToolbarSection::ToolbarInfo & info = tb.load(cit->name); - if (cit->flags & ToolbarBackend::ON) + if (cit->flags & ToolbarInfo::ON) info.state = ToolbarSection::ToolbarInfo::ON; - else if (cit->flags & ToolbarBackend::OFF) + else if (cit->flags & ToolbarInfo::OFF) info.state = ToolbarSection::ToolbarInfo::OFF; - else if (cit->flags & ToolbarBackend::AUTO) + else if (cit->flags & ToolbarInfo::AUTO) info.state = ToolbarSection::ToolbarInfo::AUTO; // save other information // if auto, frontend should *not* set on/off it->second->saveInfo(info);// maybe it is useful to update flags with real status. I do not know/* - if (!(cit->flags & ToolbarBackend::AUTO)) { + if (!(cit->flags & ToolbarInfo::AUTO)) { unsigned int flags = static_cast<unsigned int>(cit->flags);- flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON); - flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF); + flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::OFF : ToolbarInfo::ON); + flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::ON : ToolbarInfo::OFF);if (info.state == ToolbarSection::ToolbarInfo::ON) - cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags); + cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags); } */ } @@ -316,12 +316,12 @@ } -void Toolbars::add(ToolbarBackend::Toolbar const & tbb, bool newline) +void Toolbars::add(ToolbarInfo const & tbb, bool newline) { ToolbarPtr tb_ptr = owner_.makeToolbar(tbb, newline); toolbars_[tbb.name] = tb_ptr; - if (tbb.flags & ToolbarBackend::ON) + if (tbb.flags & ToolbarInfo::ON) tb_ptr->show(false); else tb_ptr->hide(false); @@ -331,7 +331,7 @@ } -void Toolbars::displayToolbar(ToolbarBackend::Toolbar const & tbb, +void Toolbars::displayToolbar(ToolbarInfo const & tbb, bool show_it) { ToolbarsMap::iterator it = toolbars_.find(tbb.name); Index: src/frontends/Toolbars.h =================================================================== --- src/frontends/Toolbars.h (revision 17731) +++ src/frontends/Toolbars.h (working copy) @@ -53,7 +53,7 @@ public: virtual ~Toolbar() {} /// Add a button to the bar.- virtual void add(FuncRequest const & func, docstring const & tooltip) = 0;+ virtual void add(ToolbarItem const & item) = 0; /** Hide the bar. * \param update_metrics is a hint to the layout engine that the @@ -89,7 +89,7 @@ void display(std::string const & name, bool show); /// get toolbar state (on/off/auto) - ToolbarBackend::Flags getToolbarState(std::string const & name); + ToolbarInfo::Flags getToolbarState(std::string const & name); /// toggle the state of toolbars (on/off/auto) void toggleToolbarState(std::string const & name); @@ -118,9 +118,9 @@ private: /// Add a new toolbar. if newline==true, start from a new line - void add(ToolbarBackend::Toolbar const & tb, bool newline); + void add(ToolbarInfo const & tb, bool newline); /// Show or hide a toolbar. - void displayToolbar(ToolbarBackend::Toolbar const & tb, bool show); + void displayToolbar(ToolbarInfo const & tb, bool show); /// Update the state of the icons void update(); @@ -144,7 +144,7 @@ int last_textclass_; // load flags with saved values - void initFlags(ToolbarBackend::Toolbar & tbb); + void initFlags(ToolbarInfo & tbb); }; /// Set the layout in the kernel when an entry has been selected Index: src/lyx_main.C =================================================================== --- src/lyx_main.C (revision 17731) +++ src/lyx_main.C (working copy) @@ -1128,8 +1128,8 @@ { enum Uitags { ui_menuset = 1, - ui_toolbar, ui_toolbars, + ui_toolbarset, ui_include, ui_last }; @@ -1137,8 +1137,8 @@ struct keyword_item uitags[ui_last - 1] = { { "include", ui_include }, { "menuset", ui_menuset }, - { "toolbar", ui_toolbar }, - { "toolbars", ui_toolbars } + { "toolbars", ui_toolbars }, + { "toolbarset", ui_toolbarset } }; // Ensure that a file is read only once (prevents include loops) @@ -1200,12 +1200,12 @@ menubackend.read(lex); break; - case ui_toolbar: - toolbarbackend.read(lex); + case ui_toolbarset: + toolbarbackend.readToolbars(lex); break; case ui_toolbars: - toolbarbackend.readToolbars(lex); + toolbarbackend.readToolbarSettings(lex); break; default: Index: src/lyxfunc.C =================================================================== --- src/lyxfunc.C (revision 17731) +++ src/lyxfunc.C (working copy) @@ -608,9 +608,9 @@ break; case LFUN_TOOLBAR_TOGGLE_STATE: {- ToolbarBackend::Flags flags = lyx_view_->getToolbarState(to_utf8 (cmd.argument()));- if (!(flags & ToolbarBackend::AUTO)) - flag.setOnOff(flags & ToolbarBackend::ON);+ ToolbarInfo::Flags flags = lyx_view_->getToolbarState(to_utf8 (cmd.argument()));+ if (!(flags & ToolbarInfo::AUTO)) + flag.setOnOff(flags & ToolbarInfo::ON); break; } Index: src/MenuBackend.C =================================================================== --- src/MenuBackend.C (revision 17731) +++ src/MenuBackend.C (working copy) @@ -787,7 +787,7 @@ // and // review (auto) // in the case of auto. - if (cit->flags & ToolbarBackend::AUTO) + if (cit->flags & ToolbarInfo::AUTO) label += _(" (auto)"); tomenu.add(MenuItem(MenuItem::Command, label, FuncRequest(LFUN_TOOLBAR_TOGGLE_STATE, cit->name))); Index: src/ToolbarBackend.C =================================================================== --- src/ToolbarBackend.C (revision 17731) +++ src/ToolbarBackend.C (working copy) @@ -13,13 +13,11 @@ #include "ToolbarBackend.h" #include "funcrequest.h" -#include "LyXAction.h" #include "lyxlex.h" #include "debug.h" #include "gettext.h" - +#include "LyXAction.h" #include "support/lstrings.h" -#include "support/filetools.h" #include "frontends/controllers/ControlMath.h" @@ -28,8 +26,6 @@ using support::compare_ascii_no_case; using support::getVectorFromString; -using support::libFileSearch; -using support::subst; using std::endl; using std::make_pair; @@ -39,51 +35,67 @@ ToolbarBackend toolbarbackend; -namespace { -enum tooltags { - TO_ADD = 1, - TO_ENDTOOLBAR, - TO_SEPARATOR, - TO_LAYOUTS, - TO_MINIBUFFER, - TO_LAST -};+ToolbarItem::ToolbarItem(Type type, FuncRequest const & func, docstring const & label)+ : type_(type), func_(func), label_(label) +{ +} -struct keyword_item toolTags[TO_LAST - 1] = { - { "end", TO_ENDTOOLBAR }, - { "item", TO_ADD }, - { "layouts", TO_LAYOUTS }, - { "minibuffer", TO_MINIBUFFER }, - { "separator", TO_SEPARATOR } -}; -} // namespace anon +ToolbarItem::~ToolbarItem() +{} -ToolbarBackend::ToolbarBackend() +ToolbarInfo::ToolbarInfo() { } -void ToolbarBackend::read(LyXLex & lex) +void ToolbarInfo::add(ToolbarItem const & item) { + items.push_back(item); + items.back().func_.origin = FuncRequest::TOOLBAR; +} + + +ToolbarInfo & ToolbarInfo::read(LyXLex & lex) +{ + enum tooltags { + TO_COMMAND = 1, + TO_ENDTOOLBAR, + TO_SEPARATOR, + TO_LAYOUTS, + TO_MINIBUFFER, + TO_TABLEINSERT, + TO_LAST + }; + + struct keyword_item toolTags[TO_LAST - 1] = { + { "end", TO_ENDTOOLBAR }, + { "item", TO_COMMAND }, + { "layouts", TO_LAYOUTS }, + { "minibuffer", TO_MINIBUFFER }, + { "separator", TO_SEPARATOR }, + { "tableinsert", TO_TABLEINSERT } + }; + //consistency check if (compare_ascii_no_case(lex.getString(), "toolbar")) { - lyxerr << "ToolbarBackend::read: ERROR wrong token:`" + lyxerr << "ToolbarInfo::read: ERROR wrong token:`" << lex.getString() << '\'' << endl; } lex.next(true); + name = lex.getString(); - Toolbar tb; - tb.name = lex.getString(); lex.next(true); - tb.gui_name = lex.getString(); + gui_name = lex.getString(); + + // FIXME what to do here? if (!lex) { - lyxerr << "ToolbarBackend::read: Malformed toolbar " + lyxerr << "ToolbarInfo::read: Malformed toolbar " "description " << lex.getString() << endl; - return; + return *this; } bool quit = false; @@ -95,54 +107,113 @@ while (lex.isOK() && !quit) { switch (lex.lex()) { - case TO_ADD: + case TO_COMMAND: if (lex.next(true)) {docstring const tooltip = translateIfPossible(lex.getDocString ());lex.next(true); string const func_arg = lex.getString(); LYXERR(Debug::PARSER) - << "ToolbarBackend::read TO_ADD func: `" + << "ToolbarInfo::read TO_COMMAND func: `" << func_arg << '\'' << endl; FuncRequest func = lyxaction.lookupFunc(func_arg); - add(tb, func, tooltip); + add(ToolbarItem(ToolbarItem::COMMAND, func, tooltip)); } break; case TO_MINIBUFFER: - add(tb, FuncRequest(kb_action(MINIBUFFER))); + add(ToolbarItem(ToolbarItem::MINIBUFFER, + FuncRequest(kb_action(ToolbarItem::MINIBUFFER)))); break; case TO_SEPARATOR: - add(tb, FuncRequest(kb_action(SEPARATOR))); + add(ToolbarItem(ToolbarItem::SEPARATOR, + FuncRequest(kb_action(ToolbarItem::SEPARATOR)))); break; case TO_LAYOUTS: - add(tb, FuncRequest(kb_action(LAYOUTS))); + add(ToolbarItem(ToolbarItem::LAYOUTS, + FuncRequest(kb_action(ToolbarItem::LAYOUTS)))); break; - + case TO_TABLEINSERT: + add(ToolbarItem(ToolbarItem::TABLEINSERT, + FuncRequest(kb_action(ToolbarItem::TABLEINSERT)))); + break; case TO_ENDTOOLBAR: quit = true; break; default: - lex.printError("ToolbarBackend::read: " + lex.printError("ToolbarInfo::read: " "Unknown toolbar tag: `$$Token'"); break; } } - toolbars.push_back(tb); - lex.popTable(); + return *this; } + + +ToolbarBackend::ToolbarBackend() +{ +} + + void ToolbarBackend::readToolbars(LyXLex & lex) { + enum tooltags { + TO_TOOLBAR = 1, + TO_ENDTOOLBARSET, + TO_LAST + }; + + struct keyword_item toolTags[TO_LAST - 1] = { + { "end", TO_ENDTOOLBARSET }, + { "toolbar", TO_TOOLBAR } + }; + //consistency check + if (compare_ascii_no_case(lex.getString(), "toolbarset")) { + lyxerr << "ToolbarBackend::readToolbars: ERROR wrong token:`" + << lex.getString() << '\'' << endl; + } + + lex.pushTable(toolTags, TO_LAST - 1); + + if (lyxerr.debugging(Debug::PARSER)) + lex.printTable(lyxerr); + + bool quit = false; + while (lex.isOK() && !quit) { + switch (lex.lex()) { + case TO_TOOLBAR: { + ToolbarInfo tb; + tb.read(lex); + toolbars.push_back(tb); + break; + } + case TO_ENDTOOLBARSET: + quit = true; + break; + default: + lex.printError("ToolbarBackend::readToolbars: " + "Unknown toolbar tag: `$$Token'"); + break; + } + } + + lex.popTable(); +} + + +void ToolbarBackend::readToolbarSettings(LyXLex & lex) +{ + //consistency check if (compare_ascii_no_case(lex.getString(), "toolbars")) { - lyxerr << "ToolbarBackend::read: ERROR wrong token:`"+ lyxerr << "ToolbarBackend::readToolbarSettings: ERROR wrong token:`"<< lex.getString() << '\'' << endl; } @@ -168,7 +239,7 @@ return; } - tcit->flags = static_cast<Flags>(0); + tcit->flags = static_cast<ToolbarInfo::Flags>(0); string flagstr = lex.getString(); lex.next(true); vector<string> flags = getVectorFromString(flagstr); @@ -179,28 +250,28 @@ for (; cit != end; ++cit) { int flag = 0; if (!compare_ascii_no_case(*cit, "off")) - flag = OFF; + flag = ToolbarInfo::OFF; else if (!compare_ascii_no_case(*cit, "on")) - flag = ON; + flag = ToolbarInfo::ON; else if (!compare_ascii_no_case(*cit, "math")) - flag = MATH; + flag = ToolbarInfo::MATH; else if (!compare_ascii_no_case(*cit, "table")) - flag = TABLE; + flag = ToolbarInfo::TABLE; else if (!compare_ascii_no_case(*cit, "review")) - flag = REVIEW; + flag = ToolbarInfo::REVIEW; else if (!compare_ascii_no_case(*cit, "top")) - flag = TOP; + flag = ToolbarInfo::TOP; else if (!compare_ascii_no_case(*cit, "bottom")) - flag = BOTTOM; + flag = ToolbarInfo::BOTTOM; else if (!compare_ascii_no_case(*cit, "left")) - flag = LEFT; + flag = ToolbarInfo::LEFT; else if (!compare_ascii_no_case(*cit, "right")) - flag = RIGHT; + flag = ToolbarInfo::RIGHT; else { - lyxerr << "ToolbarBackend::read: unrecognised token:`"+ lyxerr << "ToolbarBackend::readToolbarSettings: unrecognised token:`"<< *cit << '\'' << endl; } - tcit->flags = static_cast<Flags>(tcit->flags | flag); + tcit->flags = static_cast<ToolbarInfo::Flags>(tcit->flags | flag); } usedtoolbars.push_back(*tcit); @@ -208,55 +279,4 @@ } -void ToolbarBackend::add(Toolbar & tb, - FuncRequest const & func, docstring const & tooltip) -{ - tb.items.push_back(make_pair(func, tooltip)); - tb.items.back().first.origin = FuncRequest::TOOLBAR; -} - - -string const ToolbarBackend::getIcon(FuncRequest const & f) -{ - using frontend::find_xpm; - - string fullname; - - switch (f.action) { - case LFUN_MATH_INSERT: - if (!f.argument().empty()) - fullname = find_xpm(to_utf8(f.argument()).substr(1)); - break; - case LFUN_MATH_DELIM: - case LFUN_MATH_BIGDELIM: - fullname = find_xpm(to_utf8(f.argument())); - break; - default: - string const name = lyxaction.getActionName(f.action); - string xpm_name(name); - - if (!f.argument().empty()) - xpm_name = subst(name + ' ' + to_utf8(f.argument()), ' ', '_'); - - fullname = libFileSearch("images", xpm_name, "xpm").absFilename(); - - if (fullname.empty()) { - // try without the argument - fullname = libFileSearch("images", name, "xpm").absFilename(); - } - } - - if (!fullname.empty()) { - LYXERR(Debug::GUI) << "Full icon name is `" - << fullname << '\'' << endl; - return fullname; - } - - LYXERR(Debug::GUI) << "Cannot find icon for command \"" - << lyxaction.getActionName(f.action) - << '(' << to_utf8(f.argument()) << ")\"" << endl; - return libFileSearch("images", "unknown", "xpm").absFilename(); -} - - } // namespace lyx Index: src/ToolbarBackend.h =================================================================== --- src/ToolbarBackend.h (revision 17731) +++ src/ToolbarBackend.h (working copy) @@ -23,56 +23,82 @@ class LyXLex; - -/// -class ToolbarBackend { +class ToolbarItem { public: - /// The special toolbar actions - enum ItemType { + enum Type { + /// command/action + COMMAND, /// the command buffer - MINIBUFFER = -3, + MINIBUFFER, /// adds space between buttons in the toolbar - SEPARATOR = -2, + SEPARATOR, /// a special combox insead of a button - LAYOUTS = -1, + LAYOUTS, + /// a special widget to insert tabulars + TABLEINSERT }; - /// action, tooltip - typedef std::pair<FuncRequest, docstring> Item; + ToolbarItem(Type type, + FuncRequest const & func, + docstring const & label = docstring()); - /// the toolbar items - typedef std::vector<Item> Items; + ~ToolbarItem(); + /// item type + Type type_; + /// action + FuncRequest func_; + /// label/tooltip + docstring label_; +}; + + +/// +class ToolbarInfo { +public: /// toolbar flags enum Flags { - ON = 1, //< always shown - OFF = 2, //< never shown - MATH = 4, //< shown when in math - TABLE = 8, //< shown when in table + ON = 1, //< show + OFF = 2, //< do not show + MATH = 4, //< show when in math + TABLE = 8, //< show when in table TOP = 16, //< show at top BOTTOM = 32, //< show at bottom LEFT = 64, //< show at left RIGHT = 128, //< show at right - REVIEW = 256, //< shown when change tracking is enabled- AUTO = 512 //< only if AUTO is set, will MATH, TABLE and REIVEW is used+ REVIEW = 256, //< show when change tracking is enabled+ AUTO = 512 //< only if AUTO is set, when MATH, TABLE and REVIEW is used}; + /// the toolbar items + typedef std::vector<ToolbarItem> Items; - /// a toolbar - struct Toolbar { - /// toolbar name - std::string name; - /// toolbar GUI name - std::string gui_name; - /// toolbar contents - Items items; - /// flags - Flags flags; - }; + typedef Items::const_iterator item_iterator; - typedef std::vector<Toolbar> Toolbars; + explicit ToolbarInfo(); - typedef Items::const_iterator item_iterator; + /// toolbar name + std::string name; + /// toolbar GUI name + std::string gui_name; + /// toolbar contents + Items items; + /// flags + Flags flags; + /// read a toolbar from the file + ToolbarInfo & read(LyXLex &); + +private: + /// add toolbar item + void add(ToolbarItem const &); +}; + + +/// +class ToolbarBackend { +public: + typedef std::vector<ToolbarInfo> Toolbars; + ToolbarBackend(); /// iterator for all toolbars @@ -84,20 +110,13 @@ Toolbars::iterator end() { return usedtoolbars.end(); } - /// read a toolbar from the file - void read(LyXLex &); - - /// read the used toolbars + /// read toolbars from the file void readToolbars(LyXLex &); - /// return a full path of an XPM for the given action - static std::string const getIcon(FuncRequest const &); + /// read ui toolbar settings + void readToolbarSettings(LyXLex &); private: - /// add the given lfun with tooltip if relevant - void add(Toolbar & tb, FuncRequest const &, - docstring const & tooltip = docstring()); - /// all the toolbars Toolbars toolbars;
PGP.sig
Description: Signierter Teil der Nachricht