use std::future::Future;
use std::pin::Pin;
use super::columns_iter_set::*;
use super::structural::*;
use crate::config::*;
use crate::presentation::Presentation;
use crate::renderer::*;
use crate::session::*;
use crate::utils::*;
use crate::*;
pub trait GetViewerConfigModel: HasSession + HasRenderer + HasPresentation {
fn cloned(&self) -> GetViewerConfigModelCloned {
GetViewerConfigModelCloned {
renderer: self.renderer().clone(),
session: self.session().clone(),
presentation: self.presentation().clone(),
}
}
fn get_viewer_config(&self) -> Pin<Box<dyn Future<Output = ApiResult<ViewerConfig>>>> {
clone!(self.renderer(), self.session(), self.presentation());
Box::pin(async move {
let view_config = session.get_view_config().clone();
let js_plugin = renderer.get_active_plugin()?;
let settings = presentation.is_settings_open();
let plugin = js_plugin.name();
let plugin_config: serde_json::Value = js_plugin.save().into_serde_ext()?;
let theme = presentation.get_selected_theme_name().await;
let title = presentation.get_title();
Ok(ViewerConfig {
plugin,
title,
plugin_config,
settings,
view_config,
theme,
})
})
}
}
impl<T: HasRenderer + HasSession + HasPresentation> GetViewerConfigModel for T {}
#[derive(Clone)]
pub struct GetViewerConfigModelCloned {
renderer: Renderer,
session: Session,
presentation: Presentation,
}
derive_model!(Renderer, Session, Presentation for GetViewerConfigModelCloned);
pub trait ColumnIteratorModel: HasSession + HasRenderer + HasDragDrop {
fn column_selector_iter_set<'a>(&'a self, config: &'a ViewConfig) -> ColumnsIteratorSet<'a> {
ColumnsIteratorSet::new(config, self.session(), self.renderer(), self.dragdrop())
}
}
impl<T: HasSession + HasRenderer + HasDragDrop> ColumnIteratorModel for T {}