feat(themes): add support for global themes background colors (#120)

This commit is contained in:
Alexandre Pasmantier 2024-12-15 00:29:10 +01:00 committed by GitHub
parent ea752b13e6
commit 11da96d7fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 38 additions and 15 deletions

View File

@ -77,7 +77,6 @@ impl From<AnsiStates> for tui::style::Style {
} }
} }
AnsiCode::ForegroundColor(color) => style = style.fg(color), AnsiCode::ForegroundColor(color) => style = style.fg(color),
AnsiCode::BackgroundColor(color) => style = style.bg(color),
_ => (), _ => (),
} }
} }

View File

@ -13,7 +13,7 @@ pub struct Colorscheme {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct GeneralColorscheme { pub struct GeneralColorscheme {
pub border_fg: Color, pub border_fg: Color,
//pub background: Color, pub background: Color,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -20,7 +20,11 @@ pub fn draw_logo_block(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(general_colorscheme.border_fg)) .border_style(Style::default().fg(general_colorscheme.border_fg))
.style(Style::default().fg(mode_color)) .style(
Style::default()
.fg(mode_color)
.bg(general_colorscheme.background),
)
.padding(Padding::horizontal(1)); .padding(Padding::horizontal(1));
let logo_paragraph = build_logo_paragraph().block(logo_block); let logo_paragraph = build_logo_paragraph().block(logo_block);
@ -41,7 +45,7 @@ fn draw_metadata_block(
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.padding(Padding::horizontal(1)) .padding(Padding::horizontal(1))
.style(Style::default()); .style(Style::default().bg(colorscheme.general.background));
let metadata_table = let metadata_table =
build_metadata_table(mode, current_channel, app_metadata, colorscheme) build_metadata_table(mode, current_channel, app_metadata, colorscheme)
@ -60,7 +64,7 @@ fn draw_keymaps_block(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.border_fg)) .border_style(Style::default().fg(colorscheme.border_fg))
.style(Style::default()) .style(Style::default().bg(colorscheme.background))
.padding(Padding::horizontal(1)); .padding(Padding::horizontal(1));
let table = keymap_table.block(keymaps_block); let table = keymap_table.block(keymaps_block);

View File

@ -34,7 +34,7 @@ pub fn draw_input_box(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.style(Style::default()); .style(Style::default().bg(colorscheme.general.background));
let input_block_inner = input_block.inner(rect); let input_block_inner = input_block.inner(rect);
if input_block_inner.area() == 0 { if input_block_inner.area() == 0 {

View File

@ -280,7 +280,7 @@ pub fn draw_preview_title_block(
), ),
) )
.alignment(Alignment::Left) .alignment(Alignment::Left)
.style(Style::default()); .style(Style::default().bg(colorscheme.general.background));
f.render_widget(preview_title, rect); f.render_widget(preview_title, rect);
Ok(()) Ok(())
} }
@ -299,7 +299,7 @@ pub fn draw_preview_content_block(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.style(Style::default()) .style(Style::default().bg(colorscheme.general.background))
.padding(Padding::right(1)); .padding(Padding::right(1));
let preview_inner_block = let preview_inner_block =

View File

@ -1,6 +1,6 @@
use std::collections::HashMap; use std::collections::HashMap;
use crate::colors::Colorscheme; use crate::colors::{Colorscheme, GeneralColorscheme};
use crate::logo::build_remote_logo_paragraph; use crate::logo::build_remote_logo_paragraph;
use crate::mode::{mode_color, Mode}; use crate::mode::{mode_color, Mode};
use crate::results::build_results_list; use crate::results::build_results_list;
@ -50,7 +50,12 @@ pub fn draw_remote_control(
colorscheme, colorscheme,
); );
draw_rc_input(f, layout[1], input_state, colorscheme)?; draw_rc_input(f, layout[1], input_state, colorscheme)?;
draw_rc_logo(f, layout[2], mode_color(*mode, &colorscheme.mode)); draw_rc_logo(
f,
layout[2],
mode_color(*mode, &colorscheme.mode),
&colorscheme.general,
);
Ok(()) Ok(())
} }
@ -67,7 +72,7 @@ fn draw_rc_channels(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.style(Style::default()) .style(Style::default().bg(colorscheme.general.background))
.padding(Padding::right(1)); .padding(Padding::right(1));
let channel_list = build_results_list( let channel_list = build_results_list(
@ -93,7 +98,7 @@ fn draw_rc_input(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.style(Style::default()); .style(Style::default().bg(colorscheme.general.background));
let input_block_inner = input_block.inner(area); let input_block_inner = input_block.inner(area);
@ -145,8 +150,14 @@ fn draw_rc_input(
)); ));
Ok(()) Ok(())
} }
fn draw_rc_logo(f: &mut Frame, area: Rect, mode_color: Color) { fn draw_rc_logo(
let logo_block = Block::default().style(Style::default().fg(mode_color)); f: &mut Frame,
area: Rect,
mode_color: Color,
colorscheme: &GeneralColorscheme,
) {
let logo_block = Block::default()
.style(Style::default().fg(mode_color).bg(colorscheme.background));
let logo_paragraph = build_remote_logo_paragraph() let logo_paragraph = build_remote_logo_paragraph()
.alignment(Alignment::Center) .alignment(Alignment::Center)

View File

@ -149,7 +149,7 @@ pub fn draw_results_list(
.borders(Borders::ALL) .borders(Borders::ALL)
.border_type(BorderType::Rounded) .border_type(BorderType::Rounded)
.border_style(Style::default().fg(colorscheme.general.border_fg)) .border_style(Style::default().fg(colorscheme.general.border_fg))
.style(Style::default()) .style(Style::default().bg(colorscheme.general.background))
.padding(Padding::right(1)); .padding(Padding::right(1));
let results_list = build_results_list( let results_list = build_results_list(

View File

@ -36,6 +36,7 @@ impl Color {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Theme { pub struct Theme {
// general // general
pub background: Color,
pub border_fg: Color, pub border_fg: Color,
pub text_fg: Color, pub text_fg: Color,
pub dimmed_text_fg: Color, pub dimmed_text_fg: Color,
@ -102,6 +103,7 @@ impl Default for Theme {
#[serde(rename = "theme")] #[serde(rename = "theme")]
struct Inner { struct Inner {
// general // general
background: String,
border_fg: String, border_fg: String,
// info // info
text_fg: String, text_fg: String,
@ -130,6 +132,8 @@ impl<'de> Deserialize<'de> for Theme {
{ {
let inner = Inner::deserialize(deserializer).unwrap(); let inner = Inner::deserialize(deserializer).unwrap();
Ok(Self { Ok(Self {
background: Color::from_str(&inner.background)
.ok_or_else(|| serde::de::Error::custom("invalid color"))?,
border_fg: Color::from_str(&inner.border_fg) border_fg: Color::from_str(&inner.border_fg)
.ok_or_else(|| serde::de::Error::custom("invalid color"))?, .ok_or_else(|| serde::de::Error::custom("invalid color"))?,
text_fg: Color::from_str(&inner.text_fg) text_fg: Color::from_str(&inner.text_fg)
@ -193,6 +197,7 @@ impl Into<Colorscheme> for &Theme {
impl Into<GeneralColorscheme> for &Theme { impl Into<GeneralColorscheme> for &Theme {
fn into(self) -> GeneralColorscheme { fn into(self) -> GeneralColorscheme {
GeneralColorscheme { GeneralColorscheme {
background: (&self.background).into(),
border_fg: (&self.border_fg).into(), border_fg: (&self.border_fg).into(),
} }
} }

View File

@ -1,4 +1,5 @@
# general # general
background = '#1e1e2e'
border_fg = '#6c7086' border_fg = '#6c7086'
text_fg = '#cdd6f4' text_fg = '#cdd6f4'
dimmed_text_fg = '#6c7086' dimmed_text_fg = '#6c7086'

View File

@ -1,4 +1,5 @@
# general # general
background = '#282828'
border_fg = '#928374' border_fg = '#928374'
text_fg = '#ebdbb2' text_fg = '#ebdbb2'
dimmed_text_fg = '#a89984' dimmed_text_fg = '#a89984'

View File

@ -1,4 +1,5 @@
# general # general
background = '#2e3440'
border_fg = '#434c5e' border_fg = '#434c5e'
text_fg = '#d8dee9' text_fg = '#d8dee9'
dimmed_text_fg = '#4c566a' dimmed_text_fg = '#4c566a'

View File

@ -1,4 +1,5 @@
# general # general
background = '#002b36'
border_fg = '#586e75' border_fg = '#586e75'
text_fg = '#eee8d5' text_fg = '#eee8d5'
dimmed_text_fg = '#93a1a1' dimmed_text_fg = '#93a1a1'