Skip to main content

sim_lib_web_layout/
pane.rs

1//! Pane records.
2//!
3//! A pane is a map value: its id, the resource it shows, the active lens, its
4//! dock position, and its rectangle. Panes are plain data inside the workspace
5//! value.
6
7use sim_kernel::{Expr, Symbol};
8
9use crate::value::{get, int, map};
10
11/// Build a rectangle value.
12pub fn rect(x: i64, y: i64, w: i64, h: i64) -> Expr {
13    map(vec![
14        ("x", int(x)),
15        ("y", int(y)),
16        ("w", int(w)),
17        ("h", int(h)),
18    ])
19}
20
21/// Build a pane record.
22pub fn new_pane(id: &str, resource: Expr, lens: &str, dock: &str) -> Expr {
23    map(vec![
24        ("id", Expr::Symbol(Symbol::new(id))),
25        ("resource", resource),
26        ("lens", Expr::Symbol(Symbol::new(lens))),
27        ("dock", Expr::Symbol(Symbol::new(dock))),
28        ("rect", rect(0, 0, 400, 300)),
29    ])
30}
31
32/// The pane id, if present.
33pub fn pane_id(pane: &Expr) -> Option<Symbol> {
34    match get(pane, "id") {
35        Some(Expr::Symbol(symbol)) => Some(symbol.clone()),
36        _ => None,
37    }
38}
39
40/// The pane dock symbol, if present.
41pub fn pane_dock(pane: &Expr) -> Option<Symbol> {
42    match get(pane, "dock") {
43        Some(Expr::Symbol(symbol)) => Some(symbol.clone()),
44        _ => None,
45    }
46}
47
48/// The pane's active lens, if present.
49pub fn pane_lens(pane: &Expr) -> Option<Symbol> {
50    match get(pane, "lens") {
51        Some(Expr::Symbol(symbol)) => Some(symbol.clone()),
52        _ => None,
53    }
54}
55
56/// The pane resource value, if present.
57pub fn pane_resource(pane: &Expr) -> Option<&Expr> {
58    get(pane, "resource")
59}
60
61/// The pane rectangle, if present.
62pub fn pane_rect(pane: &Expr) -> Option<&Expr> {
63    get(pane, "rect")
64}