InfiniTime.git

commit 62c4ff9c2d28227a4119a40a67997ad2d4aa7426

Author: Riku Isokoski <riksu9000@gmail.com>

Determine the number of digits from the max value. (#1271)

 src/displayapp/widgets/Counter.cpp | 18 ++++++++++++++----
 src/displayapp/widgets/Counter.h | 1 +


diff --git a/src/displayapp/widgets/Counter.cpp b/src/displayapp/widgets/Counter.cpp
index 3c50a105d870391705082ca88e5ef8ef08924adf..e95178ec11ed4977ab00c535b5963c6a27db8ef9 100644
--- a/src/displayapp/widgets/Counter.cpp
+++ b/src/displayapp/widgets/Counter.cpp
@@ -18,9 +18,17 @@     if (event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) {
       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 @@   if (twelveHourMode) {
     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<Controllers::DateTime::Months>(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 d38dd9d79976d5d97b9e2dbc8f2604415f90c0bb..825860b8d9e9b1accd1ed63e284e7f38aadc9deb 100644
--- a/src/displayapp/widgets/Counter.h
+++ b/src/displayapp/widgets/Counter.h
@@ -41,6 +41,7 @@         lv_point_t linePoints[2];
         int min;
         int max;
         int value;
+        const int leadingZeroCount;
         bool twelveHourMode = false;
         bool monthMode = false;
         lv_font_t& font;