From a85e129026e7a6b84251fe913cf5cdf0e86c7684 Mon Sep 17 00:00:00 2001 From: shadowcat Date: Thu, 11 Dec 2025 05:48:29 -0500 Subject: [PATCH] move everything out of layout --- core/src/{layout => }/attr.rs | 4 +- core/src/{layout => }/data.rs | 0 core/src/{layout => }/event.rs | 6 +-- core/src/layout/mod.rs | 21 ----------- core/src/lib.rs | 26 ++++++++++++- core/src/{layout => }/module.rs | 8 ++-- core/src/{layout => }/num.rs | 0 core/src/{layout => }/orientation/align.rs | 2 +- core/src/{layout => }/orientation/axis.rs | 0 core/src/{layout => }/orientation/len.rs | 2 +- core/src/{layout => }/orientation/mod.rs | 0 core/src/{layout => }/orientation/pos.rs | 2 +- core/src/{layout => }/painter.rs | 36 +++++++++--------- core/src/{layout => }/primitive/color.rs | 0 core/src/{layout => }/primitive/layer.rs | 0 core/src/{layout => }/primitive/mod.rs | 0 core/src/{layout => }/primitive/text.rs | 5 +-- core/src/{layout => }/primitive/texture.rs | 0 core/src/render/data.rs | 2 +- core/src/render/mod.rs | 2 +- core/src/render/primitive.rs | 2 +- core/src/render/texture.rs | 2 +- core/src/{layout => }/ui.rs | 26 ++++++------- core/src/{layout => }/widget/id.rs | 44 +++++++++++----------- core/src/{layout => }/widget/like.rs | 4 +- core/src/{layout => }/widget/mod.rs | 14 +++---- core/src/{layout => }/widget/tag.rs | 12 +++--- core/src/{layout => }/widget/widgets.rs | 2 +- src/bin/test/main.rs | 4 +- src/default/attr.rs | 10 ++--- src/default/event.rs | 2 +- src/default/mod.rs | 2 +- src/default/render.rs | 5 +-- src/lib.rs | 8 +--- src/widget/mask.rs | 2 +- src/widget/position/align.rs | 2 +- src/widget/position/layer.rs | 2 +- src/widget/position/max_size.rs | 2 +- src/widget/position/offset.rs | 2 +- src/widget/position/pad.rs | 2 +- src/widget/position/scroll.rs | 4 +- src/widget/position/sized.rs | 2 +- src/widget/position/span.rs | 4 +- src/widget/position/stack.rs | 2 +- src/widget/ptr.rs | 2 +- src/widget/sense.rs | 13 ++----- src/widget/text/edit.rs | 3 +- src/widget/text/mod.rs | 7 ++-- 48 files changed, 142 insertions(+), 160 deletions(-) rename core/src/{layout => }/attr.rs (78%) rename core/src/{layout => }/data.rs (100%) rename core/src/{layout => }/event.rs (97%) delete mode 100644 core/src/layout/mod.rs rename core/src/{layout => }/module.rs (79%) rename core/src/{layout => }/num.rs (100%) rename core/src/{layout => }/orientation/align.rs (99%) rename core/src/{layout => }/orientation/axis.rs (100%) rename core/src/{layout => }/orientation/len.rs (98%) rename core/src/{layout => }/orientation/mod.rs (100%) rename core/src/{layout => }/orientation/pos.rs (99%) rename core/src/{layout => }/painter.rs (94%) rename core/src/{layout => }/primitive/color.rs (100%) rename core/src/{layout => }/primitive/layer.rs (100%) rename core/src/{layout => }/primitive/mod.rs (100%) rename core/src/{layout => }/primitive/text.rs (98%) rename core/src/{layout => }/primitive/texture.rs (100%) rename core/src/{layout => }/ui.rs (88%) rename core/src/{layout => }/widget/id.rs (71%) rename core/src/{layout => }/widget/like.rs (93%) rename core/src/{layout => }/widget/mod.rs (76%) rename core/src/{layout => }/widget/tag.rs (55%) rename core/src/{layout => }/widget/widgets.rs (98%) diff --git a/core/src/layout/attr.rs b/core/src/attr.rs similarity index 78% rename from core/src/layout/attr.rs rename to core/src/attr.rs index 5c55866..03063fd 100644 --- a/core/src/layout/attr.rs +++ b/core/src/attr.rs @@ -1,8 +1,8 @@ -use crate::layout::{Ui, WidgetId, WidgetIdFn, WidgetLike}; +use crate::{Ui, WidgetHandle, WidgetIdFn, WidgetLike}; pub trait WidgetAttr { type Input; - fn run(ui: &mut Ui, id: &WidgetId, input: Self::Input); + fn run(ui: &mut Ui, id: &WidgetHandle, input: Self::Input); } pub trait Attrable { diff --git a/core/src/layout/data.rs b/core/src/data.rs similarity index 100% rename from core/src/layout/data.rs rename to core/src/data.rs diff --git a/core/src/layout/event.rs b/core/src/event.rs similarity index 97% rename from core/src/layout/event.rs rename to core/src/event.rs index 99951ea..2b3cf3f 100644 --- a/core/src/layout/event.rs +++ b/core/src/event.rs @@ -1,7 +1,7 @@ use std::{hash::Hash, rc::Rc}; use crate::{ - layout::{Ui, UiModule, WeakWidgetId, WidgetId}, + Ui, UiModule, WidgetHandle, WidgetView, util::{HashMap, Id}, }; @@ -18,7 +18,7 @@ pub struct EventCtx<'a, Ctx, Data> { pub type ECtx<'a, Ctx, Data, W> = EventIdCtx<'a, Ctx, Data, W>; pub struct EventIdCtx<'a, Ctx, Data, W> { - pub id: &'a WeakWidgetId, + pub id: &'a WidgetView, pub ui: &'a mut Ui, pub state: &'a mut Ctx, pub data: Data, @@ -129,7 +129,7 @@ impl Ui { pub fn run_event( &mut self, ctx: &mut Ctx, - id: &WidgetId, + id: &WidgetHandle, event: E, data: E::Data, ) { diff --git a/core/src/layout/mod.rs b/core/src/layout/mod.rs deleted file mode 100644 index cebb4fd..0000000 --- a/core/src/layout/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -mod attr; -mod event; -mod module; -mod num; -mod orientation; -mod painter; -mod primitive; -mod ui; -mod widget; - -pub use attr::*; -pub use event::*; -pub use module::*; -pub use num::*; -pub use orientation::*; -pub use painter::*; -pub use primitive::*; -pub use ui::*; -pub use widget::*; - -pub type UiColor = Color; diff --git a/core/src/lib.rs b/core/src/lib.rs index 5727ed8..9cd5f7e 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -12,6 +12,28 @@ #![feature(unsize)] #![feature(coerce_unsized)] -pub mod layout; -pub mod render; +mod attr; +mod event; +mod module; +mod num; +mod orientation; +mod painter; +mod primitive; +mod render; +mod ui; +mod widget; + pub mod util; + +pub use attr::*; +pub use event::*; +pub use module::*; +pub use num::*; +pub use orientation::*; +pub use painter::*; +pub use primitive::*; +pub use render::*; +pub use ui::*; +pub use widget::*; + +pub type UiColor = primitive::Color; diff --git a/core/src/layout/module.rs b/core/src/module.rs similarity index 79% rename from core/src/layout/module.rs rename to core/src/module.rs index 4ea672c..fe8f7a8 100644 --- a/core/src/layout/module.rs +++ b/core/src/module.rs @@ -1,16 +1,16 @@ use std::any::{Any, TypeId}; use crate::{ - layout::WidgetInstance, + ActiveData, util::{HashMap, Id}, }; #[allow(unused_variables)] pub trait UiModule: Any { - fn on_draw(&mut self, inst: &WidgetInstance) {} - fn on_undraw(&mut self, inst: &WidgetInstance) {} + fn on_draw(&mut self, inst: &ActiveData) {} + fn on_undraw(&mut self, inst: &ActiveData) {} fn on_remove(&mut self, id: &Id) {} - fn on_move(&mut self, inst: &WidgetInstance) {} + fn on_move(&mut self, inst: &ActiveData) {} } #[derive(Default)] diff --git a/core/src/layout/num.rs b/core/src/num.rs similarity index 100% rename from core/src/layout/num.rs rename to core/src/num.rs diff --git a/core/src/layout/orientation/align.rs b/core/src/orientation/align.rs similarity index 99% rename from core/src/layout/orientation/align.rs rename to core/src/orientation/align.rs index 63a2539..4fe79d2 100644 --- a/core/src/layout/orientation/align.rs +++ b/core/src/orientation/align.rs @@ -1,4 +1,4 @@ -use crate::layout::vec2; +use crate::vec2; use super::*; diff --git a/core/src/layout/orientation/axis.rs b/core/src/orientation/axis.rs similarity index 100% rename from core/src/layout/orientation/axis.rs rename to core/src/orientation/axis.rs diff --git a/core/src/layout/orientation/len.rs b/core/src/orientation/len.rs similarity index 98% rename from core/src/layout/orientation/len.rs rename to core/src/orientation/len.rs index 442cff3..8725211 100644 --- a/core/src/layout/orientation/len.rs +++ b/core/src/orientation/len.rs @@ -1,5 +1,5 @@ use super::*; -use crate::{layout::UiNum, util::impl_op}; +use crate::{UiNum, util::impl_op}; #[derive(Debug, Default, Clone, Copy, PartialEq)] pub struct Size { diff --git a/core/src/layout/orientation/mod.rs b/core/src/orientation/mod.rs similarity index 100% rename from core/src/layout/orientation/mod.rs rename to core/src/orientation/mod.rs diff --git a/core/src/layout/orientation/pos.rs b/core/src/orientation/pos.rs similarity index 99% rename from core/src/layout/orientation/pos.rs rename to core/src/orientation/pos.rs index 885a329..204e048 100644 --- a/core/src/layout/orientation/pos.rs +++ b/core/src/orientation/pos.rs @@ -2,7 +2,7 @@ use std::{fmt::Display, hash::Hash, marker::Destruct}; use super::*; use crate::{ - layout::UiNum, + UiNum, util::{LerpUtil, impl_op}, }; diff --git a/core/src/layout/painter.rs b/core/src/painter.rs similarity index 94% rename from core/src/layout/painter.rs rename to core/src/painter.rs index b862ba2..2396acc 100644 --- a/core/src/layout/painter.rs +++ b/core/src/painter.rs @@ -1,8 +1,6 @@ use crate::{ - layout::{ - Axis, Len, Modules, PrimitiveLayers, RenderedText, Size, TextAttrs, TextBuffer, TextData, - TextureHandle, Textures, UiRegion, UiVec2, WidgetId, Widgets, - }, + Axis, Len, Modules, PrimitiveLayers, RenderedText, Size, TextAttrs, TextBuffer, TextData, + TextureHandle, Textures, UiRegion, UiVec2, WidgetHandle, Widgets, render::{Mask, MaskIdx, Primitive, PrimitiveHandle, PrimitiveInst}, util::{HashMap, HashSet, Id, TrackedArena, Vec2}, }; @@ -24,7 +22,7 @@ pub struct Painter<'a, 'c> { /// context for a painter; lets you draw and redraw widgets struct PainterCtx<'a> { pub widgets: &'a Widgets, - pub active: &'a mut HashMap, + pub active: &'a mut HashMap, pub layers: &'a mut PrimitiveLayers, pub textures: &'a mut Textures, pub masks: &'a mut TrackedArena, @@ -47,7 +45,7 @@ pub struct ResizeRef { /// important non rendering data for retained drawing #[derive(Debug)] -pub struct WidgetInstance { +pub struct ActiveData { pub id: Id, pub region: UiRegion, pub parent: Option, @@ -63,7 +61,7 @@ pub struct WidgetInstance { #[derive(Default)] pub struct PainterData { pub widgets: Widgets, - pub active: HashMap, + pub active: HashMap, pub layers: PrimitiveLayers, pub textures: Textures, pub text: TextData, @@ -233,7 +231,7 @@ impl<'a> PainterCtx<'a> { let children_height = painter.children_height; // add to active - let instance = WidgetInstance { + let instance = ActiveData { id, region, parent, @@ -293,7 +291,7 @@ impl<'a> PainterCtx<'a> { } /// NOTE: instance textures are cleared and self.textures freed - fn remove(&mut self, id: Id) -> Option { + fn remove(&mut self, id: Id) -> Option { let mut inst = self.active.remove(&id); if let Some(inst) = &mut inst { for h in &inst.primitives { @@ -311,7 +309,7 @@ impl<'a> PainterCtx<'a> { inst } - fn remove_rec(&mut self, id: Id) -> Option { + fn remove_rec(&mut self, id: Id) -> Option { let inst = self.remove(id); if let Some(inst) = &inst { for c in &inst.children { @@ -389,17 +387,17 @@ impl<'a, 'c> Painter<'a, 'c> { } /// Draws a widget within this widget's region. - pub fn widget(&mut self, id: &WidgetId) { + pub fn widget(&mut self, id: &WidgetHandle) { self.widget_at(id, self.region); } /// Draws a widget somewhere within this one. /// Useful for drawing child widgets in select areas. - pub fn widget_within(&mut self, id: &WidgetId, region: UiRegion) { + pub fn widget_within(&mut self, id: &WidgetHandle, region: UiRegion) { self.widget_at(id, region.within(&self.region)); } - fn widget_at(&mut self, id: &WidgetId, region: UiRegion) { + fn widget_at(&mut self, id: &WidgetHandle, region: UiRegion) { self.children.push(id.id()); self.ctx .draw_inner(self.layer, id.id(), region, Some(self.id), self.mask, None); @@ -429,11 +427,11 @@ impl<'a, 'c> Painter<'a, 'c> { self.region } - pub fn size(&mut self, id: &WidgetId) -> Size { + pub fn size(&mut self, id: &WidgetHandle) -> Size { self.size_ctx().size(id) } - pub fn len_axis(&mut self, id: &WidgetId, axis: Axis) -> Len { + pub fn len_axis(&mut self, id: &WidgetHandle, axis: Axis) -> Len { match axis { Axis::X => self.size_ctx().width(id), Axis::Y => self.size_ctx().height(id), @@ -552,22 +550,22 @@ impl SizeCtx<'_> { len } - pub fn width(&mut self, id: &WidgetId) -> Len { + pub fn width(&mut self, id: &WidgetHandle) -> Len { self.width_inner(id.id()) } - pub fn height(&mut self, id: &WidgetId) -> Len { + pub fn height(&mut self, id: &WidgetHandle) -> Len { self.height_inner(id.id()) } - pub fn len_axis(&mut self, id: &WidgetId, axis: Axis) -> Len { + pub fn len_axis(&mut self, id: &WidgetHandle, axis: Axis) -> Len { match axis { Axis::X => self.width(id), Axis::Y => self.height(id), } } - pub fn size(&mut self, id: &WidgetId) -> Size { + pub fn size(&mut self, id: &WidgetHandle) -> Size { Size { x: self.width(id), y: self.height(id), diff --git a/core/src/layout/primitive/color.rs b/core/src/primitive/color.rs similarity index 100% rename from core/src/layout/primitive/color.rs rename to core/src/primitive/color.rs diff --git a/core/src/layout/primitive/layer.rs b/core/src/primitive/layer.rs similarity index 100% rename from core/src/layout/primitive/layer.rs rename to core/src/primitive/layer.rs diff --git a/core/src/layout/primitive/mod.rs b/core/src/primitive/mod.rs similarity index 100% rename from core/src/layout/primitive/mod.rs rename to core/src/primitive/mod.rs diff --git a/core/src/layout/primitive/text.rs b/core/src/primitive/text.rs similarity index 98% rename from core/src/layout/primitive/text.rs rename to core/src/primitive/text.rs index f201f23..0e557a7 100644 --- a/core/src/layout/primitive/text.rs +++ b/core/src/primitive/text.rs @@ -1,7 +1,4 @@ -use crate::{ - layout::{Align, RegionAlign, TextureHandle, Textures, UiColor}, - util::Vec2, -}; +use crate::{Align, RegionAlign, TextureHandle, Textures, UiColor, util::Vec2}; use cosmic_text::{ Attrs, AttrsList, Buffer, CacheKey, Color, Family, FontSystem, Metrics, Placement, SwashCache, SwashContent, diff --git a/core/src/layout/primitive/texture.rs b/core/src/primitive/texture.rs similarity index 100% rename from core/src/layout/primitive/texture.rs rename to core/src/primitive/texture.rs diff --git a/core/src/render/data.rs b/core/src/render/data.rs index f630bb9..2953065 100644 --- a/core/src/render/data.rs +++ b/core/src/render/data.rs @@ -1,4 +1,4 @@ -use crate::{layout::UiRegion, util::Id}; +use crate::{UiRegion, util::Id}; use wgpu::*; #[repr(C)] diff --git a/core/src/render/mod.rs b/core/src/render/mod.rs index 5f428ed..6d43627 100644 --- a/core/src/render/mod.rs +++ b/core/src/render/mod.rs @@ -1,7 +1,7 @@ use std::num::NonZero; use crate::{ - layout::Ui, + Ui, render::{data::PrimitiveInstance, texture::GpuTextures, util::ArrBuf}, util::HashMap, }; diff --git a/core/src/render/primitive.rs b/core/src/render/primitive.rs index 2ba991a..a38e6a5 100644 --- a/core/src/render/primitive.rs +++ b/core/src/render/primitive.rs @@ -1,7 +1,7 @@ use std::ops::{Deref, DerefMut}; use crate::{ - layout::{Color, UiRegion}, + Color, UiRegion, render::{ ArrBuf, data::{MaskIdx, PrimitiveInstance}, diff --git a/core/src/render/texture.rs b/core/src/render/texture.rs index 30d6ecd..a9ec637 100644 --- a/core/src/render/texture.rs +++ b/core/src/render/texture.rs @@ -1,7 +1,7 @@ use image::{DynamicImage, EncodableLayout}; use wgpu::{util::DeviceExt, *}; -use crate::layout::{TextureUpdate, Textures}; +use crate::{TextureUpdate, Textures}; pub struct GpuTextures { device: Device, diff --git a/core/src/layout/ui.rs b/core/src/ui.rs similarity index 88% rename from core/src/layout/ui.rs rename to core/src/ui.rs index 0b2c36d..dd30819 100644 --- a/core/src/layout/ui.rs +++ b/core/src/ui.rs @@ -1,8 +1,6 @@ use crate::{ - layout::{ - Event, EventFn, EventModule, IdLike, PainterData, PixelRegion, TextureHandle, Widget, - WidgetId, WidgetInstance, WidgetLike, - }, + ActiveData, Event, EventFn, EventModule, IdLike, PainterData, PixelRegion, TextureHandle, + Widget, WidgetHandle, WidgetLike, util::{Id, Vec2}, }; use image::DynamicImage; @@ -15,7 +13,7 @@ use std::{ pub struct Ui { // TODO: make this at least pub(super) pub data: PainterData, - root: Option, + root: Option, recv: Receiver, pub(super) send: Sender, full_redraw: bool, @@ -23,24 +21,24 @@ pub struct Ui { } impl Ui { - pub fn add(&mut self, w: impl WidgetLike) -> WidgetId { + pub fn add(&mut self, w: impl WidgetLike) -> WidgetHandle { w.add(self) } /// useful for debugging - pub fn set_label(&mut self, id: &WidgetId, label: String) { + pub fn set_label(&mut self, id: &WidgetHandle, label: String) { self.data.widgets.data_mut(&id.id()).unwrap().label = label; } - pub fn label(&self, id: &WidgetId) -> &String { + pub fn label(&self, id: &WidgetHandle) -> &String { &self.data.widgets.data(&id.id()).unwrap().label } - pub fn add_widget(&mut self, w: W) -> WidgetId { + pub fn add_widget(&mut self, w: W) -> WidgetHandle { self.push(w) } - pub fn push(&mut self, w: W) -> WidgetId { + pub fn push(&mut self, w: W) -> WidgetHandle { let id = self.new_id(); self.data.widgets.insert(id.id(), w); id @@ -63,8 +61,8 @@ impl Ui { self.data.widgets.get_mut(id) } - fn new_id(&mut self) -> WidgetId { - WidgetId::new( + fn new_id(&mut self) -> WidgetHandle { + WidgetHandle::new( self.data.widgets.reserve(), TypeId::of::(), self.send.clone(), @@ -77,7 +75,7 @@ impl Ui { pub fn register_event( &mut self, - id: &WidgetId, + id: &WidgetHandle, event: E, f: impl EventFn, ) { @@ -165,7 +163,7 @@ impl Ui { Some(region.to_px(self.data.output_size)) } - pub fn debug(&self, label: &str) -> impl Iterator { + pub fn debug(&self, label: &str) -> impl Iterator { self.data.active.iter().filter_map(move |(id, inst)| { let l = &self.data.widgets.label(id); if *l == label { Some(inst) } else { None } diff --git a/core/src/layout/widget/id.rs b/core/src/widget/id.rs similarity index 71% rename from core/src/layout/widget/id.rs rename to core/src/widget/id.rs index 551d65f..ca1ae7b 100644 --- a/core/src/layout/widget/id.rs +++ b/core/src/widget/id.rs @@ -1,7 +1,7 @@ use std::{any::TypeId, marker::PhantomData, sync::mpsc::Sender}; use crate::{ - layout::{Ui, Widget}, + Ui, Widget, util::{Id, RefCounter}, }; @@ -16,7 +16,7 @@ pub struct AnyWidget; /// /// TODO: ergonomic clones when they get put in rust-analyzer & don't cause ICEs? #[repr(C)] -pub struct WidgetId { +pub struct WidgetHandle { pub(super) ty: TypeId, pub(super) id: Id, counter: RefCounter, @@ -25,7 +25,7 @@ pub struct WidgetId { } #[repr(C)] -pub struct WeakWidgetId { +pub struct WidgetView { pub(super) ty: TypeId, pub(super) id: Id, counter: RefCounter, @@ -33,19 +33,19 @@ pub struct WeakWidgetId { _pd: PhantomData, } -impl PartialEq for WidgetId { +impl PartialEq for WidgetHandle { fn eq(&self, other: &Self) -> bool { self.ty == other.ty && self.id == other.id } } -impl std::fmt::Debug for WidgetId { +impl std::fmt::Debug for WidgetHandle { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.id.fmt(f) } } -impl Clone for WidgetId { +impl Clone for WidgetHandle { fn clone(&self) -> Self { Self { id: self.id, @@ -57,7 +57,7 @@ impl Clone for WidgetId { } } -impl WidgetId { +impl WidgetHandle { pub(crate) fn new(id: Id, ty: TypeId, send: Sender) -> Self { Self { ty, @@ -68,11 +68,11 @@ impl WidgetId { } } - pub fn any(self) -> WidgetId { + pub fn any(self) -> WidgetHandle { self.cast_type() } - pub fn as_any(&self) -> &WidgetId { + pub fn as_any(&self) -> &WidgetHandle { // SAFETY: self is repr(C) and generic only used for phantom data unsafe { std::mem::transmute(self) } } @@ -81,7 +81,7 @@ impl WidgetId { self.id } - pub(super) fn cast_type(self) -> WidgetId { + pub(super) fn cast_type(self) -> WidgetHandle { // SAFETY: self is repr(C) and generic only used for phantom data unsafe { std::mem::transmute(self) } } @@ -90,7 +90,7 @@ impl WidgetId { self.counter.refs() } - pub fn weak(&self) -> WeakWidgetId { + pub fn weak(&self) -> WidgetView { let Self { ty, id, @@ -98,7 +98,7 @@ impl WidgetId { ref send, _pd, } = *self; - WeakWidgetId { + WidgetView { ty, id, counter: counter.quiet_clone(), @@ -108,7 +108,7 @@ impl WidgetId { } } -impl Drop for WidgetId { +impl Drop for WidgetHandle { fn drop(&mut self) { if self.counter.drop() { let _ = self.send.send(self.id); @@ -116,18 +116,18 @@ impl Drop for WidgetId { } } -pub trait WidgetIdFn: FnOnce(&mut Ui) -> WidgetId {} -impl WidgetId> WidgetIdFn for F {} +pub trait WidgetIdFn: FnOnce(&mut Ui) -> WidgetHandle {} +impl WidgetHandle> WidgetIdFn for F {} -pub trait WidgetRet: FnOnce(&mut Ui) -> WidgetId {} -impl WidgetId> WidgetRet for F {} +pub trait WidgetRet: FnOnce(&mut Ui) -> WidgetHandle {} +impl WidgetHandle> WidgetRet for F {} pub trait WidgetIdLike { - fn id(self, send: &Sender) -> WidgetId; + fn id(self, send: &Sender) -> WidgetHandle; } -impl WidgetIdLike for &WidgetId { - fn id(self, _: &Sender) -> WidgetId { +impl WidgetIdLike for &WidgetHandle { + fn id(self, _: &Sender) -> WidgetHandle { self.clone() } } @@ -137,14 +137,14 @@ pub trait IdLike { fn id(&self) -> Id; } -impl IdLike for WidgetId { +impl IdLike for WidgetHandle { type Widget = W; fn id(&self) -> Id { self.id } } -impl IdLike for WeakWidgetId { +impl IdLike for WidgetView { type Widget = W; fn id(&self) -> Id { self.id diff --git a/core/src/layout/widget/like.rs b/core/src/widget/like.rs similarity index 93% rename from core/src/layout/widget/like.rs rename to core/src/widget/like.rs index c8e5d84..d37070c 100644 --- a/core/src/layout/widget/like.rs +++ b/core/src/widget/like.rs @@ -3,11 +3,11 @@ use super::*; pub trait WidgetLike { type Widget: 'static; - fn add(self, ui: &mut Ui) -> WidgetId; + fn add(self, ui: &mut Ui) -> WidgetHandle; fn with_id( self, - f: impl FnOnce(&mut Ui, WidgetId) -> WidgetId, + f: impl FnOnce(&mut Ui, WidgetHandle) -> WidgetHandle, ) -> impl WidgetIdFn where Self: Sized, diff --git a/core/src/layout/widget/mod.rs b/core/src/widget/mod.rs similarity index 76% rename from core/src/layout/widget/mod.rs rename to core/src/widget/mod.rs index d057e56..3dbdf41 100644 --- a/core/src/layout/widget/mod.rs +++ b/core/src/widget/mod.rs @@ -1,4 +1,4 @@ -use crate::layout::{Len, Painter, SizeCtx, Ui}; +use crate::{Len, Painter, SizeCtx, Ui}; use std::{any::Any, marker::PhantomData}; mod id; @@ -34,12 +34,12 @@ pub trait WidgetFn: FnOnce(&mut Ui) -> W {} impl W> WidgetFn for F {} pub struct WidgetArr { - pub arr: [WidgetId; LEN], + pub arr: [WidgetHandle; LEN], _pd: PhantomData, } impl WidgetArr { - pub fn new(arr: [WidgetId; LEN]) -> Self { + pub fn new(arr: [WidgetHandle; LEN]) -> Self { Self { arr, _pd: PhantomData, @@ -48,17 +48,17 @@ impl WidgetArr { } pub trait WidgetOption { - fn get(self, ui: &mut Ui) -> Option; + fn get(self, ui: &mut Ui) -> Option; } impl WidgetOption for () { - fn get(self, _: &mut Ui) -> Option { + fn get(self, _: &mut Ui) -> Option { None } } -impl Option> WidgetOption for F { - fn get(self, ui: &mut Ui) -> Option { +impl Option> WidgetOption for F { + fn get(self, ui: &mut Ui) -> Option { self(ui) } } diff --git a/core/src/layout/widget/tag.rs b/core/src/widget/tag.rs similarity index 55% rename from core/src/layout/widget/tag.rs rename to core/src/widget/tag.rs index 4742943..a15a2cb 100644 --- a/core/src/layout/widget/tag.rs +++ b/core/src/widget/tag.rs @@ -5,7 +5,7 @@ pub struct ArrTag; pub struct WidgetTag; impl WidgetLike for W { type Widget = W; - fn add(self, ui: &mut Ui) -> WidgetId { + fn add(self, ui: &mut Ui) -> WidgetHandle { ui.add_widget(self) } } @@ -13,23 +13,23 @@ impl WidgetLike for W { pub struct FnTag; impl W> WidgetLike for F { type Widget = W; - fn add(self, ui: &mut Ui) -> WidgetId { + fn add(self, ui: &mut Ui) -> WidgetHandle { self(ui).add(ui) } } pub struct IdTag; -impl WidgetLike for WidgetId { +impl WidgetLike for WidgetHandle { type Widget = W; - fn add(self, _: &mut Ui) -> WidgetId { + fn add(self, _: &mut Ui) -> WidgetHandle { self } } pub struct IdFnTag; -impl WidgetId> WidgetLike for F { +impl WidgetHandle> WidgetLike for F { type Widget = W; - fn add(self, ui: &mut Ui) -> WidgetId { + fn add(self, ui: &mut Ui) -> WidgetHandle { self(ui) } } diff --git a/core/src/layout/widget/widgets.rs b/core/src/widget/widgets.rs similarity index 98% rename from core/src/layout/widget/widgets.rs rename to core/src/widget/widgets.rs index 411bc88..acb195f 100644 --- a/core/src/layout/widget/widgets.rs +++ b/core/src/widget/widgets.rs @@ -1,5 +1,5 @@ use crate::{ - layout::{IdLike, Widget}, + IdLike, Widget, util::{DynBorrower, HashMap, HashSet, Id, IdTracker}, }; diff --git a/src/bin/test/main.rs b/src/bin/test/main.rs index f8aa1ee..f4265c0 100644 --- a/src/bin/test/main.rs +++ b/src/bin/test/main.rs @@ -8,7 +8,7 @@ fn main() { } pub struct Client { - info: WidgetId, + info: WidgetHandle, } event_ctx!(Client); @@ -143,7 +143,7 @@ impl DefaultAppState for Client { let main = pad_test.clone().pad(10).add(ui); - let switch_button = |color, to: WidgetId, label| { + let switch_button = |color, to: WidgetHandle, label| { let main_ = main.clone(); let rect = rect(color) .on(CursorSense::click(), move |ctx| { diff --git a/src/default/attr.rs b/src/default/attr.rs index 01e0fe5..a827dd0 100644 --- a/src/default/attr.rs +++ b/src/default/attr.rs @@ -1,13 +1,13 @@ -use crate::{default::UiState, prelude::*}; +use crate::prelude::*; use std::time::{Duration, Instant}; use winit::dpi::{LogicalPosition, LogicalSize}; pub struct Selector; impl WidgetAttr for Selector { - type Input = WidgetId; + type Input = WidgetHandle; - fn run(ui: &mut Ui, container: &WidgetId, id: Self::Input) { + fn run(ui: &mut Ui, container: &WidgetHandle, id: Self::Input) { let container = container.clone(); ui.register_event( &container.clone(), @@ -30,7 +30,7 @@ pub struct Selectable; impl WidgetAttr for Selectable { type Input = (); - fn run(ui: &mut Ui, id: &WidgetId, _: Self::Input) { + fn run(ui: &mut Ui, id: &WidgetHandle, _: Self::Input) { let id = id.clone(); ui.register_event(&id.clone(), CursorSense::click_or_drag(), move |ctx| { select(ctx.ui, id.clone(), ctx.state, ctx.data); @@ -38,7 +38,7 @@ impl WidgetAttr for Selectable { } } -fn select(ui: &mut Ui, id: WidgetId, state: &mut UiState, data: CursorData) { +fn select(ui: &mut Ui, id: WidgetHandle, state: &mut UiState, data: CursorData) { let now = Instant::now(); let recent = (now - state.last_click) < Duration::from_millis(300); state.last_click = now; diff --git a/src/default/event.rs b/src/default/event.rs index 22fe1dd..ee9a59f 100644 --- a/src/default/event.rs +++ b/src/default/event.rs @@ -1,4 +1,4 @@ -use crate::layout::DefaultEvent; +use iris_core::DefaultEvent; #[derive(Eq, PartialEq, Hash, Clone)] pub struct Submit; diff --git a/src/default/mod.rs b/src/default/mod.rs index 9ccf16c..c1e037f 100644 --- a/src/default/mod.rs +++ b/src/default/mod.rs @@ -30,7 +30,7 @@ pub struct DefaultState { pub struct UiState { pub renderer: UiRenderer, pub input: Input, - pub focus: Option>, + pub focus: Option>, pub clipboard: Clipboard, pub window: Arc, pub ime: usize, diff --git a/src/default/render.rs b/src/default/render.rs index 510d9bc..f9b4293 100644 --- a/src/default/render.rs +++ b/src/default/render.rs @@ -1,7 +1,4 @@ -use crate::{ - layout::Ui, - render::{UiLimits, UiRenderNode}, -}; +use iris_core::{Ui, UiLimits, UiRenderNode}; use pollster::FutureExt; use std::sync::Arc; use wgpu::{util::StagingBelt, *}; diff --git a/src/lib.rs b/src/lib.rs index cc04dcd..2cc3d32 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,17 +7,13 @@ mod default; mod event; mod widget; -pub use iris_core::*; -pub use iris_macro::*; - pub mod prelude { use super::*; pub use default::*; pub use event::*; + pub use iris_core::*; pub use iris_macro::*; - pub use layout::*; - pub use render::*; pub use widget::*; - pub use super::util::Vec2; + pub use iris_core::util::Vec2; } diff --git a/src/widget/mask.rs b/src/widget/mask.rs index 3cdad7d..5b16337 100644 --- a/src/widget/mask.rs +++ b/src/widget/mask.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct Masked { - pub inner: WidgetId, + pub inner: WidgetHandle, } impl Widget for Masked { diff --git a/src/widget/position/align.rs b/src/widget/position/align.rs index ad00d27..c475b4b 100644 --- a/src/widget/position/align.rs +++ b/src/widget/position/align.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct Aligned { - pub inner: WidgetId, + pub inner: WidgetHandle, pub align: Align, } diff --git a/src/widget/position/layer.rs b/src/widget/position/layer.rs index 58bb7bd..ef55139 100644 --- a/src/widget/position/layer.rs +++ b/src/widget/position/layer.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct LayerOffset { - pub inner: WidgetId, + pub inner: WidgetHandle, pub offset: usize, } diff --git a/src/widget/position/max_size.rs b/src/widget/position/max_size.rs index 30e3ca9..83071d8 100644 --- a/src/widget/position/max_size.rs +++ b/src/widget/position/max_size.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct MaxSize { - pub inner: WidgetId, + pub inner: WidgetHandle, pub x: Option, pub y: Option, } diff --git a/src/widget/position/offset.rs b/src/widget/position/offset.rs index 6b49f83..e7a19d8 100644 --- a/src/widget/position/offset.rs +++ b/src/widget/position/offset.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct Offset { - pub inner: WidgetId, + pub inner: WidgetHandle, pub amt: UiVec2, } diff --git a/src/widget/position/pad.rs b/src/widget/position/pad.rs index 5ccc7f8..26554ee 100644 --- a/src/widget/position/pad.rs +++ b/src/widget/position/pad.rs @@ -2,7 +2,7 @@ use crate::prelude::*; pub struct Pad { pub padding: Padding, - pub inner: WidgetId, + pub inner: WidgetHandle, } impl Widget for Pad { diff --git a/src/widget/position/scroll.rs b/src/widget/position/scroll.rs index dd13783..c414b11 100644 --- a/src/widget/position/scroll.rs +++ b/src/widget/position/scroll.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct Scroll { - inner: WidgetId, + inner: WidgetHandle, axis: Axis, amt: f32, snap_end: bool, @@ -41,7 +41,7 @@ impl Widget for Scroll { } impl Scroll { - pub fn new(inner: WidgetId, axis: Axis) -> Self { + pub fn new(inner: WidgetHandle, axis: Axis) -> Self { Self { inner, axis, diff --git a/src/widget/position/sized.rs b/src/widget/position/sized.rs index 567178f..8aed65e 100644 --- a/src/widget/position/sized.rs +++ b/src/widget/position/sized.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub struct Sized { - pub inner: WidgetId, + pub inner: WidgetHandle, pub x: Option, pub y: Option, } diff --git a/src/widget/position/span.rs b/src/widget/position/span.rs index 0e3d53d..019ab1b 100644 --- a/src/widget/position/span.rs +++ b/src/widget/position/span.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use std::marker::PhantomData; pub struct Span { - pub children: Vec, + pub children: Vec, pub dir: Dir, pub gap: f32, } @@ -182,7 +182,7 @@ impl, Tag> SpanBuilder; + type Target = Vec; fn deref(&self) -> &Self::Target { &self.children diff --git a/src/widget/position/stack.rs b/src/widget/position/stack.rs index 178ecc2..a673eb9 100644 --- a/src/widget/position/stack.rs +++ b/src/widget/position/stack.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use crate::prelude::*; pub struct Stack { - pub children: Vec, + pub children: Vec, pub size: StackSize, } diff --git a/src/widget/ptr.rs b/src/widget/ptr.rs index a650c29..9d0f3f6 100644 --- a/src/widget/ptr.rs +++ b/src/widget/ptr.rs @@ -2,7 +2,7 @@ use crate::prelude::*; #[derive(Default)] pub struct WidgetPtr { - pub inner: Option, + pub inner: Option, } impl Widget for WidgetPtr { diff --git a/src/widget/sense.rs b/src/widget/sense.rs index 75bbb28..ee2d8af 100644 --- a/src/widget/sense.rs +++ b/src/widget/sense.rs @@ -1,15 +1,10 @@ use crate::prelude::*; - +use iris_core::util::{HashMap, Id}; use std::{ ops::{BitOr, Deref, DerefMut}, rc::Rc, }; -use crate::{ - layout::{UiModule, UiRegion}, - util::{HashMap, Id, Vec2}, -}; - #[derive(Clone, Copy, PartialEq)] pub enum Button { Left, @@ -125,7 +120,7 @@ pub struct CursorModule { } impl UiModule for CursorModule { - fn on_draw(&mut self, inst: &WidgetInstance) { + fn on_draw(&mut self, inst: &ActiveData) { if self.map.contains_key(&inst.id) { self.active .entry(inst.layer) @@ -134,7 +129,7 @@ impl UiModule for CursorModule { } } - fn on_undraw(&mut self, inst: &WidgetInstance) { + fn on_undraw(&mut self, inst: &ActiveData) { if let Some(layer) = self.active.get_mut(&inst.layer) { layer.remove(&inst.id); } @@ -147,7 +142,7 @@ impl UiModule for CursorModule { } } - fn on_move(&mut self, inst: &WidgetInstance) { + fn on_move(&mut self, inst: &ActiveData) { if let Some(map) = self.active.get_mut(&inst.layer) && let Some(region) = map.get_mut(&inst.id) { diff --git a/src/widget/text/edit.rs b/src/widget/text/edit.rs index b8c9d7b..1a712ff 100644 --- a/src/widget/text/edit.rs +++ b/src/widget/text/edit.rs @@ -1,7 +1,6 @@ -use std::ops::{Deref, DerefMut}; - use crate::prelude::*; use cosmic_text::{Affinity, Attrs, Cursor, FontSystem, LayoutRun, Motion}; +use std::ops::{Deref, DerefMut}; use unicode_segmentation::UnicodeSegmentation; use winit::{ event::KeyEvent, diff --git a/src/widget/text/mod.rs b/src/widget/text/mod.rs index 11ac44c..54375a1 100644 --- a/src/widget/text/mod.rs +++ b/src/widget/text/mod.rs @@ -3,8 +3,9 @@ mod edit; pub use build::*; pub use edit::*; +use iris_core::util::MutDetect; -use crate::{prelude::*, util::MutDetect}; +use crate::prelude::*; use cosmic_text::{Attrs, BufferLine, Cursor, Metrics, Shaping}; use std::ops::{Deref, DerefMut}; @@ -21,11 +22,11 @@ pub struct TextView { // cache tex: Option, width: Option, - pub hint: Option, + pub hint: Option, } impl TextView { - pub fn new(buf: TextBuffer, attrs: TextAttrs, hint: Option) -> Self { + pub fn new(buf: TextBuffer, attrs: TextAttrs, hint: Option) -> Self { Self { attrs: attrs.into(), buf: buf.into(),