use futures::future::join_all;
use perspective_client::clone;
use perspective_js::utils::*;
use crate::presentation::Presentation;
use crate::renderer::{Renderer, StagedEdit};
use crate::session::{EditDelta, OpKind, Session};
use crate::workspace::Workspace;
pub(crate) async fn seed_panel_theme(
presentation: &Presentation,
session: &Session,
renderer: &Renderer,
) {
if renderer.theme().is_none() {
submit_theme(
session,
renderer,
presentation.get_default_theme_name().await,
);
}
}
pub fn submit_theme(session: &Session, renderer: &Renderer, theme: Option<String>) {
let staged = renderer.stage(StagedEdit::Theme(theme.clone()));
let kind = OpKind::Edit {
delta: EditDelta::Renderer,
swaps_plugin: false,
};
let _ticket = session.submit(kind, {
clone!(renderer);
move |_ctx| {
Box::pin(async move {
renderer.commit_theme(theme);
drop(staged);
Ok(None)
})
}
});
}
pub fn submit_theme_stamped(session: &Session, renderer: &Renderer, theme: Option<String>) {
submit_theme(session, renderer, theme);
renderer.stamp_theme(None);
}
pub(crate) async fn seed_default_themes(presentation: &Presentation, workspace: &Workspace) {
for panel in workspace.panels() {
seed_panel_theme(presentation, &panel.session, &panel.renderer).await;
}
}
pub fn update_theme(
session: &Session,
renderer: &Renderer,
presentation: &Presentation,
workspace: &Workspace,
theme: Option<String>,
) {
if let Some(name) = &theme {
submit_theme_stamped(session, renderer, Some(name.clone()));
}
let presentation = presentation.clone();
let workspace = workspace.clone();
let renderer = renderer.clone();
let session = session.clone();
ApiFuture::spawn(async move {
match theme {
Some(name) => {
presentation.set_theme_name(Some(&name)).await?;
},
None => {
presentation.reset_theme().await?;
let default = presentation.get_default_theme_name().await;
submit_theme_stamped(&session, &renderer, default);
},
}
let panels = workspace.panels();
join_all(panels.iter().map(|panel| async move {
if panel.renderer.needs_restyle() {
panel.renderer.restyle_all().await?;
}
ApiResult::<()>::Ok(())
}))
.await
.into_iter()
.collect::<ApiResult<Vec<_>>>()?;
presentation.publish_theme_config().await?;
Ok(())
});
}