use std::cell::RefCell;
use crate::{
crossterm::event::Event, listbox, pane::Pane, snapshot::Snapshot, suggest::Suggest,
switch::ActiveKeySwitcher, text, text_editor, validate::ValidatorManager, PaneFactory,
PromptSignal,
};
use super::keymap;
pub struct Renderer {
pub keymap: RefCell<ActiveKeySwitcher<keymap::Keymap>>,
pub title_snapshot: Snapshot<text::State>,
pub text_editor_snapshot: Snapshot<text_editor::State>,
pub suggest: Option<Suggest>,
pub suggest_snapshot: Snapshot<listbox::State>,
pub validator: Option<ValidatorManager<str>>,
pub error_message_snapshot: Snapshot<text::State>,
}
impl crate::Finalizer for Renderer {
type Return = String;
fn finalize(&self) -> anyhow::Result<Self::Return> {
Ok(self
.text_editor_snapshot
.after()
.texteditor
.text_without_cursor()
.to_string())
}
}
impl crate::Renderer for Renderer {
fn create_panes(&self, width: u16, height: u16) -> Vec<Pane> {
vec![
self.title_snapshot.create_pane(width, height),
self.error_message_snapshot.create_pane(width, height),
self.text_editor_snapshot.create_pane(width, height),
self.suggest_snapshot.create_pane(width, height),
]
}
fn evaluate(&mut self, event: &Event) -> anyhow::Result<PromptSignal> {
let keymap = *self.keymap.borrow_mut().get();
keymap(event, self)
}
}