From df6557dd311fa9a5aee75c69a3d27ff17afe88af Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Tue, 7 Jun 2022 00:30:42 +0300 Subject: Extend Counter functionality Custom fonts, twelve hour mode and Value changed callback. --- src/displayapp/widgets/Counter.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/displayapp/widgets/Counter.h') 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; }; } } -- cgit v1.2.3-70-g09d2 From 3eebe0244872818d7b96d4dae3e55e3548941bda Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Mon, 1 Aug 2022 20:57:27 +0300 Subject: Add support for months and variable digit count to Counter --- src/displayapp/widgets/Counter.cpp | 27 ++++++++++++++++++++++++--- src/displayapp/widgets/Counter.h | 5 ++++- 2 files changed, 28 insertions(+), 4 deletions(-) (limited to 'src/displayapp/widgets/Counter.h') diff --git a/src/displayapp/widgets/Counter.cpp b/src/displayapp/widgets/Counter.cpp index 04a275da..d8a1626e 100644 --- a/src/displayapp/widgets/Counter.cpp +++ b/src/displayapp/widgets/Counter.cpp @@ -1,4 +1,5 @@ #include "displayapp/widgets/Counter.h" +#include "components/datetime/DateTimeController.h" using namespace Pinetime::Applications::Widgets; @@ -18,7 +19,7 @@ namespace { } } -Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, font {font} { +Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, value {min}, font {font} { } void Counter::UpBtnPressed() { @@ -74,6 +75,8 @@ void Counter::UpdateLabel() { } else { lv_label_set_text_fmt(number, "%.2i", value - 12); } + } else if (monthMode) { + lv_label_set_text(number, Controllers::DateTime::MonthShortToStringLow(static_cast(value))); } else { lv_label_set_text_fmt(number, "%.2i", value); } @@ -85,6 +88,20 @@ void Counter::EnableTwelveHourMode() { twelveHourMode = true; } +// Value is kept between 1 and 12, but the displayed value is the corresponding month +// Make sure to set the max and min values to 1 and 12. Otherwise behaviour is undefined +void Counter::EnableMonthMode() { + monthMode = true; +} + +void Counter::SetMax(int newMax) { + max = newMax; + if (value > max) { + value = max; + UpdateLabel(); + } +} + void Counter::SetValueChangedEventCallback(void* userData, void (*handler)(void* userData)) { this->userData = userData; this->ValueChangedHandler = handler; @@ -100,10 +117,14 @@ void Counter::Create() { 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"); + if (monthMode) { + lv_label_set_text_static(number, "Jan"); + } else { + lv_label_set_text_fmt(number, "%d", max); + } static constexpr uint8_t padding = 5; - const uint8_t width = lv_obj_get_width(number) + padding * 2; + const uint8_t width = std::max(lv_obj_get_width(number) + padding * 2, 58); static constexpr uint8_t btnHeight = 50; const uint8_t containerHeight = btnHeight * 2 + lv_obj_get_height(number) + padding * 2; diff --git a/src/displayapp/widgets/Counter.h b/src/displayapp/widgets/Counter.h index 13b336ca..d38dd9d7 100644 --- a/src/displayapp/widgets/Counter.h +++ b/src/displayapp/widgets/Counter.h @@ -15,6 +15,8 @@ namespace Pinetime { void HideControls(); void ShowControls(); void EnableTwelveHourMode(); + void EnableMonthMode(); + void SetMax(int newMax); void SetValueChangedEventCallback(void* userData, void (*handler)(void* userData)); int GetValue() const { @@ -36,10 +38,11 @@ namespace Pinetime { lv_obj_t* upperLine; lv_obj_t* lowerLine; lv_point_t linePoints[2]; - int value = 0; int min; int max; + int value; bool twelveHourMode = false; + bool monthMode = false; lv_font_t& font; void* userData = nullptr; -- cgit v1.2.3-70-g09d2 From 62c4ff9c2d28227a4119a40a67997ad2d4aa7426 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 21 Aug 2022 14:52:14 +0300 Subject: Determine the number of digits from the max value. (#1271) --- src/displayapp/widgets/Counter.cpp | 18 ++++++++++++++---- src/displayapp/widgets/Counter.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src/displayapp/widgets/Counter.h') diff --git a/src/displayapp/widgets/Counter.cpp b/src/displayapp/widgets/Counter.cpp index 3c50a105..e95178ec 100644 --- a/src/displayapp/widgets/Counter.cpp +++ b/src/displayapp/widgets/Counter.cpp @@ -18,9 +18,17 @@ namespace { widget->DownBtnPressed(); } } + constexpr int digitCount(int number) { + int digitCount = 0; + while (number > 0) { + digitCount++; + number /= 10; + } + return digitCount; + } } -Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, value {min}, font {font} { +Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, value {min}, font {font}, leadingZeroCount {digitCount(max)} { } void Counter::UpBtnPressed() { @@ -72,14 +80,14 @@ void Counter::UpdateLabel() { if (value == 0) { lv_label_set_text_static(number, "12"); } else if (value <= 12) { - lv_label_set_text_fmt(number, "%.2i", value); + lv_label_set_text_fmt(number, "%.*i", leadingZeroCount, value); } else { - lv_label_set_text_fmt(number, "%.2i", value - 12); + lv_label_set_text_fmt(number, "%.*i", leadingZeroCount, value - 12); } } else if (monthMode) { lv_label_set_text(number, Controllers::DateTime::MonthShortToStringLow(static_cast(value))); } else { - lv_label_set_text_fmt(number, "%.2i", value); + lv_label_set_text_fmt(number, "%.*i", leadingZeroCount, value); } } @@ -95,6 +103,8 @@ void Counter::EnableMonthMode() { monthMode = true; } +// Counter cannot be resized after creation, +// so the newMax value must have the same number of digits as the old one void Counter::SetMax(int newMax) { max = newMax; if (value > max) { diff --git a/src/displayapp/widgets/Counter.h b/src/displayapp/widgets/Counter.h index d38dd9d7..825860b8 100644 --- a/src/displayapp/widgets/Counter.h +++ b/src/displayapp/widgets/Counter.h @@ -41,6 +41,7 @@ namespace Pinetime { int min; int max; int value; + const int leadingZeroCount; bool twelveHourMode = false; bool monthMode = false; lv_font_t& font; -- cgit v1.2.3-70-g09d2