use super::{UiState, descend};
use serde_json::Value;
const PANELS: &str = "panels";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Panel {
Conversations,
ActivityTrail,
StartGoal,
}
impl Panel {
fn key(self) -> &'static str {
match self {
Panel::Conversations => "conversations",
Panel::ActivityTrail => "activity_trail",
Panel::StartGoal => "start_goal",
}
}
pub fn default_size(self) -> f32 {
match self {
Panel::Conversations => 260.0,
Panel::ActivityTrail => 200.0,
Panel::StartGoal => 240.0,
}
}
pub fn min_size(self) -> f32 {
match self {
Panel::Conversations => 24.0,
Panel::ActivityTrail | Panel::StartGoal => 48.0,
}
}
pub fn max_size(self, window: f32) -> f32 {
crate::layout::panel_ceiling(window).max(self.min_size())
}
pub fn clamp(self, size: f32, window: f32) -> f32 {
size.max(self.min_size()).min(self.max_size(window))
}
}
impl UiState {
pub fn panel_size(&self, panel: Panel) -> Option<f32> {
self.pane
.root
.get(PANELS)
.and_then(Value::as_object)
.and_then(|m| m.get(panel.key()))
.and_then(Value::as_f64)
.map(|size| size as f32)
}
pub fn set_panel_size(&mut self, panel: Panel, size: f32) {
let snapped = f64::from(size).round();
let slot = descend(&mut self.pane.root, PANELS.to_string());
slot.insert(panel.key().to_string(), Value::from(snapped));
self.pane.save();
}
}
#[cfg(test)]
mod tests;