Le 24/01/2016 11:15, Uwe Stöhr a écrit :
Am 22.01.2016 um 02:07 schrieb Uwe Stöhr:
I tried this but cannot see a problem in LyX 2.1.4 compared to LyX 2.2
with your patches applied.
I still had your patch applied and this caused a crash:
http://www.lyx.org/trac/ticket/9944
Can you please have a look and provide a new patch? (if possible only
one patch file)
I cannot reproduce.
I placed the cursor at the bottom of the manual and scrolled back up to
the top with the scrollbar. No crash happened. Did I miss anything?
Here are the patches as a single diff. Can you please confirm that this
triggers your issue?
Guillaume
diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp
index 12e871a..9161074 100644
--- a/src/mathed/InsetMathGrid.cpp
+++ b/src/mathed/InsetMathGrid.cpp
@@ -486,7 +486,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
- colinfo_[col - 1].skip_ +
+ displayColSpace(col - 1) +
colsep() +
colinfo_[col].lines_ * vlinesep();
}
@@ -508,7 +508,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
int const nextoffset =
colinfo_[first].offset_ +
wid +
- colinfo_[last].skip_ +
+ displayColSpace(last) +
colsep() +
colinfo_[last+1].lines_ * vlinesep();
int const dx = nextoffset - colinfo_[last+1].offset_;
@@ -741,7 +741,7 @@ void InsetMathGrid::metricsT(TextMetricsInfo const & mi, Dimension & dim) const
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
- colinfo_[col - 1].skip_ +
+ displayColSpace(col - 1) +
1 ; //colsep() +
//colinfo_[col].lines_ * vlinesep();
}
@@ -953,7 +953,7 @@ int InsetMathGrid::cellWidth(idx_type idx) const
col_type c2 = c1 + ncellcols(idx);
return colinfo_[c2].offset_
- colinfo_[c1].offset_
- - colinfo_[c2].skip_
+ - displayColSpace(c2)
- colsep()
- colinfo_[c2].lines_ * vlinesep();
}
@@ -1378,6 +1378,11 @@ char InsetMathGrid::displayColAlign(idx_type idx) const
}
+int InsetMathGrid::displayColSpace(col_type col) const
+{
+ return colinfo_[col].skip_;
+}
+
void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd)
{
//lyxerr << "*** InsetMathGrid: request: " << cmd << endl;
@@ -1827,4 +1832,56 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd,
}
+// static
+char InsetMathGrid::colAlign(HullType type, col_type col)
+{
+ switch (type) {
+ case hullEqnArray:
+ return "rcl"[col % 3];
+
+ case hullMultline:
+ case hullGather:
+ return 'c';
+
+ case hullAlign:
+ case hullAlignAt:
+ case hullXAlignAt:
+ case hullXXAlignAt:
+ case hullFlAlign:
+ return "rl"[col & 1];
+
+ default:
+ return 'c';
+ }
+}
+
+
+//static
+int InsetMathGrid::colSpace(HullType type, col_type col)
+{
+ int alignInterSpace;
+ switch (type) {
+ case hullEqnArray:
+ return 5;
+
+ case hullAlign:
+ alignInterSpace = 20;
+ break;
+ case hullAlignAt:
+ alignInterSpace = 0;
+ break;
+ case hullXAlignAt:
+ alignInterSpace = 40;
+ break;
+ case hullXXAlignAt:
+ case hullFlAlign:
+ alignInterSpace = 60;
+ break;
+ default:
+ return 0;
+ }
+ return (col % 2) ? alignInterSpace : 0;
+}
+
+
} // namespace lyx
diff --git a/src/mathed/InsetMathGrid.h b/src/mathed/InsetMathGrid.h
index bd3066d..7faf938 100644
--- a/src/mathed/InsetMathGrid.h
+++ b/src/mathed/InsetMathGrid.h
@@ -258,10 +258,19 @@ protected:
virtual docstring eocString(col_type col, col_type lastcol) const;
/// splits cells and shifts right part to the next cell
void splitCell(Cursor & cur);
- /// Column aligmment for display of cell \p idx.
+ /// Column alignment for display of cell \p idx.
/// Must not be written to file!
virtual char displayColAlign(idx_type idx) const;
+ /// Column spacing for display of column \p col.
+ /// Must not be written to file!
+ virtual int displayColSpace(col_type col) const;
+ // The following two functions are used in InsetMathHull and
+ // InsetMathSplit.
+ /// The value of a fixed col align for a certain hull type
+ static char colAlign(HullType type, col_type col);
+ /// The value of a fixed col spacing for a certain hull type
+ static int colSpace(HullType type, col_type col);
/// row info.
/// rowinfo_[nrows()] is a dummy row used only for hlines.
diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp
index 94e9ec4..82c6f98 100644
--- a/src/mathed/InsetMathHull.cpp
+++ b/src/mathed/InsetMathHull.cpp
@@ -349,33 +349,46 @@ bool InsetMathHull::idxLast(Cursor & cur) const
}
+//FIXME: This has probably no effect and can be removed.
char InsetMathHull::defaultColAlign(col_type col)
{
- if (type_ == hullEqnArray)
- return "rcl"[col];
- if (type_ == hullMultline)
- return 'c';
- if (type_ == hullGather)
- return 'c';
- if (type_ >= hullAlign)
- return "rl"[col & 1];
- return 'c';
+ return colAlign(type_, col);
}
char InsetMathHull::displayColAlign(idx_type idx) const
{
- if (type_ == hullMultline) {
+ switch (type_) {
+ case hullMultline: {
row_type const r = row(idx);
if (r == 0)
return 'l';
if (r == nrows() - 1)
return 'r';
+ return 'c';
+ }
+ case hullEqnArray:
+ case hullGather:
+ case hullAlign:
+ case hullAlignAt:
+ case hullXAlignAt:
+ case hullXXAlignAt:
+ case hullFlAlign:
+ return colAlign(type_, col(idx));
+ default:
+ break;
}
return InsetMathGrid::displayColAlign(idx);
}
+int InsetMathHull::displayColSpace(col_type col) const
+{
+ return colSpace(type_, col);
+}
+
+
+//FIXME: This has probably no effect and can be removed.
int InsetMathHull::defaultColSpace(col_type col)
{
if (type_ == hullAlign || type_ == hullAlignAt)
diff --git a/src/mathed/InsetMathHull.h b/src/mathed/InsetMathHull.h
index e02c619..ab63135 100644
--- a/src/mathed/InsetMathHull.h
+++ b/src/mathed/InsetMathHull.h
@@ -111,6 +111,8 @@ public:
///
int defaultColSpace(col_type col);
///
+ int displayColSpace(col_type col) const;
+ ///
char defaultColAlign(col_type col);
///
char displayColAlign(idx_type idx) const;
diff --git a/src/mathed/InsetMathSplit.cpp b/src/mathed/InsetMathSplit.cpp
index 2adb845..a69017b 100644
--- a/src/mathed/InsetMathSplit.cpp
+++ b/src/mathed/InsetMathSplit.cpp
@@ -48,20 +48,52 @@ Inset * InsetMathSplit::clone() const
}
+//FIXME: This has probably no effect and can be removed.
char InsetMathSplit::defaultColAlign(col_type col)
{
- if (name_ == "split")
- return 'l';
if (name_ == "gathered")
return 'c';
- if (name_ == "aligned" || name_ == "align")
- return (col & 1) ? 'l' : 'r';
- if (name_ == "alignedat")
- return (col & 1) ? 'l' : 'r';
+ if (name_ == "lgathered")
+ return 'l';
+ if (name_ == "rgathered")
+ return 'r';
+ if (name_ == "split"
+ || name_ == "aligned"
+ || name_ == "align"
+ || name_ == "alignedat")
+ return colAlign(hullAlign, col);
return 'l';
}
+char InsetMathSplit::displayColAlign(idx_type idx) const
+{
+ if (name_ == "gathered")
+ return 'c';
+ if (name_ == "lgathered")
+ return 'l';
+ if (name_ == "rgathered")
+ return 'r';
+ if (name_ == "split"
+ || name_ == "aligned"
+ || name_ == "align"
+ || name_ == "alignedat")
+ return colAlign(hullAlign, col(idx));
+ return InsetMathGrid::displayColAlign(idx);
+}
+
+
+int InsetMathSplit::displayColSpace(col_type col) const
+{
+ if (name_ == "split" || name_ == "aligned" || name_ == "align")
+ return colSpace(hullAlign, col);
+ if (name_ == "alignedat")
+ return colSpace(hullAlignAt, col);
+ return 0;
+}
+
+
+
void InsetMathSplit::draw(PainterInfo & pi, int x, int y) const
{
InsetMathGrid::draw(pi, x, y);
@@ -82,6 +114,10 @@ bool InsetMathSplit::getStatus(Cursor & cur, FuncRequest const & cmd,
flag.setEnabled(false);
return true;
}
+ if (s == "align-left" || s == "align-center" || s == "align-right") {
+ flag.setEnabled(false);
+ return true;
+ }
break;
}
default:
diff --git a/src/mathed/InsetMathSplit.h b/src/mathed/InsetMathSplit.h
index b0ff437..1226534 100644
--- a/src/mathed/InsetMathSplit.h
+++ b/src/mathed/InsetMathSplit.h
@@ -41,8 +41,12 @@ public:
///
int defaultColSpace(col_type) { return 0; }
///
+ int displayColSpace(col_type col) const;
+ ///
char defaultColAlign(col_type);
///
+ char displayColAlign(idx_type idx) const;
+ ///
InsetCode lyxCode() const { return MATH_SPLIT_CODE; }
private: