Skip to content

Commit df6557d

Browse files
committed
Extend Counter functionality
Custom fonts, twelve hour mode and Value changed callback.
1 parent 0f42330 commit df6557d

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

src/displayapp/screens/Timer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace Pinetime::Applications::Screens {
2727
lv_obj_t* btnPlayPause;
2828
lv_obj_t* txtPlayPause;
2929
lv_task_t* taskRefresh;
30-
Widgets::Counter minuteCounter = Widgets::Counter(0, 59);
31-
Widgets::Counter secondCounter = Widgets::Counter(0, 59);
30+
Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_76);
31+
Widgets::Counter secondCounter = Widgets::Counter(0, 59, jetbrains_mono_76);
3232
};
3333
}

src/displayapp/widgets/Counter.cpp

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,43 @@ namespace {
66
void upBtnEventHandler(lv_obj_t* obj, lv_event_t event) {
77
auto* widget = static_cast<Counter*>(obj->user_data);
88
if (event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) {
9-
widget->Increment();
9+
widget->UpBtnPressed();
1010
}
1111
}
1212

1313
void downBtnEventHandler(lv_obj_t* obj, lv_event_t event) {
1414
auto* widget = static_cast<Counter*>(obj->user_data);
1515
if (event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) {
16-
widget->Decrement();
16+
widget->DownBtnPressed();
1717
}
1818
}
1919
}
2020

21-
Counter::Counter(int min, int max) : min {min}, max {max} {
21+
Counter::Counter(int min, int max, lv_font_t& font) : min {min}, max {max}, font {font} {
2222
}
2323

24-
void Counter::Increment() {
24+
void Counter::UpBtnPressed() {
2525
value++;
2626
if (value > max) {
2727
value = min;
2828
}
2929
UpdateLabel();
30+
31+
if (ValueChangedHandler != nullptr) {
32+
ValueChangedHandler(userData);
33+
}
3034
};
3135

32-
void Counter::Decrement() {
36+
void Counter::DownBtnPressed() {
3337
value--;
3438
if (value < min) {
3539
value = max;
3640
}
3741
UpdateLabel();
42+
43+
if (ValueChangedHandler != nullptr) {
44+
ValueChangedHandler(userData);
45+
}
3846
};
3947

4048
void Counter::SetValue(int newValue) {
@@ -58,7 +66,28 @@ void Counter::ShowControls() {
5866
}
5967

6068
void Counter::UpdateLabel() {
61-
lv_label_set_text_fmt(number, "%.2i", value);
69+
if (twelveHourMode) {
70+
if (value == 0) {
71+
lv_label_set_text_static(number, "12");
72+
} else if (value <= 12) {
73+
lv_label_set_text_fmt(number, "%.2i", value);
74+
} else {
75+
lv_label_set_text_fmt(number, "%.2i", value - 12);
76+
}
77+
} else {
78+
lv_label_set_text_fmt(number, "%.2i", value);
79+
}
80+
}
81+
82+
// Value is kept between 0 and 23, but the displayed value is converted to 12-hour.
83+
// Make sure to set the max and min values to 0 and 23. Otherwise behaviour is undefined
84+
void Counter::EnableTwelveHourMode() {
85+
twelveHourMode = true;
86+
}
87+
88+
void Counter::SetValueChangedEventCallback(void* userData, void (*handler)(void* userData)) {
89+
this->userData = userData;
90+
this->ValueChangedHandler = handler;
6291
}
6392

6493
void Counter::Create() {
@@ -68,7 +97,7 @@ void Counter::Create() {
6897
lv_obj_set_style_local_bg_color(counterContainer, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, bgColor);
6998

7099
number = lv_label_create(counterContainer, nullptr);
71-
lv_obj_set_style_local_text_font(number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
100+
lv_obj_set_style_local_text_font(number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &font);
72101
lv_obj_align(number, nullptr, LV_ALIGN_CENTER, 0, 0);
73102
lv_obj_set_auto_realign(number, true);
74103
lv_label_set_text_static(number, "00");

src/displayapp/widgets/Counter.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ namespace Pinetime {
66
namespace Widgets {
77
class Counter {
88
public:
9-
Counter(int min, int max);
9+
Counter(int min, int max, lv_font_t& font);
1010

1111
void Create();
12-
void Increment();
13-
void Decrement();
12+
void UpBtnPressed();
13+
void DownBtnPressed();
1414
void SetValue(int newValue);
1515
void HideControls();
1616
void ShowControls();
17+
void EnableTwelveHourMode();
18+
void SetValueChangedEventCallback(void* userData, void (*handler)(void* userData));
1719

1820
int GetValue() const {
1921
return value;
@@ -25,6 +27,7 @@ namespace Pinetime {
2527

2628
private:
2729
void UpdateLabel();
30+
void (*ValueChangedHandler)(void* userData) = nullptr;
2831

2932
lv_obj_t* counterContainer;
3033
lv_obj_t* upBtn;
@@ -36,6 +39,10 @@ namespace Pinetime {
3639
int value = 0;
3740
int min;
3841
int max;
42+
bool twelveHourMode = false;
43+
lv_font_t& font;
44+
45+
void* userData = nullptr;
3946
};
4047
}
4148
}

0 commit comments

Comments
 (0)