Files
OneCAD-Draft/src/ui/window/about.rs
T

151 lines
3.9 KiB
Rust

use crate::app::Message;
use crate::t;
use iced::widget::{button, column, container, row, svg, text, Space};
use iced::{Background, Border, Element, Fill, Length, Shrink, Theme};
fn muted_style(theme: &Theme) -> iced::widget::text::Style {
iced::widget::text::Style {
color: Some(theme.palette().background.base.text.scale_alpha(0.68)),
}
}
fn primary_style(theme: &Theme) -> iced::widget::text::Style {
iced::widget::text::Style {
color: Some(theme.palette().primary.base.color),
}
}
fn surface_style(theme: &Theme) -> container::Style {
container::Style {
background: Some(Background::Color(
theme.palette().background.weakest.color,
)),
border: Border {
color: theme.palette().background.neutral.color,
width: 1.0,
radius: 8.0.into(),
},
..Default::default()
}
}
fn info_card<'a>(
label: std::borrow::Cow<'static, str>,
value: impl iced::widget::text::IntoFragment<'a>,
width: Length,
) -> Element<'a, Message> {
container(
column![
text(label).size(10).style(muted_style),
text(value).size(14),
]
.spacing(5),
)
.padding([10, 12])
.width(width)
.height(Length::Fixed(62.0))
.style(surface_style)
.into()
}
pub(crate) fn platform_name() -> &'static str {
#[cfg(target_arch = "wasm32")]
{
"Web"
}
#[cfg(not(target_arch = "wasm32"))]
{
match std::env::consts::OS {
"linux" => "Linux",
"windows" => "Windows",
"macos" => "macOS",
other => other,
}
}
}
pub(crate) fn architecture_name() -> &'static str {
match std::env::consts::ARCH {
"x86_64" => "x86-64",
"aarch64" => "ARM64",
"wasm32" => "WebAssembly 32-bit",
other => other,
}
}
pub fn view_window(
sizing: crate::ui::modal::ModalSizing,
) -> Element<'static, Message> {
let version = format!("v{}", env!("OCS_APP_VERSION"));
let content_width = if matches!(sizing.width, Length::Fill) {
Fill
} else {
Shrink
};
let card_width = if matches!(sizing.width, Length::Fill) {
Length::FillPortion(1)
} else {
Length::Fixed(148.0)
};
let logo = svg(svg::Handle::from_memory(include_bytes!(
"../../../assets/logo.svg"
)))
.width(Length::Fixed(72.0))
.height(Length::Fixed(72.0));
let hero = container(
row![
logo,
column![
text("Open CAD Studio").size(28).style(primary_style),
text(t!("CAD application for Architecture & Engineering"))
.size(11)
.style(muted_style),
text(version.clone()).size(13),
]
.spacing(5),
]
.spacing(18)
.align_y(iced::Center),
)
.padding([14, 16])
.width(content_width)
.style(surface_style);
let metadata = row![
info_card(t!("Version"), version, card_width),
info_card(t!("Platform"), platform_name(), card_width),
info_card(t!("Arch"), architecture_name(), card_width),
]
.spacing(8)
.width(content_width);
let copy = button(text(t!("Copy Info")).size(11))
.on_press(Message::AboutCopyInfo)
.style(button::primary)
.padding([6, 16]);
container(
column![
hero,
metadata,
row![Space::new().width(content_width), copy]
.width(sizing.width)
.align_y(iced::Center),
]
.spacing(12)
.padding(16)
.width(sizing.width)
.height(sizing.height),
)
.width(sizing.width)
.height(sizing.height)
.style(|theme: &Theme| container::Style {
background: Some(Background::Color(
theme.palette().background.base.color,
)),
..Default::default()
})
.into()
}