Add the current Moon phase in the middle
This commit is contained in:
parent
44904cd176
commit
c2ef71ed92
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -491,6 +491,12 @@ dependencies = [
|
|||||||
"wayland-protocols",
|
"wayland-protocols",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "suncalc"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "830c44c596fd2dfa93ad514462622e014c3e58e5d7e6844a87f7d510e8e68045"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "svg"
|
name = "svg"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
@ -730,6 +736,7 @@ dependencies = [
|
|||||||
"chrono",
|
"chrono",
|
||||||
"resvg",
|
"resvg",
|
||||||
"smithay-client-toolkit",
|
"smithay-client-toolkit",
|
||||||
|
"suncalc",
|
||||||
"svg",
|
"svg",
|
||||||
"tiny-skia",
|
"tiny-skia",
|
||||||
"usvg",
|
"usvg",
|
||||||
|
@ -10,3 +10,4 @@ svg = "0.10"
|
|||||||
usvg = "0.22"
|
usvg = "0.22"
|
||||||
tiny-skia = "0.6"
|
tiny-skia = "0.6"
|
||||||
resvg = "0.22"
|
resvg = "0.22"
|
||||||
|
suncalc = "0.4"
|
||||||
|
64
src/main.rs
64
src/main.rs
@ -7,7 +7,8 @@ use chrono::Timelike;
|
|||||||
use sctk::reexports::client::protocol::{wl_shm, wl_surface};
|
use sctk::reexports::client::protocol::{wl_shm, wl_surface};
|
||||||
use sctk::shm::AutoMemPool;
|
use sctk::shm::AutoMemPool;
|
||||||
use sctk::window::{Event as WEvent, FallbackFrame};
|
use sctk::window::{Event as WEvent, FallbackFrame};
|
||||||
use svg::node::element::{Group, Line, Rectangle, Style, Text};
|
use svg::node::element::path::Data as PathData;
|
||||||
|
use svg::node::element::{Circle, Group, Line, Path, Rectangle, Style, Text};
|
||||||
use svg::node::Text as TextNode;
|
use svg::node::Text as TextNode;
|
||||||
use svg::Document;
|
use svg::Document;
|
||||||
|
|
||||||
@ -22,6 +23,46 @@ fn time_to_degrees(timestamp: i32, // should be time/timestamp
|
|||||||
seconds_to_degrees(timestamp)
|
seconds_to_degrees(timestamp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_moon_path(image_width: u32, radius: f32, moon_phase: f64) -> Path {
|
||||||
|
let handle_x_pos = radius as f64 * 1.34;
|
||||||
|
let handle_y_pos = radius * 0.88;
|
||||||
|
let min_x = image_width as f64 / 2.0 - handle_x_pos;
|
||||||
|
let max_x = min_x + 2.0 * handle_x_pos;
|
||||||
|
let top_y = image_width as f32 / 2.0 - handle_y_pos;
|
||||||
|
let bottom_y = image_width as f32 / 2.0 + handle_y_pos;
|
||||||
|
|
||||||
|
let h1_x: f64;
|
||||||
|
let h2_x: f64;
|
||||||
|
|
||||||
|
if moon_phase < 14.0 {
|
||||||
|
h1_x = min_x + 2.0 * handle_x_pos * (1.0 - moon_phase / 14.0);
|
||||||
|
h2_x = max_x;
|
||||||
|
} else {
|
||||||
|
h1_x = min_x;
|
||||||
|
h2_x = max_x + 2.0 * handle_x_pos * (1.0 - moon_phase / 14.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
let path_data = PathData::new()
|
||||||
|
.move_to((image_width as f32 / 2.0, image_width as f32 / 2.0 - radius))
|
||||||
|
.cubic_curve_to((
|
||||||
|
h1_x,
|
||||||
|
top_y,
|
||||||
|
h1_x,
|
||||||
|
bottom_y,
|
||||||
|
image_width as f32 / 2.0,
|
||||||
|
image_width as f32 / 2.0 + radius,
|
||||||
|
))
|
||||||
|
.cubic_curve_to((
|
||||||
|
h2_x,
|
||||||
|
bottom_y,
|
||||||
|
h2_x,
|
||||||
|
top_y,
|
||||||
|
image_width / 2,
|
||||||
|
image_width as f32 / 2.0 - radius,
|
||||||
|
));
|
||||||
|
Path::new().set("class", "moon").set("d", path_data)
|
||||||
|
}
|
||||||
|
|
||||||
fn gen_svg() -> Document {
|
fn gen_svg() -> Document {
|
||||||
// These should be calculated
|
// These should be calculated
|
||||||
let local_timestamp = Local::now();
|
let local_timestamp = Local::now();
|
||||||
@ -29,6 +70,13 @@ fn gen_svg() -> Document {
|
|||||||
|
|
||||||
// TODO: These should be calculated instead of hardcoded
|
// TODO: These should be calculated instead of hardcoded
|
||||||
let image_width = 700u32;
|
let image_width = 700u32;
|
||||||
|
|
||||||
|
// Calculate the Moon phase
|
||||||
|
let unixtime = suncalc::Timestamp(local_timestamp.timestamp_millis());
|
||||||
|
let moon_illumination = suncalc::moon_illumination(unixtime);
|
||||||
|
let moon_radius = image_width as f32 * 0.071428571;
|
||||||
|
let moon_phase = moon_illumination.phase * 28.0;
|
||||||
|
|
||||||
let local_hour_font_size = 16.5;
|
let local_hour_font_size = 16.5;
|
||||||
let hour_name_font_size = 13.37699;
|
let hour_name_font_size = 13.37699;
|
||||||
let outer_r = (image_width as f32) / 2.0 - 3.0 * hour_name_font_size;
|
let outer_r = (image_width as f32) / 2.0 - 3.0 * hour_name_font_size;
|
||||||
@ -43,6 +91,8 @@ fn gen_svg() -> Document {
|
|||||||
"\
|
"\
|
||||||
#border {stroke: none; fill: rgb(19, 17, 30); }
|
#border {stroke: none; fill: rgb(19, 17, 30); }
|
||||||
.local-hour {stroke: none; fill: rgb(238, 187, 85);}
|
.local-hour {stroke: none; fill: rgb(238, 187, 85);}
|
||||||
|
.moon-background {stroke: rgb(170, 170, 170); stroke-width: 2px; fill: rgb(19, 17, 30);}
|
||||||
|
.moon {stroke: none; fill: rgb(170, 170, 170);}
|
||||||
.dial {stroke-width: 2px; stroke: rgb(238, 187, 85);}",
|
.dial {stroke-width: 2px; stroke: rgb(238, 187, 85);}",
|
||||||
);
|
);
|
||||||
let mut local_clock = Group::new().set("id", "local-clock");
|
let mut local_clock = Group::new().set("id", "local-clock");
|
||||||
@ -69,6 +119,17 @@ fn gen_svg() -> Document {
|
|||||||
local_clock = local_clock.add(hour_node);
|
local_clock = local_clock.add(hour_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let moon_circle = Circle::new()
|
||||||
|
.set("class", "moon-background")
|
||||||
|
.set("cx", image_width / 2)
|
||||||
|
.set("cy", image_width / 2)
|
||||||
|
.set("r", moon_radius);
|
||||||
|
|
||||||
|
let moon_group = Group::new()
|
||||||
|
.set("id", "moon-container")
|
||||||
|
.add(moon_circle)
|
||||||
|
.add(get_moon_path(image_width, moon_radius, moon_phase));
|
||||||
|
|
||||||
let dial = Line::new()
|
let dial = Line::new()
|
||||||
.set("id", "dial")
|
.set("id", "dial")
|
||||||
.set("class", "dial")
|
.set("class", "dial")
|
||||||
@ -97,6 +158,7 @@ fn gen_svg() -> Document {
|
|||||||
.add(stylesheet)
|
.add(stylesheet)
|
||||||
.add(border)
|
.add(border)
|
||||||
.add(local_clock)
|
.add(local_clock)
|
||||||
|
.add(moon_group)
|
||||||
.add(dial)
|
.add(dial)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user