Allow toggling (no)limits only after mathop symbol

In particular, introduce the new InsetMathScript::allowLimits method
that checks for that and honor it in getStatus/ddoDispatch.
This commit is contained in:
Jean-Marc Lasgouttes 2018-09-03 17:49:54 +02:00
parent 6014492699
commit 7b7ed64a0e
2 changed files with 34 additions and 10 deletions

View File

@ -365,6 +365,20 @@ void InsetMathScript::drawT(TextPainter & pain, int x, int y) const
}
// FIXME: See InsetMathSymbol::takesLimits, which seems to attempt the
// same in a hardcoded way. takeLimits use is currently commented out in
// InsetMathScript::metrics. It seems that the mathop test is general
// enough, but only time will tell.
bool InsetMathScript::allowsLimits() const
{
if (nuc().empty())
return false;
// Only makes sense for insets of mathop class
if (nuc().back()->mathClass() != MC_OP)
return false;
return true;
}
bool InsetMathScript::hasLimits() const
{
@ -375,8 +389,9 @@ bool InsetMathScript::hasLimits() const
return false;
// we can only display limits if the nucleus wants some
if (nuc().empty())
if (!allowsLimits())
return false;
// FIXME: this is some hardcoding done in InsetMathSymbol::metrics.
if (!nuc().back()->isScriptable())
return false;
@ -735,6 +750,9 @@ void InsetMathScript::doDispatch(Cursor & cur, FuncRequest & cmd)
//LYXERR("InsetMathScript: request: " << cmd);
if (cmd.action() == LFUN_MATH_LIMITS) {
// only when nucleus allows this
if (!allowsLimits())
return;
cur.recordUndoInset();
if (!cmd.argument().empty()) {
if (cmd.argument() == "limits")
@ -758,15 +776,19 @@ bool InsetMathScript::getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus & flag) const
{
if (cmd.action() == LFUN_MATH_LIMITS) {
if (!cmd.argument().empty()) {
if (cmd.argument() == "limits")
flag.setOnOff(limits_ == 1);
else if (cmd.argument() == "nolimits")
flag.setOnOff(limits_ == -1);
else
flag.setOnOff(limits_ == 0);
}
flag.setEnabled(true);
// only when nucleus allows this
if (allowsLimits()) {
if (!cmd.argument().empty()) {
if (cmd.argument() == "limits")
flag.setOnOff(limits_ == 1);
else if (cmd.argument() == "nolimits")
flag.setOnOff(limits_ == -1);
else
flag.setOnOff(limits_ == 0);
}
flag.setEnabled(true);
} else
flag.setEnabled(false);
return true;
}

View File

@ -138,6 +138,8 @@ private:
/// shifts the superscript to the right, and a negative value shifts the
/// subscript to the left.
int nker(BufferView const * bv) const;
/// can one change how scripts are drawn?
bool allowsLimits() const;
/// where do we have to draw the scripts?
bool hasLimits() const;
/// clean up empty cells and return true if a cell has been deleted.