theme: Add color method for default color palette to get color by a scale number. (#447)

```rs
ui::red(50);
ui::blue(600);
```
This commit is contained in:
Jason Lee 2024-11-28 11:36:33 +08:00 committed by GitHub
parent a941c7b32e
commit 5468d034da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 46 additions and 21 deletions

View file

@ -17,6 +17,7 @@ use ui::{
popup_menu::{PopupMenu, PopupMenuExt},
prelude::FluentBuilder as _,
table::{ColFixed, ColSort, Table, TableDelegate, TableEvent},
theme::ActiveTheme as _,
v_flex, Selectable, Size, StyleSized as _,
};
@ -255,7 +256,12 @@ impl StockTableDelegate {
self.loading = false;
}
fn render_value_cell(&self, val: f64) -> AnyElement {
fn render_value_cell(&self, val: f64, cx: &mut ViewContext<Table<Self>>) -> AnyElement {
let (fg_scale, bg_scale, opacity) = match cx.theme().mode.is_dark() {
true => (200, 950, 0.3),
false => (600, 50, 0.6),
};
let this = div()
.h_full()
.table_cell_size(self.size)
@ -265,10 +271,11 @@ impl StockTableDelegate {
let right_num = ((val - val.floor()) * 1000.).floor() as i32;
let this = if right_num % 3 == 0 {
this.text_color(ui::red_600()).bg(ui::red_50().opacity(0.6))
this.text_color(ui::red(fg_scale))
.bg(ui::red(bg_scale).opacity(opacity))
} else if right_num % 3 == 1 {
this.text_color(ui::green_600())
.bg(ui::green_50().opacity(0.6))
this.text_color(ui::green(fg_scale))
.bg(ui::green(bg_scale).opacity(opacity))
} else {
this
};
@ -351,7 +358,7 @@ impl TableDelegate for StockTableDelegate {
&self,
row_ix: usize,
col_ix: usize,
_cx: &mut ViewContext<Table<Self>>,
cx: &mut ViewContext<Table<Self>>,
) -> impl IntoElement {
let stock = self.stocks.get(row_ix).unwrap();
let col = self.columns.get(col_ix).unwrap();
@ -360,33 +367,33 @@ impl TableDelegate for StockTableDelegate {
"id" => stock.id.to_string().into_any_element(),
"name" => stock.name.clone().into_any_element(),
"symbol" => stock.symbol.clone().into_any_element(),
"price" => self.render_value_cell(stock.price),
"change" => self.render_value_cell(stock.change),
"change_percent" => self.render_value_cell(stock.change_percent),
"volume" => self.render_value_cell(stock.volume),
"turnover" => self.render_value_cell(stock.turnover),
"market_cap" => self.render_value_cell(stock.market_cap),
"ttm" => self.render_value_cell(stock.ttm),
"five_mins_ranking" => self.render_value_cell(stock.five_mins_ranking),
"price" => self.render_value_cell(stock.price, cx),
"change" => self.render_value_cell(stock.change, cx),
"change_percent" => self.render_value_cell(stock.change_percent, cx),
"volume" => self.render_value_cell(stock.volume, cx),
"turnover" => self.render_value_cell(stock.turnover, cx),
"market_cap" => self.render_value_cell(stock.market_cap, cx),
"ttm" => self.render_value_cell(stock.ttm, cx),
"five_mins_ranking" => self.render_value_cell(stock.five_mins_ranking, cx),
"th60_days_ranking" => stock.th60_days_ranking.to_string().into_any_element(),
"year_change_percent" => (stock.year_change_percent * 100.0)
.to_string()
.into_any_element(),
"bid" => self.render_value_cell(stock.bid),
"bid_volume" => self.render_value_cell(stock.bid_volume),
"ask" => self.render_value_cell(stock.ask),
"ask_volume" => self.render_value_cell(stock.ask_volume),
"bid" => self.render_value_cell(stock.bid, cx),
"bid_volume" => self.render_value_cell(stock.bid_volume, cx),
"ask" => self.render_value_cell(stock.ask, cx),
"ask_volume" => self.render_value_cell(stock.ask_volume, cx),
"open" => stock.open.to_string().into_any_element(),
"prev_close" => stock.prev_close.to_string().into_any_element(),
"high" => self.render_value_cell(stock.high),
"low" => self.render_value_cell(stock.low),
"high" => self.render_value_cell(stock.high, cx),
"low" => self.render_value_cell(stock.low, cx),
"turnover_rate" => (stock.turnover_rate * 100.0).to_string().into_any_element(),
"rise_rate" => (stock.rise_rate * 100.0).to_string().into_any_element(),
"amplitude" => (stock.amplitude * 100.0).to_string().into_any_element(),
"pe_status" => stock.pe_status.to_string().into_any_element(),
"pb_status" => stock.pb_status.to_string().into_any_element(),
"volume_ratio" => self.render_value_cell(stock.volume_ratio),
"bid_ask_ratio" => self.render_value_cell(stock.bid_ask_ratio),
"volume_ratio" => self.render_value_cell(stock.volume_ratio, cx),
"bid_ask_ratio" => self.render_value_cell(stock.bid_ask_ratio, cx),
"latest_pre_close" => stock.latest_pre_close.to_string().into_any_element(),
"latest_post_close" => stock.latest_post_close.to_string().into_any_element(),
"pre_market_cap" => stock.pre_market_cap.to_string().into_any_element(),

View file

@ -172,6 +172,7 @@ where
macro_rules! color_method {
($color:tt, $scale:tt) => {
paste::paste! {
#[inline]
#[allow(unused)]
pub fn [<$color _ $scale>]() -> Hsla {
if let Some(color) = DEFAULT_COLOR.$color.get(&($scale as usize)) {
@ -186,6 +187,23 @@ macro_rules! color_method {
macro_rules! color_methods {
($color:tt) => {
paste::paste! {
/// Get color by scale number.
///
/// The possible scale numbers are:
/// 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
///
/// If the scale number is not found, it will return black color.
#[inline]
pub fn [<$color>](scale: usize) -> Hsla {
if let Some(color) = DEFAULT_COLOR.$color.get(&scale) {
return color.hsla;
}
black()
}
}
color_method!($color, 50);
color_method!($color, 100);
color_method!($color, 200);