use core::panic;
use std::collections::HashMap;
use std::default;
use log::debug;
use uuid::Uuid;
pub struct Pane {
pub id: String,
}
pub struct Tiles {
pub tree: egui_tiles::Tree<Pane>,
tile_ids_by_pane_id: HashMap<String, egui_tiles::TileId>,
}
impl default::Default for Tiles {
fn default() -> Tiles {
let mut tiles = egui_tiles::Tiles::default();
let root_pane_id = tiles.insert_pane(Pane {
id: "_root_pane".to_string(),
});
tiles.set_visible(root_pane_id, false);
let root = tiles.insert_tab_tile(vec![root_pane_id]);
Tiles {
tree: egui_tiles::Tree::new(Uuid::new_v4().to_string(), root, tiles),
tile_ids_by_pane_id: HashMap::new(),
}
}
}
impl Tiles {
pub fn add_pane(&mut self, pane: Pane) {
if self.tile_ids_by_pane_id.contains_key(&pane.id) {
return;
}
let pane_id = pane.id.clone();
let child = self.tree.tiles.insert_pane(pane);
if let Some(root_id) = self.tree.root()
&& let Some(egui_tiles::Tile::Container(root_container)) =
self.tree.tiles.get_mut(root_id)
{
debug!(
"Adding tile {:?} for {} to root container ({:?}).",
child,
pane_id,
root_container.kind()
);
root_container.add_child(child);
self.tile_ids_by_pane_id.insert(pane_id, child);
} else {
panic!("Root tile not found or is not a container.");
}
}
pub fn remove_pane(&mut self, pane_id: &str) {
if let Some(tile_id) = self.tile_ids_by_pane_id.get(pane_id) {
debug!("Removing tile {tile_id:?} of {pane_id}");
self.tree.remove_recursively(*tile_id);
self.tile_ids_by_pane_id.remove(pane_id);
}
}
pub fn set_visible(&mut self, pane_id: &str, visible: bool) {
if let Some(tile_id) = self.tile_ids_by_pane_id.get(pane_id) {
debug!("Setting visibility of tile {tile_id:?} for {pane_id} to {visible}");
self.tree.tiles.set_visible(*tile_id, visible);
}
}
}