From 6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 14 Apr 2020 07:08:24 +0200
Subject: Simplify drawing logic in `clock` example

---
 examples/clock/src/main.rs | 74 ++++++++++++++++++++--------------------------
 1 file changed, 32 insertions(+), 42 deletions(-)

(limited to 'examples')

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;
 
-- 
cgit