bar.rs
1 use ratatui::{ 2 layout::{Constraint, Direction, Layout}, 3 widgets::{LineGauge, Paragraph, Widget}, 4 }; 5 use specs::{Join, World, WorldExt}; 6 7 use crate::combat::CombatStats; 8 9 pub struct CombatBarView<'a> { 10 pub world: &'a World, 11 } 12 13 impl<'a> CombatBarView<'a> { 14 pub const MIN_LEN: u16 = 27; 15 } 16 17 impl<'a> Widget for CombatBarView<'a> { 18 fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) 19 where 20 Self: Sized, 21 { 22 let stats_storage = self.world.read_storage::<CombatStats>(); 23 let player_storage = self.world.read_storage::<CombatStats>(); 24 25 let (_, stats) = (&player_storage, &stats_storage) 26 .join() 27 .next() 28 .expect("should be a player"); 29 30 let combat_layout = Layout::default() 31 .direction(Direction::Horizontal) 32 .constraints(vec![ 33 Constraint::Length(5), 34 Constraint::Length(10), 35 Constraint::Length(1), 36 Constraint::Fill(1), 37 Constraint::Length(10), 38 ]) 39 .split(area); 40 41 Paragraph::new("hp: [").render(combat_layout[0], buf); 42 43 LineGauge::default() 44 .ratio(stats.hp_ratio()) 45 .render(combat_layout[1], buf); 46 47 Paragraph::new("]").render(combat_layout[2], buf); 48 49 Paragraph::new(format!("{:3> }a, {:3> }d", stats.power, stats.defense)) 50 .render(combat_layout[4], buf); 51 } 52 }