colors setting via config file
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									73db8ca32a
								
							
						
					
					
						commit
						405061265b
					
				| @ -1,4 +1,24 @@ | |||||||
| { | { | ||||||
|  |     "styles": { | ||||||
|  |         "Menu": { | ||||||
|  |             "normal_style": "", | ||||||
|  |             "hover_style": "bold yellow italic on blue", | ||||||
|  |             "normal_border_style": "blue", | ||||||
|  |             "hover_border_style": "blue", | ||||||
|  |             "normal_title_style": "blue", | ||||||
|  |             "hover_title_style": "", | ||||||
|  |             "tagged_style": "yellow italic", | ||||||
|  |         }, | ||||||
|  |         "Explorer": { | ||||||
|  |             "normal_style": "", | ||||||
|  |             "hover_style": "bold yellow italic on blue", | ||||||
|  |             "normal_border_style": "blue", | ||||||
|  |             "hover_border_style": "blue", | ||||||
|  |             "normal_title_style": "blue", | ||||||
|  |             "hover_title_style": "", | ||||||
|  |             "tagged_style": "yellow bold", | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|     "keybindings": { |     "keybindings": { | ||||||
|         "Explorer": { |         "Explorer": { | ||||||
|             "<q>": "Quit", |             "<q>": "Quit", | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ use crate::{ | |||||||
| 
 | 
 | ||||||
| #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] | #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] | ||||||
| pub enum Mode { | pub enum Mode { | ||||||
|  |     Menu, | ||||||
|     Explorer, |     Explorer, | ||||||
|     ExplorerActive, |     ExplorerActive, | ||||||
|     Empty, |     Empty, | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ use ratatui::{ | |||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{ | use crate::{ | ||||||
|  |     config::Config, | ||||||
|     widgets::{BigText, PixelSize}, 
 |     widgets::{BigText, PixelSize}, 
 | ||||||
|     action::Action, 
 |     action::Action, 
 | ||||||
|     palette::StylePalette, |     palette::StylePalette, | ||||||
| @ -46,6 +47,18 @@ impl BlockTicker { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for BlockTicker { | impl Component for BlockTicker { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::BestBlockUpdated(block) => self.block_found(block)?, |             Action::BestBlockUpdated(block) => self.block_found(block)?, | ||||||
| @ -79,7 +92,7 @@ impl Component for BlockTicker { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) |                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) | ||||||
|                     .title("Passed")) |                     .title("Passed")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
| @ -99,7 +112,7 @@ impl Component for BlockTicker { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .title("Passed")) |                     .title("Passed")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
|                 .wrap(Wrap { trim: true }); |                 .wrap(Wrap { trim: true }); | ||||||
|  | |||||||
| @ -7,7 +7,12 @@ use ratatui::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{action::Action, palette::StylePalette, widgets::{PixelSize, BigText}}; | use crate::{ | ||||||
|  |     config::Config, | ||||||
|  |     action::Action, 
 | ||||||
|  |     palette::StylePalette, 
 | ||||||
|  |     widgets::{PixelSize, BigText}, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default)] | #[derive(Debug, Default)] | ||||||
| pub struct CurrentEpoch { | pub struct CurrentEpoch { | ||||||
| @ -30,6 +35,18 @@ impl CurrentEpoch { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for CurrentEpoch { | impl Component for CurrentEpoch { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::SetEpochProgress(number, progress) => 
 |             Action::SetEpochProgress(number, progress) => 
 | ||||||
| @ -70,7 +87,7 @@ impl Component for CurrentEpoch { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .padding(Padding::new(0, 0, height.saturating_sub(3) / 2, 0)) |                     .padding(Padding::new(0, 0, height.saturating_sub(3) / 2, 0)) | ||||||
|                     .title("Epoch")) |                     .title("Epoch")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
| @ -89,7 +106,7 @@ impl Component for CurrentEpoch { | |||||||
|                 .block(Block::bordered() |                 .block(Block::bordered() | ||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .title_top(Line::from("Epoch").right_aligned()) |                     .title_top(Line::from("Epoch").right_aligned()) | ||||||
|                     .title_top(Line::from(format!("{}{} {}{}", |                     .title_top(Line::from(format!("{}{} {}{}", | ||||||
|                                 if big_time { hours } else { minutes }, |                                 if big_time { hours } else { minutes }, | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ use ratatui::{ | |||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{ | use crate::{ | ||||||
|  |     config::Config, | ||||||
|     action::Action, 
 |     action::Action, 
 | ||||||
|     palette::StylePalette, 
 |     palette::StylePalette, 
 | ||||||
|     types::EraInfo, 
 |     types::EraInfo, 
 | ||||||
| @ -35,6 +36,18 @@ impl CurrentEra { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for CurrentEra { | impl Component for CurrentEra { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::SetActiveEra(era_info) => self.update_era(era_info)?, |             Action::SetActiveEra(era_info) => self.update_era(era_info)?, | ||||||
| @ -88,7 +101,7 @@ impl Component for CurrentEra { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .padding(Padding::new(0, 0, (height.saturating_sub(3)) / 2, 0)) |                     .padding(Padding::new(0, 0, (height.saturating_sub(3)) / 2, 0)) | ||||||
|                     .title("Era")) |                     .title("Era")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
| @ -107,7 +120,7 @@ impl Component for CurrentEra { | |||||||
|                 .block(Block::bordered() |                 .block(Block::bordered() | ||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .title_top(Line::from("Era").right_aligned()) |                     .title_top(Line::from("Era").right_aligned()) | ||||||
|                     .title_top(Line::from(format!("{}{} {}{}", |                     .title_top(Line::from(format!("{}{} {}{}", | ||||||
|                                 if big_time { hours } else { minutes }, |                                 if big_time { hours } else { minutes }, | ||||||
|  | |||||||
| @ -5,7 +5,6 @@ use primitive_types::H256; | |||||||
| use ratatui::{ | use ratatui::{ | ||||||
|     layout::{Alignment, Rect}, 
 |     layout::{Alignment, Rect}, 
 | ||||||
|     prelude::*, 
 |     prelude::*, 
 | ||||||
|     style::Style, 
 |  | ||||||
|     text::Line, 
 |     text::Line, 
 | ||||||
|     widgets::{Block, BorderType, Paragraph}, |     widgets::{Block, BorderType, Paragraph}, | ||||||
|     Frame |     Frame | ||||||
| @ -16,7 +15,7 @@ use codec::Decode; | |||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{ | use crate::{ | ||||||
|     types::CasperExtrinsicDetails, CasperAccountId, |     types::CasperExtrinsicDetails, CasperAccountId, | ||||||
|     action::Action, app::Mode, palette::StylePalette, |     config::Config, action::Action, app::Mode, palette::StylePalette, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct BlockInfo { | struct BlockInfo { | ||||||
| @ -164,10 +163,6 @@ impl ExplorerBlocks { | |||||||
|         let total_length = rect.as_size().height as usize - 2; |         let total_length = rect.as_size().height as usize - 2; | ||||||
|         let mut items = Vec::new(); |         let mut items = Vec::new(); | ||||||
| 
 | 
 | ||||||
|         let active_style = self.palette.create_text_style(true); |  | ||||||
|         let latest_style = self.palette.create_text_style(false); |  | ||||||
|         let finalized_style = Style::new().fg(self.palette.foreground_hover()); |  | ||||||
| 
 |  | ||||||
|         let start_index = match self.used_block_number { |         let start_index = match self.used_block_number { | ||||||
|             Some(used_block) if total_length < self.blocks.len() => { |             Some(used_block) if total_length < self.blocks.len() => { | ||||||
|                 self.blocks |                 self.blocks | ||||||
| @ -180,14 +175,16 @@ impl ExplorerBlocks { | |||||||
|             _ => 0, |             _ => 0, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  |         let normal_style = self.palette.create_text_style(false); | ||||||
|  |         let active_style = self.palette.create_text_style(true); | ||||||
|  |         let finalized_style = self.palette.create_tagged_style(); | ||||||
|  | 
 | ||||||
|         for (idx, current_block_info) in self.blocks.iter().skip(start_index).enumerate() { |         for (idx, current_block_info) in self.blocks.iter().skip(start_index).enumerate() { | ||||||
|             if idx == total_length { break; } |             if idx == total_length { break; } | ||||||
| 
 | 
 | ||||||
|             let style = match self.used_block_number { |             let style = match self.used_block_number { | ||||||
|                 Some(used_block) if current_block_info.block_number == used_block => active_style, |                 Some(used_block) if current_block_info.block_number == used_block => active_style, | ||||||
|                 _ => { |                 _ => if current_block_info.finalized { finalized_style } else { normal_style } | ||||||
|                     if current_block_info.finalized { finalized_style } else { latest_style } |  | ||||||
|                 } |  | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             items.push(self.prepare_block_line_info(¤t_block_info, width).style(style)); |             items.push(self.prepare_block_line_info(¤t_block_info, width).style(style)); | ||||||
| @ -233,24 +230,22 @@ impl ExplorerBlocks { | |||||||
|         let mut total_length = rect.as_size().height - 2; |         let mut total_length = rect.as_size().height - 2; | ||||||
|         let mut items = Vec::new(); |         let mut items = Vec::new(); | ||||||
| 
 | 
 | ||||||
|         let normal_style = self.palette.create_text_style(false); |  | ||||||
|         let active_style = self.palette.create_text_style(true); |  | ||||||
| 
 |  | ||||||
|         if let Some(used_block_number) = self.used_block_number { |         if let Some(used_block_number) = self.used_block_number { | ||||||
|             let default_hash = H256::repeat_byte(69u8); |             let default_hash = H256::repeat_byte(69u8); | ||||||
|             let hash = self.block_headers |             let hash = self.block_headers | ||||||
|                 .get(&used_block_number) |                 .get(&used_block_number) | ||||||
|                 .unwrap_or(&default_hash); |                 .unwrap_or(&default_hash); | ||||||
| 
 | 
 | ||||||
|  |             let normal_style = self.palette.create_text_style(false); | ||||||
|  |             let active_style = self.palette.create_text_style(true); | ||||||
|  | 
 | ||||||
|             if let Some(exts) = self.extrinsics.get(&hash) { |             if let Some(exts) = self.extrinsics.get(&hash) { | ||||||
|                 for (index, ext) in exts.iter().enumerate() { |                 for (index, ext) in exts.iter().enumerate() { | ||||||
|                     if total_length == 0 { break; } |                     if total_length == 0 { break; } | ||||||
| 
 | 
 | ||||||
|                     let style = if let Some((_, used_ext_index)) = self.used_ext_index { |                     let style = if let Some((_, used_ext_index)) = self.used_ext_index { | ||||||
|                         if index == used_ext_index { active_style } else { normal_style } |                         if index == used_ext_index { active_style } else { normal_style } | ||||||
|                     } else { |                     } else { normal_style }; | ||||||
|                         normal_style |  | ||||||
|                     }; |  | ||||||
| 
 | 
 | ||||||
|                     items.push(self.prepare_ext_line_info( |                     items.push(self.prepare_ext_line_info( | ||||||
|                             index, 
 |                             index, 
 | ||||||
| @ -405,7 +400,9 @@ impl ExplorerBlocks { | |||||||
|         border_style: Color, |         border_style: Color, | ||||||
|         border_type: BorderType, |         border_type: BorderType, | ||||||
|     ) -> Paragraph { |     ) -> Paragraph { | ||||||
|         let title_style = self.palette.create_title_style(); |         let title_style = self | ||||||
|  |             .palette | ||||||
|  |             .create_title_style(self.is_active && self.used_paragraph_index == 0); | ||||||
|         Paragraph::new(self.prepare_block_lines(place)) |         Paragraph::new(self.prepare_block_lines(place)) | ||||||
|             .block(Block::bordered() |             .block(Block::bordered() | ||||||
|                 .border_style(border_style) |                 .border_style(border_style) | ||||||
| @ -422,7 +419,9 @@ impl ExplorerBlocks { | |||||||
|         border_style: Color, |         border_style: Color, | ||||||
|         border_type: BorderType, |         border_type: BorderType, | ||||||
|     ) -> Paragraph { |     ) -> Paragraph { | ||||||
|         let title_style = self.palette.create_title_style(); |         let title_style = self | ||||||
|  |             .palette | ||||||
|  |             .create_title_style(self.is_active && self.used_paragraph_index == 1); | ||||||
|         Paragraph::new(self.prepare_ext_lines(place)) |         Paragraph::new(self.prepare_ext_lines(place)) | ||||||
|             .block(Block::bordered() |             .block(Block::bordered() | ||||||
|                 .border_style(border_style) |                 .border_style(border_style) | ||||||
| @ -439,7 +438,7 @@ impl ExplorerBlocks { | |||||||
|         border_style: Color, |         border_style: Color, | ||||||
|         border_type: BorderType, |         border_type: BorderType, | ||||||
|     ) -> Paragraph { |     ) -> Paragraph { | ||||||
|         let title_style = self.palette.create_title_style(); |         let title_style = self.palette.create_title_style(false); | ||||||
|         Paragraph::new(self.prepare_event_lines(place)) |         Paragraph::new(self.prepare_event_lines(place)) | ||||||
|             .block(Block::bordered() |             .block(Block::bordered() | ||||||
|                 .border_style(border_style) |                 .border_style(border_style) | ||||||
| @ -452,6 +451,19 @@ impl ExplorerBlocks { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for ExplorerBlocks { | impl Component for ExplorerBlocks { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |             self.palette.with_tagged_style(style.get("tagged_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { |     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { | ||||||
|         match key.code { |         match key.code { | ||||||
|             KeyCode::Char('k') | KeyCode::Up if self.is_active => self.move_up(), 
 |             KeyCode::Char('k') | KeyCode::Up if self.is_active => self.move_up(), 
 | ||||||
|  | |||||||
| @ -4,15 +4,16 @@ use ratatui::{ | |||||||
|     layout::{Alignment, Rect}, 
 |     layout::{Alignment, Rect}, 
 | ||||||
|     text::Line, 
 |     text::Line, 
 | ||||||
|     widgets::{Bar, BarChart, BarGroup, Block}, |     widgets::{Bar, BarChart, BarGroup, Block}, | ||||||
|     Frame |     Frame, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::action::Action; | use crate::{palette::StylePalette, config::Config, action::Action}; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default)] | #[derive(Debug, Default)] | ||||||
| pub struct ExtrinsicsChart { | pub struct ExtrinsicsChart { | ||||||
|     extrinsics: VecDeque<(u32, usize)>, |     extrinsics: VecDeque<(u32, usize)>, | ||||||
|  |     palette: StylePalette, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl ExtrinsicsChart { | impl ExtrinsicsChart { | ||||||
| @ -21,6 +22,7 @@ impl ExtrinsicsChart { | |||||||
|     const BAR_GAP: usize = 1; |     const BAR_GAP: usize = 1; | ||||||
| 
 | 
 | ||||||
|     fn extrinsics_bar_chart(&self, width: u16) -> BarChart { |     fn extrinsics_bar_chart(&self, width: u16) -> BarChart { | ||||||
|  |         let (border_style, border_type) = self.palette.create_border_style(false); | ||||||
|         let length = (width as usize) / (Self::BAR_WIDTH + Self::BAR_GAP); |         let length = (width as usize) / (Self::BAR_WIDTH + Self::BAR_GAP); | ||||||
| 
 | 
 | ||||||
|         let bars: Vec<Bar> = self.extrinsics |         let bars: Vec<Bar> = self.extrinsics | ||||||
| @ -32,7 +34,12 @@ impl ExtrinsicsChart { | |||||||
| 
 | 
 | ||||||
|         BarChart::default() |         BarChart::default() | ||||||
|             .data(BarGroup::default().bars(&bars)) |             .data(BarGroup::default().bars(&bars)) | ||||||
|             .block(Block::bordered().title_alignment(Alignment::Right).title("Tx. Heat Map")) |             .block(Block::bordered() | ||||||
|  |                 .border_style(border_style) | ||||||
|  |                 .border_type(border_type) | ||||||
|  |                 .title_style(self.palette.create_title_style(false)) | ||||||
|  |                 .title_alignment(Alignment::Right) | ||||||
|  |                 .title("Tx. Heat Map")) | ||||||
|             .bar_width(8) |             .bar_width(8) | ||||||
|             .bar_gap(1) |             .bar_gap(1) | ||||||
|     } |     } | ||||||
| @ -64,6 +71,18 @@ impl ExtrinsicsChart { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for ExtrinsicsChart { | impl Component for ExtrinsicsChart { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::ExtrinsicsLength(block, length) => self.update_extrinsics_length(block, length)?, |             Action::ExtrinsicsLength(block, length) => self.update_extrinsics_length(block, length)?, | ||||||
|  | |||||||
| @ -6,7 +6,12 @@ use ratatui::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{action::Action, palette::StylePalette, widgets::{PixelSize, BigText}}; | use crate::{ | ||||||
|  |     config::Config, 
 | ||||||
|  |     action::Action, 
 | ||||||
|  |     palette::StylePalette, 
 | ||||||
|  |     widgets::{PixelSize, BigText}, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default)] | #[derive(Debug, Default)] | ||||||
| pub struct FinalizedBlock { | pub struct FinalizedBlock { | ||||||
| @ -22,6 +27,18 @@ impl FinalizedBlock { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for FinalizedBlock { | impl Component for FinalizedBlock { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::NewFinalizedBlock(number) => self.update_block_number(number)?, |             Action::NewFinalizedBlock(number) => self.update_block_number(number)?, | ||||||
| @ -46,7 +63,7 @@ impl Component for FinalizedBlock { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) |                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) | ||||||
|                     .title("Latest")) |                     .title("Latest")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
| @ -66,7 +83,7 @@ impl Component for FinalizedBlock { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .title("Latest")) |                     .title("Latest")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
|                 .wrap(Wrap { trim: true }); |                 .wrap(Wrap { trim: true }); | ||||||
|  | |||||||
| @ -6,7 +6,12 @@ use ratatui::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::{action::Action, palette::StylePalette, widgets::{PixelSize, BigText}}; | use crate::{ | ||||||
|  |     config::Config, 
 | ||||||
|  |     action::Action, 
 | ||||||
|  |     palette::StylePalette, 
 | ||||||
|  |     widgets::{PixelSize, BigText}, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default)] | #[derive(Debug, Default)] | ||||||
| pub struct LatestBlock { | pub struct LatestBlock { | ||||||
| @ -22,6 +27,18 @@ impl LatestBlock { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for LatestBlock { | impl Component for LatestBlock { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn update(&mut self, action: Action) -> Result<Option<Action>> { |     fn update(&mut self, action: Action) -> Result<Option<Action>> { | ||||||
|         match action { |         match action { | ||||||
|             Action::NewBestBlock(number) => self.update_block_number(number)?, |             Action::NewBestBlock(number) => self.update_block_number(number)?, | ||||||
| @ -46,7 +63,7 @@ impl Component for LatestBlock { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) |                     .padding(Padding::new(0, 0, height.saturating_sub(2) / 2, 0)) | ||||||
|                     .title("Latest")) |                     .title("Latest")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
| @ -66,7 +83,7 @@ impl Component for LatestBlock { | |||||||
|                     .border_style(border_style) |                     .border_style(border_style) | ||||||
|                     .border_type(border_type) |                     .border_type(border_type) | ||||||
|                     .title_alignment(Alignment::Right) |                     .title_alignment(Alignment::Right) | ||||||
|                     .title_style(self.palette.create_title_style()) |                     .title_style(self.palette.create_title_style(false)) | ||||||
|                     .title("Latest")) |                     .title("Latest")) | ||||||
|                 .alignment(Alignment::Center) |                 .alignment(Alignment::Center) | ||||||
|                 .wrap(Wrap { trim: true }); |                 .wrap(Wrap { trim: true }); | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ use ratatui::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use crate::action::Action; | use crate::{config::Config, action::Action}; | ||||||
| 
 | 
 | ||||||
| mod latest_block; | mod latest_block; | ||||||
| mod finalized_block; | mod finalized_block; | ||||||
| @ -45,6 +45,15 @@ impl Default for Explorer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Component for Explorer { | impl Component for Explorer { | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(_) = config.styles.get(&crate::app::Mode::Explorer) { | ||||||
|  |             for component in self.components.iter_mut() { | ||||||
|  |                 component.register_config_handler(config.clone())?; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { |     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { | ||||||
|         for component in self.components.iter_mut() { |         for component in self.components.iter_mut() { | ||||||
|             component.handle_key_event(key)?; |             component.handle_key_event(key)?; | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ use crossterm::event::{KeyEvent, KeyCode}; | |||||||
| 
 | 
 | ||||||
| use super::Component; | use super::Component; | ||||||
| use super::palette::StylePalette; | use super::palette::StylePalette; | ||||||
| use crate::{action::Action, app::Mode}; | use crate::{config::Config, action::Action, app::Mode}; | ||||||
| 
 | 
 | ||||||
| pub struct Menu { | pub struct Menu { | ||||||
|     command_tx: Option<UnboundedSender<Action>>, |     command_tx: Option<UnboundedSender<Action>>, | ||||||
| @ -98,6 +98,18 @@ impl Component for Menu { | |||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     fn register_config_handler(&mut self, config: Config) -> Result<()> { | ||||||
|  |         if let Some(style) = config.styles.get(&crate::app::Mode::Menu) { | ||||||
|  |             self.palette.with_normal_style(style.get("normal_style").copied()); | ||||||
|  |             self.palette.with_hover_style(style.get("hover_style").copied()); | ||||||
|  |             self.palette.with_normal_border_style(style.get("normal_border_style").copied()); | ||||||
|  |             self.palette.with_hover_border_style(style.get("hover_border_style").copied()); | ||||||
|  |             self.palette.with_normal_title_style(style.get("normal_title_style").copied()); | ||||||
|  |             self.palette.with_hover_title_style(style.get("hover_title_style").copied()); | ||||||
|  |         } | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { |     fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { | ||||||
|         match key.code { |         match key.code { | ||||||
|            KeyCode::Up | KeyCode::Char('k') if self.is_active => self.move_current_up()?, 
 |            KeyCode::Up | KeyCode::Char('k') if self.is_active => self.move_current_up()?, 
 | ||||||
|  | |||||||
| @ -369,6 +369,7 @@ fn process_color_string(color_str: &str) -> (String, Modifier) { | |||||||
|         .replace("grey", "gray") |         .replace("grey", "gray") | ||||||
|         .replace("bright", "") |         .replace("bright", "") | ||||||
|         .replace("bold", "") |         .replace("bold", "") | ||||||
|  |         .replace("italic", "") | ||||||
|         .replace("underline", "") |         .replace("underline", "") | ||||||
|         .replace("inverse", ""); |         .replace("inverse", ""); | ||||||
| 
 | 
 | ||||||
| @ -382,6 +383,9 @@ fn process_color_string(color_str: &str) -> (String, Modifier) { | |||||||
|     if color_str.contains("inverse") { |     if color_str.contains("inverse") { | ||||||
|         modifiers |= Modifier::REVERSED; |         modifiers |= Modifier::REVERSED; | ||||||
|     } |     } | ||||||
|  |     if color_str.contains("italic") { | ||||||
|  |         modifiers |= Modifier::ITALIC; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     (color, modifiers) |     (color, modifiers) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										125
									
								
								src/palette.rs
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								src/palette.rs
									
									
									
									
									
								
							| @ -1,23 +1,21 @@ | |||||||
| use ratatui::style::{Style, Color, Modifier}; | use ratatui::style::{Style, Color}; | ||||||
| use ratatui::widgets::block::BorderType; | use ratatui::widgets::block::BorderType; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct StylePalette { | pub struct StylePalette { | ||||||
|     background: Option<Color>, |     normal_style: Option<Style>, | ||||||
|     foreground: Option<Color>, |     hover_style: Option<Style>, | ||||||
|     modifiers: Vec<Modifier>, |  | ||||||
| 
 | 
 | ||||||
|     background_hover: Option<Color>, |     normal_border_style: Option<Style>, | ||||||
|     foreground_hover: Option<Color>, |     hover_border_style: Option<Style>, | ||||||
|     modifiers_hover: Vec<Modifier>, |  | ||||||
| 
 | 
 | ||||||
|     border_color: Option<Color>, |     normal_title_style: Option<Style>, | ||||||
|     title_color: Option<Color>, |     hover_title_style: Option<Style>, | ||||||
|     border_type: BorderType, |  | ||||||
| 
 | 
 | ||||||
|     border_color_hover: Option<Color>, |     tagged_style: Option<Style>, | ||||||
|     //title_color_hover: Option<Color>,
 | 
 | ||||||
|     border_type_hover: BorderType, |     normal_border_type: BorderType, | ||||||
|  |     hover_border_type: BorderType, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for StylePalette { | impl Default for StylePalette { | ||||||
| @ -27,77 +25,80 @@ impl Default for StylePalette { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl StylePalette { | impl StylePalette { | ||||||
|     // TODO: make read from the config by default
 |  | ||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             background: None, |             normal_style: None, | ||||||
|             foreground: None, |             hover_style: None, | ||||||
|             modifiers: Vec::new(), |             normal_border_style: None, | ||||||
|  |             hover_border_style: None, | ||||||
|  |             normal_title_style: None, | ||||||
|  |             hover_title_style: None, | ||||||
|  |             tagged_style: None, | ||||||
| 
 | 
 | ||||||
|             background_hover: Some(Color::Blue), |             normal_border_type: BorderType::Plain, | ||||||
|             foreground_hover: Some(Color::Yellow), |             hover_border_type: BorderType::Double, | ||||||
|             modifiers_hover: vec![ |  | ||||||
|                 Modifier::ITALIC, |  | ||||||
|                 Modifier::BOLD, |  | ||||||
|             ], |  | ||||||
| 
 |  | ||||||
|             border_color: Some(Color::Blue), |  | ||||||
|             title_color: Some(Color::Blue), |  | ||||||
|             border_type: BorderType::Plain, |  | ||||||
| 
 |  | ||||||
|             border_color_hover: Some(Color::Blue), |  | ||||||
|             //title_color_hover: Some(Color::Blue),
 |  | ||||||
|             border_type_hover: BorderType::Double, |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn foreground_hover(&self) -> Color { |     pub fn with_normal_style(&mut self, normal_style: Option<Style>) { | ||||||
|         self.foreground_hover.unwrap_or_default() |         self.normal_style = normal_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_hover_style(&mut self, hover_style: Option<Style>) { | ||||||
|  |         self.hover_style = hover_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_normal_border_style(&mut self, normal_border_style: Option<Style>) { | ||||||
|  |         self.normal_border_style = normal_border_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_hover_border_style(&mut self, hover_border_style: Option<Style>) { | ||||||
|  |         self.hover_border_style = hover_border_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_normal_title_style(&mut self, normal_title_style: Option<Style>) { | ||||||
|  |         self.normal_title_style = normal_title_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_hover_title_style(&mut self, hover_title_style: Option<Style>) { | ||||||
|  |         self.hover_title_style = hover_title_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn with_tagged_style(&mut self, tagged_style: Option<Style>) { | ||||||
|  |         self.tagged_style = tagged_style; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn create_tagged_style(&self) -> Style { | ||||||
|  |         self.tagged_style.unwrap_or_default() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn create_text_style(&mut self, active: bool) -> Style { |     pub fn create_text_style(&mut self, active: bool) -> Style { | ||||||
|         if active { |         if active { 
 | ||||||
|             self.create_text_style_hover() |             self.hover_style.unwrap_or_default() | ||||||
|         } else { |         } else { 
 | ||||||
|             self.create_text_style_normal() |             self.normal_style.unwrap_or_default() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn create_border_style(&self, active: bool) -> (Color, BorderType) { |     pub fn create_border_style(&self, active: bool) -> (Color, BorderType) { | ||||||
|         if active { |         if active { | ||||||
|             ( |             ( | ||||||
|                 self.border_color_hover.unwrap_or_default(), 
 |                 self.hover_border_style.map(|style| style.fg).flatten().unwrap_or_default(), | ||||||
|                 self.border_type_hover, 
 |                 self.hover_border_type, 
 | ||||||
|             ) |             ) | ||||||
|         } else { |         } else { | ||||||
|             ( |             ( | ||||||
|                 self.border_color.unwrap_or_default(), 
 |                 self.normal_border_style.map(|style| style.fg).flatten().unwrap_or_default(), | ||||||
|                 self.border_type, 
 |                 self.normal_border_type, 
 | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn create_title_style(&mut self) -> Style { |     pub fn create_title_style(&self, active: bool) -> Style { | ||||||
|         Style::default().fg(self.title_color.unwrap_or_default()) |         if active { | ||||||
|     } |             self.normal_title_style.unwrap_or_default() | ||||||
| 
 |         } else { | ||||||
|     fn create_text_style_normal(&self) -> Style { |             self.hover_title_style.unwrap_or_default() | ||||||
|         let mut style = Style::default() |  | ||||||
|             .fg(self.foreground.unwrap_or_default()) |  | ||||||
|             .bg(self.background.unwrap_or_default()); |  | ||||||
|         for modifier in self.modifiers.iter() { |  | ||||||
|             style = style.add_modifier(*modifier); |  | ||||||
|         } |         } | ||||||
|         style |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn create_text_style_hover(&self) -> Style { |  | ||||||
|         let mut style = Style::default() |  | ||||||
|             .fg(self.foreground_hover.unwrap_or_default()) |  | ||||||
|             .bg(self.background_hover.unwrap_or_default()); |  | ||||||
|         for modifier in self.modifiers_hover.iter() { |  | ||||||
|             style = style.add_modifier(*modifier); |  | ||||||
|         } |  | ||||||
|         style |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user