Hello Jean-Marc,

> Fine. Do you know how to use "git commit --amend" (for updating commit) 
> and "git format-patch" (to send commit via e-mail)? Send it tomorrow if 
> you can, I cannot be sure I will have time this week end (family 
> pressure...).

I have used git commit --amend but not git format-patch. I will try to learn
these things quickly.
Sorry for the delay. It took much time than I thought. I will test the code
with you patch in the other message and update the log accordingly.
Following is my suggested log, when committing to the master, after deleting
merges that I have done so far. It would be very helpful, even if you can
quickly go through it. (also can find at:
https://dl.dropboxusercontent.com/u/105510128/Log-master)


[Feature] Key board based horizontal scrolling for math insets


This feature also applicable for other insets; graphics and labels.

Although the initial implementation was started with scrolling the whole
content of the document at once when traverse through a too wide row, the
current implementation is capable of scrolling a single row when reaching
its content which is beyond the screen limits, using left and right arrow
keys.

The attribute 'left_edge_' introduced in the Cursor plays a main role in
horizontal scrolling of the wide rows that grow beyond the screen limits.
This attribute represents by how much pixels the current row that the text
cursor lies in should be get scrolled.

The main logic that is responsible for drawing the scrolled rows was 
started within TextMetrics::drawParagraph and later moved to BufferView.

 * The main logic is called via BufferView::draw.

 * What this does is set the left_edge_ attribute in Cursor in order to
 show the position that the text cursor lies in.

 * To make sure that BufferView::draw gets involved when Update flag is 
 FitCursor necessary changes are made in BufferView::processUpdateFlags.

Basically what the logic that used to set the left_edge_ does is,

 * The row which the text cursor lies in is identified by a CursorSlice
 that points to the beginning of the row. This is the 'rowSlice' variable
 used in checkCursorLeftEdge in BufferView. The Cursor members are 
 modified correspondingly to obtain this variable. Here row objects were
 not used to identify the current row, because it appears that row objects
 can disappear when doing a decoration update for example. This means that
 comparing row pointers is not a good idea, be cause they can change
 without notice.

 * Using Cursor::setCurrentRowSlice reset left_edge_ when changing cursor
 row. This is done in order to prevent unwanted scrolling that happens
 when changing the selected row using up and down arrow keys.

 * Recompute inset positions before checking left edge of the row, by
 painting the row insets with drawing disabled. This is done because, some
 of the position calculations of math insets are taken place within the
 drawing procedure.

 * Current x position of the text cursor is compared with the left_edge_
 value and the other variables like row.width(), bv.workWidth(). Compute
 the needed left_edge_ value in order to show where the text cursor lies
 in. The basics conditions that we check before recomputing left_edge_
 are,
 if the text cursor lies rightward to the current right screen boundary,
 if the text cursor lies leftward to the current left screen boundary,
 if the text cursor lies within screen boundaries but the length of the
 row is lesser than the left boundary of the screen (this happens when we
 delete some content of the row using delete key or backspace key).

 * Change update strategy when left edge has changed. This allows to
 redraw the row when no drawing was scheduled. By doing so, it was
 possible to redraw a wide row when moving to the leftmost position of the
 wide row, from the leftmost position of the row below, using the left
 arrow key.

In TextMetrics::drawParagraph it is checked whether the current row is
what is drawing now. If it is so, the value used to the x value of the row
for drawing is adapted according to the computed value of left_edge_ of
Cursor.

The method used to pass boundary() was fixed to get row when cursor was in
a nested inset. This matter is considered Cursor::textRow is modified and 
Cursor::bottomRow is created which returns the the top-level row that 
holds the cursor.

GuiWorkArea::Private::showCursor() is modified to show the cursor position
in a scrolled row.


Reply via email to