Am Montag, 1. Mai 2006 20:21 schrieb Enrico Forestieri: > I just discovered another small problem. > > When using the GUI for fixed size delimiters and there is a selection: > > 1) if the left delimiter is empty, hitting insert produces nothing; > > 2) if the right delimiter is empty, hitting insert the selection is > replaced.
This updated patch should work better. If it does, it goes in. It does not yet address the backspace problem, I will look at that later. Georg Log: Implement GUI for fixed size math delimiters (by Enrico Forestieri and me): * src/lfuns.h (enum kb_action): New lfun LFUN_MATH_BIGDELIM * src/LyXAction.C (void LyXAction::init): New lfun LFUN_MATH_BIGDELIM * src/mathed/math_nestinset.C (void MathNestInset::doDispatch): remove debug message (void MathNestInset::doDispatch): remove LFUN_MATH_DELIM test for multiple cells (now in getStatus) (void MathNestInset::doDispatch): Handle LFUN_MATH_BIGDELIM (bool MathNestInset::getStatus): Disable LFUN_MATH_DELIM and LFUN_MATH_BIGDELIM when the selection spans multiple cells * src/frontends/qt3/ui/QDelimiterDialogBase.ui Added a combobox for selecting delimiter size. * src/frontends/qt3/QDelimiterDialog.[Ch] (fix_name, QDelimiterDialog, insertClicked, size_selected): Allow for fixed size delimiters. * src/frontends/gtk/GMathDelim.C: Add FIXME commnent for fixed size delimiters * src/frontends/qt4/QDelimiterDialog.C: ditto * src/frontends/xforms/FormMathsDelim.C: ditto * src/frontends/controllers/ControlMath.[Ch]: Added dispatchBigDelim() to deal with fixed size delimiters. * src/text3.C (void LyXText::dispatch): Handle LFUN_MATH_BIGDELIM (bool LyXText::getStatus): ditto * src/ToolbarBackend.C (string const ToolbarBackend::getIcon): Handle LFUN_MATH_BIGDELIM
Index: src/LyXAction.C =================================================================== --- src/LyXAction.C (Revision 13802) +++ src/LyXAction.C (Arbeitskopie) @@ -212,6 +212,7 @@ void LyXAction::init() { LFUN_MARK_ON, "mark-on", ReadOnly }, { LFUN_MARK_TOGGLE, "mark-toggle", ReadOnly }, { LFUN_MATH_DELIM, "math-delim", Noop }, + { LFUN_MATH_BIGDELIM, "math-bigdelim", Noop }, { LFUN_MATH_DISPLAY, "math-display", Noop }, { LFUN_MATH_INSERT, "math-insert", Noop }, { LFUN_MATH_SUBSCRIPT, "math-subscript", Noop }, Index: src/mathed/math_nestinset.C =================================================================== --- src/mathed/math_nestinset.C (Revision 13802) +++ src/mathed/math_nestinset.C (Arbeitskopie) @@ -848,7 +848,6 @@ void MathNestInset::doDispatch(LCursor & } case LFUN_MATH_DELIM: { - lyxerr << "MathNestInset::LFUN_MATH_DELIM" << endl; string ls; string rs = lyx::support::split(cmd.argument, ls, ' '); // Reasonable default values @@ -857,9 +856,37 @@ void MathNestInset::doDispatch(LCursor & if (rs.empty()) rs = ')'; recordUndo(cur, Undo::ATOMIC); - // Don't do this with multi-cell selections - if (cur.selBegin().idx() == cur.selEnd().idx()) - cur.handleNest(MathAtom(new MathDelimInset(ls, rs))); + cur.handleNest(MathAtom(new MathDelimInset(ls, rs))); + break; + } + + case LFUN_MATH_BIGDELIM: { + string const lname = cmd.getArg(0); + string const ldelim = cmd.getArg(1); + string const rname = cmd.getArg(2); + string const rdelim = cmd.getArg(3); + latexkeys const * l = in_word_set(lname); + bool const have_l = l && l->inset == "big" && + MathBigInset::isBigInsetDelim(ldelim); + l = in_word_set(rname); + bool const have_r = l && l->inset == "big" && + MathBigInset::isBigInsetDelim(rdelim); + // We mimic LFUN_MATH_DELIM in case we have an empty left + // or right delimiter. + if (have_l || have_r) { + recordUndo(cur, Undo::ATOMIC); + string const selection = grabAndEraseSelection(cur); + selClearOrDel(cur); + if (have_l) + cur.insert(MathAtom(new MathBigInset(lname, + ldelim))); + cur.niceInsert(selection); + if (have_r) + cur.insert(MathAtom(new MathBigInset(rname, + rdelim))); + } + // Don't call cur.undispatched() if we did nothing, this would + // lead to infinite recursion via LyXText::dispatch(). break; } @@ -917,7 +944,7 @@ void MathNestInset::doDispatch(LCursor & } -bool MathNestInset::getStatus(LCursor & /*cur*/, FuncRequest const & cmd, +bool MathNestInset::getStatus(LCursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { // the font related toggles @@ -993,6 +1020,13 @@ bool MathNestInset::getStatus(LCursor & case LFUN_MATH_MATRIX: flag.enabled(currentMode() == MATH_MODE); break; + + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: + // Don't do this with multi-cell selections + flag.enabled(cur.selBegin().idx() == cur.selEnd().idx()); + break; + default: ret = false; break; Index: src/frontends/gtk/GMathDelim.C =================================================================== --- src/frontends/gtk/GMathDelim.C (Revision 13802) +++ src/frontends/gtk/GMathDelim.C (Arbeitskopie) @@ -36,6 +36,8 @@ using std::string; namespace lyx { namespace frontend { +// FIXME: Implement fixed size delimiters (see qt3 frontend) + namespace { Index: src/frontends/qt3/QDelimiterDialog.C =================================================================== --- src/frontends/qt3/QDelimiterDialog.C (Revision 13802) +++ src/frontends/qt3/QDelimiterDialog.C (Arbeitskopie) @@ -18,9 +18,14 @@ #include "controllers/ControlMath.h" +#include "gettext.h" + #include <qlabel.h> #include <qpixmap.h> #include <qcheckbox.h> +#include <qcombobox.h> + +#include <sstream> using std::string; @@ -38,6 +43,12 @@ char const * delim[] = { }; +char const * const bigleft[] = {"bigl", "Bigl", "biggl", "Biggl", ""}; +char const * const bigright[] = {"bigr", "Bigr", "biggr", "Biggr", ""}; +char const * const biggui[] = {N_("big size"), N_("Big size"), + N_("bigg size"), N_("Bigg size"), ""}; + + string do_match(const string & str) { if (str == "(") return ")"; @@ -59,7 +70,7 @@ string do_match(const string & str) } -string fix_name(const string & str) +string fix_name(const string & str, bool big) { if (str == "slash") return "/"; @@ -67,7 +78,10 @@ string fix_name(const string & str) return "\\"; if (str == "empty") return "."; - return str; + if (!big || str == "(" || str == ")" || str == "[" || str == "]") + return str; + + return "\\" + str; } } // namespace anon @@ -89,11 +103,17 @@ QDelimiterDialog::QDelimiterDialog(QMath leftIP->add(QPixmap(toqstr(empty_xpm)), "empty", "empty"); rightIP->add(QPixmap(toqstr(empty_xpm)), "empty", "empty"); + delimSize->insertItem(qt_("Variable size")); + for (int i = 0; *biggui[i]; ++i) + delimSize->insertItem(qt_(biggui[i])); + size_ = 0; // Leave these std:: qualifications alone ! connect(leftIP, SIGNAL(button_clicked(const std::string &)), this, SLOT(ldelim_clicked(const std::string &))); connect(rightIP, SIGNAL(button_clicked(const std::string &)), this, SLOT(rdelim_clicked(const std::string &))); + connect(delimSize, SIGNAL(activated(int)), + this, SLOT(size_selected(int)) ); ldelim_clicked("("); rdelim_clicked(")"); } @@ -101,7 +121,18 @@ QDelimiterDialog::QDelimiterDialog(QMath void QDelimiterDialog::insertClicked() { - form_->controller().dispatchDelim(fix_name(left_) + ' ' + fix_name(right_)); + if (size_ == 0) { + form_->controller().dispatchDelim( + fix_name(left_, false) + ' ' + + fix_name(right_, false)); + } else { + std::ostringstream os; + os << '"' << bigleft[size_ - 1] << "\" \"" + << fix_name(left_, true) << "\" \"" + << bigright[size_ - 1] << "\" \"" + << fix_name(right_, true) << '"'; + form_->controller().dispatchBigDelim(os.str()); + } } @@ -137,5 +168,11 @@ void QDelimiterDialog::rdelim_clicked(co } } + +void QDelimiterDialog::size_selected(int index) +{ + size_ = index; +} + } // namespace frontend } // namespace lyx Index: src/frontends/qt3/QDelimiterDialog.h =================================================================== --- src/frontends/qt3/QDelimiterDialog.h (Revision 13802) +++ src/frontends/qt3/QDelimiterDialog.h (Arbeitskopie) @@ -30,6 +30,7 @@ public: public slots: void ldelim_clicked(const std::string & str); void rdelim_clicked(const std::string & str); + void size_selected(int); void insertClicked(); protected: //needed ? virtual void closeEvent(QCloseEvent * e); @@ -42,6 +43,9 @@ private: /// symbol of right delimiter std::string right_; + /// size of delimiters + int size_; + /// owning form QMathDelimiter * form_; }; Index: src/frontends/qt3/ui/QDelimiterDialogBase.ui =================================================================== --- src/frontends/qt3/ui/QDelimiterDialogBase.ui (Revision 13802) +++ src/frontends/qt3/ui/QDelimiterDialogBase.ui (Arbeitskopie) @@ -307,6 +307,22 @@ </size> </property> </spacer> + <widget class="QComboBox"> + <property name="name"> + <cstring>delimSize</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Choose delimiter size</string> + </property> + </widget> </hbox> </widget> <widget class="QLayoutWidget"> Index: src/frontends/qt4/QDelimiterDialog.C =================================================================== --- src/frontends/qt4/QDelimiterDialog.C (Revision 13802) +++ src/frontends/qt4/QDelimiterDialog.C (Arbeitskopie) @@ -28,6 +28,8 @@ using std::string; namespace lyx { namespace frontend { +// FIXME: Implement fixed size delimiters (see qt3 frontend) + namespace { char const * delim[] = { Index: src/frontends/xforms/FormMathsDelim.C =================================================================== --- src/frontends/xforms/FormMathsDelim.C (Revision 13802) +++ src/frontends/xforms/FormMathsDelim.C (Arbeitskopie) @@ -33,6 +33,8 @@ using std::ostringstream; namespace lyx { namespace frontend { +// FIXME: Implement fixed size delimiters (see qt3 frontend) + namespace { int const delim_rversion[] = { Index: src/frontends/controllers/ControlMath.h =================================================================== --- src/frontends/controllers/ControlMath.h (Revision 13802) +++ src/frontends/controllers/ControlMath.h (Arbeitskopie) @@ -43,9 +43,11 @@ public: void dispatchCubeRoot() const; /// Insert a matrix void dispatchMatrix(std::string const & str) const; - /// Insert a delimiter + /// Insert a variable size delimiter void dispatchDelim(std::string const & str) const; - /// Wwitch between display and inline + /// Insert a big delimiter + void dispatchBigDelim(std::string const & str) const; + /// Switch between display and inline void dispatchToggleDisplay() const; /** A request to the kernel to launch a dialog. * \param name the dialog identifier. Index: src/frontends/controllers/ControlMath.C =================================================================== --- src/frontends/controllers/ControlMath.C (Revision 13802) +++ src/frontends/controllers/ControlMath.C (Arbeitskopie) @@ -79,6 +79,12 @@ void ControlMath::dispatchDelim(string c } +void ControlMath::dispatchBigDelim(string const & str) const +{ + dispatchFunc(LFUN_MATH_BIGDELIM, str); +} + + void ControlMath::dispatchToggleDisplay() const { dispatchFunc(LFUN_MATH_DISPLAY); Index: src/text3.C =================================================================== --- src/text3.C (Revision 13802) +++ src/text3.C (Arbeitskopie) @@ -1311,7 +1311,8 @@ void LyXText::dispatch(LCursor & cur, Fu case LFUN_MATH_INSERT: case LFUN_MATH_MATRIX: - case LFUN_MATH_DELIM: { + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: { cur.insert(new MathHullInset("simple")); cur.dispatch(FuncRequest(LFUN_CHAR_FORWARD)); cur.dispatch(cmd); @@ -1878,6 +1879,7 @@ bool LyXText::getStatus(LCursor & cur, F case LFUN_MATH_INSERT: case LFUN_MATH_MATRIX: case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: case LFUN_MATH_SUBSCRIPT: case LFUN_MATH_SUPERSCRIPT: case LFUN_FONT_DEFAULT: Index: src/lfuns.h =================================================================== --- src/lfuns.h (Revision 13802) +++ src/lfuns.h (Arbeitskopie) @@ -362,10 +362,11 @@ enum kb_action { LFUN_OUTLINE_DOWN, LFUN_OUTLINE_IN, LFUN_OUTLINE_OUT, - // 275 LFUN_PARAGRAPH_MOVE_DOWN, // Edwin 20060408 LFUN_PARAGRAPH_MOVE_UP, // Edwin 20060408 + // 280 LFUN_BUFFER_TOGGLE_COMPRESSION, // bpeng 20060427 + LFUN_MATH_BIGDELIM, LFUN_LASTACTION // end of the table }; Index: src/ToolbarBackend.C =================================================================== --- src/ToolbarBackend.C (Revision 13802) +++ src/ToolbarBackend.C (Arbeitskopie) @@ -217,12 +217,16 @@ string const ToolbarBackend::getIcon(Fun string fullname; - if (f.action == LFUN_MATH_INSERT) { + switch (f.action) { + case LFUN_MATH_INSERT: if (!f.argument.empty()) fullname = find_xpm(f.argument.substr(1)); - } else if (f.action == LFUN_MATH_DELIM) { + break; + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: fullname = find_xpm(f.argument); - } else { + break; + default: string const name = lyxaction.getActionName(f.action); string xpm_name(name);