summaryrefslogtreecommitdiffstats
path: root/examples/clock
diff options
context:
space:
mode:
Diffstat (limited to 'examples/clock')
-rw-r--r--examples/clock/src/main.rs83
1 files changed, 48 insertions, 35 deletions
diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs
index 87da0c7e..5110c78e 100644
--- a/examples/clock/src/main.rs
+++ b/examples/clock/src/main.rs
@@ -1,17 +1,18 @@
-use iced::executor;
+use iced::alignment;
use iced::mouse;
use iced::widget::canvas::{stroke, Cache, Geometry, LineCap, Path, Stroke};
use iced::widget::{canvas, container};
use iced::{
- Application, Command, Element, Length, Point, Rectangle, Renderer,
- Settings, Subscription, Theme, Vector,
+ Degrees, Element, Font, Length, Point, Rectangle, Renderer, Subscription,
+ Theme, Vector,
};
pub fn main() -> iced::Result {
- Clock::run(Settings {
- antialiasing: true,
- ..Settings::default()
- })
+ iced::sandbox("Clock - Iced", Clock::update, Clock::view)
+ .subscription(Clock::subscription)
+ .theme(Clock::theme)
+ .antialiased()
+ .run()
}
struct Clock {
@@ -24,28 +25,8 @@ enum Message {
Tick(time::OffsetDateTime),
}
-impl Application for Clock {
- type Executor = executor::Default;
- type Message = Message;
- type Theme = Theme;
- type Flags = ();
-
- fn new(_flags: ()) -> (Self, Command<Message>) {
- (
- Clock {
- now: time::OffsetDateTime::now_local()
- .unwrap_or_else(|_| time::OffsetDateTime::now_utc()),
- clock: Cache::default(),
- },
- Command::none(),
- )
- }
-
- fn title(&self) -> String {
- String::from("Clock - Iced")
- }
-
- fn update(&mut self, message: Message) -> Command<Message> {
+impl Clock {
+ fn update(&mut self, message: Message) {
match message {
Message::Tick(local_time) => {
let now = local_time;
@@ -56,8 +37,6 @@ impl Application for Clock {
}
}
}
-
- Command::none()
}
fn view(&self) -> Element<Message> {
@@ -82,7 +61,18 @@ impl Application for Clock {
}
fn theme(&self) -> Theme {
- Theme::TokyoNight
+ Theme::ALL[(self.now.unix_timestamp() as usize / 60) % Theme::ALL.len()]
+ .clone()
+ }
+}
+
+impl Default for Clock {
+ fn default() -> Self {
+ Self {
+ now: time::OffsetDateTime::now_local()
+ .unwrap_or_else(|_| time::OffsetDateTime::now_utc()),
+ clock: Cache::default(),
+ }
}
}
@@ -145,8 +135,31 @@ impl<Message> canvas::Program<Message> for Clock {
});
frame.with_save(|frame| {
- frame.rotate(hand_rotation(self.now.second(), 60));
+ let rotation = hand_rotation(self.now.second(), 60);
+
+ frame.rotate(rotation);
frame.stroke(&long_hand, thin_stroke());
+
+ let rotate_factor = if rotation < 180.0 { 1.0 } else { -1.0 };
+
+ frame.rotate(Degrees(-90.0 * rotate_factor));
+ frame.fill_text(canvas::Text {
+ content: theme.to_string(),
+ size: 15.into(),
+ position: Point::new(
+ (0.8 * radius - 8.0) * rotate_factor,
+ -8.0,
+ ),
+ color: palette.primary.weak.text,
+ horizontal_alignment: if rotate_factor > 0.0 {
+ alignment::Horizontal::Right
+ } else {
+ alignment::Horizontal::Left
+ },
+ vertical_alignment: alignment::Vertical::Bottom,
+ font: Font::MONOSPACE,
+ ..canvas::Text::default()
+ });
});
});
@@ -154,8 +167,8 @@ impl<Message> canvas::Program<Message> for Clock {
}
}
-fn hand_rotation(n: u8, total: u8) -> f32 {
+fn hand_rotation(n: u8, total: u8) -> Degrees {
let turns = n as f32 / total as f32;
- 2.0 * std::f32::consts::PI * turns
+ Degrees(360.0 * turns)
}