use teksilo_core::BuildContext;
use teksilo_core::widget::EventContext;
use crate::mru::{MruEntry, MruList};
use crate::store::SettingsStore;
use crate::window_state::WindowStateService;
pub trait SettingsExt {
fn settings(&self) -> &SettingsStore {
self.try_settings().unwrap_or_else(|| {
panic!(
"SettingsExt::settings(): no SettingsStore registered. \
Call TeksiloAppBuilder::settings(SettingsBundle::new()) at startup."
)
})
}
fn window_state(&self) -> &WindowStateService {
self.try_window_state().unwrap_or_else(|| {
panic!(
"SettingsExt::window_state(): no WindowStateService registered. \
Call .with_window_state(true) on the SettingsBundle."
)
})
}
fn mru<T: MruEntry>(&self) -> &MruList<T> {
self.try_mru::<T>().unwrap_or_else(|| {
panic!(
"SettingsExt::mru::<{}>(): no MruList registered. \
Construct one with MruList::open(...) and register via \
TeksiloAppBuilder::app_state(mru_handle.clone()).",
std::any::type_name::<T>(),
)
})
}
fn try_settings(&self) -> Option<&SettingsStore>;
fn try_window_state(&self) -> Option<&WindowStateService>;
fn try_mru<T: MruEntry>(&self) -> Option<&MruList<T>>;
}
impl<'a> SettingsExt for BuildContext<'a> {
fn try_settings(&self) -> Option<&SettingsStore> {
self.app_state::<SettingsStore>()
}
fn try_window_state(&self) -> Option<&WindowStateService> {
self.app_state::<WindowStateService>()
}
fn try_mru<T: MruEntry>(&self) -> Option<&MruList<T>> {
self.app_state::<MruList<T>>()
}
}
impl<'a> SettingsExt for EventContext<'a> {
fn try_settings(&self) -> Option<&SettingsStore> {
self.app_state::<SettingsStore>()
}
fn try_window_state(&self) -> Option<&WindowStateService> {
self.app_state::<WindowStateService>()
}
fn try_mru<T: MruEntry>(&self) -> Option<&MruList<T>> {
self.app_state::<MruList<T>>()
}
}