summaryrefslogtreecommitdiffstats
path: root/src/canvas.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/canvas.rs')
-rw-r--r--src/canvas.rs153
1 files changed, 57 insertions, 96 deletions
diff --git a/src/canvas.rs b/src/canvas.rs
index d85f2444..626f4f7f 100644
--- a/src/canvas.rs
+++ b/src/canvas.rs
@@ -1,6 +1,5 @@
-use anyhow::Context;
use itertools::izip;
-use std::collections::HashMap;
+use std::{collections::HashMap, str::FromStr};
use tui::{
backend::Backend,
@@ -25,6 +24,7 @@ use crate::{
data_conversion::{ConvertedBatteryData, ConvertedCpuData, ConvertedProcessData},
options::Config,
utils::error,
+ utils::error::BottomError,
};
mod canvas_colours;
@@ -59,6 +59,35 @@ pub struct DisplayableData {
pub battery_data: Vec<ConvertedBatteryData>,
}
+#[derive(Debug)]
+pub enum ColourScheme {
+ Default,
+ DefaultLight,
+ Gruvbox,
+ GruvboxLight,
+ // Nord,
+ Custom,
+}
+
+impl FromStr for ColourScheme {
+ type Err = BottomError;
+
+ fn from_str(s: &str) -> error::Result<Self> {
+ let lower_case = s.to_lowercase();
+ match lower_case.as_str() {
+ "default" => Ok(ColourScheme::Default),
+ "default-light" => Ok(ColourScheme::DefaultLight),
+ "gruvbox" => Ok(ColourScheme::Gruvbox),
+ "gruvbox-light" => Ok(ColourScheme::GruvboxLight),
+ // "nord" => Ok(ColourScheme::Nord),
+ _ => Err(BottomError::ConfigError(format!(
+ "\"{}\" is an invalid built-in color scheme.",
+ s
+ ))),
+ }
+ }
+}
+
/// Handles the canvas' state. TODO: [OPT] implement this.
pub struct Painter {
pub colours: CanvasColours,
@@ -78,6 +107,7 @@ pub struct Painter {
impl Painter {
pub fn init(
widget_layout: BottomLayout, table_gap: u16, is_basic_mode: bool, config: &Config,
+ colour_scheme: ColourScheme,
) -> anyhow::Result<Self> {
// Now for modularity; we have to also initialize the base layouts!
// We want to do this ONCE and reuse; after this we can just construct
@@ -161,117 +191,48 @@ impl Painter {
table_height_offset: if is_basic_mode { 2 } else { 4 } + table_gap,
};
- painter.generate_config_colours(config)?;
+ if let ColourScheme::Custom = colour_scheme {
+ painter.generate_config_colours(config)?;
+ } else {
+ painter.generate_colour_scheme(colour_scheme)?;
+ }
painter.colours.generate_remaining_cpu_colours();
painter.complete_painter_init();
Ok(painter)
}
- pub fn generate_config_colours(&mut self, config: &Config) -> anyhow::Result<()> {
+ fn generate_config_colours(&mut self, config: &Config) -> anyhow::Result<()> {
if let Some(colours) = &config.colors {
- if let Some(border_color) = &colours.border_color {
- self.colours
- .set_border_colour(border_color)
- .context("Update 'border_color' in your config file..")?;
- }
-
- if let Some(highlighted_border_color) = &colours.highlighted_border_color {
- self.colours
- .set_highlighted_border_colour(highlighted_border_color)
- .context("Update 'highlighted_border_color' in your config file..")?;
- }
-
- if let Some(text_color) = &colours.text_color {
- self.colours
- .set_text_colour(text_color)
- .context("Update 'text_color' in your config file..")?;
- }
-
- if let Some(avg_cpu_color) = &colours.avg_cpu_color {
- self.colours
- .set_avg_cpu_colour(avg_cpu_color)
- .context("Update 'avg_cpu_color' in your config file..")?;
- }
-
- if let Some(all_cpu_color) = &colours.all_cpu_color {
- self.colours
- .set_all_cpu_colour(all_cpu_color)
- .context("Update 'all_cpu_color' in your config file..")?;
- }
+ self.colours.set_colours_from_palette(colours)?;
+ }
- if let Some(cpu_core_colors) = &colours.cpu_core_colors {
- self.colours
- .set_cpu_colours(cpu_core_colors)
- .context("Update 'cpu_core_colors' in your config file..")?;
- }
+ Ok(())
+ }
- if let Some(ram_color) = &colours.ram_color {
- self.colours
- .set_ram_colour(ram_color)
- .context("Update 'ram_color' in your config file..")?;
+ fn generate_colour_scheme(&mut self, colour_scheme: ColourScheme) -> anyhow::Result<()> {
+ match colour_scheme {
+ ColourScheme::Default => {
+ // Don't have to do anything.
}
-
- if let Some(swap_color) = &colours.swap_color {
+ ColourScheme::DefaultLight => {
self.colours
- .set_swap_colour(swap_color)
- .context("Update 'swap_color' in your config file..")?;
+ .set_colours_from_palette(&*DEFAULT_LIGHT_MODE_COLOUR_PALETTE)?;
}
-
- if let Some(rx_color) = &colours.rx_color {
+ ColourScheme::Gruvbox => {
self.colours
- .set_rx_colour(rx_color)
- .context("Update 'rx_color' in your config file..")?;
+ .set_colours_from_palette(&*GRUVBOX_COLOUR_PALETTE)?;
}
-
- if let Some(tx_color) = &colours.tx_color {
+ ColourScheme::GruvboxLight => {
self.colours
- .set_tx_colour(tx_color)
- .context("Update 'tx_color' in your config file..")?;
+ .set_colours_from_palette(&*GRUVBOX_LIGHT_COLOUR_PALETTE)?;
}
-
- // if let Some(rx_total_color) = &colours.rx_total_color {
- // painter.colours.set_rx_total_colour(rx_total_color)?;
+ // ColourScheme::Nord => {
+ // self.colours
+ // .set_colours_from_palette(&*NORD_COLOUR_PALETTE)?;
// }
-
- // if let Some(tx_total_color) = &colours.tx_total_color {
- // painter.colours.set_tx_total_colour(tx_total_color)?;
- // }
-
- if let Some(table_header_color) = &colours.table_header_color {
- self.colours
- .set_table_header_colour(table_header_color)
- .context("Update 'table_header_color' in your config file..")?;
- }
-
- if let Some(scroll_entry_text_color) = &colours.selected_text_color {
- self.colours
- .set_scroll_entry_text_color(scroll_entry_text_color)
- .context("Update 'selected_text_color' in your config file..")?;
- }
-
- if let Some(scroll_entry_bg_color) = &colours.selected_bg_color {
- self.colours
- .set_scroll_entry_bg_color(scroll_entry_bg_color)
- .context("Update 'selected_bg_color' in your config file..")?;
- }
-
- if let Some(widget_title_color) = &colours.widget_title_color {
- self.colours
- .set_widget_title_colour(widget_title_color)
- .context("Update 'widget_title_color' in your config file..")?;
- }
-
- if let Some(graph_color) = &colours.graph_color {
- self.colours
- .set_graph_colour(graph_color)
- .context("Update 'graph_color' in your config file..")?;
- }
-
- if let Some(battery_colors) = &colours.battery_colors {
- self.colours
- .set_battery_colors(battery_colors)
- .context("Update 'battery_colors' in your config file.")?;
+ ColourScheme::Custom => {
+ // This case should never occur, just do nothing.
}
}