switch to element defined span lens + better size fn

This commit is contained in:
2025-11-13 14:27:31 -05:00
parent 8755c04feb
commit 73afea8c35
17 changed files with 767 additions and 646 deletions

View File

@@ -1,7 +1,7 @@
use crate::{
layout::{
Layers, Modules, TextAttrs, TextBuffer, TextData, TextTexture, TextureHandle, Textures,
UiRegion, UiVec2, Vec2, WidgetId, Widgets,
Layers, Modules, Size, TextAttrs, TextBuffer, TextData, TextTexture, TextureHandle,
Textures, UiRegion, Vec2, WidgetId, Widgets,
},
render::{Mask, MaskIdx, Primitive, PrimitiveHandle, PrimitiveInst},
util::{HashMap, HashSet, Id, TrackedArena},
@@ -14,7 +14,7 @@ pub struct Painter<'a, 'c> {
textures: Vec<TextureHandle>,
primitives: Vec<PrimitiveHandle>,
children: Vec<Id>,
sized_children: HashMap<Id, UiVec2>,
sized_children: HashMap<Id, Size>,
/// whether this widget depends on region's final pixel size or not
/// TODO: decide if point (pt) should be used here instead of px
pub layer: usize,
@@ -41,10 +41,10 @@ pub struct WidgetInstance {
pub textures: Vec<TextureHandle>,
pub primitives: Vec<PrimitiveHandle>,
pub children: Vec<Id>,
pub resize: Option<(Id, UiVec2)>,
pub resize: Option<(Id, Size)>,
pub mask: MaskIdx,
pub layer: usize,
pub desired_size: UiVec2,
pub desired_size: Size,
}
#[derive(Default)]
@@ -348,7 +348,7 @@ impl<'a, 'c> Painter<'a, 'c> {
self.region
}
pub fn size<W>(&mut self, id: &WidgetId<W>) -> UiVec2 {
pub fn size<W>(&mut self, id: &WidgetId<W>) -> Size {
self.size_ctx().size(id)
}
@@ -388,14 +388,14 @@ pub struct SizeCtx<'a> {
pub textures: &'a mut Textures,
widgets: &'a Widgets,
px_dependent: &'a mut HashSet<Id>,
checked: &'a mut HashMap<Id, UiVec2>,
checked: &'a mut HashMap<Id, Size>,
region: UiRegion,
screen_size: Vec2,
id: Id,
}
impl SizeCtx<'_> {
fn size_inner(&mut self, id: Id, region: UiRegion) -> UiVec2 {
fn size_inner(&mut self, id: Id, region: UiRegion) -> Size {
let self_region = self.region;
self.region = region;
let size = self.widgets.get_dyn_dynamic(id).desired_size(self);
@@ -403,17 +403,17 @@ impl SizeCtx<'_> {
self.checked.insert(id, size);
size
}
pub fn size<W>(&mut self, id: &WidgetId<W>) -> UiVec2 {
pub fn size<W>(&mut self, id: &WidgetId<W>) -> Size {
// TODO: determine if this is useful
// if let Some(size) = self.checked.get(&id.id) {
// return Some(*size);
// }
if let Some(&size) = self.checked.get(&id.id) {
return size;
}
self.size_inner(id.id, self.region)
}
fn size_raw(&mut self, id: Id) -> UiVec2 {
fn size_raw(&mut self, id: Id) -> Size {
self.size_inner(id, self.region)
}
pub fn size_within<W>(&mut self, id: &WidgetId<W>, region: UiRegion) -> UiVec2 {
pub fn size_within<W>(&mut self, id: &WidgetId<W>, region: UiRegion) -> Size {
self.size_inner(id.id, region.within(&self.region))
}
pub fn px_size(&mut self) -> Vec2 {