#![cfg(all(
any(feature = "desktop", feature = "tablet", feature = "mobile"),
not(any(feature = "mini", feature = "embedded"))
))]
use rust_widgets::core::Color;
use rust_widgets::theme::{global_theme_manager, resolved_theme_style, AppearanceMode};
const KINDS: &[&str] = &[
"button",
"check_box",
"radio_button",
"spin_box",
"combo_box",
"line_edit",
"list_box",
"slider",
"progress_bar",
"label",
"panel",
"frame",
"scroll_area",
"message_box",
"tool_bar",
"status_bar",
"menu_bar",
"group_box",
"scroll_bar",
"list_view",
];
fn rgb(color: Option<Color>) -> String {
color.map(|c| format!("rgb({},{},{})", c.r, c.g, c.b)).unwrap_or_else(|| "(none)".to_string())
}
fn dump(label: &str, window_bg: Option<Color>) {
println!("── {label} ── window background: {}", rgb(window_bg));
println!("{:<16} {:<28} {:<28} border", "kind", "background", "text");
println!("{}", "-".repeat(96));
for kind in KINDS {
match resolved_theme_style(kind) {
Some(style) => {
let border = style
.border_color
.map(|c| format!("rgb({},{},{}) w={:?}", c.r, c.g, c.b, style.border_width))
.unwrap_or_else(|| "(none)".to_string());
let invisible = match (style.background_color, window_bg) {
(Some(fill), Some(bg))
if fill.r == bg.r && fill.g == bg.g && fill.b == bg.b =>
{
" <-- same as window background"
}
_ => "",
};
println!(
"{kind:<16} {:<28} {:<28} {border}{invisible}",
rgb(style.background_color),
rgb(style.text_color)
);
}
None => println!("{kind:<16} (no theme style resolved)"),
}
}
println!();
}
fn main() {
for (mode, label) in [(AppearanceMode::Light, "light"), (AppearanceMode::Dark, "dark")] {
if !global_theme_manager().set_appearance(mode) {
println!("── {label} ── (this appearance is not registered)\n");
continue;
}
let window_bg = global_theme_manager().current_theme().map(|t| t.colors.background);
dump(label, window_bg);
}
}