diff --git a/quake_tui/src/app.rs b/quake_tui/src/app.rs index 14726195..b8971aa2 100644 --- a/quake_tui/src/app.rs +++ b/quake_tui/src/app.rs @@ -1,3 +1,15 @@ +use quake_core::entry::EntryDefines; +use quake_core::QuakeConfig; +use serde_yaml; +use std::error::Error; +use std::fs; +use std::path::Path; +use tui::buffer::Buffer; +use tui::layout::{Alignment, Corner, Rect}; +use tui::style::{Color, Modifier, Style}; +use tui::text::{Span, Spans}; +use tui::widgets::{Block, Borders, List, ListItem, Paragraph, Widget}; + pub struct App { pub mode: Mode, pub command: String, @@ -35,11 +47,72 @@ pub enum Mode { Normal, } +#[derive(Clone, Debug)] pub enum MainWidget { Home, EntryTypes, } +impl Widget for MainWidget { + fn render(self, area: Rect, buf: &mut Buffer) { + match self { + MainWidget::Home => { + let help_messages = vec![ + Spans::from(vec![ + Span::raw("Press "), + Span::styled(":", Style::default().add_modifier(Modifier::BOLD)), + Span::raw(" into command mode, "), + Span::styled("Esc", Style::default().add_modifier(Modifier::BOLD)), + Span::raw(" back to normal mode."), + ]), + Spans::from(vec![ + Span::raw("Command "), + Span::styled("listAll", Style::default().add_modifier(Modifier::BOLD)), + Span::raw(" list all workspace."), + ]), + Spans::from(vec![ + Span::raw("Command "), + Span::styled("quit", Style::default().add_modifier(Modifier::BOLD)), + Span::raw(" quit quake app."), + ]), + ]; + let p = Paragraph::new(help_messages) + .block(Block::default().title("Main").borders(Borders::ALL)) + .alignment(Alignment::Center); + p.render(area, buf); + } + MainWidget::EntryTypes => { + let entry_types: Vec = list_entry_types().unwrap_or_default(); + let entry_types_list = List::new(entry_types) + .block(Block::default().borders(Borders::ALL).title("List")) + .start_corner(Corner::TopLeft); + + entry_types_list.render(area, buf); + } + } + } +} + +fn list_entry_types() -> Result>, Box> { + let config: QuakeConfig = serde_yaml::from_str(fs::read_to_string(".quake.yaml")?.as_str())?; + let entry_defines_path = Path::new(&config.workspace).join("entries-define.yaml"); + let entry_defines: EntryDefines = + serde_yaml::from_str(&fs::read_to_string(entry_defines_path)?)?; + + Ok(entry_defines + .entries + .iter() + .map(|define| { + let entry_type = Spans::from(vec![Span::styled( + define.entry_type.clone(), + Style::default().fg(Color::Yellow), + )]); + + ListItem::new(vec![entry_type]) + }) + .collect()) +} + pub struct AppState { running: bool, } diff --git a/quake_tui/src/ui.rs b/quake_tui/src/ui.rs index 08ecceb5..8ec940fd 100644 --- a/quake_tui/src/ui.rs +++ b/quake_tui/src/ui.rs @@ -1,15 +1,8 @@ -use crate::app::{App, MainWidget, Mode}; -use quake_core::entry::EntryDefines; -use quake_core::QuakeConfig; -use serde_yaml; -use std::error::Error; -use std::fs; -use std::path::Path; +use crate::app::{App, Mode}; use tui::backend::Backend; -use tui::layout::{Alignment, Constraint, Corner, Direction, Layout, Rect}; -use tui::style::{Color, Modifier, Style}; -use tui::text::{Span, Spans}; -use tui::widgets::{Block, Borders, List, ListItem, Paragraph}; +use tui::layout::{Constraint, Direction, Layout}; +use tui::style::{Color, Style}; +use tui::widgets::{Block, Borders, Paragraph}; use tui::Frame; use unicode_width::UnicodeWidthStr; @@ -34,67 +27,5 @@ pub fn draw(f: &mut Frame, app: &mut App) { ), } - draw_main(app, f, chunks[1]); -} - -fn draw_main(app: &App, frame: &mut Frame, area: Rect) -where - B: Backend, -{ - match app.main_widget { - MainWidget::Home => { - let help_messages = vec![ - Spans::from(vec![ - Span::raw("Press "), - Span::styled(":", Style::default().add_modifier(Modifier::BOLD)), - Span::raw(" into command mode, "), - Span::styled("Esc", Style::default().add_modifier(Modifier::BOLD)), - Span::raw(" back to normal mode."), - ]), - Spans::from(vec![ - Span::raw("Command "), - Span::styled("listAll", Style::default().add_modifier(Modifier::BOLD)), - Span::raw(" list all workspace."), - ]), - Spans::from(vec![ - Span::raw("Command "), - Span::styled("quit", Style::default().add_modifier(Modifier::BOLD)), - Span::raw(" quit quake app."), - ]), - ]; - frame.render_widget( - Paragraph::new(help_messages) - .block(Block::default().title("Main").borders(Borders::ALL)) - .alignment(Alignment::Center), - area, - ) - } - MainWidget::EntryTypes => { - let entry_types: Vec = list_entry_types().unwrap_or_default(); - let entry_types_list = List::new(entry_types) - .block(Block::default().borders(Borders::ALL).title("List")) - .start_corner(Corner::TopLeft); - frame.render_widget(entry_types_list, area); - } - } -} - -fn list_entry_types() -> Result>, Box> { - let config: QuakeConfig = serde_yaml::from_str(fs::read_to_string(".quake.yaml")?.as_str())?; - let entry_defines_path = Path::new(&config.workspace).join("entries-define.yaml"); - let entry_defines: EntryDefines = - serde_yaml::from_str(&fs::read_to_string(entry_defines_path)?)?; - - Ok(entry_defines - .entries - .iter() - .map(|define| { - let entry_type = Spans::from(vec![Span::styled( - define.entry_type.clone(), - Style::default().fg(Color::Yellow), - )]); - - ListItem::new(vec![entry_type]) - }) - .collect()) + f.render_widget(app.main_widget.clone(), chunks[1]); }