Le 28/09/2018 à 18:12, Jean-Marc Lasgouttes a écrit :
Le 20/09/2018 à 19:47, Jean-Marc Lasgouttes a écrit :
Le 03/09/2018 à 18:01, Jean-Marc Lasgouttes a écrit :
commit 7b7ed64a0e760eccad5fff7fa944b983d0bed025
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon Sep 3 17:49:54 2018 +0200

     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.

Riki,

Can I backport this (along with the fixup at 6cfd733dea70b)?

Ping!

Pong!

JMarc


JMarc


JMarc

---
  src/mathed/InsetMathScript.cpp |   42 ++++++++++++++++++++++++++++++---------
  src/mathed/InsetMathScript.h   |    2 +
  2 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/mathed/InsetMathScript.cpp b/src/mathed/InsetMathScript.cpp
index 8c6416a..2f66b0f 100644
--- a/src/mathed/InsetMathScript.cpp
+++ b/src/mathed/InsetMathScript.cpp
@@ -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;
      }
diff --git a/src/mathed/InsetMathScript.h b/src/mathed/InsetMathScript.h
index c1589b1..d29ffbd 100644
--- a/src/mathed/InsetMathScript.h
+++ b/src/mathed/InsetMathScript.h
@@ -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.




Reply via email to