Fluid 0.7.0 has been released!

cookiewitch artha at samerion.com
Mon Nov 18 14:27:41 UTC 2024


On Friday, 8 November 2024 at 21:13:19 UTC, IchorDev wrote:
> That’s a tricky one!
> I was thinking that an API to add shapes that the text ‘goes 
> around’. The shape type would be a sumtype of different shapes, 
> probably stored in an optimisation structure like a tree.
> But what if you want an *inline* rectangle that will move 
> depending on the text layout? For that case we *could* ask that 
> the user just get the position that the text ends, place their 
> element manually, and then use a second layout object, with the 
> first line set to start after the end of the element. I 
> acknowledge that’s a lot of work on the user end, but I’d argue 
> that it’s an obscure (and frankly absurd) use-case, and 
> requires a lot of implementation-specific decisions that make 
> it impossible to account for everyone’s needs with our own 
> implementation. Can the rectangle overflow the margins at the 
> end of a line, or does it wrap? How is the line with the inline 
> rectangle on it vertically aligned? How and when can shapes 
> intersect with text if at all?

Measurement and rendering uses the `TextRuler` struct (frankly 
more important than the Fluid-centric `StyledText` one we keep 
discussing), which I hope to keep super simple so it can be 
easily manipulated by the user. It keeps track of the pen 
position and text size.

The idea is `TextRuler` is fed pieces of unbreakable content 
("words") which may be text, but it can be anything of known 
width. A textual word would be first measured and then placed in 
the ruler to place it in the correct spot in the text.

Whatever manipulates the ruler, like the `Text` struct, could 
handle other pieces through a hook that would run between words. 
I imagine it would have a signature like `void delegate(ref 
TextRuler, WordSize)`. `inline-block`-like content (images, 
buttons, etc.) would increase line height and add a single "word" 
both matching the image's size. `inline` elements could add 
multiple words. `float` content could be simulated by inserting a 
word on every line at its supposed location, and thus would even 
support non-rectangular elements anywhere within the line.

I'm not sure yet when to move the engine into its own project, 
but I would like to have this ability in Fluid soon; I thought I 
would let you know about this idea.

As for `TextRulerCache` I mentioned earlier, I'm almost sure I've 
ironed out all the quirks and bugs. I think it's OK now, but 
certainly coding a pretty weird and complex data structure while 
having a fever wasn't my brightest idea.


More information about the Digitalmars-d-announce mailing list