app work?

This commit is contained in:
2025-11-14 13:49:01 -05:00
parent e2690fa611
commit 218b3f14ed
6 changed files with 56 additions and 47 deletions

View File

@@ -1,7 +1,7 @@
use crate::{
layout::{
Layers, Modules, Size, TextAttrs, TextBuffer, TextData, TextTexture, TextureHandle,
Textures, UiRegion, Vec2, WidgetId, Widgets,
Textures, UiRegion, UiVec2, Vec2, WidgetId, Widgets,
},
render::{Mask, MaskIdx, Primitive, PrimitiveHandle, PrimitiveInst},
util::{HashMap, HashSet, Id, TrackedArena},
@@ -91,12 +91,12 @@ impl<'a> PainterCtx<'a> {
text: self.text,
textures: self.textures,
widgets: self.widgets,
region: UiRegion::full(),
size: UiVec2::FULL_SIZE,
screen_size: self.screen_size,
px_dependent: self.px_dependent,
id,
};
let desired = ctx.size_inner(id, active.region);
let desired = ctx.size_inner(id, active.region.size());
if size != desired {
self.redraw(rid);
if self.draw_started.contains(&id) {
@@ -190,7 +190,7 @@ impl<'a> PainterCtx<'a> {
screen_size: painter.ctx.screen_size,
px_dependent: painter.ctx.px_dependent,
id: painter.id,
region: UiRegion::full(),
size: UiVec2::FULL_SIZE,
}
.size_raw(id);
@@ -352,6 +352,10 @@ impl<'a, 'c> Painter<'a, 'c> {
self.size_ctx().size(id)
}
pub fn region_size<W>(&mut self, id: &WidgetId<W>) -> UiVec2 {
self.size_ctx().size(id).to_uivec2(self.region.size().rel)
}
pub fn size_ctx(&mut self) -> SizeCtx<'_> {
SizeCtx {
text: self.ctx.text,
@@ -361,13 +365,13 @@ impl<'a, 'c> Painter<'a, 'c> {
screen_size: self.ctx.screen_size,
px_dependent: self.ctx.px_dependent,
id: self.id,
region: self.region,
size: self.region.size(),
}
}
pub fn px_size(&mut self) -> Vec2 {
self.ctx.px_dependent.insert(self.id);
self.region.in_size(self.ctx.screen_size)
self.region.size().to_abs(self.ctx.screen_size)
}
pub fn text_data(&mut self) -> &mut TextData {
@@ -389,38 +393,39 @@ pub struct SizeCtx<'a> {
widgets: &'a Widgets,
px_dependent: &'a mut HashSet<Id>,
checked: &'a mut HashMap<Id, Size>,
region: UiRegion,
/// TODO: should this be pub? rn used for sized
pub size: UiVec2,
screen_size: Vec2,
id: Id,
}
impl SizeCtx<'_> {
fn size_inner(&mut self, id: Id, region: UiRegion) -> Size {
let self_region = self.region;
self.region = region;
fn size_inner(&mut self, id: Id, size: UiVec2) -> Size {
let self_size = self.size;
self.size = size;
let size = self.widgets.get_dyn_dynamic(id).desired_size(self);
self.region = self_region;
self.size = self_size;
self.checked.insert(id, size);
size
}
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 size;
}
self.size_inner(id.id, self.region)
// if let Some(&size) = self.checked.get(&id.id) {
// return size;
// }
self.size_inner(id.id, self.size)
}
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) -> Size {
self.size_inner(id.id, region.within(&self.region))
self.size_inner(id, self.size)
}
pub fn px_size(&mut self) -> Vec2 {
self.px_dependent.insert(self.id);
self.region.in_size(self.screen_size)
self.size.to_abs(self.screen_size)
}
pub fn draw_text(&mut self, buffer: &mut TextBuffer, attrs: &TextAttrs) -> TextTexture {
self.text.draw(buffer, attrs, self.textures)
}
pub fn label(&self) -> &String {
self.widgets.label(&self.id)
}
}