104 lines
3.0 KiB
Rust
104 lines
3.0 KiB
Rust
|
|
//! Persistence example with a runnable UI:
|
||
|
|
//! `cargo run --example 4_persistence`
|
||
|
|
|
||
|
|
use eframe::egui;
|
||
|
|
use grimdock::{
|
||
|
|
ChildSide, DropPolicy, PaneBuilder, PaneOptions, PanelContext, PanelStyle, PanelTree,
|
||
|
|
PersistedPanelTree, SplitDir, Tab,
|
||
|
|
};
|
||
|
|
|
||
|
|
fn main() -> eframe::Result<()> {
|
||
|
|
let options = eframe::NativeOptions {
|
||
|
|
viewport: egui::ViewportBuilder::default()
|
||
|
|
.with_title("grimdock 4_persistence")
|
||
|
|
.with_inner_size([960.0, 600.0]),
|
||
|
|
..Default::default()
|
||
|
|
};
|
||
|
|
|
||
|
|
eframe::run_native(
|
||
|
|
"grimdock 4_persistence",
|
||
|
|
options,
|
||
|
|
Box::new(|_cc| Ok(Box::new(App::new()))),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
struct App {
|
||
|
|
tree: PanelTree<&'static str>,
|
||
|
|
saved: Option<PersistedPanelTree<&'static str>>,
|
||
|
|
style: PanelStyle,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl App {
|
||
|
|
fn new() -> Self {
|
||
|
|
Self {
|
||
|
|
tree: make_tree(),
|
||
|
|
saved: None,
|
||
|
|
style: PanelStyle::default(),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl eframe::App for App {
|
||
|
|
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
||
|
|
egui::Panel::top("controls").show(ctx, |ui| {
|
||
|
|
ui.horizontal(|ui| {
|
||
|
|
if ui.button("Save layout").clicked() {
|
||
|
|
self.saved = Some(self.tree.to_persisted());
|
||
|
|
}
|
||
|
|
|
||
|
|
if ui.button("Restore saved layout").clicked() {
|
||
|
|
if let Some(saved) = self.saved.clone() {
|
||
|
|
self.tree =
|
||
|
|
PanelTree::from_persisted(saved).expect("saved layout should restore");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ui.button("Reset demo layout").clicked() {
|
||
|
|
self.tree = make_tree();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
if let Some(saved) = &self.saved {
|
||
|
|
ui.label(format!(
|
||
|
|
"Saved version {} with {} persisted nodes",
|
||
|
|
saved.version,
|
||
|
|
saved.nodes.len()
|
||
|
|
));
|
||
|
|
} else {
|
||
|
|
ui.label("No saved layout yet.");
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
egui::CentralPanel::default()
|
||
|
|
.frame(egui::Frame::NONE)
|
||
|
|
.show(ctx, |ui| {
|
||
|
|
PanelContext::new(ui, &mut self.tree, &self.style).show(|ui, tab_id| {
|
||
|
|
ui.heading(*tab_id);
|
||
|
|
ui.label("Drag tabs, resize panes, then press Save layout.");
|
||
|
|
ui.label("Restore saved layout to rebuild the tree from the persisted format.");
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn make_tree() -> PanelTree<&'static str> {
|
||
|
|
let mut options = PaneOptions::default();
|
||
|
|
options.drop_policy = DropPolicy::merge_only();
|
||
|
|
options.allow_resize = false;
|
||
|
|
|
||
|
|
let mut tree = PanelTree::from_pane(
|
||
|
|
PaneBuilder::new(Tab::new("editor", "editor").with_leading_visual(">"))
|
||
|
|
.push_tab(Tab::new("search", "search").with_leading_visual("?"))
|
||
|
|
.with_options(options),
|
||
|
|
);
|
||
|
|
|
||
|
|
tree.split_leaf(
|
||
|
|
0,
|
||
|
|
SplitDir::Vertical,
|
||
|
|
Tab::new("terminal", "terminal").with_leading_visual("$"),
|
||
|
|
ChildSide::Second,
|
||
|
|
);
|
||
|
|
|
||
|
|
tree
|
||
|
|
}
|