use crate::area::Area;
use crate::errors::Result;
use crate::skin::MadSkin;
use crate::views::TextView;
pub struct MadView {
markdown: String,
area: Area,
pub skin: MadSkin,
pub scroll: i32,
}
impl MadView {
pub fn from(markdown: String, area: Area, skin: MadSkin) -> MadView {
MadView {
markdown,
area,
skin,
scroll: 0,
}
}
pub fn write(&self) -> Result<()> {
self.write_on(&mut std::io::stdout())
}
pub fn write_on<W>(&self, w: &mut W) -> Result<()>
where
W: std::io::Write,
{
let text = self.skin.area_text(&self.markdown, &self.area);
let mut text_view = TextView::from(&self.area, &text);
text_view.scroll = self.scroll;
text_view.write_on(w)?;
Ok(w.flush()?)
}
pub fn resize(&mut self, area: &Area) {
if *area == self.area {
return;
}
if area.width != self.area.width {
self.scroll = 0; }
self.area.left = area.left;
self.area.top = area.top;
self.area.height = area.height;
self.area.width = area.width;
}
pub fn try_scroll_lines(&mut self, lines_count: i32) {
let text = self.skin.area_text(&self.markdown, &self.area);
let mut text_view = TextView::from(&self.area, &text);
text_view.scroll = self.scroll;
text_view.try_scroll_lines(lines_count);
self.scroll = text_view.scroll;
}
pub fn try_scroll_pages(&mut self, pages_count: i32) {
self.try_scroll_lines(pages_count * i32::from(self.area.height));
}
}