summaryrefslogtreecommitdiffstats
path: root/examples/clock
diff options
context:
space:
mode:
Diffstat (limited to 'examples/clock')
-rw-r--r--examples/clock/src/main.rs89
1 files changed, 51 insertions, 38 deletions
diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs
index 87da0c7e..897f8f1b 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::program("Clock - Iced", Clock::update, Clock::view)
+ .subscription(Clock::subscription)
+ .theme(Clock::theme)
+ .antialiasing(true)
+ .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 / 10) % 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(),
+ }
}
}
@@ -104,7 +94,7 @@ impl<Message> canvas::Program<Message> for Clock {
let radius = frame.width().min(frame.height()) / 2.0;
let background = Path::circle(center, radius);
- frame.fill(&background, palette.primary.weak.color);
+ frame.fill(&background, palette.secondary.strong.color);
let short_hand =
Path::line(Point::ORIGIN, Point::new(0.0, -0.5 * radius));
@@ -117,7 +107,7 @@ impl<Message> canvas::Program<Message> for Clock {
let thin_stroke = || -> Stroke {
Stroke {
width,
- style: stroke::Style::Solid(palette.primary.weak.text),
+ style: stroke::Style::Solid(palette.secondary.strong.text),
line_cap: LineCap::Round,
..Stroke::default()
}
@@ -126,7 +116,7 @@ impl<Message> canvas::Program<Message> for Clock {
let wide_stroke = || -> Stroke {
Stroke {
width: width * 3.0,
- style: stroke::Style::Solid(palette.primary.weak.text),
+ style: stroke::Style::Solid(palette.secondary.strong.text),
line_cap: LineCap::Round,
..Stroke::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: (radius / 15.0).into(),
+ position: Point::new(
+ (0.78 * radius) * rotate_factor,
+ -width * 2.0,
+ ),
+ color: palette.secondary.strong.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)
}