Skip to content

Commit

Permalink
refactor(tui): extract main render logic to MainWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
Eliot00 committed Dec 10, 2021
1 parent a4753a8 commit 907152b
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 74 deletions.
73 changes: 73 additions & 0 deletions quake_tui/src/app.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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<ListItem> = 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<Vec<ListItem<'static>>, Box<dyn Error>> {
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,
}
Expand Down
79 changes: 5 additions & 74 deletions quake_tui/src/ui.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -34,67 +27,5 @@ pub fn draw<B: Backend>(f: &mut Frame<B>, app: &mut App) {
),
}

draw_main(app, f, chunks[1]);
}

fn draw_main<B>(app: &App, frame: &mut Frame<B>, 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<ListItem> = 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<Vec<ListItem<'static>>, Box<dyn Error>> {
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]);
}

0 comments on commit 907152b

Please sign in to comment.