From df6557dd311fa9a5aee75c69a3d27ff17afe88af Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Tue, 7 Jun 2022 00:30:42 +0300 Subject: [PATCH] Extend Counter functionality Custom fonts, twelve hour mode and Value changed callback. --- src/displayapp/screens/Timer.h | 4 +-- src/displayapp/widgets/Counter.cpp | 43 +++++++++++++++++++++++++----- src/displayapp/widgets/Counter.h | 13 ++++++--- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/displayapp/screens/Timer.h b/src/displayapp/screens/Timer.h index 2797a4fa..29b5e813 100644 --- a/src/displayapp/screens/Timer.h +++ b/src/displayapp/screens/Timer.h @@ -27,7 +27,7 @@ namespace Pinetime::Applications::Screens { lv_obj_t* btnPlayPause; lv_obj_t* txtPlayPause; lv_task_t* taskRefresh; - Widgets::Counter minuteCounter = Widgets::Counter(0, 59); - Widgets::Counter secondCounter = Widgets::Counter(0, 59); + Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_76); + Widgets::Counter secondCounter = Widgets::Counter(0, 59, jetbrains_mono_76); }; } diff --git a/src/displayapp/widgets/Counter.cpp b/src/displayapp/widgets/Counter.cpp index ecf39613..04a275da 100644 --- a/src/displayapp/widgets/Counter.cpp +++ b/src/displayapp/widgets/Counter.cpp @@ -6,35 +6,43 @@ namespace { void upBtnEventHandler(lv_obj_t* obj, lv_event_t event) { auto* widget = static_cast(obj->user_data); if (event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) { - widget->Increment(); + widget->UpBtnPressed(); } } void downBtnEventHandler(lv_obj_t* obj, lv_event_t event) { auto* widget = static_cast(obj->user_data); if (event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) { - widget->Decrement(); + widget->DownBtnPressed(); } } } -Counter::Counter(int min, int max) : min {min}, max {max} { +Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, font {font} { } -void Counter::Increment() { +void Counter::UpBtnPressed() { value++; if (value > max) { value = min; } UpdateLabel(); + + if (ValueChangedHandler != nullptr) { + ValueChangedHandler(userData); + } }; -void Counter::Decrement() { +void Counter::DownBtnPressed() { value--; if (value < min) { value = max; } UpdateLabel(); + + if (ValueChangedHandler != nullptr) { + ValueChangedHandler(userData); + } }; void Counter::SetValue(int newValue) { @@ -58,7 +66,28 @@ void Counter::ShowControls() { } void Counter::UpdateLabel() { - lv_label_set_text_fmt(number, "%.2i", value); + if (twelveHourMode) { + if (value == 0) { + lv_label_set_text_static(number, "12"); + } else if (value <= 12) { + lv_label_set_text_fmt(number, "%.2i", value); + } else { + lv_label_set_text_fmt(number, "%.2i", value - 12); + } + } else { + lv_label_set_text_fmt(number, "%.2i", value); + } +} + +// Value is kept between 0 and 23, but the displayed value is converted to 12-hour. +// Make sure to set the max and min values to 0 and 23. Otherwise behaviour is undefined +void Counter::EnableTwelveHourMode() { + twelveHourMode = true; +} + +void Counter::SetValueChangedEventCallback(void* userData, void (*handler)(void* userData)) { + this->userData = userData; + this->ValueChangedHandler = handler; } void Counter::Create() { @@ -68,7 +97,7 @@ void Counter::Create() { lv_obj_set_style_local_bg_color(counterContainer, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, bgColor); number = lv_label_create(counterContainer, nullptr); - lv_obj_set_style_local_text_font(number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); + lv_obj_set_style_local_text_font(number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &font); lv_obj_align(number, nullptr, LV_ALIGN_CENTER, 0, 0); lv_obj_set_auto_realign(number, true); lv_label_set_text_static(number, "00"); diff --git a/src/displayapp/widgets/Counter.h b/src/displayapp/widgets/Counter.h index 3df8b839..13b336ca 100644 --- a/src/displayapp/widgets/Counter.h +++ b/src/displayapp/widgets/Counter.h @@ -6,14 +6,16 @@ namespace Pinetime { namespace Widgets { class Counter { public: - Counter(int min, int max); + Counter(int min, int max, lv_font_t& font); void Create(); - void Increment(); - void Decrement(); + void UpBtnPressed(); + void DownBtnPressed(); void SetValue(int newValue); void HideControls(); void ShowControls(); + void EnableTwelveHourMode(); + void SetValueChangedEventCallback(void* userData, void (*handler)(void* userData)); int GetValue() const { return value; @@ -25,6 +27,7 @@ namespace Pinetime { private: void UpdateLabel(); + void (*ValueChangedHandler)(void* userData) = nullptr; lv_obj_t* counterContainer; lv_obj_t* upBtn; @@ -36,6 +39,10 @@ namespace Pinetime { int value = 0; int min; int max; + bool twelveHourMode = false; + lv_font_t& font; + + void* userData = nullptr; }; } }