kk/src/display/body.rs

109 lines
2.4 KiB
Rust

use std::io::{Stdout, Write};
use termion::{clear, cursor, raw::RawTerminal};
use super::{Environment, Event, Page};
type Result<T> = std::result::Result<T, anyhow::Error>;
#[derive(Debug, Clone)]
pub enum Body {
Echo,
Signin(SigninPage),
}
impl Body {
fn echo(env: Environment, screen: &mut RawTerminal<Stdout>, event: Event) -> Result<()> {
let event = format!("{}", event);
write!(
screen,
"{theme}{clear}{start}{}",
env.frame.write(&format!("Event: {}", event), 1, 1),
theme = env.theme.display_string(),
clear = clear::All,
start = env.frame.goto(1, 1)
)?;
screen.flush()?;
Ok(())
}
}
impl Page for Body {
fn receive_event(
&mut self,
env: Environment,
screen: &mut RawTerminal<Stdout>,
event: Event,
) -> Result<()> {
match self {
Body::Signin(b) => b.receive_event(env, screen, event)?,
Body::Echo => Body::echo(env, screen, event)?,
};
Ok(())
}
fn init(&self, env: Environment, screen: &mut RawTerminal<Stdout>) -> Result<()> {
write!(
screen,
"{theme}{clear}{cursor}{fr}",
theme = env.theme.display_string(),
fr = env.frame.frame_str(),
cursor = env.frame.goto(0, 0),
clear = clear::All
)?;
screen.flush()?;
Ok(())
}
}
#[derive(Debug, Clone, Default)]
struct SigninPage {
hostname: String,
username: String,
cursor: SigninCursorLocation,
}
#[derive(Debug, Clone)]
enum SigninCursorLocation {
Hostname,
Username,
Next,
}
impl Default for SigninCursorLocation {
fn default() -> Self {
Self::Hostname
}
}
impl SigninPage {
fn frame_string() -> String {
format!("")
}
}
impl Page for SigninPage {
fn receive_event(
&mut self,
env: Environment,
screen: &mut RawTerminal<Stdout>,
event: Event,
) -> Result<()> {
Ok(())
}
fn init(&self, env: Environment, screen: &mut RawTerminal<Stdout>) -> Result<()> {
write!(
screen,
"{theme}{clear}{hide_cursor}{frame}",
frame = env.frame.frame_str(),
theme = env.theme.display_string(),
clear = clear::All,
hide_cursor = cursor::Hide,
)?;
screen.flush()?;
Ok(())
}
}