embedded_charts/dashboard/
simple.rs

1//! Simplified dashboard implementation without type erasure
2
3use super::{GridLayout, GridPosition};
4use crate::error::ChartResult;
5use embedded_graphics::primitives::Rectangle;
6use heapless::Vec;
7
8/// Maximum number of charts in a dashboard
9pub const MAX_DASHBOARD_CHARTS: usize = 16;
10
11/// A simple dashboard that manages viewport layout
12pub struct SimpleDashboard {
13    /// Grid layout configuration
14    grid: GridLayout,
15    /// Spacing between panels
16    spacing: u32,
17}
18
19impl SimpleDashboard {
20    /// Create a new dashboard
21    pub fn new(rows: u8, cols: u8, spacing: u32) -> Self {
22        Self {
23            grid: GridLayout::new(rows, cols),
24            spacing,
25        }
26    }
27
28    /// Calculate viewport for a specific grid position
29    pub fn get_viewport(&self, position: GridPosition, total_viewport: Rectangle) -> Rectangle {
30        self.grid
31            .calculate_cell_viewport(total_viewport, position, self.spacing)
32    }
33
34    /// Calculate all viewports for a given number of panels
35    pub fn get_all_viewports<const N: usize>(
36        &self,
37        total_viewport: Rectangle,
38        panel_count: usize,
39    ) -> ChartResult<Vec<Rectangle, N>> {
40        let mut positions: Vec<GridPosition, N> = Vec::new();
41        let mut index = 0;
42
43        'outer: for row in 0..self.grid.rows {
44            for col in 0..self.grid.cols {
45                if index >= panel_count {
46                    break 'outer;
47                }
48                positions
49                    .push(GridPosition::new(row, col))
50                    .map_err(|_| crate::error::ChartError::MemoryFull)?;
51                index += 1;
52            }
53        }
54
55        self.grid
56            .calculate_viewports(total_viewport, &positions, self.spacing)
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63    use embedded_graphics::prelude::*;
64
65    #[test]
66    fn test_simple_dashboard() {
67        let dashboard = SimpleDashboard::new(2, 2, 10);
68        let total_viewport = Rectangle::new(Point::new(0, 0), Size::new(200, 200));
69
70        // Test single viewport
71        let viewport = dashboard.get_viewport(GridPosition::new(0, 0), total_viewport);
72        assert_eq!(viewport.top_left, Point::new(0, 0));
73        assert_eq!(viewport.size, Size::new(95, 95));
74
75        // Test all viewports
76        let viewports: Vec<Rectangle, 4> = dashboard.get_all_viewports(total_viewport, 3).unwrap();
77        assert_eq!(viewports.len(), 3);
78    }
79}