use iris::prelude::*; use std::{cell::RefCell, rc::Rc}; pub(crate) fn update_info(rsc: &mut Rsc, info: WeakWidget, views: usize) { let render_state = rsc.ui().render_state(); let new = format!( "widgets: {}\nactive: {}\nviews: {views}", rsc.widgets().len(), render_state.get().active_widgets(), ); if new != *rsc.widgets()[info].content { *rsc.widgets_mut()[info].content = new; } } pub(crate) struct ClientWidgets { pub(crate) info: WeakWidget, } pub(crate) fn build( rsc: &mut Rsc, ui_state: &mut impl HasRoot, ) -> ClientWidgets where Rsc::State: FocusHost, { let rrect = rect(PaintId::WHITE).radius(20); let pad_test = ( rrect.clone().color(PaintId::BLUE), ( rrect .clone() .color(PaintId::RED) .sized((100, 100)) .center() .width(rest(2)), ( rrect.clone().color(PaintId::ORANGE), rrect.clone().color(PaintId::LIME).pad(10.0), ) .span(Dir::RIGHT) .width(rest(2)), rrect.clone().color(PaintId::YELLOW), ) .span(Dir::RIGHT) .pad(10) .width(rest(3)), ) .span(Dir::RIGHT) .add(rsc); let span_test = ( rrect.clone().color(PaintId::GREEN).width(100), rrect.clone().color(PaintId::ORANGE), rrect.clone().color(PaintId::CYAN), rrect.clone().color(PaintId::BLUE).width(rel(0.5)), rrect.clone().color(PaintId::MAGENTA).width(100), rrect.color(PaintId::RED).width(100), ) .span(Dir::LEFT) .add(rsc); let span_add = Span::empty(Dir::RIGHT).add(rsc); let add_button = rect(PaintId::LIME) .radius(30) .on(CursorSense::click(), move |_, rsc| { let child = image(include_bytes!("assets/sungals.png")) .center() .add_strong(rsc); span_add(rsc).push(child); }) .sized((150, 150)) .align(Align::BOT_RIGHT); let del_button = rect(PaintId::RED) .radius(30) .on(CursorSense::click(), move |_, rsc| { span_add(rsc).pop(); }) .sized((150, 150)) .align(Align::BOT_LEFT); let span_add_test = (span_add, add_button, del_button).stack().add(rsc); let btext = |content| wtext(content).size(30); let text_test = ( btext("this is a").align(Align::LEFT), btext("teeeeeeeest").align(Align::RIGHT), btext("okkk\nokkkkkk!").align(Align::LEFT), btext("hmm"), btext("a"), ( btext("'").family(MONOSPACE).align(Align::TOP), btext("'").family(MONOSPACE), btext(":gamer mode").family(MONOSPACE), rect(PaintId::CYAN).sized((10, 10)).center(), rect(PaintId::RED).sized((100, 100)).center(), rect(PaintId::PURPLE).sized((50, 50)).align(Align::TOP), ) .span(Dir::RIGHT) .center(), wtext("pretty cool right?").size(50), ) .span(Dir::DOWN) .add(rsc); let texts = Span::empty(Dir::DOWN).gap(10).add(rsc); let msg_area = texts .scrollable(Axis::Y, Pin::Start) .masked() .background(rect(PaintId::SKY)); let add_text = wtext("add") .editable(EditMode::MultiLine) .text_align(Align::LEFT) .size(30) .attr::(()) .on(Submit, move |ctx, rsc: &mut Rsc| { let w = ctx.widget; let content = w.edit(rsc).take(); let text = wtext(content) .editable(EditMode::MultiLine) .size(30) .text_align(Align::LEFT) .wrap(true) .attr::(()); let fill = rsc .ui_mut() .paints .add(Srgba8::WHITE.to_linear().darker(0.5)); let msg_box = text.background(rect(fill)).add_strong(rsc); texts(rsc).push(msg_box); }) .add(rsc); let text_edit_scroll = ( msg_area.height(rest(1)), ( Rect::new( rsc.ui_mut() .paints .add(Srgba8::WHITE.to_linear().darker(0.9)), ), ( add_text.width(rest(1)), Rect::new(PaintId::GREEN) .on(CursorSense::click(), move |ctx, rsc: &mut Rsc| { rsc.run_event::(add_text, (), ctx.state); }) .sized((40, 40)), ) .span(Dir::RIGHT) .pad(10), ) .stack() .size(StackSize::Child(1)) .layer_offset(1) .align(Align::BOT), ) .span(Dir::DOWN) .add(rsc); let main = WidgetPtr::new().add(rsc); let vals = Rc::new(RefCell::new((0, Vec::new()))); let mut switch_button = |solid: Srgba8, to: WeakWidget, label| { let value = solid.to_linear(); let paint = rsc.ui_mut().paints.add(value); let to = to.upgrade(rsc); let vec = &mut vals.borrow_mut().1; let i = vec.len(); if vec.is_empty() { vec.push(None); main(rsc).set(to); } else { vec.push(Some(to)); } let vals = vals.clone(); let pressed = paint.clone(); let hovered = paint.clone(); let normal = paint.clone(); let rect = rect(paint) .on(CursorSense::click(), move |_ctx, rsc: &mut Rsc| { let (prev, vec) = &mut *vals.borrow_mut(); if let Some(h) = vec[i].take() { vec[*prev] = main(rsc).replace(h); *prev = i; } rsc.ui_mut().paints.set(&pressed, value.darker(0.3)); }) .on( CursorSense::HoverStart | CursorSense::unclick(), move |_ctx, rsc: &mut Rsc| { rsc.ui_mut().paints.set(&hovered, value.brighter(0.2)); }, ) .on(CursorSense::HoverEnd, move |_ctx, rsc: &mut Rsc| { rsc.ui_mut().paints.set(&normal, value); }) .label(label); (rect, wtext(label).size(30).text_align(Align::CENTER)).stack() }; let tabs = ( switch_button(Srgba8::RED, pad_test, "pad"), switch_button(Srgba8::GREEN, span_test, "span"), switch_button(Srgba8::BLUE, span_add_test, "image span"), switch_button(Srgba8::MAGENTA, text_test, "text layout"), switch_button(Srgba8::YELLOW, text_edit_scroll, "text edit scroll"), ) .span(Dir::RIGHT); let info = wtext("").add(rsc); let info_sect = info.pad(10).align(Align::RIGHT); ((tabs.height(40), main.pad(10)).span(Dir::DOWN), info_sect) .stack() .set_root(rsc, ui_state); ClientWidgets { info } }