use openworm::net::RequestUsers; use crate::session::Session; use super::*; #[derive(PartialEq, Eq, Hash, Clone, Copy)] enum View { Info, User, } pub fn view(rsc: &mut Rsc, session: &Session) -> StrongWidget { let mut view = WidgetSelector::new(View::Info, info(rsc)); view.set(View::User, users(rsc, session)); let view = view.add(rsc); let [info, server] = tabs(rsc, view, [("info", View::Info), ("users", View::User)]); let side_bar = rect(Color::BLACK.alpha(150)) .foreground((info, server).span(Dir::DOWN)) .width(260); (side_bar, view).span(Dir::RIGHT).add_strong(rsc) } fn info(rsc: &mut Rsc) -> StrongWidget { wtext("server info").center_text().add_strong(rsc) } fn users(rsc: &mut Rsc, session: &Session) -> StrongWidget { let ptr = WidgetPtr::new( large_hint_text("loading users...") .center_text() .width(rest(1)) .add_strong(rsc), ) .add(rsc); let con = session.con.clone(); rsc.events.register(ptr, Draw, move |_, rsc| { let con = con.clone(); rsc.spawn_task(async move |mut ctx| { let Ok(resp) = con.request(RequestUsers).await else { return; }; ctx.update(move |_, rsc| { let mut span = Span::empty(Dir::DOWN); for user in resp.users { let thing = ( wtext(user.id.to_string()).size(20), wtext(user.username).size(20), ) .span(Dir::RIGHT) .gap(30) .pad(15); span.push(thing.add_strong(rsc)); } span.set_ptr(ptr, rsc); }); }); }); ptr.upgrade(rsc) }