use std::hash::Hash;
use re_log_types::EntityPath;
use crate::{ContainerId, Item, ViewId};
#[derive(Debug, Clone, Copy, Hash)]
#[allow(clippy::enum_variant_names)]
pub enum CollapseScope {
StreamsTree,
StreamsTreeFiltered { session_id: egui::Id },
BlueprintStreamsTree,
BlueprintStreamsTreeFiltered { session_id: egui::Id },
BlueprintTree,
BlueprintTreeFiltered { session_id: egui::Id },
}
impl CollapseScope {
const ALL: [Self; 2] = [Self::StreamsTree, Self::BlueprintTree];
pub fn item(self, item: Item) -> Option<CollapsedId> {
match item {
Item::InstancePath(instance_path) => Some(self.entity(instance_path.entity_path)),
Item::Container(container_id) => Some(self.container(container_id)),
Item::View(view_id) => Some(self.view(view_id)),
Item::DataResult(view_id, instance_path) => {
Some(self.data_result(view_id, instance_path.entity_path))
}
Item::AppId(_) | Item::DataSource(_) | Item::StoreId(_) | Item::ComponentPath(_) => {
None
}
}
}
pub fn container(self, container_id: ContainerId) -> CollapsedId {
CollapsedId {
item: CollapseItem::Container(container_id),
scope: self,
}
}
pub fn view(self, view_id: ViewId) -> CollapsedId {
CollapsedId {
item: CollapseItem::View(view_id),
scope: self,
}
}
pub fn data_result(self, view_id: ViewId, entity_path: EntityPath) -> CollapsedId {
CollapsedId {
item: CollapseItem::DataResult(view_id, entity_path),
scope: self,
}
}
pub fn entity(self, entity_path: EntityPath) -> CollapsedId {
CollapsedId {
item: CollapseItem::Entity(entity_path),
scope: self,
}
}
}
#[derive(Debug, Clone, Hash)]
pub enum CollapseItem {
Container(ContainerId),
View(ViewId),
DataResult(ViewId, EntityPath),
Entity(EntityPath),
}
impl CollapseItem {
pub fn set_open_all(&self, ctx: &egui::Context, open: bool) {
for scope in CollapseScope::ALL {
let id = CollapsedId {
item: self.clone(),
scope,
};
id.set_open(ctx, open);
}
}
}
#[derive(Debug, Clone, Hash)]
pub struct CollapsedId {
item: CollapseItem,
scope: CollapseScope,
}
impl From<CollapsedId> for egui::Id {
fn from(id: CollapsedId) -> Self {
Self::new(id)
}
}
impl CollapsedId {
pub fn egui_id(&self) -> egui::Id {
self.clone().into()
}
pub fn is_open(&self, ctx: &egui::Context) -> Option<bool> {
egui::collapsing_header::CollapsingState::load(ctx, self.egui_id())
.map(|state| state.is_open())
}
pub fn set_open(&self, ctx: &egui::Context, open: bool) {
let mut collapsing_state = egui::collapsing_header::CollapsingState::load_with_default_open(
ctx,
self.egui_id(),
false,
);
collapsing_state.set_open(open);
collapsing_state.store(ctx);
}
}