use crate::list_item::{ItemButtons, ListItemContentButtonsExt};
use crate::{UiExt as _, list_item};
pub struct SectionCollapsingHeader<'a> {
label: egui::WidgetText,
default_open: bool,
buttons: ItemButtons<'a>,
}
impl SectionCollapsingHeader<'_> {
pub fn new(label: impl Into<egui::WidgetText>) -> Self {
Self {
label: label.into(),
default_open: true,
buttons: ItemButtons::default()
.with_always_show_buttons(true),
}
}
#[inline]
pub fn default_open(mut self, default_open: bool) -> Self {
self.default_open = default_open;
self
}
pub fn show(
self,
ui: &mut egui::Ui,
add_body: impl FnOnce(&mut egui::Ui),
) -> egui::CollapsingResponse<()> {
let Self {
label,
default_open,
buttons,
} = self;
let id = ui.make_persistent_id(label.text());
let mut content = list_item::LabelContent::new(label);
*content.buttons_mut() = buttons;
let resp = list_item::ListItem::new()
.interactive(true)
.force_background(ui.tokens().section_header_color)
.show_hierarchical_with_children_unindented(ui, id, default_open, content, |ui| {
ui.add_space(4.0); add_body(ui);
ui.add_space(4.0); });
if resp.item_response.clicked() {
if let Some(mut state) = egui::collapsing_header::CollapsingState::load(ui.ctx(), id) {
state.toggle(ui);
state.store(ui.ctx());
}
}
egui::CollapsingResponse {
header_response: resp.item_response,
body_response: resp.body_response.map(|r| r.response),
body_returned: None,
openness: resp.openness,
}
}
}
impl<'a> ListItemContentButtonsExt<'a> for SectionCollapsingHeader<'a> {
fn buttons(&self) -> &ItemButtons<'a> {
&self.buttons
}
fn buttons_mut(&mut self) -> &mut ItemButtons<'a> {
&mut self.buttons
}
}