Skip to content

Commit

Permalink
feat(theme): add list theme support
Browse files Browse the repository at this point in the history
- Introduced `ListThemeConfig` in the theme configuration.
- Updated `WidgetThemeConfig` to include `list` themes.
- Modified `SingleNamespaceDialog` to accept and apply the new themes.
- Added default implementations and builders for `FilterFormTheme` and
  `ListTheme`.
- Updated tests to cover the new theme configurations.
  • Loading branch information
sarub0b0 committed Nov 2, 2024
1 parent ef798dd commit 5ef11fa
Show file tree
Hide file tree
Showing 13 changed files with 400 additions and 50 deletions.
26 changes: 24 additions & 2 deletions example/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ theme:

## 検索にマッチした文字列のハイライト
highlight:

## 検索にマッチした文字列の中でフォーカスしている文字列のハイライト
focus:
fg_color: yellow
Expand Down Expand Up @@ -101,6 +100,30 @@ theme:
fg_color: dark_gray
query:
fg_color: yellow
## 選択リスト
list:
## フィルターフォーム
filter:
# base:
# fg_color: magenta
# border:
# type: "double"
# active:
# fg_color: green
# inactive:
# fg_color: blue
query:
fg_color: yellow

## 選択のハイライト
selection:
fg_color: green
modifier: reversed

## ステータス
status:
fg_color: yellow

dialog:
## 未設定の場合、theme.base で設定した背景色を使う
# base:
Expand All @@ -118,4 +141,3 @@ theme:
fg_color: lightcyan
desc:
fg_color: gray

4 changes: 4 additions & 0 deletions src/config/theme.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
mod base;
mod border;
mod dialog;
mod filter;
mod header;
mod help;
mod list;
mod style;
mod tab;
mod table;
Expand All @@ -19,7 +21,9 @@ pub use self::tab::TabThemeConfig;
pub use base::BaseThemeConfig;
pub use border::BorderThemeConfig;
pub use dialog::*;
pub use filter::*;
pub use help::HelpThemeConfig;
pub use list::*;
pub use style::ThemeStyleConfig;
pub use table::*;
pub use text::*;
Expand Down
18 changes: 18 additions & 0 deletions src/config/theme/filter.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
use serde::{Deserialize, Serialize};

use super::{BorderThemeConfig, ThemeStyleConfig};

#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct FilterFormThemeConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base: Option<ThemeStyleConfig>,

#[serde(default, skip_serializing_if = "Option::is_none")]
pub border: Option<BorderThemeConfig>,

#[serde(default)]
pub prefix: ThemeStyleConfig,

#[serde(default)]
pub query: ThemeStyleConfig,
}
33 changes: 33 additions & 0 deletions src/config/theme/list.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
use ratatui::style::Modifier;
use serde::{Deserialize, Serialize};

use super::{FilterFormThemeConfig, ThemeStyleConfig};

#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct ListThemeConfig {
#[serde(default)]
pub filter: FilterFormThemeConfig,

#[serde(default = "default_selection")]
pub selection: ThemeStyleConfig,

#[serde(default)]
pub status: ThemeStyleConfig,
}

impl Default for ListThemeConfig {
fn default() -> ListThemeConfig {
ListThemeConfig {
selection: default_selection(),
filter: FilterFormThemeConfig::default(),
status: Default::default(),
}
}
}

fn default_selection() -> ThemeStyleConfig {
ThemeStyleConfig {
modifier: Modifier::REVERSED,
..Default::default()
}
}
17 changes: 1 addition & 16 deletions src/config/theme/table.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,9 @@
use serde::{Deserialize, Serialize};

use super::{BorderThemeConfig, ThemeStyleConfig};
use super::FilterFormThemeConfig;

#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct TableThemeConfig {
#[serde(default)]
pub filter: FilterFormThemeConfig,
}

#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct FilterFormThemeConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base: Option<ThemeStyleConfig>,

#[serde(default, skip_serializing_if = "Option::is_none")]
pub border: Option<BorderThemeConfig>,

#[serde(default)]
pub prefix: ThemeStyleConfig,

#[serde(default)]
pub query: ThemeStyleConfig,
}
163 changes: 159 additions & 4 deletions src/config/theme/widget.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
use ratatui::style::{Color, Modifier};
use serde::{Deserialize, Serialize};

use crate::ui::widget::{FilterFormTheme, InputFormTheme, SearchFormTheme, TextTheme, WidgetTheme};
use crate::ui::widget::{
single_select, table, InputFormTheme, ListTheme, SearchFormTheme, TextTheme, WidgetTheme,
};

use super::{
BorderThemeConfig, DialogThemeConfig, FilterFormThemeConfig, TableThemeConfig, TextThemeConfig,
ThemeStyleConfig,
BorderThemeConfig, DialogThemeConfig, FilterFormThemeConfig, ListThemeConfig, TableThemeConfig,
TextThemeConfig, ThemeStyleConfig,
};

#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
Expand Down Expand Up @@ -58,6 +60,9 @@ pub struct WidgetThemeConfig {
#[serde(default)]
pub table: TableThemeConfig,

#[serde(default)]
pub list: ListThemeConfig,

#[serde(default)]
pub dialog: DialogThemeConfig,
}
Expand Down Expand Up @@ -94,7 +99,7 @@ impl From<WidgetThemeConfig> for TextTheme {
}
}

impl From<WidgetThemeConfig> for FilterFormTheme {
impl From<WidgetThemeConfig> for (WidgetTheme, InputFormTheme) {
fn from(theme: WidgetThemeConfig) -> Self {
let FilterFormThemeConfig {
base,
Expand All @@ -116,12 +121,47 @@ impl From<WidgetThemeConfig> for FilterFormTheme {
.border_active_style(border.active)
.border_inactive_style(border.inactive);

(widget_theme, input_form_theme)
}
}

impl From<WidgetThemeConfig> for table::FilterFormTheme {
fn from(theme: WidgetThemeConfig) -> Self {
let (widget_theme, input_form_theme) = (theme).into();

Self::default()
.widget_theme(widget_theme)
.input_form_theme(input_form_theme)
}
}

impl From<WidgetThemeConfig> for single_select::FilterFormTheme {
fn from(theme: WidgetThemeConfig) -> Self {
let (widget_theme, input_form_theme) = (theme).into();

Self::default()
.widget_theme(widget_theme)
.input_form_theme(input_form_theme)
}
}

impl From<WidgetThemeConfig> for ListTheme {
fn from(theme: WidgetThemeConfig) -> Self {
Self {
selected: theme.list.selection.into(),
}
}
}

impl From<WidgetThemeConfig> for single_select::SelectFormTheme {
fn from(theme: WidgetThemeConfig) -> Self {
Self {
list_theme: theme.clone().into(),
widget_theme: theme.into(),
}
}
}

#[cfg(test)]
mod tests {
use crate::config::theme::{
Expand All @@ -148,6 +188,7 @@ mod tests {
border: BorderThemeConfig::default(),
text: TextThemeConfig::default(),
table: TableThemeConfig::default(),
list: ListThemeConfig::default(),
dialog: DialogThemeConfig::default(),
};

Expand Down Expand Up @@ -217,6 +258,43 @@ mod tests {
},
},
},
list: ListThemeConfig {
filter: FilterFormThemeConfig {
base: Some(ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
}),
border: Some(BorderThemeConfig {
ty: BorderType::Plain,
active: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
inactive: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
mouse_over: ThemeStyleConfig::default(),
}),
prefix: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
query: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
},
selection: ThemeStyleConfig {
fg_color: Some(Color::Green),
modifier: Modifier::REVERSED,
..Default::default()
},
status: ThemeStyleConfig {
fg_color: Some(Color::Yellow),
..Default::default()
},
},
dialog: DialogThemeConfig {
base: Some(ThemeStyleConfig {
fg_color: Some(Color::Blue),
Expand Down Expand Up @@ -284,6 +362,26 @@ mod tests {
fg_color: white
query:
fg_color: white
list:
filter:
base:
fg_color: white
border:
type: plain
active:
fg_color: white
inactive:
fg_color: white
mouse_over: {}
prefix:
fg_color: white
query:
fg_color: white
selection:
fg_color: green
modifier: reversed
status:
fg_color: yellow
dialog:
base:
fg_color: blue
Expand Down Expand Up @@ -346,6 +444,26 @@ mod tests {
fg_color: white
query:
fg_color: white
list:
filter:
base:
fg_color: white
border:
type: plain
active:
fg_color: white
inactive:
fg_color: white
mouse_over: {}
prefix:
fg_color: white
query:
fg_color: white
selection:
fg_color: green
modifier: reversed
status:
fg_color: yellow
dialog:
base:
fg_color: blue
Expand Down Expand Up @@ -444,6 +562,43 @@ mod tests {
},
},
},
list: ListThemeConfig {
filter: FilterFormThemeConfig {
base: Some(ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
}),
border: Some(BorderThemeConfig {
ty: BorderType::Plain,
active: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
inactive: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
mouse_over: ThemeStyleConfig::default(),
}),
prefix: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
query: ThemeStyleConfig {
fg_color: Some(Color::White),
..Default::default()
},
},
selection: ThemeStyleConfig {
fg_color: Some(Color::Green),
modifier: Modifier::REVERSED,
..Default::default()
},
status: ThemeStyleConfig {
fg_color: Some(Color::Yellow),
..Default::default()
},
},
dialog: DialogThemeConfig {
base: Some(ThemeStyleConfig {
fg_color: Some(Color::Blue),
Expand Down
Loading

0 comments on commit 5ef11fa

Please sign in to comment.