use std::collections::BTreeMap;
use crate::config::{CssKind, CssLiteralUse, NamedValue, assign_palette_names};
use crate::presentation::Presentation;
use crate::workspace::{PanelId, Workspace};
pub fn styles_in_use(workspace: &Workspace) -> Vec<(PanelId, CssLiteralUse)> {
let mut ids = workspace.panel_ids();
ids.sort_by(|a, b| a.as_str().cmp(b.as_str()));
let mut out = vec![];
for id in ids {
let Some(panel) = workspace.panel(&id) else {
continue;
};
let uses = {
let view_config = panel.session.get_view_config();
panel
.renderer
.css_literals_in_use(&view_config, &panel.session)
};
out.extend(uses.into_iter().map(|x| (id.clone(), x)));
}
out
}
pub fn palette_set(workspace: &Workspace, presentation: &Presentation) -> BTreeMap<String, String> {
let host: Vec<NamedValue> = CssKind::ALL
.into_iter()
.flat_map(|kind| presentation.host_named_values(kind))
.collect();
let in_use: Vec<(CssKind, String)> = styles_in_use(workspace)
.into_iter()
.map(|(_, x)| (x.kind, x.literal))
.collect();
assign_palette_names(&presentation.palette(), &host, &in_use, &|name| {
presentation.resolve_css_var(name).is_some()
})
}
pub fn named_values(
workspace: &Workspace,
presentation: &Presentation,
kind: CssKind,
) -> Vec<NamedValue> {
let mut out: Vec<NamedValue> = palette_set(workspace, presentation)
.into_iter()
.filter(|(name, _)| name.starts_with(kind.var_prefix()))
.map(|(name, value)| NamedValue { name, value })
.collect();
for entry in presentation.host_named_values(kind) {
if !out.iter().any(|x| x.name == entry.name) {
out.push(entry);
}
}
out
}