use super::{_ConstMutSwitchUiCallback, ConstMutSwitchUi, ConstRef, ConstUI, MutRef, MutUI, RefType}; use eframe::egui::Ui; use egui_extras::{Column, TableBuilder, TableRow}; use std::marker::PhantomData; pub trait _ConstMutSwitchUiTableBaseCallback { type Header: _ConstMutSwitchUiTableRowCallback; type Body: _ConstMutSwitchUiTableRowCallback; fn header_to_body<'a>( header: &mut >::Clojure<'a>, ) -> impl Iterator>::Clojure<'a>>; } pub trait _ConstMutSwitchUiTableRowCallback { type Clojure<'a>; fn render_row>( row: &mut Row, clojure: &mut Self::Clojure<'_>, ); } pub trait ConstMutSwitchUiTableRow { type RefType: RefType; fn cell>(&mut self, clojure: &mut F::Clojure<'_>); } pub(super) struct ConstMutSwitchUiTableRowImpl< 'a, 'b, RefType: super::RefType, Constructor: __SwitchUiConstructor1, > { row: TableRow<'a, 'b>, __phantom: PhantomData<(Constructor, RefType)>, } impl> ConstMutSwitchUiTableRow for ConstMutSwitchUiTableRowImpl<'_, '_, RefType, Constructor> { type RefType = RefType; fn cell>(&mut self, clojure: &mut F::Clojure<'_>) { self.row .col(|ui| F::render(&mut Constructor::__wrap(ui), clojure)); } } trait __SwitchUiConstructor1 { type Ctx<'a>: ConstMutSwitchUi; fn __wrap<'a>(ui: &'a mut Ui) -> Self::Ctx<'a>; } impl __SwitchUiConstructor1 for ConstUI<'_> { type Ctx<'a> = ConstUI<'a>; fn __wrap<'a>(ui: &'a mut Ui) -> Self::Ctx<'a> { todo!() } } impl __SwitchUiConstructor1 for MutUI<'_> { type Ctx<'a> = MutUI<'a>; fn __wrap<'a>(ui: &'a mut Ui) -> Self::Ctx<'a> { todo!() } } pub(super) fn render_table< 'a, Ctx: ConstMutSwitchUi, F: _ConstMutSwitchUiTableBaseCallback, Constructor: __SwitchUiConstructor1, >( ui: &mut Ui, vscroll: bool, columnsCount: usize, headerClojure: &mut >::Clojure<'_>, ) { TableBuilder::new(ui) .striped(true) // Alternating row colors .resizable(true) .vscroll(vscroll) .columns(Column::remainder(), columnsCount) .header(20.0, |row| { F::Header::render_row( &mut ConstMutSwitchUiTableRowImpl::<_, Constructor> { row, __phantom: PhantomData::default(), }, headerClojure, ) }) .body(|mut body| { for mut rowData in F::header_to_body(headerClojure) { body.row(20.0, |row| { F::Body::render_row( &mut ConstMutSwitchUiTableRowImpl::<_, Constructor> { row, __phantom: PhantomData::default(), }, &mut rowData, ) }); } }); }