diff --git a/src/app.rs b/src/app.rs index ec9beef..7113711 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,12 +6,12 @@ use crate::{ storage::AppStorage, terminal::Terminal, widgets::{ - clock::{self, Clock, ClockArgs}, - countdown::{Countdown, CountdownWidget}, + clock::{self, ClockState, ClockStateArgs}, + countdown::{Countdown, CountdownState}, footer::{Footer, FooterState}, header::Header, - pomodoro::{Mode as PomodoroMode, Pomodoro, PomodoroArgs, PomodoroWidget}, - timer::{Timer, TimerWidget}, + pomodoro::{Mode as PomodoroMode, PomodoroState, PomodoroStateArgs, PomodoroWidget}, + timer::{Timer, TimerState}, }, }; use color_eyre::Result; @@ -36,12 +36,12 @@ pub struct App { content: Content, mode: Mode, app_time: AppTime, - countdown: Countdown, - timer: Timer, - pomodoro: Pomodoro, + countdown: CountdownState, + timer: TimerState, + pomodoro: PomodoroState, style: Style, with_decis: bool, - footer_state: FooterState, + footer: FooterState, } pub struct AppArgs { @@ -115,30 +115,27 @@ impl App { app_time: get_app_time(), style, with_decis, - countdown: Countdown::new(Clock::::new(ClockArgs { + countdown: CountdownState::new(ClockState::::new(ClockStateArgs { initial_value: initial_value_countdown, current_value: current_value_countdown, tick_value: Duration::from_millis(TICK_VALUE_MS), - style, with_decis, })), - timer: Timer::new(Clock::::new(ClockArgs { + timer: TimerState::new(ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: current_value_timer, tick_value: Duration::from_millis(TICK_VALUE_MS), - style, with_decis, })), - pomodoro: Pomodoro::new(PomodoroArgs { + pomodoro: PomodoroState::new(PomodoroStateArgs { mode: pomodoro_mode, initial_value_work, current_value_work, initial_value_pause, current_value_pause, - style, with_decis, }), - footer_state: FooterState::new(show_menu, app_time_format), + footer: FooterState::new(show_menu, app_time_format), } } @@ -204,17 +201,11 @@ impl App { KeyCode::Char('t') => self.content = Content::Timer, KeyCode::Char('p') => self.content = Content::Pomodoro, // toogle app time format - KeyCode::Char(':') => self.footer_state.toggle_app_time_format(), + KeyCode::Char(':') => self.footer.toggle_app_time_format(), // toogle menu - KeyCode::Char('m') => self - .footer_state - .set_show_menu(!self.footer_state.get_show_menu()), + KeyCode::Char('m') => self.footer.set_show_menu(!self.footer.get_show_menu()), KeyCode::Char(',') => { self.style = self.style.next(); - // update clocks - self.timer.set_style(self.style); - self.countdown.set_style(self.style); - self.pomodoro.set_style(self.style); } KeyCode::Char('.') => { self.with_decis = !self.with_decis; @@ -223,8 +214,8 @@ impl App { self.countdown.set_with_decis(self.with_decis); self.pomodoro.set_with_decis(self.with_decis); } - KeyCode::Up => self.footer_state.set_show_menu(true), - KeyCode::Down => self.footer_state.set_show_menu(false), + KeyCode::Up => self.footer.set_show_menu(true), + KeyCode::Down => self.footer.set_show_menu(false), _ => {} }; } @@ -239,8 +230,8 @@ impl App { pub fn to_storage(&self) -> AppStorage { AppStorage { content: self.content, - show_menu: self.footer_state.get_show_menu(), - app_time_format: *self.footer_state.app_time_format(), + show_menu: self.footer.get_show_menu(), + app_time_format: *self.footer.app_time_format(), style: self.style, with_decis: self.with_decis, pomodoro_mode: self.pomodoro.get_mode().clone(), @@ -266,9 +257,15 @@ struct AppWidget; impl AppWidget { fn render_content(&self, area: Rect, buf: &mut Buffer, state: &mut App) { match state.content { - Content::Timer => TimerWidget.render(area, buf, &mut state.timer.clone()), - Content::Countdown => CountdownWidget.render(area, buf, &mut state.countdown.clone()), - Content::Pomodoro => PomodoroWidget.render(area, buf, &mut state.pomodoro.clone()), + Content::Timer => { + Timer { style: state.style }.render(area, buf, &mut state.timer); + } + Content::Countdown => { + Countdown { style: state.style }.render(area, buf, &mut state.countdown) + } + Content::Pomodoro => { + PomodoroWidget { style: state.style }.render(area, buf, &mut state.pomodoro) + } }; } } @@ -279,11 +276,7 @@ impl StatefulWidget for AppWidget { let [v0, v1, v2] = Layout::vertical([ Constraint::Length(1), Constraint::Percentage(100), - Constraint::Length(if state.footer_state.get_show_menu() { - 4 - } else { - 1 - }), + Constraint::Length(if state.footer.get_show_menu() { 4 } else { 1 }), ]) .areas(area); @@ -295,12 +288,12 @@ impl StatefulWidget for AppWidget { // content self.render_content(v1, buf, state); // footer - let footer = Footer { + Footer { running_clock: state.clock_is_running(), selected_content: state.content, edit_mode: state.is_edit_mode(), app_time: state.app_time, - }; - StatefulWidget::render(footer, v2, buf, &mut state.footer_state); + } + .render(v2, buf, &mut state.footer); } } diff --git a/src/widgets/clock.rs b/src/widgets/clock.rs index db94f5c..827d498 100644 --- a/src/widgets/clock.rs +++ b/src/widgets/clock.rs @@ -73,26 +73,24 @@ pub enum Format { } #[derive(Debug, Clone)] -pub struct Clock { +pub struct ClockState { initial_value: DurationEx, current_value: DurationEx, tick_value: DurationEx, mode: Mode, format: Format, - pub style: Style, pub with_decis: bool, phantom: PhantomData, } -pub struct ClockArgs { +pub struct ClockStateArgs { pub initial_value: Duration, pub current_value: Duration, pub tick_value: Duration, - pub style: Style, pub with_decis: bool, } -impl Clock { +impl ClockState { pub fn toggle_pause(&mut self) { self.mode = if self.mode == Mode::Tick { Mode::Pause @@ -296,10 +294,6 @@ impl Clock { self.update_format(); } - pub fn is_done(&self) -> bool { - self.mode == Mode::Done - } - fn update_format(&mut self) { self.format = self.get_format(); } @@ -324,13 +318,12 @@ impl Clock { #[derive(Debug, Clone)] pub struct Countdown {} -impl Clock { - pub fn new(args: ClockArgs) -> Self { - let ClockArgs { +impl ClockState { + pub fn new(args: ClockStateArgs) -> Self { + let ClockStateArgs { initial_value, current_value, tick_value, - style, with_decis, } = args; let mut instance = Self { @@ -345,7 +338,6 @@ impl Clock { Mode::Pause }, format: Format::S, - style, with_decis, phantom: PhantomData, }; @@ -394,13 +386,12 @@ impl Clock { #[derive(Debug, Clone)] pub struct Timer {} -impl Clock { - pub fn new(args: ClockArgs) -> Self { - let ClockArgs { +impl ClockState { + pub fn new(args: ClockStateArgs) -> Self { + let ClockStateArgs { initial_value, current_value, tick_value, - style, with_decis, } = args; let mut instance = Self { @@ -416,7 +407,6 @@ impl Clock { }, format: Format::S, phantom: PhantomData, - style, with_decis, }; // update format once @@ -461,6 +451,7 @@ pub struct ClockWidget where T: std::fmt::Debug, { + style: Style, phantom: PhantomData, } @@ -468,8 +459,9 @@ impl ClockWidget where T: std::fmt::Debug, { - pub fn new() -> Self { + pub fn new(style: Style) -> Self { Self { + style, phantom: PhantomData, } } @@ -568,12 +560,12 @@ impl StatefulWidget for ClockWidget where T: std::fmt::Debug, { - type State = Clock; + type State = ClockState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { let with_decis = state.with_decis; let format = state.format; - let symbol = state.style.get_digit_symbol(); + let symbol = self.style.get_digit_symbol(); let widths = self.get_horizontal_lengths(&format, with_decis); let area = center_horizontal( area, diff --git a/src/widgets/clock_test.rs b/src/widgets/clock_test.rs index 4b4bf07..3054554 100644 --- a/src/widgets/clock_test.rs +++ b/src/widgets/clock_test.rs @@ -1,5 +1,4 @@ use crate::{ - common::Style, duration::{ONE_DECI_SECOND, ONE_HOUR, ONE_MINUTE, ONE_SECOND}, widgets::clock::*, }; @@ -7,11 +6,10 @@ use std::time::Duration; #[test] fn test_toggle_edit() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); // off by default @@ -26,11 +24,10 @@ fn test_toggle_edit() { #[test] fn test_default_edit_mode_hhmmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -41,11 +38,10 @@ fn test_default_edit_mode_hhmmss() { #[test] fn test_default_edit_mode_mmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_MINUTE, current_value: ONE_MINUTE, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); // toggle on @@ -55,11 +51,10 @@ fn test_default_edit_mode_mmss() { #[test] fn test_default_edit_mode_ss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_SECOND, current_value: ONE_SECOND, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); // toggle on @@ -69,11 +64,10 @@ fn test_default_edit_mode_ss() { #[test] fn test_edit_next_hhmmssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -91,11 +85,10 @@ fn test_edit_next_hhmmssd() { #[test] fn test_edit_next_hhmmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -111,11 +104,10 @@ fn test_edit_next_hhmmss() { #[test] fn test_edit_next_mmssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_MINUTE, current_value: ONE_MINUTE, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -131,11 +123,10 @@ fn test_edit_next_mmssd() { #[test] fn test_edit_next_mmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_MINUTE, current_value: ONE_MINUTE, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -149,11 +140,10 @@ fn test_edit_next_mmss() { #[test] fn test_edit_next_ssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_SECOND * 3, current_value: ONE_SECOND * 3, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -165,11 +155,10 @@ fn test_edit_next_ssd() { #[test] fn test_edit_next_ss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_SECOND * 3, current_value: ONE_SECOND * 3, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -182,11 +171,10 @@ fn test_edit_next_ss() { #[test] fn test_edit_prev_hhmmssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -203,11 +191,10 @@ fn test_edit_prev_hhmmssd() { #[test] fn test_edit_prev_hhmmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_HOUR, current_value: ONE_HOUR, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -222,11 +209,10 @@ fn test_edit_prev_hhmmss() { #[test] fn test_edit_prev_mmssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_MINUTE, current_value: ONE_MINUTE, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -243,11 +229,10 @@ fn test_edit_prev_mmssd() { #[test] fn test_edit_prev_mmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_MINUTE, current_value: ONE_MINUTE, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -262,11 +247,10 @@ fn test_edit_prev_mmss() { #[test] fn test_edit_prev_ssd() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_SECOND, current_value: ONE_SECOND, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: true, }); @@ -281,11 +265,10 @@ fn test_edit_prev_ssd() { #[test] fn test_edit_prev_ss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: ONE_SECOND, current_value: ONE_SECOND, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -298,11 +281,10 @@ fn test_edit_prev_ss() { #[test] fn test_edit_up_ss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: Duration::ZERO, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -315,11 +297,10 @@ fn test_edit_up_ss() { #[test] fn test_edit_up_mmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: Duration::from_secs(60), tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -335,11 +316,10 @@ fn test_edit_up_mmss() { #[test] fn test_edit_up_hhmmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: Duration::from_secs(3600), tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -357,11 +337,10 @@ fn test_edit_up_hhmmss() { #[test] fn test_edit_down_ss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: ONE_SECOND, tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -378,11 +357,10 @@ fn test_edit_down_ss() { #[test] fn test_edit_down_mmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: Duration::from_secs(120), tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); @@ -401,11 +379,10 @@ fn test_edit_down_mmss() { #[test] fn test_edit_down_hhmmss() { - let mut c = Clock::::new(ClockArgs { + let mut c = ClockState::::new(ClockStateArgs { initial_value: Duration::ZERO, current_value: Duration::from_secs(3600), tick_value: ONE_DECI_SECOND, - style: Style::default(), with_decis: false, }); diff --git a/src/widgets/countdown.rs b/src/widgets/countdown.rs index 53fa715..f1e9b62 100644 --- a/src/widgets/countdown.rs +++ b/src/widgets/countdown.rs @@ -11,33 +11,29 @@ use crate::{ common::Style, events::{Event, EventHandler}, utils::center, - widgets::clock::{self, Clock, ClockWidget}, + widgets::clock::{self, ClockState, ClockWidget}, }; #[derive(Debug, Clone)] -pub struct Countdown { - clock: Clock, +pub struct CountdownState { + clock: ClockState, } -impl Countdown { - pub const fn new(clock: Clock) -> Self { +impl CountdownState { + pub const fn new(clock: ClockState) -> Self { Self { clock } } - pub fn set_style(&mut self, style: Style) { - self.clock.style = style; - } - pub fn set_with_decis(&mut self, with_decis: bool) { self.clock.with_decis = with_decis; } - pub fn get_clock(&self) -> &Clock { + pub fn get_clock(&self) -> &ClockState { &self.clock } } -impl EventHandler for Countdown { +impl EventHandler for CountdownState { fn update(&mut self, event: Event) -> Option { let edit_mode = self.clock.is_edit_mode(); match event { @@ -77,12 +73,14 @@ impl EventHandler for Countdown { } } -pub struct CountdownWidget; +pub struct Countdown { + pub style: Style, +} -impl StatefulWidget for CountdownWidget { - type State = Countdown; +impl StatefulWidget for Countdown { + type State = CountdownState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { - let clock = ClockWidget::new(); + let clock = ClockWidget::new(self.style); let label = Line::raw((format!("Countdown {}", state.clock.get_mode())).to_uppercase()); let area = center( diff --git a/src/widgets/pomodoro.rs b/src/widgets/pomodoro.rs index 4d0ba2a..fbe07fb 100644 --- a/src/widgets/pomodoro.rs +++ b/src/widgets/pomodoro.rs @@ -3,7 +3,7 @@ use crate::{ constants::TICK_VALUE_MS, events::{Event, EventHandler}, utils::center, - widgets::clock::{Clock, ClockWidget, Countdown}, + widgets::clock::{ClockState, ClockWidget, Countdown}, }; use ratatui::{ buffer::Buffer, @@ -18,7 +18,7 @@ use strum::Display; use serde::{Deserialize, Serialize}; -use super::clock::ClockArgs; +use super::clock::ClockStateArgs; #[derive(Debug, Clone, Display, Hash, Eq, PartialEq, Deserialize, Serialize)] pub enum Mode { @@ -28,18 +28,18 @@ pub enum Mode { #[derive(Debug, Clone)] pub struct ClockMap { - work: Clock, - pause: Clock, + work: ClockState, + pause: ClockState, } impl ClockMap { - fn get_mut(&mut self, mode: &Mode) -> &mut Clock { + fn get_mut(&mut self, mode: &Mode) -> &mut ClockState { match mode { Mode::Work => &mut self.work, Mode::Pause => &mut self.pause, } } - fn get(&self, mode: &Mode) -> &Clock { + fn get(&self, mode: &Mode) -> &ClockState { match mode { Mode::Work => &self.work, Mode::Pause => &self.pause, @@ -48,66 +48,62 @@ impl ClockMap { } #[derive(Debug, Clone)] -pub struct Pomodoro { +pub struct PomodoroState { mode: Mode, clock_map: ClockMap, } -pub struct PomodoroArgs { +pub struct PomodoroStateArgs { pub mode: Mode, pub initial_value_work: Duration, pub current_value_work: Duration, pub initial_value_pause: Duration, pub current_value_pause: Duration, - pub style: Style, pub with_decis: bool, } -impl Pomodoro { - pub fn new(args: PomodoroArgs) -> Self { - let PomodoroArgs { +impl PomodoroState { + pub fn new(args: PomodoroStateArgs) -> Self { + let PomodoroStateArgs { mode, initial_value_work, current_value_work, initial_value_pause, current_value_pause, - style, with_decis, } = args; Self { mode, clock_map: ClockMap { - work: Clock::::new(ClockArgs { + work: ClockState::::new(ClockStateArgs { initial_value: initial_value_work, current_value: current_value_work, tick_value: Duration::from_millis(TICK_VALUE_MS), - style, with_decis, }), - pause: Clock::::new(ClockArgs { + pause: ClockState::::new(ClockStateArgs { initial_value: initial_value_pause, current_value: current_value_pause, tick_value: Duration::from_millis(TICK_VALUE_MS), - style, with_decis, }), }, } } - fn get_clock_mut(&mut self) -> &mut Clock { + fn get_clock_mut(&mut self) -> &mut ClockState { self.clock_map.get_mut(&self.mode) } - pub fn get_clock(&self) -> &Clock { + pub fn get_clock(&self) -> &ClockState { self.clock_map.get(&self.mode) } - pub fn get_clock_work(&self) -> &Clock { + pub fn get_clock_work(&self) -> &ClockState { &self.clock_map.work } - pub fn get_clock_pause(&self) -> &Clock { + pub fn get_clock_pause(&self) -> &ClockState { &self.clock_map.pause } @@ -115,11 +111,6 @@ impl Pomodoro { &self.mode } - pub fn set_style(&mut self, style: Style) { - self.clock_map.work.style = style; - self.clock_map.pause.style = style; - } - pub fn set_with_decis(&mut self, with_decis: bool) { self.clock_map.work.with_decis = with_decis; self.clock_map.pause.with_decis = with_decis; @@ -133,7 +124,7 @@ impl Pomodoro { } } -impl EventHandler for Pomodoro { +impl EventHandler for PomodoroState { fn update(&mut self, event: Event) -> Option { let edit_mode = self.get_clock().is_edit_mode(); match event { @@ -177,12 +168,14 @@ impl EventHandler for Pomodoro { } } -pub struct PomodoroWidget; +pub struct PomodoroWidget { + pub style: Style, +} impl StatefulWidget for PomodoroWidget { - type State = Pomodoro; + type State = PomodoroState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { - let clock_widget = ClockWidget::new(); + let clock_widget = ClockWidget::new(self.style); let label = Line::raw( (format!( "Pomodoro {} {}", diff --git a/src/widgets/timer.rs b/src/widgets/timer.rs index cc1fc3a..ab0280b 100644 --- a/src/widgets/timer.rs +++ b/src/widgets/timer.rs @@ -2,7 +2,7 @@ use crate::{ common::Style, events::{Event, EventHandler}, utils::center, - widgets::clock::{self, Clock, ClockWidget}, + widgets::clock::{self, ClockState, ClockWidget}, }; use ratatui::{ buffer::Buffer, @@ -14,29 +14,25 @@ use ratatui::{ use std::cmp::max; #[derive(Debug, Clone)] -pub struct Timer { - clock: Clock, +pub struct TimerState { + clock: ClockState, } -impl Timer { - pub const fn new(clock: Clock) -> Self { +impl TimerState { + pub const fn new(clock: ClockState) -> Self { Self { clock } } - pub fn set_style(&mut self, style: Style) { - self.clock.style = style; - } - pub fn set_with_decis(&mut self, with_decis: bool) { self.clock.with_decis = with_decis; } - pub fn get_clock(&self) -> &Clock { + pub fn get_clock(&self) -> &ClockState { &self.clock } } -impl EventHandler for Timer { +impl EventHandler for TimerState { fn update(&mut self, event: Event) -> Option { let edit_mode = self.clock.is_edit_mode(); match event { @@ -73,13 +69,15 @@ impl EventHandler for Timer { } } -pub struct TimerWidget; +pub struct Timer { + pub style: Style, +} -impl StatefulWidget for &TimerWidget { - type State = Timer; +impl StatefulWidget for Timer { + type State = TimerState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { let clock = &mut state.clock; - let clock_widget = ClockWidget::new(); + let clock_widget = ClockWidget::new(self.style); let label = Line::raw((format!("Timer {}", clock.get_mode())).to_uppercase()); let area = center(