Support nighttime
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Isaac Mills 2025-07-28 22:34:19 -06:00
parent 55c0912608
commit f719983c62
Signed by: fnmain
GPG key ID: B67D7410F33A0F61
2 changed files with 46 additions and 24 deletions

View file

@ -25,7 +25,7 @@ use web_time::Instant;
use crate::app::{ use crate::app::{
password_locker::PasswordLocker, password_locker::PasswordLocker,
weather_icon::{WeatherIcon, DAY_ICONS}, weather_icon::{WeatherIcon, WEATHER_ICONS},
}; };
mod password_locker; mod password_locker;
@ -143,7 +143,7 @@ impl<E: AppExecutor> App<E> {
lon: -111.89066476757807, lon: -111.89066476757807,
country: String::from("US"), country: String::from("US"),
}, },
"metric".to_owned(), "imperial".to_owned(),
dotenv!("OPENWEATHERMAP_API_KEY").to_owned(), dotenv!("OPENWEATHERMAP_API_KEY").to_owned(),
); );
weather_client.get_current_weather().await.unwrap() weather_client.get_current_weather().await.unwrap()
@ -225,23 +225,42 @@ impl<E: AppExecutor> App<E> {
let layout = Layout::new( let layout = Layout::new(
Direction::Vertical, Direction::Vertical,
[Constraint::Length(12), Constraint::Min(0)], [Constraint::Length(20), Constraint::Min(0)],
) )
.split(weather_area.inner(Margin::new(2, 2))); .split(weather_area.inner(Margin::new(2, 2)));
let layout_upper = Layout::new( let layout_upper = Layout::new(
Direction::Horizontal, if weather_area.width < (weather_area.height * 2) {
[Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)], Direction::Vertical
} else {
Direction::Horizontal
},
[
Constraint::Length(if weather_area.width < (weather_area.height * 2) {
28 / 2
} else {
28
}),
Constraint::Min(0),
],
) )
.split(layout[0]); .split(layout[0]);
frame.render_widget( frame.render_widget(
WeatherIcon(DAY_ICONS.get(&weather.weather[0].icon).unwrap()), WeatherIcon(
WEATHER_ICONS
.get(&weather.weather[0].icon[..weather.weather[0].icon.len() - 1])
.unwrap(),
weather.weather[0].icon[weather.weather[0].icon.len() - 1..]
.bytes()
.next()
.unwrap(),
),
layout_upper[0], layout_upper[0],
); );
frame.render_widget( frame.render_widget(
Paragraph::new(format!( Paragraph::new(format!(
"{} {}°C\n~{}°C -{}°C +{}°C\n{} {} {}m/s SSE\nVisibility: {}km", "{} {}°F\n~{}°F -{}°F +{}°F\n{} {} {}mph\nVisibility: {}km",
weather.name, weather.name,
weather.main.temp.unwrap_or(f64::NAN), weather.main.temp.unwrap_or(f64::NAN),
weather.main.feels_like.unwrap_or(f64::NAN), weather.main.feels_like.unwrap_or(f64::NAN),
@ -263,11 +282,7 @@ impl<E: AppExecutor> App<E> {
)) ))
.fg(Color::Rgb(226, 190, 89)) .fg(Color::Rgb(226, 190, 89))
.bg(Color::Black), .bg(Color::Black),
if weather_area.width < (weather_area.height * 2) { layout_upper[1],
layout[1]
} else {
layout_upper[1]
},
); );
} else { } else {
frame.render_widget( frame.render_widget(

View file

@ -3,8 +3,8 @@ use ratatui::{style::Color, widgets::Widget};
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
use ratzilla::ratatui; use ratzilla::ratatui;
pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! { pub const WEATHER_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"01d" => [ "01" => [
"", "",
"", "",
r#" r#"
@ -23,7 +23,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
============+ ============+
"#, "#,
], ],
"02d" => [ "02" => [
"", "",
r#" r#"
...... ......
@ -53,7 +53,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"#, "#,
], ],
"03d" => [ "03" => [
"", "",
r#" r#"
......... .........
@ -69,7 +69,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"#, "#,
"", "",
], ],
"04d" => [ "04" => [
r#" r#"
######## ########
%######### %#########
@ -100,7 +100,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"#, "#,
"", "",
], ],
"09d" => [ "09" => [
r#" r#"
####### #######
-%######### -%#########
@ -133,7 +133,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"#, "#,
"", "",
], ],
"10d" => [ "10" => [
r#" r#"
@ -180,7 +180,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"#, "#,
], ],
"11d" => [ "11" => [
r#" r#"
###### ######
######### #########
@ -233,7 +233,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
+= +=
"#, "#,
], ],
"13d" => [ "13" => [
r#" r#"
## ##
# ######## # # ######## #
@ -250,7 +250,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
"", "",
"", "",
], ],
"50d" => [ "50" => [
r#" r#"
########## ##########
@ -267,7 +267,7 @@ pub const DAY_ICONS: phf::Map<&'static str, [&'static str; 3]> = phf_map! {
], ],
}; };
pub struct WeatherIcon(pub &'static [&'static str; 3]); pub struct WeatherIcon(pub &'static [&'static str; 3], pub u8);
impl Widget for WeatherIcon { impl Widget for WeatherIcon {
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
@ -277,7 +277,14 @@ impl Widget for WeatherIcon {
for (layer, color) in [ for (layer, color) in [
(0, Color::Rgb(72, 72, 72)), (0, Color::Rgb(72, 72, 72)),
(1, Color::Rgb(242, 242, 242)), (1, Color::Rgb(242, 242, 242)),
(2, Color::Rgb(236, 110, 76)), (
2,
if self.1 == b'd' {
Color::Rgb(236, 110, 76)
} else {
Color::Rgb(72, 72, 72)
},
),
] { ] {
for (y, line) in self.0[layer].lines().skip(1).enumerate() { for (y, line) in self.0[layer].lines().skip(1).enumerate() {
for (x, byte) in line.bytes().enumerate() { for (x, byte) in line.bytes().enumerate() {