cursor_position returns (x,y) of the cursor. This is needed for clients
that do not want to use a fully fledged editor (for example TextInput in
Iced).
is_rtl is necessary to know the base direction of a paragraph.
Fixes two issues:
- When writing RTL text in an LTR line the carret disappears since the
last glyph is not necessarily at the end of the line
- `highlight()` used to return just one (x_left, x_width) but in Bidi
text you can't draw the selection rectangle with only one rectangle.
This issue wasn't visible before because Editor was drawing the
selection rectangle per glyph and not using `highlight()` method
Uses missing_warn! (debug or warn depending on warn_on_missing_glyphs
feature) to surface when a requested family cannot be matched at the
desired weight, which is the root cause of variable font fallback
issues.
Add variable_weight_match flag to FontMatchKey: when a face has a
wght axis covering the requested weight, let it pass the
font_weight_diff == 0 filter without altering sort priority.
The check is done inline via db.with_face_data() in FontMatchKey::new()
so it participates in the existing font_matches_cache invalidation —
no separate caching needed.
* feat: add Ellipsize enum
* chore: API changes needed for ellipsize
Decided not to change "layout()" function for now to avoid breaking the
interface. For now.
* chore: shape ellipsis
* feat: Ellipsize::Start
Since it can only have 1 line, it's easier to implement.
* DROPME: temporarily change rich-text for testing
* test(ellipsize): Testing Ellipsize::Start
Long text in small buffer should produce ellipsis glyphs
* fix: do not need font_system anymore
We moved ellipsis shaping elsewhere so no need to pass font_system to
layout function (which also was recreating a new one in the tests every
time making them take forever).
* feat: Ellipsize::End
* improv(ellipsize): use a single ellipsis shape
* improv: Ellipsie::End && Wrap::None
There is no need to layout the whole line if it's not going to fit.
* fix: mixed bidi text when Ellipsize::End && Wrap::None
* chore: clean up and simplify when line.RTL==span.RTL
* fix(ellipsize): last word is not (word_count -1) if iter().rev()
* refactor(layout): extract the layout algorithm to make it more readable
* improv(ellipsize): Ellipsize::Start && Wrap::None
we iterate in reverse and only layout what's going to be visible
* Revert: delete the previous approach of post processing ellipsis
* doc: explain the interaction between Ellipsize and Wrap
* chore: lower the scope
* feat: Ellipsize the last line of a paragraph
For now only the number of lines is supported
* fix: clear ellipsized field on visual lines
This was causing ellipsis to show on random lines
* chore: remove old tests
will add better tests soon
* chore: clean up changes from previous attempt
* fix: consider the ellipsis width when doing alignment
* feat(ellipsize): add `Height` limit to `Ellipsize`
* fix: ellipsize the start of the last line correctly
* fix: ellipsize at the start of mixed bidi lines
* feat: Ellipsize::Middle
* fix: consider ellipsize::middle when calculating alignment correction
* refactor: improve readability
* refactor: deduplicate "fit_glyphs"
* refactor: combine backward and forward layout into one (wip)
* fix: Backward works in the unified layout_spans
* chore: clean up
* fix: Ellipsize::Middle
* fix: handle large words in bidi boundaries
* chore: clean up and some refactoring
* fix: ellipsis is now the same level as the surrounding text
* fix: try to fit more when ellipsizing::middle
* improv: ellipsis now have the same level as the neighbors
This makes ellipsized RTL text inside a LTR line more readable.
before:
Hello سلام...خوبی؟
Hello خولی؟...سلام
* fix: some extra words were being rendered in Ellipsize::Middle
This was causing the last word (if it's not the same level as the rest)
to be rendered outside the buffer.
* test: a few test cases for ellipsize
* fix: assign the correct byte range to ellipsis
this should fix the panic when selecting or clicking on or near the
ellipsis in the editor.