Commit Graph

396 Commits

Author SHA1 Message Date
Jean-Marc Lasgouttes
2886843560 Make sure paragraph positions are updated when scrolling
Sometimes quick selection-scrolling could cause a crash because the
position of some paragraphs is not computed. To fix that, in
BufferView::showCursor, make sure that the metrics are always kept
clean using updateMetrics(false), which is lighweight.

As a consequence, the 'update' parameter of showCursor and
scrollDocView is not needed anymore. Its removal is mechanical and
accounts for most of this commit.

The only other significant change is that, when creating synthetic
mouse events and relying on scroll() for small moves, the full metrics
recomputation is replaced by the lighter version.

More work is still to come on this code, but this should be going in
the right direction.

(cherry picked from commit 6e0ea4269a)
2024-07-10 17:18:47 +02:00
Jean-Marc Lasgouttes
2434a3a288 Implement quick scroll
Replace flag parameter for updateMetrics() by a `force' boolean. When
it is false, the method keeps the metrics of paragraphs that are still
visible in WorkArea instead of computing everything afresh. All it has
to do is update their positions.

Add code to updateMetrics() to update the value of the anchor pit/ypos
(similar to the one in draw()).

Update processUpdateFlags() to use this when update flag is ForceDraw.

Modify scrollDocView() to just change the anchor paragraph position
when the scrolling operation would re-use some of the existing
paragraphs.

The time needed to update the metrics when scrolling with mouse in the
branch-test.lyx document is now divided by 20!

Part of bug #12297.

(cherry picked from commit 08010c6a5e)
2024-04-18 16:45:58 +02:00
Pavel Sanda
7e2c1dca36 Improve stats update times for buffer switches and toolbar toggles. 2024-04-05 23:14:25 +02:00
Pavel Sanda
ae07763abf Allow relative statistics values in statusbar.
https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg221311.html
2024-04-05 19:44:25 +02:00
Juergen Spitzmueller
812e306dad Factor out shared method
Amends babb5b007b
2024-03-31 12:40:27 +02:00
Jean-Marc Lasgouttes
100e759f17 When splitting a bufferview, keep the scrollbar position
This is actually better thean making sure that the cursor is visible.

Fixes bug #12689.
2023-09-05 14:33:18 +02:00
Jean-Marc Lasgouttes
7eecab5902 Check whether MathRow exists when computing caret metrics
Fixes bug #12888.
2023-09-02 17:21:03 +02:00
Jean-Marc Lasgouttes
89db357cd6 Code factoring: introduce BufferView::busy()
The WorkArea should not have to look at details of the undo stack.
No change intended.
2023-05-03 11:57:31 +02:00
Jean-Marc Lasgouttes
22c6fe8e0c Remove boolean arguments of scrollToCursor wih an enum
This makes the function inent more obvious. No change intended.

Related to bug #12491.
2022-12-21 18:47:33 +01:00
Jean-Marc Lasgouttes
2203078111 Fix flicker due to changing metrics while selecting with the mouse
This patch has been backported from the lyx-unstable branch
https://gitlab.com/gadmm/lyx-unstable/-/commit/9d7ed42389ba

Actual author is Guillaume Munch.

Fixes bug #8951.
2022-07-25 23:04:08 +02:00
Jean-Marc Lasgouttes
110445e3e2 Rename BufferView::updateScrollbar to show what does
Only parameters are updated, not the scrollbar itself.
2021-10-29 17:45:51 +02:00
Jean-Marc Lasgouttes
42abb26054 Make paragraph-goto and friends set paragraph to the top
Add parameter 'force' to scrollToCursor(...) to avoid the case where the
cursor is not set to top because it is already visible on screen.
Change screen offset in this method so that the paragraph is really at
the top of the screen. This part may cause unforeseen issues and needs care.

gotoInset: use the new force flag and do not trigger a redraw.
Instead, return a boolean telling whether redraw is needed.
In the code that use it, set an update flag instead of the extra redraw.

In the handling of paragraph-goto, also set the update flag instead of
triggering a repaint.

Remove Bufferview::scrollToCursor(), which was equivalent to showCursor().

Fixes bug #10425.
2021-09-29 12:16:39 +02:00
Jean-Marc Lasgouttes
0f0ad1f715 Make bookmarks display configurable
Introduce a GUI-less LyXRC member bookmarks_visibility. This is
experimental and will not be documented for 2.4.0. Having the code
present will allow to (1) improve it gradually and (2) fix the many
bookmarks bugs that it exposes.

The corresponding tag is \experimental:bookmarks_visibility, which is
intentionally weird.

Three possible values:

* none: no bookmark display
* margin: display the bookmark in margin
* inline: display the bookmark at cursor position.

The default margin has been made wider so that there is room for the
bookmark. This was necessary anyway. The margin bookmark is now
displayed correctly in full screen with limited text width.

Margin display still needs some improvements when several bookmarks
are on the same row.

Mostly fixes bug #2496.
2021-04-07 16:19:20 +02:00
Enrico Forestieri
eeb36e808c Change cursor shape for clickable math insets
Currently, only InsetMathRef and InsetMathSpace are clickable.
2021-04-01 16:59:55 +02:00
Enrico Forestieri
5a43b86141 Allow context menus in mathed
It is now possible to get a context menu for math insets.
InsetMathSpace was already providing a specific context menu,
but it was never triggered because the math hull inset is not
descendable. It is still so, but now when a context menu is
requested all the insets inside the math hull are examined.
If the inset under the cursor provides a context menu, it
is shown instead of the general math one.

Fixes #12100.
2021-03-05 21:21:41 +01:00
Jean-Marc Lasgouttes
090e9a6c36 Keep the useful parts of reverted commits
Keep from 907f0207 the introduction of BufferView::top/bottomMargin()
and the setting of the top/bottom margin of the document. The
difference is that the extra height is still added to the relevant
rows, and not only to the paragraph metrics.

Keep from f41ca959 the reduction of top/bottom margin for Adv F&R
workareas.
2021-02-16 12:29:40 +01:00
Jean-Marc Lasgouttes
a40ca1430e Revert "Improve handling of top and bottom margin"
This reverts commit 907f020724.
2021-02-16 12:29:40 +01:00
Stephan Witt
a476cc4839 #8055 add support for system-wide find buffer on Mac
Command-E is standard for paste to find buffer on Mac. That's why the key binding is changed appropriately.
2021-02-14 18:56:25 +01:00
Scott Kostyshak
9649e80c44 Fix Clang warning about struct/class mismatch
CaretGeometry is defined as a struct, but was forward-declared as a
class. Now we forward-declare as a struct. This addresses the
following Clang warning (that does not appear with GCC):

src/frontends/CaretGeometry.h:27:1: warning: 'CaretGeometry' defined
as a struct here but previously declared as a class; this is valid,
but may result in linker errors under the Microsoft C++ ABI
[-Wmismatched-tags]
2020-11-26 13:51:12 -05:00
Jean-Marc Lasgouttes
1b3ffa6627 Rewrite (again!) the code for caret drawing
The caret geometry is now computed in BufferView as a list of shapes
(caret, horizontal l-shape if needed, completion triangle if needed)
kept in a variable of type CaretGeometry.

The code in WorkArea.cpp only has to draw these shapes. The
CaretWidget (which never was a widget) in GuiWorkArea.cpp is gone
now.

As a consequence, the bounding box for the cursor is known precisely
and therefore rows should be repainted correctly now. This avoids
caret droppings.

Fixes bug #12024.
2020-11-24 20:12:42 +01:00
Yuriy Skalko
fa6ac23e1c Reduce includes in header files 2020-10-19 17:33:51 +03:00
Yuriy Skalko
65c88f0a0a Remove redundant const & for primitive types 2020-10-19 12:50:07 +03:00
Yuriy Skalko
2a594d3e90 Remove unused forward declarations 2020-10-13 09:57:36 +03:00
Jean-Marc Lasgouttes
7f1b1729b4 Cleanup the caret geometry code
Intended changes:

* code is shorter and cleaner

* caret scales better with zoom when cursor_width=0: completion
  indicator, l-shaped cursor...

Details:

* Rename BufferView::getPosAndHeight to getPosAndDim because ascent is
  needed too and width could in the future be set depending on font.

* Get rid of rect_ in CaretWidget and record a Dimension (and y value) instead.
  Remove also caret_width_ and slant_, replace rtl_ with dir.

* Make CaretWidget members public and lose the trailing _.

* change CaretWidget::update to read its parameters from current bufferview.
2020-10-01 13:17:01 +02:00
Jean-Marc Lasgouttes
907f020724 Improve handling of top and bottom margin
The 20px space on top and bottom of document have traditionally been
obtained by adding them to the ascent/descent of the first/last row.
This leads to annoyances like selections that are drawn in these
margins and issues with the nesting marker.

The change is to add the value to the ParagraphMetrics ascent/descent
only and to correct one place where the ascent of the first row may be
different from the ascent of the ParagraphMetrcs object. There may be
other places where this should be done.

Fixes bug #9545.
2020-07-13 02:42:39 +02:00
Jean-Marc Lasgouttes
32f06d01ec Revert "Improve handling of top and bottom margin"
It turns out this is not ready at all.

This reverts commit ff7cdf1b74.
2020-07-13 00:00:36 +02:00
Jean-Marc Lasgouttes
ff7cdf1b74 Improve handling of top and bottom margin
The 20px space on top and bottom of document have traditionally been
obtained by adding the to the ascent/descent of the first/last row.
This reads to annoyances like selections that are drawn in these
margins and issues with the nesting marker.

The change is to add the values to a separate member of the Row
object, and to add new Row::total(Ascent|Descent) methods that add the
effect of this padding.

Moreover, some methods are added to TextMetrics to simplify the
BufferView code.

Fixes bug #9545.
2020-07-12 20:32:04 +02:00
Richard Kimberly Heck
cf37ad8c80 Use ranges, fix warnings 2020-02-28 01:40:30 -05:00
Jean-Marc Lasgouttes
6f8298b165 Set language to OS input language when moving cursor
Instead of setting language from context when moving the cursor, set
it to the OS input language. This behavior will probably need to be
controlled by a preference, since not everybody changes keyboard
mapping when changing language.

This required to move BufferView::setCursorLanguage to
Cursor::setLanguageFromInput().
2019-07-19 11:52:03 +02:00
Jean-Marc Lasgouttes
049aed8e08 Respect OS-level keyboard language
This bug provides two features:

1/ when a new document is created the language is set to the current
  keyboard language.

2/ when keyboard is switched at OS level, the input language of
   current window is changed. The language is set preferably to one of
   those of the document. Ex. if the keyboard changes to en_GB but one
   is typing a document in US English and Hebrew, then US English will
   be selected rather that adding UK English to the list.

The implementation depends a lot on Qt. The platform status is :

* working on Windows 10

* not working with Linux (although 1/ works with Qt4); it seems that
  Qt5 supports switching through ibus, but I do not know what this
  means.

* not yet tested on macOS.

This addresses bugs #6450, #6247 and somehow #10514.
2019-07-17 23:23:13 +02:00
Jean-Marc Lasgouttes
e6b54ea4d2 Fix assertion in caret display code
It is not a good idea to call caretPosAndHeight when the caret is in a
paragraph that is not in cached metrics. This can happen when not
using "cursor follows scrollbar".

This commit refactor things a bit so that testing is done in
BufferView.

This bug is not in 2.3.x.
2019-07-14 23:27:44 +02:00
Jean-Marc Lasgouttes
d02244c8fb Make caret visible inside math macros arguments
The first step is to move the MathRow cache to BufferView, alongside
coordCache. This was on the todo list anyway, since it allows to let
go the math row information when the math equation is not on the
screen anymore. With the old scheme, it would always remain in memory.

Then, when computing caret size in MathData::metrics, make sure that
the mathrow of the elements that are linearized in the MathRow object
get their caret size information initialized too.

Fixes bug #11587.
2019-06-03 16:28:16 +02:00
Jean-Marc Lasgouttes
048f9ee08e Rewrite the code that sets caret height in mathed
Instead of remembering the caret ascent and descent for the cell that contains the cursor, the new code remembers caret dimension for each MathRow object. This makes the code much less fragile (ans slightly smaller).

This fixes caret size issues when the Update::SinglePar flag is active.

Fixes bug #11541.
2019-04-16 15:58:51 +02:00
Juergen Spitzmueller
2ed3b22a06 Add ignorelang option to file-insert
This is useful for inserted files with no real text content
2019-03-26 10:13:33 +01:00
Jean-Marc Lasgouttes
7f0525e9e0 Change the way scrolled rows are tracked
The goal of this commit is to simplify the logic in TextMetrics::draw.
Now, rows are repainted depending on their changed() status.

Instead of checking whether rows have been scrolled horizontally at
draw time, the code marks the row as changed when testing for
horizontal scrolling.

To this end a new method TestMetrics::setRowChanged is added, that
searches a row in the text metrics cache and marks it changed if
found.

The old code that remembered the previously scrolled row can now be
removed.
2019-02-25 15:19:58 +01:00
Jean-Marc Lasgouttes
90cfe4ec3b Adapt caret height to context in mathed.
Compute a height from current font and current cell vertical
dimensions in MathData::metrics(), because this is where current font
is known.

Introduce BufferView::setCaretAscentDescent to remember this value.

This mechanism is not used for text because Cursor::current_font is
restored by undo, and the caret height would not be changed then. But
in principle it is doable.
2018-04-27 00:03:48 +02:00
Jean-Marc Lasgouttes
2f1eb35b86 Rework caret display code
The new code is much simpler: what it does is, after redrawing has
been done, to mark the cursor row as changed, so that it will be
repainted on next paint event.

This avoids some crashes at the price of possibly repainting the row
when it was not necessary.
2018-04-26 23:25:31 +02:00
Jean-Marc Lasgouttes
1a969fa4a6 New method zoomedPixel to compute pixel amount also in HiDpi
The function does not use for now any information from the BufferView
(only lyxrc), but this should eventually change if we want to honor
multi monitor setups properly.
2018-01-25 22:08:35 +01:00
Jean-Marc Lasgouttes
6df9cbef95 Remove unused BufferView member 2017-11-29 12:27:57 +01:00
Jean-Marc Lasgouttes
8d8988de47 Allow multiple calls to processUpdateFlags before redraw
The goal of this commit is to ensure that a processUpdateFlags call
that requires no redraw will not override a previous one that did
require a redraw.

To this end, the semantics of the flag argument is now different: its
value is now OR'ed with a private update_flags_ variable. This
variable is only reset after the buffer view has actually been
redrawn.

A new Update::ForceRedraw flag has been added. It requires a full
redraw but no metrics computation. It is not used in the main code
(yet), but avoids to compute metrics repeatedly in consecutive
processUpdateFlags calls.

The process is now as follows:
- if flags is just None, return immediately, there is nothing to do.
- the Force flag is honored (full metrics computation) and replaced
  with ForceDraw.
- the FitCursor flag is honored and removed from the flags.
- the SinglePar update is added if ForceDraw is not in flags and only
  the current par has been modified.

The remaining flags are only then added to the BufferView update
flags, and the update strategy is computed for the next paint event.

Finally the dubious call to updateMacros in updateMetrics has been
removed for performance reasons.
2017-10-24 22:25:29 +02:00
Jean-Marc Lasgouttes
b4294a7b06 Revert "Allow multiple calls to processUpdateFlags before redraw"
The concept is correct, but it seems a bit too disruptive.

This reverts commit c19c54dd5b.
2017-10-17 20:10:11 +02:00
Jean-Marc Lasgouttes
c19c54dd5b Allow multiple calls to processUpdateFlags before redraw
The goal of this commit is to ensure that a processUpdateFlags call
that requires no redraw will not override a previous one that did
require a redraw.

To this end, the semantics of the flag argument is now different: its
value is now OR'ed with a private update_flags_ variable. This
variable is only reset after the buffer view has actually been
redrawn.

A new Update::ForceRedraw flag has been added. It requires a full
redraw but no metrics computation. It is not used in the main code
(yet), but avoids to compute metrics repeatedly in consecutive
processUpdateFlags calls.

Finally the dubious call to updateMacros in updateMetrics has been
removed for performance reasons.
2017-10-16 11:05:52 +02:00
Juergen Spitzmueller
648ddd25ec Collapsable -> Collapsible (part 1)
The current spelling is not strictly wrong, but flagged as unusual or
historical by some authorities. It is also found fault with many
spell checkers. Thus we decided to move to the more standard "-ible"
form once and for all.

See #10678 for discussion

This part only covers the usage in comments and the like. More to follow.

This will all also all be backported to 2.3.x, for the sake of backwards
compatibility (cherry-picking).
2017-10-16 10:03:05 +02:00
Jean-Marc Lasgouttes
b0737d2589 Rename more instances of "cursor" to "caret"
Thanks to Pavel for the hint.
2017-09-08 16:57:22 +02:00
Jean-Marc Lasgouttes
fb655725b7 Remove workaround that is not necessary anymore.
This code was necessary to handle cases where the insets positions
were not yet in cache. This cannot happen anymore thanks to the
nodraw stage.
2017-09-08 16:57:21 +02:00
Jean-Marc Lasgouttes
e7fdce0b5a Fix caret painting
The trick is to remember in BufferView what has been done at the
previous draw, so that the row that contained the caret can be
repainted if needed.

To this end, add an argument paint_caret to BufferView, although
painting the caret is not the job of the BufferView (at this point).

BufferView::needRepaint will act as an interface with
TextMetrics::drawParagraph to know whether the painting of a given
row should be forced.

Currently everything is done at the top row level, so that, if the
caret is in a large table, the whole table will have to be repainted.
It is not clear yet that this is necessary.
2017-09-08 16:57:21 +02:00
Jean-Marc Lasgouttes
efc7359015 three-stage drawing: add a nodraw stage
Normally the two stages of drawing are
1/ compute metrics of insets/rows/paragraphs/mathrow...
2/ draw the elements and cache their positions

Now the three stages are
1/ metrics
2/ nodraw: do not draw the elements, but cache their position
3/ draw the elements (and store again their position; it does not
   seems to hurt performance).

Revive the NullPainter: this replaces the setDrawingEnabled mechanism
with a painter that does nothing. The advantage is that updatePosCache
(renamed from setPosCache) does not need anymore to be invoked from
the frontend.

updatePosCache (the nodraw stage) is called at the end of
BufferView::updateMetrics.
2017-08-29 16:37:07 +02:00
Jean-Marc Lasgouttes
de990f72e1 Define new inPixels helper in BufferView
Length::inPixels(MetricsBase const &) and VSpace::inPixels(BufferView
const &) should be moved respectuvely to MetricsBase and BufferView:
core file are not supposed to use GUI files.
2017-04-28 15:06:30 +02:00
Guillaume Munch
148b3ae773 Move class definitions inside main class
Prepare for following commits.

This prevent's forward-declaration, but including the TexRow header should be
inexpensive.
2016-10-22 23:24:01 +02:00
Guillaume Munch
2e45bade7a Simplify and add debug message 2016-10-22 23:24:00 +02:00