use crate::*;
pub struct SidePanel {
id: Id,
max_width: f32,
}
impl SidePanel {
pub fn left(id_source: impl std::hash::Hash, max_width: f32) -> Self {
Self {
id: Id::new(id_source),
max_width,
}
}
}
impl SidePanel {
pub fn show<R>(
self,
ctx: &CtxRef,
add_contents: impl FnOnce(&mut Ui) -> R,
) -> InnerResponse<R> {
let Self { id, max_width } = self;
let mut panel_rect = ctx.available_rect();
panel_rect.max.x = panel_rect.max.x.at_most(panel_rect.min.x + max_width);
let layer_id = LayerId::background();
let clip_rect = ctx.input().screen_rect();
let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect);
let frame = Frame::side_top_panel(&ctx.style());
let inner_response = frame.show(&mut panel_ui, |ui| {
ui.set_min_height(ui.max_rect_finite().height()); add_contents(ui)
});
ctx.frame_state()
.allocate_left_panel(inner_response.response.rect);
inner_response
}
}
pub struct TopPanel {
id: Id,
max_height: Option<f32>,
}
impl TopPanel {
pub fn top(id_source: impl std::hash::Hash) -> Self {
Self {
id: Id::new(id_source),
max_height: None,
}
}
}
impl TopPanel {
pub fn show<R>(
self,
ctx: &CtxRef,
add_contents: impl FnOnce(&mut Ui) -> R,
) -> InnerResponse<R> {
let Self { id, max_height } = self;
let max_height = max_height.unwrap_or_else(|| ctx.style().spacing.interact_size.y);
let mut panel_rect = ctx.available_rect();
panel_rect.max.y = panel_rect.max.y.at_most(panel_rect.min.y + max_height);
let layer_id = LayerId::background();
let clip_rect = ctx.input().screen_rect();
let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect);
let frame = Frame::side_top_panel(&ctx.style());
let inner_response = frame.show(&mut panel_ui, |ui| {
ui.set_min_width(ui.max_rect_finite().width()); add_contents(ui)
});
ctx.frame_state()
.allocate_top_panel(inner_response.response.rect);
inner_response
}
}
#[derive(Default)]
pub struct CentralPanel {
frame: Option<Frame>,
}
impl CentralPanel {
pub fn frame(mut self, frame: Frame) -> Self {
self.frame = Some(frame);
self
}
}
impl CentralPanel {
pub fn show<R>(
self,
ctx: &CtxRef,
add_contents: impl FnOnce(&mut Ui) -> R,
) -> InnerResponse<R> {
let Self { frame } = self;
let panel_rect = ctx.available_rect();
let layer_id = LayerId::background();
let id = Id::new("central_panel");
let clip_rect = ctx.input().screen_rect();
let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect);
let frame = frame.unwrap_or_else(|| Frame::central_panel(&ctx.style()));
let inner_response = frame.show(&mut panel_ui, |ui| {
ui.expand_to_include_rect(ui.max_rect()); add_contents(ui)
});
ctx.frame_state()
.allocate_central_panel(inner_response.response.rect);
inner_response
}
}