summaryrefslogtreecommitdiffstats
path: root/examples/clock
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-14 07:08:24 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-14 07:19:50 +0200
commit6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a (patch)
treee176a23df2f328abe18f46c081f436eb7376223a /examples/clock
parent3df49bebd47e8ff7c54934d6474336b7439176f9 (diff)
downloadiced-6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a.tar.gz
iced-6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a.tar.bz2
iced-6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a.zip
Simplify drawing logic in `clock` example
Diffstat (limited to 'examples/clock')
-rw-r--r--examples/clock/src/main.rs74
1 files changed, 32 insertions, 42 deletions
diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs
index dab91eab..827379fa 100644
--- a/examples/clock/src/main.rs
+++ b/examples/clock/src/main.rs
@@ -99,63 +99,53 @@ impl canvas::Drawable for LocalTime {
let center = frame.center();
let radius = frame.width().min(frame.height()) / 2.0;
- let offset = Vector::new(center.x, center.y);
let clock = Path::circle(center, radius);
-
frame.fill(&clock, Color::from_rgb8(0x12, 0x93, 0xD8));
- fn draw_hand(
- n: u32,
- total: u32,
- length: f32,
- offset: Vector,
- path: &mut canvas::path::Builder,
- ) {
- let turns = n as f32 / total as f32;
- let t = 2.0 * std::f32::consts::PI * (turns - 0.25);
+ let short_hand =
+ Path::line(Point::ORIGIN, Point::new(0.0, -0.5 * radius));
- let x = length * t.cos();
- let y = length * t.sin();
+ let long_hand =
+ Path::line(Point::ORIGIN, Point::new(0.0, -0.8 * radius));
- path.line_to(Point::new(x, y) + offset);
- }
+ let thin_stroke = canvas::Stroke {
+ width: radius / 100.0,
+ color: Color::WHITE,
+ line_cap: canvas::LineCap::Round,
+ ..canvas::Stroke::default()
+ };
- let hour_and_minute_hands = canvas::Path::new(|path| {
- path.move_to(center);
- draw_hand(self.hour, 12, 0.5 * radius, offset, path);
+ let wide_stroke = canvas::Stroke {
+ width: thin_stroke.width * 3.0,
+ ..thin_stroke
+ };
- path.move_to(center);
- draw_hand(self.minute, 60, 0.8 * radius, offset, path)
- });
+ frame.translate(Vector::new(center.x, center.y));
- frame.stroke(
- &hour_and_minute_hands,
- canvas::Stroke {
- width: radius / 100.0 * 3.0,
- color: Color::WHITE,
- line_cap: canvas::LineCap::Round,
- ..canvas::Stroke::default()
- },
- );
+ frame.with_save(|frame| {
+ frame.rotate(hand_rotation(self.hour, 12));
+ frame.stroke(&short_hand, wide_stroke);
+ });
- let second_hand = canvas::Path::new(|path| {
- path.move_to(center);
- draw_hand(self.second, 60, 0.8 * radius, offset, path)
+ frame.with_save(|frame| {
+ frame.rotate(hand_rotation(self.minute, 60));
+ frame.stroke(&long_hand, wide_stroke);
});
- frame.stroke(
- &second_hand,
- canvas::Stroke {
- width: radius / 100.0,
- color: Color::WHITE,
- line_cap: canvas::LineCap::Round,
- ..canvas::Stroke::default()
- },
- );
+ frame.with_save(|frame| {
+ frame.rotate(hand_rotation(self.second, 60));
+ frame.stroke(&long_hand, thin_stroke);
+ });
}
}
+fn hand_rotation(n: u32, total: u32) -> f32 {
+ let turns = n as f32 / total as f32;
+
+ 2.0 * std::f32::consts::PI * turns
+}
+
mod time {
use iced::futures;