# TODOs, semi-random sorting

[x] Implement glyph draw command
[x] Implement div.view and scrollbars
[x] Port font system from C to C3 (rewrite1)
[ ] Update ARCHITECTURE.md
[ ] Write a README.md
[x] Use an arena allocator for cache
[ ] Do not redraw if there was no update (no layout and no draw)
[ ] Do command buffer damage tracking based on a context grid (see rxi writeup)
[x] Better handling of the active and focused widgets, try
to maintain focus until mouse release (fix scroll bars)
[x] Clip element bounds to parent div, specifically text
[ ] Resizeable divs
[x] Implement a z index and sort command buffer based on that
    [ ] Ctx.set_z_index()
    [x] Sort command buffer on insertion
[x] Standardize element handling, for example all buttons do almost the same thing, so write a lot 
    of boiler plate and reuse it
[x] The id combination in gen_id() uses an intger division, which is costly, use another combination 
    function that is non-linear and doesn't use division
[ ] Animations, somehow
[x] Maybe cache codepoint converted strings
[x] Fix scroll wheel when div is scrolled
[ ] Be consistent with the initialization methods some are foo.new() and some are foo.init()
[ ] Implement image loading (.bmp, .ff, .qoi and .png), in the future even lossy images like .jpg
    [x] .qoi
    [ ] .ff
    [ ] .bmp
    [ ] .png
    [ ] .jpg
[ ] gif support?
[ ] layout_set_max_rows() and layout_set_max_columns()
[x] Maybe SDF sprites??
[x] Stylesheets and stylesheet import
[x] use SDF to draw anti-aliased rounded rectangles https://zed.dev/blog/videogame
[ ] Subdivide modules into ugui::ug for exported functions and ugui::core for
    internal use functions (used to create widgets)
[x] The render loop RAPES the gpu, valve pls fix
[ ] The way the element structures are implemented wastes a lot of memory since
    each struct Elem, struct Cmd, etc. is as big as the largest element. It would
    be better to use a different allcation strategy.
[ ] Add a way to handle time events like double clicks
[x] Fix how padding is applied in push_rect. In CSS padding is applied between the border and the
    content, the background color is applied starting from the border. Right now push_rect() offsets
    the background rect by both border and padding
[x] Investigate why the debug pointer (cyan rectangle) disappears... 

## Layout

[x] Flexbox
[x] Center elements to the row/column
[x] Text wrapping / reflow
[x] Implement a better and unified way to place a glyph and get the cursor position, maybe with a struct
[ ] Correct whitespace handling in text (\t \r etc)
[x] Consider a multi-pass recursive approach to layout (like https://github.com/nicbarker/clay)
    instead of the curren multi-frame approach.
[x] Implement column/row sizing (min, max)
[x] Implement a way to size the element as the current row/column size
    *   +-------------+
    *   |             |
    *   +-------------+
    *   +--+
    *   |  |
    *   +--+
    *   <------------->
    *     column size
    See the calculator example for why it is useful
[ ] Find a way to concile pixel measurements to the mm ones used in css, for example in min/max sizing
    of elements
[x] Center elements to div (center children_bounds to the center of the div bounds and shift the origin accordingly)
[x] Use containing_rect() in position_element() to skip some computing and semplify the function
[x] Rename position_element() to layout_element()
[x] Make functions to mark rows/columns as full, to fix the calculator demo

## Input

[x] Keyboard input
[x] Mouse scroll wheel
[ ] Touch input
[x] Do not set input event to true if the movement was zero (like no mouse movement)
[ ] Use input event flags, for example to consume the input event
[ ] Fix bug in text box: when spamming keys you can get multiple characters in the text input field
    of the context, this causes a bug where only the first char is actually used

## Commands

[x] rect commads should have:
    - border width
    - border radius
[x] add a command to update an atlas
[ ] New window command, useful for popups
[x] Text command returns the text bounds, this way we can avoid the pattern 
    draw_text(a, pos) -> off = compute_bounds(a) -> draw_text(b, pos+off) -> ...
[ ] Rounded rectangle with different radius for each corner

## Atlas

[ ] Add an interface to create, destroy, update and get atlases based on their ids
[ ] Implement multiple font atlases
[ ] Pixel format conversion

## Fonts

[x] Fix the missing alpha channel
[x] Fix the alignment

## Widgets

[x] Dynamic text box to implement an fps counter
[x] Button with label
[x] Text Input box
[ ] Icon Buttons
[x] Switch
[x] Checkbox
[ ] Selectable text box

## API

[ ] Introduce a Layout structure that specifies the positioning of elements inside
    a Div element. This would allow specifying alignment, maximum and minimum sizing
    margins between children, etc.
    This is different from style which is applied per-element.
[ ] Remove Ids for element that don't need them. Such elements are button, toggles,
    and all elements which do not have internal data that has to be cached and/or
    queried by the user for later use. This allows for smaller caches and in general
    reduces some load, since most of the stuff is recomputed for every frame.

## SDL3 Renderer

[x] smart batching
[x] maybe use instancing since we are always drawing the same geometry. With instancing every
    different quad could have its coulour, border and radius with much better performance than
    issuing a draw call for every quad (and uploading it)
    https://rastertek.com/dx11win10tut48.html
    https://www.braynzarsoft.net/viewtutorial/q16390-33-instancing-with-indexed-primitives
[ ] implement min and max fps