Rework display of numbers in margins of hull insets

This requires the introduction of the booleans selected_left and
selected_right in PainterInfo. These tell whether the selection
continues at the left/right of the inset.

This information allows to

1/ paint equation number in the right color: either current text color
   or selection text color.

2/ before that, paint a small background rectangle of the correct color.

This allows to avoid painting a large rectangle of an arbitrary color
that was the cause of the bug.

Fixes bug #12319.
This commit is contained in:
Jean-Marc Lasgouttes 2021-07-01 18:35:16 +02:00
parent 5dd96345ab
commit da57154f94
4 changed files with 31 additions and 13 deletions

View File

@ -132,7 +132,8 @@ MetricsInfo::MetricsInfo(BufferView * bv, FontInfo font, int textwidth,
/////////////////////////////////////////////////////////////////////////
PainterInfo::PainterInfo(BufferView * bv, lyx::frontend::Painter & painter)
: pain(painter), ltr_pos(false), change(), selected(false),
: pain(painter), ltr_pos(false), change(),
selected(false), selected_left(false), selected_right(false),
do_spellcheck(true), full_repaint(true), background_color(Color_background),
leftx(0), rightx(0)
{

View File

@ -141,12 +141,15 @@ public:
Change change;
/// Whether the parent is selected as a whole
bool selected;
/// Whether the left/right margins are selected
bool selected_left, selected_right;
/// Whether the spell checker is enabled for the parent
bool do_spellcheck;
/// True when it can be assumed that the screen has been cleared
bool full_repaint;
/// Current background color
ColorCode background_color;
/// The left and right position of current line (inside margins).
/// Useful for drawing display math numbering
int leftx, rightx;
};

View File

@ -82,7 +82,11 @@ FontInfo RowPainter::labelFont(bool end) const
void RowPainter::paintInset(Row::Element const & e) const
{
// Handle selection
// Handle selection (first left/right, then middle).
pi_.selected_left = pi_.selected
|| (row_.isRTL() ? row_.end_margin_sel : row_.begin_margin_sel);
pi_.selected_right = pi_.selected
|| (row_.isRTL() ? row_.begin_margin_sel : row_.end_margin_sel);
bool const pi_selected = pi_.selected;
Cursor const & cur = pi_.base.bv->cursor();
if (cur.selection() && cur.text() == &text_

View File

@ -589,13 +589,9 @@ void InsetMathHull::drawBackground(PainterInfo & pi, int x, int y) const
dim.wid, dim.asc + dim.des, backgroundColor(pi));
return;
}
// If there are numbers, the margins around the (displayed)
// equation have to be cleared.
if (numberedType())
pi.pain.fillRectangle(pi.leftx, y - dim.asc,
pi.rightx - pi.leftx, dim.height(), pi.background_color);
pi.pain.fillRectangle(x + 1, y - dim.asc + 1, dim.wid - 2,
dim.asc + dim.des - 1, pi.backgroundColor(this));
dim.height() - 1, pi.backgroundColor(this));
}
@ -626,11 +622,6 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
}
// First draw the numbers
ColorCode color = pi.selected && lyxrc.use_system_colors
? Color_selectiontext : standardColor();
bool const really_change_color = pi.base.font.color() == Color_none;
Changer dummy0 = really_change_color ? pi.base.font.changeColor(color)
: noChange();
if (numberedType()) {
BufferParams::MathNumber const math_number = buffer().params().getMathNumber();
for (row_type row = 0; row < nrows(); ++row) {
@ -639,18 +630,37 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
Dimension dimnl;
mathed_string_dim(pi.base.font, nl, dimnl);
if (math_number == BufferParams::LEFT) {
ColorCode const col = pi.selected_left
? Color_selectiontext
: pi.base.font.color();
Changer dummy0 = pi.base.font.changeColor(col);
if (dimnl.wid > x - pi.leftx)
yy += rowinfo(row).descent + dimnl.asc;
pi.pain.fillRectangle(pi.leftx, yy - dimnl.asc,
dimnl.width(), dimnl.height(),
pi.selected_left ? Color_selection : pi.background_color);
pi.draw(pi.leftx, yy, nl);
} else {
ColorCode const col = pi.selected_right
? Color_selectiontext
: pi.base.font.color();
Changer dummy0 = pi.base.font.changeColor(col);
if (dimnl.wid > pi.rightx - x - dim.wid)
yy += rowinfo(row).descent + dimnl.asc;
pi.pain.fillRectangle(pi.rightx - dimnl.wid, yy - dimnl.asc,
dimnl.width(), dimnl.height(),
pi.selected_right ? Color_selection : pi.background_color);
pi.draw(pi.rightx - dimnl.wid, yy, nl);
}
}
}
// Then the equations
ColorCode color = pi.selected && lyxrc.use_system_colors
? Color_selectiontext : standardColor();
bool const really_change_color = pi.base.font.color() == Color_none;
Changer dummy0 = really_change_color ? pi.base.font.changeColor(color)
: noChange();
Changer dummy1 = pi.base.changeFontSet(standardFont());
Changer dummy2 = pi.base.font.changeStyle(display() ? DISPLAY_STYLE
: TEXT_STYLE);