diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 75562ba87d..e4a8f49e08 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -402,9 +402,9 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) // arity changed or other reason to detach? if (oldDisplayMode == MathMacro::DISPLAY_NORMAL - && (macroInset->arity() != macroNumArgs - || macroInset->optionals() != macroOptionals - || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) { + && (macroInset->arity() != macroNumArgs + || macroInset->optionals() != macroOptionals + || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) { detachMacroParameters(cur, i); } @@ -414,7 +414,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) // Cursor in \label? if (newDisplayMode != MathMacro::DISPLAY_UNFOLDED - && oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) { + && oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) { // put cursor in front of macro if (cur) { int macroSlice = cur->find(macroInset); @@ -424,17 +424,18 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) } // update the display mode + size_t appetite = macroInset->appetite(); macroInset->setDisplayMode(newDisplayMode); // arity changed? if (newDisplayMode == MathMacro::DISPLAY_NORMAL - && (macroInset->arity() != macroNumArgs - || macroInset->optionals() != macroOptionals)) { + && (macroInset->arity() != macroNumArgs + || macroInset->optionals() != macroOptionals)) { // is it a virgin macro which was never attached to parameters? bool fromInitToNormalMode = (oldDisplayMode == MathMacro::DISPLAY_INIT - || oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT) - && newDisplayMode == MathMacro::DISPLAY_NORMAL; + || oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT) + && newDisplayMode == MathMacro::DISPLAY_NORMAL; // if the macro was entered interactively (i.e. not by paste or during // loading), it should not be greedy, but the cursor should @@ -443,7 +444,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) // attach parameters attachMacroParameters(cur, i, macroNumArgs, macroOptionals, - fromInitToNormalMode, interactive); + fromInitToNormalMode, interactive, appetite); if (cur) { // FIXME: proper anchor handling, this removes the selection @@ -593,7 +594,7 @@ void MathData::detachMacroParameters(Cursor * cur, const size_type macroPos) void MathData::attachMacroParameters(Cursor * cur, const size_type macroPos, const size_type macroNumArgs, const int macroOptionals, const bool fromInitToNormalMode, - const bool interactiveInit) + const bool interactiveInit, const size_t appetite) { MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro(); @@ -615,9 +616,9 @@ void MathData::attachMacroParameters(Cursor * cur, if (!interactiveInit) { collectOptionalParameters(cur, macroOptionals, detachedArgs, p, scriptToPutAround, macroPos, thisPos, thisSlice); - collectParameters(cur, macroNumArgs, detachedArgs, p, - scriptToPutAround, macroPos, thisPos, thisSlice); } + collectParameters(cur, macroNumArgs, detachedArgs, p, + scriptToPutAround, macroPos, thisPos, thisSlice, appetite); // attach arguments back to macro inset macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals); @@ -743,10 +744,14 @@ void MathData::collectOptionalParameters(Cursor * cur, void MathData::collectParameters(Cursor * cur, const size_type numParams, vector & params, size_t & pos, MathAtom & scriptToPutAround, - const pos_type macroPos, const int thisPos, const int thisSlice) + const pos_type macroPos, const int thisPos, const int thisSlice, + const size_t appetite) { + size_t startSize = params.size(); + // insert normal arguments while (params.size() < numParams + && params.size() - startSize < appetite && pos < size() && !scriptToPutAround.nucleus()) { MathAtom & cell = operator[](pos); diff --git a/src/mathed/MathData.h b/src/mathed/MathData.h index 56da42ca38..a57d674dbb 100644 --- a/src/mathed/MathData.h +++ b/src/mathed/MathData.h @@ -177,7 +177,8 @@ private: /// void attachMacroParameters(Cursor * cur, const size_type macroPos, const size_type macroNumArgs, const int macroOptionals, - const bool fromInitToNormalMode, const bool interactiveInit); + const bool fromInitToNormalMode, const bool interactiveInit, + const size_t appetite); /// void collectOptionalParameters(Cursor * cur, const size_type numOptionalParams, std::vector & params, @@ -187,7 +188,8 @@ private: void collectParameters(Cursor * cur, const size_type numParams, std::vector & params, size_t & pos, MathAtom & scriptToPutAround, - const pos_type macroPos, const int thisPos, const int thisSlice); + const pos_type macroPos, const int thisPos, const int thisSlice, + const size_t appetite); }; /// diff --git a/src/mathed/MathMacro.cpp b/src/mathed/MathMacro.cpp index 96e75ae414..37c393e010 100644 --- a/src/mathed/MathMacro.cpp +++ b/src/mathed/MathMacro.cpp @@ -114,7 +114,7 @@ private: MathMacro::MathMacro(docstring const & name) : InsetMathNest(0), name_(name), displayMode_(DISPLAY_INIT), attachedArgsNum_(0), optionals_(0), nextFoldMode_(true), - macro_(0), needsUpdate_(false) + macro_(0), needsUpdate_(false), appetite_(9) {} @@ -449,7 +449,7 @@ void MathMacro::drawSelection(PainterInfo & pi, int x, int y) const } -void MathMacro::setDisplayMode(MathMacro::DisplayMode mode) +void MathMacro::setDisplayMode(MathMacro::DisplayMode mode, int appetite) { if (displayMode_ != mode) { // transfer name if changing from or to DISPLAY_UNFOLDED @@ -464,6 +464,12 @@ void MathMacro::setDisplayMode(MathMacro::DisplayMode mode) displayMode_ = mode; needsUpdate_ = true; } + + // the interactive init mode is non-greedy by default + if (appetite == -1) + appetite_ = (mode == DISPLAY_INTERACTIVE_INIT) ? 0 : 9; + else + appetite_ = size_t(appetite); } diff --git a/src/mathed/MathMacro.h b/src/mathed/MathMacro.h index dae4d8099c..f78aee1ba7 100644 --- a/src/mathed/MathMacro.h +++ b/src/mathed/MathMacro.h @@ -118,14 +118,16 @@ public: if (n <= int(nargs())) optionals_ = n; } - + /// Return the maximal number of arguments the macro is greedy for. + size_t appetite() const { return appetite_; } + protected: friend class MathData; friend class ArgumentProxy; friend class Cursor; /// update the display mode (should only be called after detaching arguments) - void setDisplayMode(DisplayMode mode); + void setDisplayMode(DisplayMode mode, int appetite = -1); /// compute the next display mode DisplayMode computeDisplayMode() const; /// update macro definition @@ -142,7 +144,7 @@ protected: MacroData const * macro() { return macro_; } /// bool editMetrics(BufferView const * bv) const; - + private: /// virtual Inset * clone() const; @@ -175,6 +177,8 @@ private: std::string requires_; /// update macro representation bool needsUpdate_; + /// maximal number of arguments the macro is greedy for + size_t appetite_; public: ///