refactor: refactor some fields and code to use "colour" spelling (#2058)

<!-- Please use this template (unless you have a very good reason not
to). PRs that do not use the template may be closed. -->

## Description

_A description of the change, what it does, and why it was made. If
relevant (e.g. UI changes), **please also provide
screenshots/recordings**:_

Rename a bunch of code/struct field names to use "colour". Note this
should have no functional change to config settings as I was already
aliasing "colour" for "color" settings, this just flips it internally.

As for why, I'm Canadian, I grew up spelling it this way, sorry.

## Issue

_If applicable, what issue does this address?_

Closes: #<issue-number>

## Testing

_If relevant, please state how this was tested (including steps):_

_If this change affects the program, please also indicate which
platforms were tested:_

- [ ] _Windows_
- [ ] _macOS (specify version below)_
- [x] _Linux (specify distro below)_
- [ ] _Other (specify below)_

## Checklist

_Ensure **all** of these are met:_

- [x] _If this PR adds or changes a dependency, please justify this in
the description_
- [x] _If this is a code change, areas your change affects have been
linted using (`cargo fmt`)_
- [x] _If this is a code change, your changes pass `cargo clippy --all
-- -D warnings`_
- [x] _If this is a code change, new tests were added if relevant_
- [x] _If this is a code change, your changes pass `cargo test`_
- [x] _The change has been tested to work (see above) and doesn't appear
to break other things_
- [x] _Documentation has been updated if needed (`README.md`, help menu,
docs, configs, etc.)_
- [x] _There are no merge conflicts_
- [x] _You have reviewed your changes first_
- [x] _The pull request passes the provided CI pipeline_

## Other

_Anything else that maintainers should know about this PR:_
This commit is contained in:
Clement Tsang
2026-05-08 01:34:02 -04:00
committed by GitHub
parent abad5b6f1e
commit d08036f69a
29 changed files with 510 additions and 349 deletions
+1 -1
View File
@@ -31,7 +31,7 @@ That said, these are more guidelines rather than hard rules, though the project
- [#1938](https://github.com/ClementTsang/bottom/pull/1938), [#1980](https://github.com/ClementTsang/bottom/pull/1980): Report average packet size and packet rate.
- [#2003](https://github.com/ClementTsang/bottom/pull/2003): Configurable default sort column for temperature and disk table widgets.
- [#1979](https://github.com/ClementTsang/bottom/pull/1979): Add a global `bg_color` config option to set widget background colour.
- [#1979](https://github.com/ClementTsang/bottom/pull/1979): Add a global `bg_colour` config option to set widget background colour.
- [#2039](https://github.com/ClementTsang/bottom/pull/2039): Add a config option for drawing a line separator (`table_gap`) between the column headers and data.
- [#1948](https://github.com/ClementTsang/bottom/pull/1948): Add support for both an `!=` operator and `!` negation prefixes in query searches.
- [#2045](https://github.com/ClementTsang/bottom/pull/2045): Add support for showing a decimal place for CPU usage
@@ -93,9 +93,9 @@ see information on these options by running `btm -h`, or run `btm --help` to dis
## Style Options
| Option | Behaviour |
| ------------------ | ---------------------------------------------------------------- |
| `--theme <SCHEME>` | Use a built-in color theme, use '--help' for info on the colors. |
| Option | Behaviour |
| ------------------ | ------------------------------------------------------------------ |
| `--theme <SCHEME>` | Use a built-in colour theme, use '--help' for info on the colours. |
## Other Options
@@ -42,6 +42,28 @@ bottom's components can also be individually styled by the user to control the c
### Colours
!!! Info
Note that anywhere `"colour"` is used, it can be substituted for `"color"`:
```toml
# This is okay
[styles.widgets.widget_title]
colour = "black"
bg_colour = "white"
[styles.cpu]
all_entry_colour = "green"
# This is also okay
[styles.widgets.widget_title]
color = "black"
bg_color = "white"
[styles.cpu]
all_entry_color = "green"
```
You can configure the colours for components with strings that are either hex colours (e.g. `"#ffffff"`), RGB colours
(e.g. `"255, 255, 255"`), or named colours. Named colours are one of the following strings:
@@ -69,19 +91,19 @@ Text can generally be styled using the following TOML table:
```toml
[field]
# The foreground colour of text.
color = "black"
colour = "black"
# The background colour of text.
bg_color = "blue"
bg_colour = "blue"
# Whether to make the text bold.
bold = false
# Inline table version
field = { color = "black", bg_color = "blue", bold = false }
field = { colour = "black", bg_colour = "blue", bold = false }
```
All fields are optional; by default if `bg_color` is not set then there will be no background color.
All fields are optional; by default if `bg_colour` is not set then there will be no background colour.
If you _just_ want to style text by setting the foreground colour, for brevity, then you can also just set the field
to be the colour itself. For example:
@@ -97,81 +119,81 @@ selected_text = "#fff"
These can be set under `[styles.cpu]`:
| Config field | Details | Examples |
| ----------------- | ---------------------------------------------------------------- | -------------------------------------------- |
| `all_entry_color` | The colour of the "All" CPU label | `all_entry_color = "Red"` |
| `avg_entry_color` | The colour of the average CPU label and graph line | `avg_entry_color = "255, 0, 255"` |
| `cpu_core_colors` | Colour of each CPU threads' label and graph line. Read in order. | `cpu_core_colors = ["Red", "Blue", "Green"]` |
| Config field | Details | Examples |
| ------------------ | ---------------------------------------------------------------- | --------------------------------------------- |
| `all_entry_colour` | The colour of the "All" CPU label | `all_entry_colour = "Red"` |
| `avg_entry_colour` | The colour of the average CPU label and graph line | `avg_entry_colour = "255, 0, 255"` |
| `cpu_core_colours` | Colour of each CPU threads' label and graph line. Read in order. | `cpu_core_colours = ["Red", "Blue", "Green"]` |
#### Temperature Graph
These can be set under `[styles.temp_graph]`:
| Config field | Details | Examples |
| ------------------------- | -------------------------------------------------------------- | ---------------------------------------------------- |
| `temp_graph_color_styles` | Colour of each temperature sensor's graph line. Read in order. | `temp_graph_color_styles = ["Red", "Blue", "Green"]` |
| Config field | Details | Examples |
| -------------------------- | -------------------------------------------------------------- | ----------------------------------------------------- |
| `temp_graph_colour_styles` | Colour of each temperature sensor's graph line. Read in order. | `temp_graph_colour_styles = ["Red", "Blue", "Green"]` |
#### Memory
These can be set under `[styles.memory]`:
| Config field | Details | Examples |
| ------------- | ------------------------------------------------------------------------------ | --------------------------------------- |
| `ram_color` | The colour of the RAM label and graph line | `ram_color = "Red"` |
| `cache_color` | The colour of the cache label and graph line. Does not do anything on Windows. | `cache_color = "#ffffff"` |
| `swap_color` | The colour of the swap label and graph line | `swap_color = "255, 0, 255"` |
| `arc_color` | The colour of the ARC label and graph line | `arc_color = "Blue"` |
| `gpu_colors` | Colour of each GPU's memory label and graph line. Read in order. | `gpu_colors = ["Red", "Blue", "Green"]` |
| Config field | Details | Examples |
| -------------- | ------------------------------------------------------------------------------ | ---------------------------------------- |
| `ram_colour` | The colour of the RAM label and graph line | `ram_colour = "Red"` |
| `cache_colour` | The colour of the cache label and graph line. Does not do anything on Windows. | `cache_colour = "#ffffff"` |
| `swap_colour` | The colour of the swap label and graph line | `swap_colour = "255, 0, 255"` |
| `arc_colour` | The colour of the ARC label and graph line | `arc_colour = "Blue"` |
| `gpu_colours` | Colour of each GPU's memory label and graph line. Read in order. | `gpu_colours = ["Red", "Blue", "Green"]` |
#### Network
These can be set under `[styles.network]`:
| Config field | Details | Examples |
| ---------------- | --------------------------------------------------------- | ---------------------------- |
| `rx_color` | The colour of the RX (download) label and graph line | `rx_color = "Red"` |
| `tx_color` | The colour of the TX (upload) label and graph line | `tx_color = "#ffffff"` |
| `rx_total_color` | The colour of the total RX (download) label in basic mode | `rx_total_color = "0, 0, 0"` |
| `tx_total_color` | The colour of the total TX (upload) label in basic mode | `tx_total_color = "#000"` |
| Config field | Details | Examples |
| ----------------- | --------------------------------------------------------- | ----------------------------- |
| `rx_colour` | The colour of the RX (download) label and graph line | `rx_colour = "Red"` |
| `tx_colour` | The colour of the TX (upload) label and graph line | `tx_colour = "#ffffff"` |
| `rx_total_colour` | The colour of the total RX (download) label in basic mode | `rx_total_colour = "0, 0, 0"` |
| `tx_total_colour` | The colour of the total TX (upload) label in basic mode | `tx_total_colour = "#000"` |
#### Battery
These can be set under `[styles.battery]`:
| Config field | Details | Examples |
| ---------------------- | ------------------------------------------------------------------------ | ---------------------------------- |
| `high_battery_color` | The colour of the battery widget bar when the battery is over 50% | `high_battery_color = "Red"` |
| `medium_battery_color` | The colour of the battery widget bar when the battery between 10% to 50% | `medium_battery_color = "#ffffff"` |
| `low_battery_color` | The colour of the battery widget bar when the battery is under 10% | `low_battery_color = "0, 0, 0"` |
| Config field | Details | Examples |
| ----------------------- | ------------------------------------------------------------------------ | ----------------------------------- |
| `high_battery_colour` | The colour of the battery widget bar when the battery is over 50% | `high_battery_colour = "Red"` |
| `medium_battery_colour` | The colour of the battery widget bar when the battery between 10% to 50% | `medium_battery_colour = "#ffffff"` |
| `low_battery_colour` | The colour of the battery widget bar when the battery is under 10% | `low_battery_colour = "0, 0, 0"` |
#### Tables
These can be set under `[styles.tables]`:
| Config field | Details | Examples |
| ------------ | ------------------------------ | -------------------------------------------------------------- |
| `headers` | Text styling for table headers | `headers = { color = "red", bg_color = "black", bold = true }` |
| Config field | Details | Examples |
| ------------ | ------------------------------ | ---------------------------------------------------------------- |
| `headers` | Text styling for table headers | `headers = { colour = "red", bg_colour = "black", bold = true }` |
#### Graphs
These can be set under `[styles.graphs]`:
| Config field | Details | Examples |
| ------------- | -------------------------------------------- | ------------------------------------------------------------------- |
| `graph_color` | The general colour of the parts of the graph | `graph_color = "white"` |
| `legend_text` | Text styling for graph's legend text | `legend_text = { color = "black", bg_color = "blue", bold = true }` |
| Config field | Details | Examples |
| -------------- | -------------------------------------------- | --------------------------------------------------------------------- |
| `graph_colour` | The general colour of the parts of the graph | `graph_colour = "white"` |
| `legend_text` | Text styling for graph's legend text | `legend_text = { colour = "black", bg_colour = "blue", bold = true }` |
#### General widget settings
These can be set under `[styles.widgets]`:
| Config field | Details | Examples |
| ----------------------- | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `border_color` | The colour of the widgets' borders | `border_color = "white"` |
| `selected_border_color` | The colour of a widget's borders when the widget is selected | `selected_border_color = "white"` |
| `widget_title` | Text styling for a widget's title | `widget_title = { color = "black", bg_color = "blue", bold = true }` |
| `bg_color` | The background color of the widgets. | `bg_color = "black"` |
| `text` | Text styling for text in general | `text = { color = "black", bg_color = "blue", bold = true }` |
| `selected_text` | Text styling for text when representing something that is selected | `selected_text = { color = "black", bg_color = "blue", bold = true }` |
| `disabled_text` | Text styling for text when representing something that is disabled | `disabled_text = { color = "black", bg_color = "blue", bold = true }` |
| `thread_text` | Text styling for text when representing process threads. Only usable on Linux at the moment. | `thread_text = { color = "green", bg_color = "blue", bold = true }` |
| Config field | Details | Examples |
| ------------------------ | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `border_colour` | The colour of the widgets' borders | `border_colour = "white"` |
| `selected_border_colour` | The colour of a widget's borders when the widget is selected | `selected_border_colour = "white"` |
| `widget_title` | Text styling for a widget's title | `widget_title = { colour = "black", bg_colour = "blue", bold = true }` |
| `bg_colour` | The background colour of the widgets. | `bg_colour = "black"` |
| `text` | Text styling for text in general | `text = { colour = "black", bg_colour = "blue", bold = true }` |
| `selected_text` | Text styling for text when representing something that is selected | `selected_text = { colour = "black", bg_colour = "blue", bold = true }` |
| `disabled_text` | Text styling for text when representing something that is disabled | `disabled_text = { colour = "black", bg_colour = "blue", bold = true }` |
| `thread_text` | Text styling for text when representing process threads. Only usable on Linux at the moment. | `thread_text = { colour = "green", bg_colour = "blue", bold = true }` |
+14 -13
View File
@@ -61,22 +61,22 @@ Let's say you're installing [Iosevka](https://github.com/be5invis/Iosevka). The
4. Here, add a new `String value`, and set the `Name` to a bunch of 0's (e.g. `000` - make sure the name isn't already used), then set the `Data` to the font name (e.g. `Iosevka`).
<figure>
<img src="../assets/screenshots/troubleshooting/regedit_fonts.webp" alt="Regedit menu showing how to add a new font for Command Prompt/PowerShell"/>
<figcaption><sub>The last entry is the new entry for Iosevka</sub></figcaption>
</figure>
<figure>
<img src="../assets/screenshots/troubleshooting/regedit_fonts.webp" alt="Regedit menu showing how to add a new font for Command Prompt/PowerShell"/>
<figcaption><sub>The last entry is the new entry for Iosevka</sub></figcaption>
</figure>
5. Then, open the Command Prompt/PowerShell, and right-click on the top bar, and open "Properties":
<figure>
<img src="../assets/screenshots/troubleshooting/cmd_prompt_props.webp" alt="Opening the properties menu in Command Prompt/PowerShell"/>
</figure>
<figure>
<img src="../assets/screenshots/troubleshooting/cmd_prompt_props.webp" alt="Opening the properties menu in Command Prompt/PowerShell"/>
</figure>
6. From here, go to "Font", and set the font to your new font (so in this example, Iosevka):
<figure>
<img src="../assets/screenshots/troubleshooting/cmd_prompt_font.webp" alt="Setting a new font in Command Prompt/PowerShell"/>
</figure>
<figure>
<img src="../assets/screenshots/troubleshooting/cmd_prompt_font.webp" alt="Setting a new font in Command Prompt/PowerShell"/>
</figure>
## Why can't I see all my temperature sensors on Windows?
@@ -122,7 +122,7 @@ It may be handy to refer to the automatically generated config files or the
[sample configuration files](https://github.com/ClementTsang/bottom/tree/main/sample_configs). The config files also
follow the [TOML](https://toml.io/en/) format.
Also make sure your config options are under the right table - for example, to set your temperature type, you must
Also make sure your config option settings are in the right location - for example, to set your temperature type, you must
set it under the `[flags]` table:
```toml
@@ -130,11 +130,12 @@ set it under the `[flags]` table:
temperature_type = "f"
```
Meanwhile, if you want to set a custom color scheme, it would be under the `[styles]` table:
Meanwhile, if you want to set a custom colour or styling scheme, it would be under the `[styles]` table - for example:
```toml
[styles.tables.headers]
color="LightBlue"
colour = "LightBlue"
bold = true
```
To help validate your configuration files, there is [JSON Schema](https://json-schema.org/) support if your IDE/editor
+3 -3
View File
@@ -64,11 +64,11 @@ is added together when displayed.
<img src="../../../assets/screenshots/process/process_grouped.webp" alt="A picture of grouped mode in a process widget."/>
</figure>
!!! info
!!! Info
Note that the process state and user columns are disabled in this mode.
!!! info
!!! Info
Note that if tree mode is also active, processes cannot be grouped together due to the behaviour of the two modes
somewhat clashing. This also reflects with default modes like `group_processes`.
@@ -103,7 +103,7 @@ A process in tree mode can also be "collapsed", hiding its children and any desc
++plus++, or ++left++ keys, or clicking on an entry. It can be expanded by using the ++minus++, ++plus++, or ++right++
keys, or by clicking on the entry again. The ++space++ key can also be used to toggle between the collapsed and expanded states.
!!! info
!!! Info
Note that if tree mode is active, processes cannot be grouped together due to the behaviour of the two modes
somewhat clashing. This also reflects with default modes like `group_processes`.
+30 -27
View File
@@ -297,50 +297,53 @@
# or overridden if the command-line flag for a built-in theme is set.
#theme = "default"
# Styling options. You can control things like colour choices, text styling (bold, italic, etc), and more.
# Note that any setting that uses the word "colour" can be substituted for "color" and it will still work fine.
#[styles.cpu]
#all_entry_color = "green"
#avg_entry_color = "red"
#cpu_core_colors = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#all_entry_colour = "green"
#avg_entry_colour = "red"
#cpu_core_colours = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#[styles.temp_graph]
#temp_graph_color_styles = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#temp_graph_colour_styles = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#[styles.memory]
#ram_color = "light magenta"
#cache_color = "light red"
#swap_color = "light yellow"
#arc_color = "light cyan"
#gpu_colors = ["light blue", "light red", "cyan", "green", "blue", "red"]
#ram_colour = "light magenta"
#cache_colour = "light red"
#swap_colour = "light yellow"
#arc_colour = "light cyan"
#gpu_colours = ["light blue", "light red", "cyan", "green", "blue", "red"]
#[styles.network]
#rx_color = "light magenta"
#tx_color = "light yellow"
#rx_total_color = "light cyan"
#tx_total_color = "light green"
#rx_colour = "light magenta"
#tx_colour = "light yellow"
#rx_total_colour = "light cyan"
#tx_total_colour = "light green"
#[styles.battery]
#high_battery_color = "green"
#medium_battery_color = "yellow"
#low_battery_color = "red"
#high_battery_colour = "green"
#medium_battery_colour = "yellow"
#low_battery_colour = "red"
#[styles.tables]
#headers = {color = "light blue", bold = true}
#headers = {colour = "light blue", bold = true}
#[styles.graphs]
#graph_color = "gray"
#legend_text = {color = "gray"}
#graph_colour = "gray"
#legend_text = {colour = "gray"}
#[styles.widgets]
#border_color = "gray"
#selected_border_color = "light blue"
#widget_title = {color = "gray"}
#text = {color = "gray"}
#selected_text = {color = "black", bg_color = "light blue"}
#disabled_text = {color = "dark gray"}
#border_colour = "gray"
#selected_border_colour = "light blue"
#widget_title = {colour = "gray"}
#text = {colour = "gray"}
#selected_text = {colour = "black", bg_colour = "light blue"}
#disabled_text = {colour = "dark gray"}
# Disabled by default
#bg_color = "black"
#bg_colour = "black"
# Only on Linux
#thread_text = {color = "green"}
#thread_text = {colour = "green"}
# Layout - layouts follow a pattern like this:
# [[row]] represents a row in the application.
+1 -1
View File
@@ -71,7 +71,7 @@ pub struct TimeGraph<'a> {
/// The graph style.
pub graph_style: Style,
/// The background color
/// The background colour/styling.
pub general_widget_style: Style,
/// The border style.
+30 -27
View File
@@ -545,50 +545,53 @@ pub(crate) const CONFIG_TEXT: &str = r#"# This is a default config file for bott
# or overridden if the command-line flag for a built-in theme is set.
#theme = "default"
# Styling options. You can control things like colour choices, text styling (bold, italic, etc), and more.
# Note that any setting that uses the word "colour" can be substituted for "color" and it will still work fine.
#[styles.cpu]
#all_entry_color = "green"
#avg_entry_color = "red"
#cpu_core_colors = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#all_entry_colour = "green"
#avg_entry_colour = "red"
#cpu_core_colours = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#[styles.temp_graph]
#temp_graph_color_styles = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#temp_graph_colour_styles = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
#[styles.memory]
#ram_color = "light magenta"
#cache_color = "light red"
#swap_color = "light yellow"
#arc_color = "light cyan"
#gpu_colors = ["light blue", "light red", "cyan", "green", "blue", "red"]
#ram_colour = "light magenta"
#cache_colour = "light red"
#swap_colour = "light yellow"
#arc_colour = "light cyan"
#gpu_colours = ["light blue", "light red", "cyan", "green", "blue", "red"]
#[styles.network]
#rx_color = "light magenta"
#tx_color = "light yellow"
#rx_total_color = "light cyan"
#tx_total_color = "light green"
#rx_colour = "light magenta"
#tx_colour = "light yellow"
#rx_total_colour = "light cyan"
#tx_total_colour = "light green"
#[styles.battery]
#high_battery_color = "green"
#medium_battery_color = "yellow"
#low_battery_color = "red"
#high_battery_colour = "green"
#medium_battery_colour = "yellow"
#low_battery_colour = "red"
#[styles.tables]
#headers = {color = "light blue", bold = true}
#headers = {colour = "light blue", bold = true}
#[styles.graphs]
#graph_color = "gray"
#legend_text = {color = "gray"}
#graph_colour = "gray"
#legend_text = {colour = "gray"}
#[styles.widgets]
#border_color = "gray"
#selected_border_color = "light blue"
#widget_title = {color = "gray"}
#text = {color = "gray"}
#selected_text = {color = "black", bg_color = "light blue"}
#disabled_text = {color = "dark gray"}
#border_colour = "gray"
#selected_border_colour = "light blue"
#widget_title = {colour = "gray"}
#text = {colour = "gray"}
#selected_text = {colour = "black", bg_colour = "light blue"}
#disabled_text = {colour = "dark gray"}
# Disabled by default
#bg_color = "black"
#bg_colour = "black"
# Only on Linux
#thread_text = {color = "green"}
#thread_text = {colour = "green"}
# Layout - layouts follow a pattern like this:
# [[row]] represents a row in the application.
+3 -1
View File
@@ -381,7 +381,9 @@ pub(crate) fn init_app(args: BottomArgs, config: Config) -> Result<(App, BottomL
let process_default_sort = match &args.process.process_default_sort {
Some(name) => Some(ProcColumn::parse_column_name(name).ok_or_else(|| {
anyhow::anyhow!("'{name}' is not a valid process column for --process_default_sort")
OptionError::arg(format!(
"'{name}' is not a valid process column for '--process_default_sort'"
))
})?),
None => config.processes.as_ref().and_then(|cfg| cfg.default_sort),
};
+4 -4
View File
@@ -646,15 +646,15 @@ pub struct StyleArgs {
],
hide_possible_values = true,
help = indoc! {
"Use a built-in color theme, use '--help' for info on the colors. [possible values: default, default-light, gruvbox, gruvbox-light, nord, nord-light]",
"Use a built-in colour theme, use '--help' for info on the colours. [possible values: default, default-light, gruvbox, gruvbox-light, nord, nord-light]",
},
long_help = indoc! {
"Use a pre-defined color theme. Currently supported themes are:
"Use a pre-defined colour theme. Currently supported themes are:
- default
- default-light (default but adjusted for lighter backgrounds)
- gruvbox (a bright theme with 'retro groove' colors)
- gruvbox (a bright theme with 'retro groove' colours)
- gruvbox-light (gruvbox but adjusted for lighter backgrounds)
- nord (an arctic, north-bluish color palette)
- nord (an arctic, north-bluish colour palette)
- nord-light (nord but adjusted for lighter backgrounds)"
}
)]
+76 -31
View File
@@ -34,7 +34,7 @@ use crate::options::{
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "generate_schema", derive(schemars::JsonSchema))]
#[cfg_attr(test, derive(PartialEq, Eq))]
pub(crate) struct ColorStr(Cow<'static, str>);
pub(crate) struct ColourStr(Cow<'static, str>);
/// A style for text.
#[derive(Clone, Debug, Deserialize, Serialize)]
@@ -42,15 +42,15 @@ pub(crate) struct ColorStr(Cow<'static, str>);
#[cfg_attr(feature = "generate_schema", derive(schemars::JsonSchema))]
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) enum TextStyleConfig {
Colour(ColorStr),
Colour(ColourStr),
TextStyle {
/// A built-in ANSI colour, RGB hex, or RGB colour code.
#[serde(alias = "colour")]
color: Option<ColorStr>,
#[serde(alias = "color")]
colour: Option<ColourStr>,
/// A built-in ANSI colour, RGB hex, or RGB colour code.
#[serde(alias = "bg_colour")]
bg_color: Option<ColorStr>,
#[serde(alias = "bg_color")]
bg_colour: Option<ColourStr>,
/// Whether to make this text bolded or not. If not set,
/// will default to built-in defaults.
@@ -171,59 +171,59 @@ impl Styles {
"gruvbox-light" => Ok(Self::gruvbox_light_palette()),
"nord" => Ok(Self::nord_palette()),
"nord-light" => Ok(Self::nord_light_palette()),
_ => Err(
OptionError::other(format!("'{theme}' is an invalid built-in color scheme."))
.into(),
),
_ => Err(OptionError::other(format!(
"'{theme}' is an invalid built-in colour scheme."
))
.into()),
}
}
fn set_styles_from_config(&mut self, config: &StyleConfig) -> OptionResult<()> {
// CPU
set_colour!(self.avg_cpu_colour, config.cpu, avg_entry_color);
set_colour!(self.all_cpu_colour, config.cpu, all_entry_color);
set_colour_list!(self.cpu_colour_styles, config.cpu, cpu_core_colors);
set_colour!(self.avg_cpu_colour, config.cpu, avg_entry_colour);
set_colour!(self.all_cpu_colour, config.cpu, all_entry_colour);
set_colour_list!(self.cpu_colour_styles, config.cpu, cpu_core_colours);
// Temperature graph
set_colour_list!(
self.temp_graph_colour_styles,
config.temp_graph,
temp_graph_color_styles
temp_graph_colour_styles
);
// Memory
set_colour!(self.ram_style, config.memory, ram_color);
set_colour!(self.swap_style, config.memory, swap_color);
set_colour!(self.ram_style, config.memory, ram_colour);
set_colour!(self.swap_style, config.memory, swap_colour);
#[cfg(not(target_os = "windows"))]
set_colour!(self.cache_style, config.memory, cache_color);
set_colour!(self.cache_style, config.memory, cache_colour);
#[cfg(feature = "zfs")]
set_colour!(self.arc_style, config.memory, arc_color);
set_colour!(self.arc_style, config.memory, arc_colour);
#[cfg(feature = "gpu")]
set_colour_list!(self.gpu_colours, config.memory, gpu_colors);
set_colour_list!(self.gpu_colours, config.memory, gpu_colours);
// Network
set_colour!(self.rx_style, config.network, rx_color);
set_colour!(self.tx_style, config.network, tx_color);
set_colour!(self.total_rx_style, config.network, rx_total_color);
set_colour!(self.total_tx_style, config.network, tx_total_color);
set_colour!(self.rx_style, config.network, rx_colour);
set_colour!(self.tx_style, config.network, tx_colour);
set_colour!(self.total_rx_style, config.network, rx_total_colour);
set_colour!(self.total_tx_style, config.network, tx_total_colour);
// Battery
set_colour!(self.high_battery, config.battery, high_battery_color);
set_colour!(self.medium_battery, config.battery, medium_battery_color);
set_colour!(self.low_battery, config.battery, low_battery_color);
set_colour!(self.high_battery, config.battery, high_battery_colour);
set_colour!(self.medium_battery, config.battery, medium_battery_colour);
set_colour!(self.low_battery, config.battery, low_battery_colour);
// Tables
set_style!(self.table_header_style, config.tables, headers);
// Widget graphs
set_colour!(self.graph_style, config.graphs, graph_color);
set_colour!(self.graph_style, config.graphs, graph_colour);
set_style!(self.graph_legend_style, config.graphs, legend_text);
// General widget text.
set_bg_colour!(self.general_widget_style, config.widgets, bg_color);
set_bg_colour!(self.general_widget_style, config.widgets, bg_colour);
set_style!(self.widget_title_style, config.widgets, widget_title);
set_style!(self.text_style, config.widgets, text);
set_style!(self.selected_text_style, config.widgets, selected_text);
@@ -235,11 +235,11 @@ impl Styles {
}
// Widget borders
set_colour!(self.border_style, config.widgets, border_color);
set_colour!(self.border_style, config.widgets, border_colour);
set_colour!(
self.highlighted_border_style,
config.widgets,
selected_border_color
selected_border_colour
);
if let Some(widgets) = &config.widgets {
@@ -258,7 +258,52 @@ mod test {
use tui::style::{Color, Style};
use super::Styles;
use crate::options::config::style::utils::str_to_colour;
use crate::options::config::{Config, style::utils::str_to_colour};
#[test]
fn color_spelling_aliases_work() {
// Parse all_styling_color.toml (which uses the "color" alias spelling throughout)
// and assert every field was actually parsed.
let toml_str = include_str!("../../../tests/valid_configs/all_styling_color.toml");
let config = toml_edit::de::from_str::<Config>(toml_str)
.expect("config file should parse")
.styles
.expect("styles section should be present");
let cpu = config.cpu.as_ref().unwrap();
assert!(cpu.all_entry_colour.is_some());
assert!(cpu.avg_entry_colour.is_some());
assert!(cpu.cpu_core_colours.is_some());
let temp = config.temp_graph.as_ref().unwrap();
assert!(temp.temp_graph_colour_styles.is_some());
let mem = config.memory.as_ref().unwrap();
assert!(mem.ram_colour.is_some());
assert!(mem.cache_colour.is_some());
assert!(mem.swap_colour.is_some());
assert!(mem.arc_colour.is_some());
assert!(mem.gpu_colours.is_some());
let net = config.network.as_ref().unwrap();
assert!(net.rx_colour.is_some());
assert!(net.tx_colour.is_some());
assert!(net.rx_total_colour.is_some());
assert!(net.tx_total_colour.is_some());
let bat = config.battery.as_ref().unwrap();
assert!(bat.high_battery_colour.is_some());
assert!(bat.medium_battery_colour.is_some());
assert!(bat.low_battery_colour.is_some());
let graphs = config.graphs.as_ref().unwrap();
assert!(graphs.graph_colour.is_some());
let widgets = config.widgets.as_ref().unwrap();
assert!(widgets.border_colour.is_some());
assert!(widgets.selected_border_colour.is_some());
assert!(widgets.bg_colour.is_some());
}
#[test]
fn default_selected_colour_works() {
+7 -7
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use super::ColorStr;
use super::ColourStr;
/// Styling specific to the battery widget.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -8,15 +8,15 @@ use super::ColorStr;
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct BatteryStyle {
/// The colour of the battery widget bar when the battery is over 50%.
#[serde(alias = "high_battery_colour")]
pub(crate) high_battery_color: Option<ColorStr>,
#[serde(alias = "high_battery_color")]
pub(crate) high_battery_colour: Option<ColourStr>,
/// The colour of the battery widget bar when the battery between 10% to
/// 50%.
#[serde(alias = "medium_battery_colour")]
pub(crate) medium_battery_color: Option<ColorStr>,
#[serde(alias = "medium_battery_color")]
pub(crate) medium_battery_colour: Option<ColourStr>,
/// The colour of the battery widget bar when the battery is under 10%.
#[serde(alias = "low_battery_colour")]
pub(crate) low_battery_color: Option<ColorStr>,
#[serde(alias = "low_battery_color")]
pub(crate) low_battery_colour: Option<ColourStr>,
}
+7 -9
View File
@@ -1,8 +1,6 @@
use serde::{Deserialize, Serialize};
use super::ColorStr;
// TODO: Use Canadian spelling for colour with an alias for US later instead since internally I use Canadian spelling.
use super::ColourStr;
/// Styling specific to the CPU widget.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -10,14 +8,14 @@ use super::ColorStr;
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct CpuStyle {
/// The colour of the "All" CPU label.
#[serde(alias = "all_entry_colour")]
pub(crate) all_entry_color: Option<ColorStr>,
#[serde(alias = "all_entry_color")]
pub(crate) all_entry_colour: Option<ColourStr>,
/// The colour of the average CPU label and graph line.
#[serde(alias = "avg_entry_colour")]
pub(crate) avg_entry_color: Option<ColorStr>,
#[serde(alias = "avg_entry_color")]
pub(crate) avg_entry_colour: Option<ColourStr>,
/// Colour of each CPU threads' label and graph line. Read in order.
#[serde(alias = "cpu_core_colours")]
pub(crate) cpu_core_colors: Option<Vec<ColorStr>>,
#[serde(alias = "cpu_core_colors")]
pub(crate) cpu_core_colours: Option<Vec<ColourStr>>,
}
+3 -3
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use super::{ColorStr, TextStyleConfig};
use super::{ColourStr, TextStyleConfig};
/// General styling for graph widgets.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -8,8 +8,8 @@ use super::{ColorStr, TextStyleConfig};
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct GraphStyle {
/// The general colour of the parts of the graph.
#[serde(alias = "graph_colour")]
pub(crate) graph_color: Option<ColorStr>,
#[serde(alias = "graph_color")]
pub(crate) graph_colour: Option<ColourStr>,
/// Text styling for graph's legend text.
pub(crate) legend_text: Option<TextStyleConfig>,
+11 -13
View File
@@ -1,8 +1,6 @@
use serde::{Deserialize, Serialize};
use super::ColorStr;
// TODO: Maybe I should swap the alias and the field name since internally I use
// u.
use super::ColourStr;
/// Styling specific to the memory widget.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -10,24 +8,24 @@ use super::ColorStr;
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct MemoryStyle {
/// The colour of the RAM label and graph line.
#[serde(alias = "ram_colour")]
pub(crate) ram_color: Option<ColorStr>,
#[serde(alias = "ram_color")]
pub(crate) ram_colour: Option<ColourStr>,
/// The colour of the cache label and graph line. Does not do anything on
/// Windows.
#[cfg_attr(target_os = "windows", allow(dead_code))]
#[serde(alias = "cache_colour")]
pub(crate) cache_color: Option<ColorStr>,
#[serde(alias = "cache_color")]
pub(crate) cache_colour: Option<ColourStr>,
/// The colour of the swap label and graph line.
#[serde(alias = "swap_colour")]
pub(crate) swap_color: Option<ColorStr>,
#[serde(alias = "swap_color")]
pub(crate) swap_colour: Option<ColourStr>,
/// The colour of the ARC label and graph line.
#[serde(alias = "arc_colour")]
pub(crate) arc_color: Option<ColorStr>,
#[serde(alias = "arc_color")]
pub(crate) arc_colour: Option<ColourStr>,
/// Colour of each GPU's memory label and graph line. Read in order.
#[serde(alias = "gpu_colours")]
pub(crate) gpu_colors: Option<Vec<ColorStr>>,
#[serde(alias = "gpu_colors")]
pub(crate) gpu_colours: Option<Vec<ColourStr>>,
}
+10 -10
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use super::ColorStr;
use super::ColourStr;
/// Styling specific to the network widget.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -8,18 +8,18 @@ use super::ColorStr;
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct NetworkStyle {
/// The colour of the RX (download) label and graph line.
#[serde(alias = "rx_colour")]
pub(crate) rx_color: Option<ColorStr>,
#[serde(alias = "rx_color")]
pub(crate) rx_colour: Option<ColourStr>,
/// The colour of the TX (upload) label and graph line.
#[serde(alias = "tx_colour")]
pub(crate) tx_color: Option<ColorStr>,
#[serde(alias = "tx_color")]
pub(crate) tx_colour: Option<ColourStr>,
/// he colour of the total RX (download) label in basic mode.
#[serde(alias = "rx_total_colour")]
pub(crate) rx_total_color: Option<ColorStr>,
/// The colour of the total RX (download) label in basic mode.
#[serde(alias = "rx_total_color")]
pub(crate) rx_total_colour: Option<ColourStr>,
/// The colour of the total TX (upload) label in basic mode.
#[serde(alias = "tx_total_colour")]
pub(crate) tx_total_color: Option<ColorStr>,
#[serde(alias = "tx_total_color")]
pub(crate) tx_total_colour: Option<ColourStr>,
}
+3 -3
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use super::ColorStr;
use super::ColourStr;
/// Styling specific to the temperature graph widget.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -8,6 +8,6 @@ use super::ColorStr;
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct TempGraphStyle {
/// Colour of each temperature sensor's graph line. Read in order.
#[serde(alias = "temp_graph_colour_styles")]
pub(crate) temp_graph_color_styles: Option<Vec<ColorStr>>,
#[serde(alias = "temp_graph_color_styles")]
pub(crate) temp_graph_colour_styles: Option<Vec<ColourStr>>,
}
+4 -4
View File
@@ -4,16 +4,16 @@ pub(super) mod default;
pub(super) mod gruvbox;
pub(super) mod nord;
/// Convert a [`tui::style::Color`] into a [`tui::style::Style`] with the color
/// Convert a [`tui::style::Color`] into a [`tui::style::Style`] with the colour
/// as the foreground.
macro_rules! color {
macro_rules! colour {
($value:expr) => {
tui::style::Style::new().fg($value)
};
}
/// Convert a hex string to a [`tui::style::Style`], where the hex string is
/// used as the foreground color.
/// used as the foreground colour.
macro_rules! hex {
($value:literal) => {
tui::style::Style::new().fg(crate::options::config::style::utils::try_hex_to_colour(
@@ -30,6 +30,6 @@ macro_rules! hex_colour {
};
}
pub(super) use color;
pub(super) use colour;
pub(super) use hex;
pub(super) use hex_colour;
+70 -70
View File
@@ -3,7 +3,7 @@ use tui::{
widgets::BorderType,
};
use super::color;
use super::colour;
use crate::options::config::style::Styles;
impl Styles {
@@ -17,107 +17,107 @@ impl Styles {
const HIGHLIGHT_COLOUR: Color = Color::LightBlue;
const AVG_COLOUR: Color = Color::Red;
const ALL_COLOUR: Color = Color::Green;
const DEFAULT_SELECTED_TEXT_STYLE: Style = color!(Color::Black).bg(HIGHLIGHT_COLOUR);
const DEFAULT_SELECTED_TEXT_STYLE: Style = colour!(Color::Black).bg(HIGHLIGHT_COLOUR);
const TEXT_COLOUR: Color = Color::Gray;
let list_colours = vec![
color!(Color::LightMagenta),
color!(Color::LightYellow),
color!(Color::LightCyan),
color!(Color::LightGreen),
color!(Color::LightBlue),
color!(Color::Cyan),
color!(Color::Green),
color!(Color::Blue),
colour!(Color::LightMagenta),
colour!(Color::LightYellow),
colour!(Color::LightCyan),
colour!(Color::LightGreen),
colour!(Color::LightBlue),
colour!(Color::Cyan),
colour!(Color::Green),
colour!(Color::Blue),
];
Self {
ram_style: color!(FIRST_COLOUR),
ram_style: colour!(FIRST_COLOUR),
#[cfg(not(target_os = "windows"))]
cache_style: color!(FIFTH_COLOUR),
swap_style: color!(SECOND_COLOUR),
cache_style: colour!(FIFTH_COLOUR),
swap_style: colour!(SECOND_COLOUR),
#[cfg(feature = "zfs")]
arc_style: color!(THIRD_COLOUR),
arc_style: colour!(THIRD_COLOUR),
#[cfg(feature = "gpu")]
gpu_colours: vec![
color!(FOURTH_COLOUR),
color!(Color::LightBlue),
color!(Color::LightRed),
color!(Color::Cyan),
color!(Color::Green),
color!(Color::Blue),
color!(Color::Red),
colour!(FOURTH_COLOUR),
colour!(Color::LightBlue),
colour!(Color::LightRed),
colour!(Color::Cyan),
colour!(Color::Green),
colour!(Color::Blue),
colour!(Color::Red),
],
rx_style: color!(FIRST_COLOUR),
tx_style: color!(SECOND_COLOUR),
total_rx_style: color!(THIRD_COLOUR),
total_tx_style: color!(FOURTH_COLOUR),
all_cpu_colour: color!(ALL_COLOUR),
avg_cpu_colour: color!(AVG_COLOUR),
rx_style: colour!(FIRST_COLOUR),
tx_style: colour!(SECOND_COLOUR),
total_rx_style: colour!(THIRD_COLOUR),
total_tx_style: colour!(FOURTH_COLOUR),
all_cpu_colour: colour!(ALL_COLOUR),
avg_cpu_colour: colour!(AVG_COLOUR),
cpu_colour_styles: list_colours.clone(),
temp_graph_colour_styles: list_colours,
border_style: color!(TEXT_COLOUR),
highlighted_border_style: color!(HIGHLIGHT_COLOUR),
text_style: color!(TEXT_COLOUR),
border_style: colour!(TEXT_COLOUR),
highlighted_border_style: colour!(HIGHLIGHT_COLOUR),
text_style: colour!(TEXT_COLOUR),
selected_text_style: DEFAULT_SELECTED_TEXT_STYLE,
table_header_style: color!(HIGHLIGHT_COLOUR).add_modifier(Modifier::BOLD),
widget_title_style: color!(TEXT_COLOUR),
table_header_style: colour!(HIGHLIGHT_COLOUR).add_modifier(Modifier::BOLD),
widget_title_style: colour!(TEXT_COLOUR),
general_widget_style: Style::default(),
graph_style: color!(TEXT_COLOUR),
graph_legend_style: color!(TEXT_COLOUR),
high_battery: color!(Color::Green),
medium_battery: color!(Color::Yellow),
low_battery: color!(Color::Red),
invalid_query_style: color!(Color::Red),
disabled_text_style: color!(Color::DarkGray),
graph_style: colour!(TEXT_COLOUR),
graph_legend_style: colour!(TEXT_COLOUR),
high_battery: colour!(Color::Green),
medium_battery: colour!(Color::Yellow),
low_battery: colour!(Color::Red),
invalid_query_style: colour!(Color::Red),
disabled_text_style: colour!(Color::DarkGray),
border_type: BorderType::Plain,
#[cfg(target_os = "linux")]
thread_text_style: color!(Color::Green),
thread_text_style: colour!(Color::Green),
}
}
pub fn default_light_palette() -> Self {
let list_colours = vec![
color!(Color::LightMagenta),
color!(Color::LightBlue),
color!(Color::LightRed),
color!(Color::Cyan),
color!(Color::Green),
color!(Color::Blue),
color!(Color::Red),
colour!(Color::LightMagenta),
colour!(Color::LightBlue),
colour!(Color::LightRed),
colour!(Color::Cyan),
colour!(Color::Green),
colour!(Color::Blue),
colour!(Color::Red),
];
Self {
ram_style: color!(Color::Blue),
ram_style: colour!(Color::Blue),
#[cfg(not(target_os = "windows"))]
cache_style: color!(Color::LightRed),
swap_style: color!(Color::Red),
cache_style: colour!(Color::LightRed),
swap_style: colour!(Color::Red),
#[cfg(feature = "zfs")]
arc_style: color!(Color::LightBlue),
arc_style: colour!(Color::LightBlue),
#[cfg(feature = "gpu")]
gpu_colours: vec![
color!(Color::LightGreen),
color!(Color::LightCyan),
color!(Color::LightRed),
color!(Color::Cyan),
color!(Color::Green),
color!(Color::Blue),
color!(Color::Red),
colour!(Color::LightGreen),
colour!(Color::LightCyan),
colour!(Color::LightRed),
colour!(Color::Cyan),
colour!(Color::Green),
colour!(Color::Blue),
colour!(Color::Red),
],
rx_style: color!(Color::Blue),
tx_style: color!(Color::Red),
total_rx_style: color!(Color::LightBlue),
total_tx_style: color!(Color::LightRed),
rx_style: colour!(Color::Blue),
tx_style: colour!(Color::Red),
total_rx_style: colour!(Color::LightBlue),
total_tx_style: colour!(Color::LightRed),
cpu_colour_styles: list_colours.clone(),
temp_graph_colour_styles: list_colours,
border_style: color!(Color::Black),
text_style: color!(Color::Black),
selected_text_style: color!(Color::White).bg(Color::LightBlue),
table_header_style: color!(Color::Black).add_modifier(Modifier::BOLD),
widget_title_style: color!(Color::Black),
graph_style: color!(Color::Black),
graph_legend_style: color!(Color::Black),
disabled_text_style: color!(Color::Gray),
border_style: colour!(Color::Black),
text_style: colour!(Color::Black),
selected_text_style: colour!(Color::White).bg(Color::LightBlue),
table_header_style: colour!(Color::Black).add_modifier(Modifier::BOLD),
widget_title_style: colour!(Color::Black),
graph_style: colour!(Color::Black),
graph_legend_style: colour!(Color::Black),
disabled_text_style: colour!(Color::Gray),
..Self::default_palette()
}
}
+3 -3
View File
@@ -3,7 +3,7 @@ use tui::{
widgets::BorderType,
};
use super::{color, hex};
use super::{colour, hex};
use crate::options::config::style::{Styles, themes::hex_colour};
impl Styles {
@@ -68,7 +68,7 @@ impl Styles {
high_battery: hex!("#98971a"),
medium_battery: hex!("#fabd2f"),
low_battery: hex!("#fb4934"),
invalid_query_style: color!(Color::Red),
invalid_query_style: colour!(Color::Red),
disabled_text_style: hex!("#665c54"),
border_type: BorderType::Plain,
#[cfg(target_os = "linux")]
@@ -137,7 +137,7 @@ impl Styles {
high_battery: hex!("#98971a"),
medium_battery: hex!("#d79921"),
low_battery: hex!("#cc241d"),
invalid_query_style: color!(Color::Red),
invalid_query_style: colour!(Color::Red),
disabled_text_style: hex!("#d5c4a1"),
border_type: BorderType::Plain,
#[cfg(target_os = "linux")]
+3 -3
View File
@@ -3,7 +3,7 @@ use tui::{
widgets::BorderType,
};
use super::{color, hex};
use super::{colour, hex};
use crate::options::config::style::{Styles, themes::hex_colour};
impl Styles {
@@ -56,7 +56,7 @@ impl Styles {
high_battery: hex!("#a3be8c"),
medium_battery: hex!("#ebcb8b"),
low_battery: hex!("#bf616a"),
invalid_query_style: color!(Color::Red),
invalid_query_style: colour!(Color::Red),
disabled_text_style: hex!("#4c566a"),
border_type: BorderType::Plain,
#[cfg(target_os = "linux")]
@@ -113,7 +113,7 @@ impl Styles {
high_battery: hex!("#a3be8c"),
medium_battery: hex!("#ebcb8b"),
low_battery: hex!("#bf616a"),
invalid_query_style: color!(Color::Red),
invalid_query_style: colour!(Color::Red),
disabled_text_style: hex!("#d8dee9"),
border_type: BorderType::Plain,
#[cfg(target_os = "linux")]
+48 -48
View File
@@ -6,12 +6,12 @@ use unicode_segmentation::UnicodeSegmentation;
pub(super) fn try_hex_to_colour(hex: &str) -> Result<Color, String> {
fn hex_component_to_int(hex: &str, first: &str, second: &str) -> Result<u8, String> {
u8::from_str_radix(&concat_string!(first, second), 16)
.map_err(|_| format!("'{hex}' is an invalid hex color, could not decode."))
.map_err(|_| format!("'{hex}' is an invalid hex colour, could not decode."))
}
fn invalid_hex_format(hex: &str) -> String {
format!(
"'{hex}' is an invalid hex color. It must be either a 7 character hex string of the form '#12ab3c' or a 3 character hex string of the form '#1a2'.",
"'{hex}' is an invalid hex colour. It must be either a 7 character hex string of the form '#12ab3c' or a 3 character hex string of the form '#1a2'.",
)
}
@@ -44,7 +44,7 @@ pub fn str_to_colour(input_val: &str) -> Result<Color, String> {
if input_val.starts_with('#') {
try_hex_to_colour(input_val)
} else if input_val.contains(',') {
convert_rgb_to_color(input_val)
convert_rgb_to_colour(input_val)
} else {
convert_name_to_colour(input_val)
}
@@ -53,7 +53,7 @@ pub fn str_to_colour(input_val: &str) -> Result<Color, String> {
}
}
fn convert_rgb_to_color(rgb_str: &str) -> Result<Color, String> {
fn convert_rgb_to_colour(rgb_str: &str) -> Result<Color, String> {
let rgb_list = rgb_str.split(',').collect::<Vec<&str>>();
if rgb_list.len() != 3 {
return Err(format!(
@@ -75,8 +75,8 @@ fn convert_rgb_to_color(rgb_str: &str) -> Result<Color, String> {
}
}
fn convert_name_to_colour(color_name: &str) -> Result<Color, String> {
match color_name.to_lowercase().trim() {
fn convert_name_to_colour(colour_name: &str) -> Result<Color, String> {
match colour_name.to_lowercase().trim() {
"reset" => Ok(Color::Reset),
"black" => Ok(Color::Black),
"red" => Ok(Color::Red),
@@ -95,9 +95,9 @@ fn convert_name_to_colour(color_name: &str) -> Result<Color, String> {
"lightcyan" | "light cyan" => Ok(Color::LightCyan),
"white" => Ok(Color::White),
_ => Err(format!(
"'{color_name}' is an invalid named color.
"'{colour_name}' is an invalid named colour.
The following are supported named colors:
The following are supported named colours:
+--------+-------------+---------------------+
| Reset | Magenta | Light Yellow |
+--------+-------------+---------------------+
@@ -112,7 +112,7 @@ The following are supported named colors:
| Blue | Light Green | |
+--------+-------------+---------------------+
Alternatively, hex colors or RGB color codes are valid.\n"
Alternatively, hex colours or RGB colour codes are valid.\n"
)),
}
}
@@ -144,12 +144,12 @@ macro_rules! set_style {
);
}
TextStyleConfig::TextStyle {
color,
bg_color,
colour,
bg_colour,
bold,
italics,
} => {
if let Some(fg) = &color {
if let Some(fg) = &colour {
$palette_field = $palette_field
.fg(crate::options::config::style::utils::str_to_colour(
&fg.0,
@@ -168,7 +168,7 @@ macro_rules! set_style {
})?);
}
if let Some(bg) = &bg_color {
if let Some(bg) = &bg_colour {
$palette_field = $palette_field
.bg(crate::options::config::style::utils::str_to_colour(
&bg.0,
@@ -291,7 +291,7 @@ mod test {
use tui::style::{Modifier, Style};
use super::*;
use crate::options::config::style::{ColorStr, TextStyleConfig};
use crate::options::config::style::{ColourStr, TextStyleConfig};
#[test]
fn general_str_to_colour() {
@@ -322,7 +322,7 @@ mod test {
#[test]
fn valid_colour_names() {
// Standard color should work
// Standard colour should work
assert_eq!(convert_name_to_colour("red"), Ok(Color::Red));
// Capitalizing should be fine.
@@ -424,18 +424,18 @@ mod test {
#[test]
fn test_rgb_colours() {
assert_eq!(
convert_rgb_to_color("0, 0, 0").unwrap(),
convert_rgb_to_colour("0, 0, 0").unwrap(),
Color::Rgb(0, 0, 0)
);
assert_eq!(
convert_rgb_to_color("255, 255, 255").unwrap(),
convert_rgb_to_colour("255, 255, 255").unwrap(),
Color::Rgb(255, 255, 255)
);
assert!(convert_rgb_to_color("255, 256, 255").is_err());
assert!(convert_rgb_to_color("256, 0, 256").is_err());
assert!(convert_rgb_to_color("1, -1, 1").is_err());
assert!(convert_rgb_to_color("1, -100000, 1").is_err());
assert!(convert_rgb_to_color("1, -100000, 100000").is_err());
assert!(convert_rgb_to_colour("255, 256, 255").is_err());
assert!(convert_rgb_to_colour("256, 0, 256").is_err());
assert!(convert_rgb_to_colour("1, -1, 1").is_err());
assert!(convert_rgb_to_colour("1, -100000, 1").is_err());
assert!(convert_rgb_to_colour("1, -100000, 100000").is_err());
}
struct DummyConfig {
@@ -443,18 +443,18 @@ mod test {
}
struct InnerDummyConfig {
color_a: Option<ColorStr>,
color_b: Option<ColorStr>,
color_c: Option<ColorStr>,
color_d: Option<ColorStr>,
many_colors: Option<Vec<ColorStr>>,
color_a: Option<ColourStr>,
color_b: Option<ColourStr>,
color_c: Option<ColourStr>,
color_d: Option<ColourStr>,
many_colors: Option<Vec<ColourStr>>,
text_a: Option<TextStyleConfig>,
text_b: Option<TextStyleConfig>,
text_c: Option<TextStyleConfig>,
text_d: Option<TextStyleConfig>,
text_e: Option<TextStyleConfig>,
bad_color: Option<ColorStr>,
bad_list: Option<Vec<ColorStr>>,
bad_color: Option<ColourStr>,
bad_list: Option<Vec<ColourStr>>,
bad_text_a: Option<TextStyleConfig>,
bad_text_b: Option<TextStyleConfig>,
}
@@ -463,45 +463,45 @@ mod test {
fn default() -> Self {
Self {
color_a: None,
color_b: Some(ColorStr("red".into())),
color_c: Some(ColorStr("255, 255, 255".into())),
color_d: Some(ColorStr("#000000".into())),
many_colors: Some(vec![ColorStr("red".into()), ColorStr("blue".into())]),
text_a: Some(TextStyleConfig::Colour(ColorStr("green".into()))),
color_b: Some(ColourStr("red".into())),
color_c: Some(ColourStr("255, 255, 255".into())),
color_d: Some(ColourStr("#000000".into())),
many_colors: Some(vec![ColourStr("red".into()), ColourStr("blue".into())]),
text_a: Some(TextStyleConfig::Colour(ColourStr("green".into()))),
text_b: Some(TextStyleConfig::TextStyle {
color: None,
bg_color: None,
colour: None,
bg_colour: None,
bold: None,
italics: None,
}),
text_c: Some(TextStyleConfig::TextStyle {
color: Some(ColorStr("magenta".into())),
bg_color: Some(ColorStr("255, 255, 255".into())),
colour: Some(ColourStr("magenta".into())),
bg_colour: Some(ColourStr("255, 255, 255".into())),
bold: Some(true),
italics: Some(false),
}),
text_d: Some(TextStyleConfig::TextStyle {
color: Some(ColorStr("#fff".into())),
bg_color: Some(ColorStr("1, 1, 1".into())),
colour: Some(ColourStr("#fff".into())),
bg_colour: Some(ColourStr("1, 1, 1".into())),
bold: Some(false),
italics: Some(true),
}),
text_e: None,
bad_color: Some(ColorStr("asdf".into())),
bad_color: Some(ColourStr("asdf".into())),
bad_list: Some(vec![
ColorStr("red".into()),
ColorStr("asdf".into()),
ColorStr("ghi".into()),
ColourStr("red".into()),
ColourStr("asdf".into()),
ColourStr("ghi".into()),
]),
bad_text_a: Some(TextStyleConfig::TextStyle {
color: Some(ColorStr("asdf".into())),
bg_color: None,
colour: Some(ColourStr("asdf".into())),
bg_colour: None,
bold: None,
italics: None,
}),
bad_text_b: Some(TextStyleConfig::TextStyle {
color: None,
bg_color: Some(ColorStr("asdf".into())),
colour: None,
bg_colour: Some(ColourStr("asdf".into())),
bold: None,
italics: None,
}),
+8 -7
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use super::{ColorStr, TextStyleConfig, borders::WidgetBorderType};
use super::{ColourStr, TextStyleConfig, borders::WidgetBorderType};
/// General styling for generic widgets.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -8,12 +8,12 @@ use super::{ColorStr, TextStyleConfig, borders::WidgetBorderType};
#[cfg_attr(test, serde(deny_unknown_fields), derive(PartialEq, Eq))]
pub(crate) struct WidgetStyle {
/// The colour of the widgets' borders.
#[serde(alias = "border_colour")]
pub(crate) border_color: Option<ColorStr>,
#[serde(alias = "border_color")]
pub(crate) border_colour: Option<ColourStr>,
/// The colour of a widget's borders when the widget is selected.
#[serde(alias = "selected_border_colour")]
pub(crate) selected_border_color: Option<ColorStr>,
#[serde(alias = "selected_border_color")]
pub(crate) selected_border_colour: Option<ColourStr>,
/// Text styling for a widget's title.
pub(crate) widget_title: Option<TextStyleConfig>,
@@ -34,6 +34,7 @@ pub(crate) struct WidgetStyle {
/// Widget borders type.
pub(crate) widget_border_type: Option<WidgetBorderType>,
/// Background color for widgets.
pub(crate) bg_color: Option<ColorStr>,
/// Background colour for widgets.
#[serde(alias = "bg_color")]
pub(crate) bg_colour: Option<ColourStr>,
}
+4 -2
View File
@@ -11,6 +11,8 @@ use concat_string::concat_string;
use tui::widgets::Row;
use super::process_columns::ProcColumn;
#[cfg(target_os = "linux")]
use crate::collection::processes::ProcessType;
use crate::{
canvas::{
Painter,
@@ -215,9 +217,9 @@ pub struct ProcWidgetData {
pub gpu_mem_usage: MemUsage,
#[cfg(feature = "gpu")]
pub gpu_usage: u32,
/// The process "type". Used to color things.
/// The process "type". Used to colour things.
#[cfg(target_os = "linux")]
pub process_type: crate::collection::processes::ProcessType,
pub process_type: ProcessType,
#[cfg(unix)]
pub nice: i32,
pub priority: i32,
+5 -5
View File
@@ -48,7 +48,7 @@ fn test_invalid_colour_hex() {
btm_command(&["-C", "./tests/invalid_configs/invalid_colour_hex.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid hex color"));
.stderr(predicate::str::contains("invalid hex colour"));
}
/// Checks for if a hex is too long
@@ -57,7 +57,7 @@ fn test_invalid_colour_hex_2() {
btm_command(&["-C", "./tests/invalid_configs/invalid_colour_hex_2.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid hex color"));
.stderr(predicate::str::contains("invalid hex colour"));
}
/// Checks unicode hex because the way we originally did it could cause char
@@ -67,7 +67,7 @@ fn test_invalid_colour_hex_3() {
btm_command(&["-C", "./tests/invalid_configs/invalid_colour_hex_3.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid hex color"));
.stderr(predicate::str::contains("invalid hex colour"));
}
#[test]
@@ -75,7 +75,7 @@ fn test_invalid_colour_name() {
btm_command(&["-C", "./tests/invalid_configs/invalid_colour_name.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid named color"));
.stderr(predicate::str::contains("invalid named colour"));
}
#[test]
@@ -99,7 +99,7 @@ fn test_invalid_colour_string() {
btm_command(&["-C", "./tests/invalid_configs/invalid_colour_string.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid named color"));
.stderr(predicate::str::contains("invalid named colour"));
}
#[test]
+6 -1
View File
@@ -177,7 +177,12 @@ fn test_styling_sanity_check() {
#[test]
fn test_styling_sanity_check_2() {
run_and_kill(&["-C", "./tests/valid_configs/styling_2.toml"]);
run_and_kill(&["-C", "./tests/valid_configs/all_styling.toml"]);
}
#[test]
fn test_color_spelling_is_valid() {
run_and_kill(&["-C", "./tests/valid_configs/all_styling_color.toml"]);
}
#[test]
+66
View File
@@ -0,0 +1,66 @@
# These are all the components that support custom theming. Note that colour support
# will depend on terminal support.
[styles]
# Built-in themes. Valid values are:
# - "default"
# - "default-light"
# - "gruvbox"
# - "gruvbox-light"
# - "nord"
# - "nord-light".
# This will have the lowest precedence if a custom colour palette is set,
# or overridden if the command-line flag for a built-in theme is set.
theme = "default"
[styles.cpu]
all_entry_colour = "green"
avg_entry_colour = "red"
cpu_core_colours = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
[styles.temp_graph]
temp_graph_colour_styles = [
"light magenta",
"light yellow",
"light cyan",
"light green",
"light blue",
"cyan",
"green",
"blue",
]
[styles.memory]
ram_colour = "light magenta"
cache_colour = "light red"
swap_colour = "light yellow"
arc_colour = "light cyan"
gpu_colours = ["light blue", "light red", "cyan", "green", "blue", "red"]
[styles.network]
rx_colour = "light magenta"
tx_colour = "light yellow"
rx_total_colour = "light cyan"
tx_total_colour = "light green"
[styles.battery]
high_battery_colour = "green"
medium_battery_colour = "yellow"
low_battery_colour = "red"
[styles.tables]
headers = { colour = "light blue" }
[styles.graphs]
graph_colour = "gray"
legend_text = { colour = "gray" }
[styles.widgets]
border_colour = "gray"
selected_border_colour = "light blue"
widget_title = { colour = "gray" }
text = { colour = "gray" }
selected_text = { colour = "black", bg_colour = "light blue" }
disabled_text = { colour = "dark gray" }
bg_colour = "black"
@@ -1,4 +1,6 @@
# These are all the components that support custom theming. Note that colour support
# Styling but we use "color" everywhere.
# These are all the components that support custom theming. Note that color support
# will depend on terminal support.
[styles]
@@ -10,7 +12,7 @@
# - "nord"
# - "nord-light".
# This will have the lowest precedence if a custom colour palette is set,
# This will have the lowest precedence if a custom color palette is set,
# or overridden if the command-line flag for a built-in theme is set.
theme = "default"
@@ -19,6 +21,18 @@ all_entry_color = "green"
avg_entry_color = "red"
cpu_core_colors = ["light magenta", "light yellow", "light cyan", "light green", "light blue", "cyan", "green", "blue"]
[styles.temp_graph]
temp_graph_color_styles = [
"light magenta",
"light yellow",
"light cyan",
"light green",
"light blue",
"cyan",
"green",
"blue",
]
[styles.memory]
ram_color = "light magenta"
cache_color = "light red"
@@ -51,3 +65,4 @@ widget_title = { color = "gray" }
text = { color = "gray" }
selected_text = { color = "black", bg_color = "light blue" }
disabled_text = { color = "dark gray" }
bg_color = "black"
+1 -1
View File
@@ -1,4 +1,4 @@
# Remove things from this if they are no longer OS-specific.
[styles.widgets]
thread_text = { color = "green" }
thread_text = { colour = "green" }