macro_rules! impl_widget_behavior {
($state:ty, $render:path, $measure:expr) => {
impl WidgetBehavior for RefCell<$state> {
fn render(
self: Rc<Self>,
renderer: &mut HydrolysisRenderer,
ctx: RenderContext,
env: &Environment,
) {
let mut widget_ctx = WidgetRenderContext::new(renderer, ctx);
$render(&mut widget_ctx, &self, env);
}
fn measure(
&self,
state: &mut HydroState,
proposal: ProposalSize,
env: &Environment,
) -> ViewDimensions {
($measure)(&self.borrow(), proposal, state, env)
}
}
};
}
mod build;
mod build_controls;
mod build_views;
mod collection;
mod flush;
mod layout;
mod nodes;
mod subview;
mod window;
pub(crate) use collection::*;
pub(crate) use flush::ChildTextureTarget;
pub(crate) use nodes::*;
use subview::*;
use super::*;
use crate::renderer::lazy::{
LazyStackAxisConfig, VirtualExtentIndex, lazy_stack_axis_config, place_lazy_stack_item,
};
use crate::scroll::ScrollHandle;
use core::cell::Cell;
use core::ops::Range;
use nami::Computed;
use nami::watcher::BoxWatcherGuard;
use waterui_core::MainThreadBound;
use waterui_core::id::{Id as RawId, SelfId};
use waterui_core::layout::{LayoutPriority, Point, Rect, Size};
use waterui_core::views::{AnyViews, Views};
use waterui_layout::scroll::{Axis as ScrollAxis, ScrollController, ScrollView};
type CollectionItemId = SelfId<RawId>;
pub(crate) enum RenderNode {
Color(ColorNode),
Text(Box<TextNode>),
Container(Box<ContainerNode>),
Opacity(Box<OpacityNode>),
Scale(Box<ScaleNode>),
Rotation(Box<RotationNode>),
Offset(Box<OffsetNode>),
Retain(Box<RetainNode>),
Env(Box<EnvNode>),
Scroll(Box<ScrollNode>),
Collection(Box<CollectionNode>),
LazyStack(Box<LazyStackNode>),
SceneView(Box<SceneViewNode>),
GpuSurface(Box<GpuSurfaceNode>),
ViewEffect(Box<ViewEffectNode>),
AppliedFilter(Box<AppliedFilterNode>),
Dynamic(Box<DynamicHostNode>),
Wrapper(Box<WrapperNode>),
Widget(WidgetNode),
}