From 565d94176591e9291797fbc006bac885e41a0e78 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sun, 14 Jan 2024 15:34:48 -0600 Subject: [PATCH 01/10] Add Timer's Time Remaining to the StatusIcons bar When a timer is active the time remaining will be displayed in the StatusIcons bar along with an hour glass symbol, and will be set to hidden when the timer's off. --- src/components/timer/Timer.cpp | 4 +-- src/components/timer/Timer.h | 4 +-- src/displayapp/DisplayApp.cpp | 4 ++- src/displayapp/screens/ApplicationList.cpp | 3 ++ src/displayapp/screens/ApplicationList.h | 2 ++ src/displayapp/screens/Tile.cpp | 5 +-- src/displayapp/screens/Tile.h | 1 + src/displayapp/screens/WatchFaceDigital.cpp | 3 +- src/displayapp/screens/WatchFaceDigital.h | 3 ++ .../screens/settings/QuickSettings.cpp | 7 ++-- .../screens/settings/QuickSettings.h | 3 +- src/displayapp/widgets/StatusIcons.cpp | 33 +++++++++++++++++-- src/displayapp/widgets/StatusIcons.h | 6 +++- 13 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/components/timer/Timer.cpp b/src/components/timer/Timer.cpp index 279178cd33..935d41e288 100644 --- a/src/components/timer/Timer.cpp +++ b/src/components/timer/Timer.cpp @@ -11,7 +11,7 @@ void Timer::StartTimer(std::chrono::milliseconds duration) { xTimerStart(timer, 0); } -std::chrono::milliseconds Timer::GetTimeRemaining() { +std::chrono::milliseconds Timer::GetTimeRemaining() const { if (IsRunning()) { TickType_t remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount(); return std::chrono::milliseconds(remainingTime * 1000 / configTICK_RATE_HZ); @@ -23,6 +23,6 @@ void Timer::StopTimer() { xTimerStop(timer, 0); } -bool Timer::IsRunning() { +bool Timer::IsRunning() const { return (xTimerIsTimerActive(timer) == pdTRUE); } diff --git a/src/components/timer/Timer.h b/src/components/timer/Timer.h index 2469666f4f..406ae03327 100644 --- a/src/components/timer/Timer.h +++ b/src/components/timer/Timer.h @@ -15,9 +15,9 @@ namespace Pinetime { void StopTimer(); - std::chrono::milliseconds GetTimeRemaining(); + std::chrono::milliseconds GetTimeRemaining() const; - bool IsRunning(); + bool IsRunning() const; private: TimerHandle_t timer; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 6671ac9e51..c5fa14a894 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -527,6 +527,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio batteryController, bleController, alarmController, + timer, dateTimeController, filesystem, std::move(apps)); @@ -582,7 +583,8 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio motorController, settingsController, bleController, - alarmController); + alarmController, + timer); break; case Apps::Settings: currentScreen = std::make_unique(this, settingsController); diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index fb46b41384..90ea40ee9b 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -22,6 +22,7 @@ ApplicationList::ApplicationList(DisplayApp* app, const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, const Pinetime::Controllers::AlarmController& alarmController, + const Controllers::Timer& timer, Controllers::DateTime& dateTimeController, Pinetime::Controllers::FS& filesystem, std::array&& apps) @@ -30,6 +31,7 @@ ApplicationList::ApplicationList(DisplayApp* app, batteryController {batteryController}, bleController {bleController}, alarmController {alarmController}, + timer {timer}, dateTimeController {dateTimeController}, filesystem {filesystem}, apps {std::move(apps)}, @@ -62,6 +64,7 @@ std::unique_ptr ApplicationList::CreateScreen(unsigned int screenNum) co batteryController, bleController, alarmController, + timer, dateTimeController, pageApps); } diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 4a57d7c034..457c4bb1ed 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -19,6 +19,7 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, const Pinetime::Controllers::AlarmController& alarmController, + const Pinetime::Controllers::Timer& timer, Controllers::DateTime& dateTimeController, Pinetime::Controllers::FS& filesystem, std::array&& apps); @@ -34,6 +35,7 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController; const Pinetime::Controllers::Ble& bleController; const Pinetime::Controllers::AlarmController& alarmController; + const Pinetime::Controllers::Timer& timer; Controllers::DateTime& dateTimeController; Pinetime::Controllers::FS& filesystem; std::array apps; diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 7c585a4b97..8e3c5c5565 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -30,12 +30,13 @@ Tile::Tile(uint8_t screenID, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer, Controllers::DateTime& dateTimeController, std::array& applications) : app {app}, dateTimeController {dateTimeController}, pageIndicator(screenID, numScreens), - statusIcons(batteryController, bleController, alarmController) { + statusIcons(batteryController, bleController, alarmController, timer) { settingsController.SetAppMenu(screenID); @@ -87,7 +88,7 @@ Tile::Tile(uint8_t screenID, btnm1->user_data = this; lv_obj_set_event_cb(btnm1, event_handler); - taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this); + taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this); UpdateScreen(); } diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index c16151d0e1..e54dfd5659 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -29,6 +29,7 @@ namespace Pinetime { const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer, Controllers::DateTime& dateTimeController, std::array& applications); diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 3163c6e750..341dd919db 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -20,6 +20,7 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -32,7 +33,7 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, heartRateController {heartRateController}, motionController {motionController}, weatherService {weatherService}, - statusIcons(batteryController, bleController, alarmController) { + statusIcons(batteryController, bleController, alarmController, timer) { statusIcons.Create(); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 3005cea56f..f7ed541ddc 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -21,6 +21,7 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class Timer; } namespace Applications { @@ -32,6 +33,7 @@ namespace Pinetime { const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -87,6 +89,7 @@ namespace Pinetime { controllers.batteryController, controllers.bleController, controllers.alarmController, + controllers.timer, controllers.notificationManager, controllers.settingsController, controllers.heartRateController, diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index c5c3071aef..f31a206be7 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -34,13 +34,14 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController, const Controllers::Ble& bleController, - const Controllers::AlarmController& alarmController) + const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer) : app {app}, dateTimeController {dateTimeController}, brightness {brightness}, motorController {motorController}, settingsController {settingsController}, - statusIcons(batteryController, bleController, alarmController) { + statusIcons(batteryController, bleController, alarmController, timer) { statusIcons.Create(); @@ -119,7 +120,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(lbl_btn, Symbols::settings); - taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this); + taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this); UpdateScreen(); } diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 87c126b7fa..203e051f37 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -24,7 +24,8 @@ namespace Pinetime { Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController, const Controllers::Ble& bleController, - const Controllers::AlarmController& alarmController); + const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer); ~QuickSettings() override; diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 777731a59f..c4daa462a3 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -6,11 +6,26 @@ using namespace Pinetime::Applications::Widgets; StatusIcons::StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, - const Controllers::AlarmController& alarmController) - : batteryIcon(true), batteryController {batteryController}, bleController {bleController}, alarmController {alarmController} { + const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer) + : batteryIcon(true), + batteryController {batteryController}, + bleController {bleController}, + alarmController {alarmController}, + timer {timer} { } void StatusIcons::Create() { + timerIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(timerIcon, Screens::Symbols::hourGlass); + lv_obj_set_style_local_text_color(timerIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_obj_align(timerIcon, lv_scr_act(), LV_ALIGN_IN_TOP_MID, -38, 0); + + timeRemaining = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_label_set_text(timeRemaining, "00:00"); + lv_obj_align(timeRemaining, nullptr, LV_ALIGN_IN_TOP_MID, 4, 0); + container = lv_cont_create(lv_scr_act(), nullptr); lv_cont_set_layout(container, LV_LAYOUT_ROW_TOP); lv_cont_set_fit(container, LV_FIT_TIGHT); @@ -32,6 +47,20 @@ void StatusIcons::Create() { } void StatusIcons::Update() { + if (timer.IsRunning()) { + auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); + + uint8_t minutes = secondsRemaining.count() / 60; + uint8_t seconds = secondsRemaining.count() % 60; + lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds); + + lv_obj_set_hidden(timeRemaining, false); + lv_obj_set_hidden(timerIcon, false); + } else { + lv_obj_set_hidden(timeRemaining, true); + lv_obj_set_hidden(timerIcon, true); + } + powerPresent = batteryController.IsPowerPresent(); if (powerPresent.IsUpdated()) { lv_obj_set_hidden(batteryPlug, !powerPresent.Get()); diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h index 5524e996c5..3ab06bf3ef 100644 --- a/src/displayapp/widgets/StatusIcons.h +++ b/src/displayapp/widgets/StatusIcons.h @@ -16,7 +16,8 @@ namespace Pinetime { public: StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, - const Controllers::AlarmController& alarmController); + const Controllers::AlarmController& alarmController, + const Controllers::Timer& timer); void Align(); void Create(); @@ -31,6 +32,7 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController; const Controllers::Ble& bleController; const Controllers::AlarmController& alarmController; + const Controllers::Timer& timer; Utility::DirtyValue batteryPercentRemaining {}; Utility::DirtyValue powerPresent {}; @@ -38,6 +40,8 @@ namespace Pinetime { Utility::DirtyValue bleRadioEnabled {}; Utility::DirtyValue alarmEnabled {}; + lv_obj_t* timerIcon; + lv_obj_t* timeRemaining; lv_obj_t* bleIcon; lv_obj_t* alarmIcon; lv_obj_t* batteryPlug; From 20e0af5f504da06b5ccb9e84875e12081cee675f Mon Sep 17 00:00:00 2001 From: JustScott Date: Thu, 30 Jan 2025 22:31:58 -0600 Subject: [PATCH 02/10] Dynamically position or replace the live timer This commit moves the timeRemaining and timerIcon into a timerContainer nested within the primary container. This ensures the timeRemaining and timerIcon stay closer together than the other items in the primary container, while still dynamically aligning with the rest of them. When two or more icons (excluding batteryIcon) are present, the timeRemaining and timerIcon are replaced by a soloTimerIcon to prevent overlap with the time in the top left corner. --- src/displayapp/widgets/StatusIcons.cpp | 73 +++++++++++++++++--------- src/displayapp/widgets/StatusIcons.h | 6 ++- 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index c4daa462a3..10dacd0e52 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -16,28 +16,35 @@ StatusIcons::StatusIcons(const Controllers::Battery& batteryController, } void StatusIcons::Create() { - timerIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(timerIcon, Screens::Symbols::hourGlass); - lv_obj_set_style_local_text_color(timerIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - lv_obj_align(timerIcon, lv_scr_act(), LV_ALIGN_IN_TOP_MID, -38, 0); - - timeRemaining = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - lv_label_set_text(timeRemaining, "00:00"); - lv_obj_align(timeRemaining, nullptr, LV_ALIGN_IN_TOP_MID, 4, 0); - container = lv_cont_create(lv_scr_act(), nullptr); lv_cont_set_layout(container, LV_LAYOUT_ROW_TOP); lv_cont_set_fit(container, LV_FIT_TIGHT); lv_obj_set_style_local_pad_inner(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); lv_obj_set_style_local_bg_opa(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + timerContainer = lv_cont_create(container, nullptr); + lv_cont_set_layout(timerContainer, LV_LAYOUT_ROW_TOP); + lv_cont_set_fit(timerContainer, LV_FIT_TIGHT); + lv_obj_set_style_local_pad_inner(timerContainer, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 1); + lv_obj_set_style_local_bg_opa(timerContainer, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + + timerIcon = lv_label_create(timerContainer, nullptr); + lv_label_set_text_static(timerIcon, Screens::Symbols::hourGlass); + lv_obj_set_style_local_text_color(timerIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + + timeRemaining = lv_label_create(timerContainer, nullptr); + lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_label_set_text(timeRemaining, "00:00"); + bleIcon = lv_label_create(container, nullptr); lv_label_set_text_static(bleIcon, Screens::Symbols::bluetooth); batteryPlug = lv_label_create(container, nullptr); lv_label_set_text_static(batteryPlug, Screens::Symbols::plug); + soloTimerIcon = lv_label_create(container, nullptr); + lv_label_set_text_static(soloTimerIcon, Screens::Symbols::hourGlass); + alarmIcon = lv_label_create(container, nullptr); lv_label_set_text_static(alarmIcon, Screens::Symbols::bell); @@ -47,20 +54,6 @@ void StatusIcons::Create() { } void StatusIcons::Update() { - if (timer.IsRunning()) { - auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); - - uint8_t minutes = secondsRemaining.count() / 60; - uint8_t seconds = secondsRemaining.count() % 60; - lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds); - - lv_obj_set_hidden(timeRemaining, false); - lv_obj_set_hidden(timerIcon, false); - } else { - lv_obj_set_hidden(timeRemaining, true); - lv_obj_set_hidden(timerIcon, true); - } - powerPresent = batteryController.IsPowerPresent(); if (powerPresent.IsUpdated()) { lv_obj_set_hidden(batteryPlug, !powerPresent.Get()); @@ -83,5 +76,37 @@ void StatusIcons::Update() { lv_obj_set_hidden(bleIcon, !bleState.Get()); } + if (timer.IsRunning()) { + uint8_t activeIconCounter = 0; + + if (!lv_obj_get_hidden(bleIcon)) { + activeIconCounter++; + } + if (!lv_obj_get_hidden(batteryPlug)) { + activeIconCounter++; + } + if (!lv_obj_get_hidden(alarmIcon)) { + activeIconCounter++; + } + + // more than 2 icons (plus the batteryIcon) make the timerContainer collide + // with other text, so replace it with a timer icon + if (activeIconCounter > 2) { + lv_obj_set_hidden(soloTimerIcon, false); + lv_obj_set_hidden(timerContainer, true); + } else { + auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); + uint8_t minutes = secondsRemaining.count() / 60; + uint8_t seconds = secondsRemaining.count() % 60; + lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds); + + lv_obj_set_hidden(soloTimerIcon, true); + lv_obj_set_hidden(timerContainer, false); + } + } else { + lv_obj_set_hidden(soloTimerIcon, true); + lv_obj_set_hidden(timerContainer, true); + } + lv_obj_realign(container); } diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h index 3ab06bf3ef..43abb10ca6 100644 --- a/src/displayapp/widgets/StatusIcons.h +++ b/src/displayapp/widgets/StatusIcons.h @@ -40,12 +40,14 @@ namespace Pinetime { Utility::DirtyValue bleRadioEnabled {}; Utility::DirtyValue alarmEnabled {}; + lv_obj_t* container; + lv_obj_t* timerContainer; lv_obj_t* timerIcon; lv_obj_t* timeRemaining; lv_obj_t* bleIcon; - lv_obj_t* alarmIcon; lv_obj_t* batteryPlug; - lv_obj_t* container; + lv_obj_t* soloTimerIcon; + lv_obj_t* alarmIcon; }; } } From fe99a1da5298d294b6229a9bb7777e1a6876ed50 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 1 Feb 2025 07:23:03 -0600 Subject: [PATCH 03/10] Replace hardcoded active icon counter logic Loop through the children of `container` to count visible icons instead of hardcoding each icon. Adding icons to the container no longer requires adding another hardcoded icon to the active Icon counter logic. --- src/displayapp/widgets/StatusIcons.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 10dacd0e52..209711c9f4 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -78,22 +78,33 @@ void StatusIcons::Update() { if (timer.IsRunning()) { uint8_t activeIconCounter = 0; + lv_obj_t* child = lv_obj_get_child(container, NULL); - if (!lv_obj_get_hidden(bleIcon)) { - activeIconCounter++; + while (child != NULL) { + if (!lv_obj_get_hidden(child)) { + activeIconCounter++; + } + child = lv_obj_get_child(container, child); } - if (!lv_obj_get_hidden(batteryPlug)) { - activeIconCounter++; + + // Subtract batteryIcon as it doesn't count (always active) + activeIconCounter--; + + // Subtract individually because switching pages initially sets all icons + // to visible. This causes soloTimerIcon to briefly appear before the + // timerContainer is set to visible. + if (!lv_obj_get_hidden(timerContainer)) { + activeIconCounter--; } - if (!lv_obj_get_hidden(alarmIcon)) { - activeIconCounter++; + if (!lv_obj_get_hidden(soloTimerIcon)) { + activeIconCounter--; } // more than 2 icons (plus the batteryIcon) make the timerContainer collide // with other text, so replace it with a timer icon if (activeIconCounter > 2) { - lv_obj_set_hidden(soloTimerIcon, false); lv_obj_set_hidden(timerContainer, true); + lv_obj_set_hidden(soloTimerIcon, false); } else { auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); uint8_t minutes = secondsRemaining.count() / 60; From 3632d5ef93d16e43a5d3f54ef4f2653742367b3f Mon Sep 17 00:00:00 2001 From: JustScott Date: Thu, 13 Feb 2025 19:04:39 -0600 Subject: [PATCH 04/10] Dynamically remove minutes from timer Removes the minute counter from the timer when under a minute to allow displaying the remaining second count with more icons. --- src/displayapp/widgets/StatusIcons.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 209711c9f4..213b97fae3 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -78,6 +78,7 @@ void StatusIcons::Update() { if (timer.IsRunning()) { uint8_t activeIconCounter = 0; + uint8_t maxIcons = 0; lv_obj_t* child = lv_obj_get_child(container, NULL); while (child != NULL) { @@ -100,17 +101,21 @@ void StatusIcons::Update() { activeIconCounter--; } - // more than 2 icons (plus the batteryIcon) make the timerContainer collide - // with other text, so replace it with a timer icon - if (activeIconCounter > 2) { + std::chrono::seconds secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); + uint8_t timerMinutes = (secondsRemaining.count() % 3600) / 60; + uint8_t timerSeconds = secondsRemaining.count() % 60; + if (timerMinutes > 0) { + maxIcons = 2; + lv_label_set_text_fmt(timeRemaining, "%02d:%02d", timerMinutes, timerSeconds); + } else { + maxIcons = 3; + lv_label_set_text_fmt(timeRemaining, ":%02d", timerSeconds); + } + + if (activeIconCounter > maxIcons) { lv_obj_set_hidden(timerContainer, true); lv_obj_set_hidden(soloTimerIcon, false); } else { - auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); - uint8_t minutes = secondsRemaining.count() / 60; - uint8_t seconds = secondsRemaining.count() % 60; - lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds); - lv_obj_set_hidden(soloTimerIcon, true); lv_obj_set_hidden(timerContainer, false); } From 24cd41fe2a49991a1b88565f84d95132fc44aa75 Mon Sep 17 00:00:00 2001 From: JustScott Date: Thu, 13 Feb 2025 19:39:10 -0600 Subject: [PATCH 05/10] Allow one more icon in 24H mode --- src/displayapp/screens/Tile.cpp | 2 +- src/displayapp/screens/WatchFaceDigital.cpp | 2 +- src/displayapp/screens/settings/QuickSettings.cpp | 2 +- src/displayapp/widgets/StatusIcons.cpp | 10 ++++++++-- src/displayapp/widgets/StatusIcons.h | 5 ++++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 8e3c5c5565..21e24eccb8 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -36,7 +36,7 @@ Tile::Tile(uint8_t screenID, : app {app}, dateTimeController {dateTimeController}, pageIndicator(screenID, numScreens), - statusIcons(batteryController, bleController, alarmController, timer) { + statusIcons(batteryController, bleController, alarmController, timer, settingsController) { settingsController.SetAppMenu(screenID); diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 341dd919db..8cdbceb087 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -33,7 +33,7 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, heartRateController {heartRateController}, motionController {motionController}, weatherService {weatherService}, - statusIcons(batteryController, bleController, alarmController, timer) { + statusIcons(batteryController, bleController, alarmController, timer, settingsController) { statusIcons.Create(); diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index f31a206be7..89dab5c053 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -41,7 +41,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, brightness {brightness}, motorController {motorController}, settingsController {settingsController}, - statusIcons(batteryController, bleController, alarmController, timer) { + statusIcons(batteryController, bleController, alarmController, timer, settingsController) { statusIcons.Create(); diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 213b97fae3..02ab1cacb8 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -7,12 +7,14 @@ using namespace Pinetime::Applications::Widgets; StatusIcons::StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, - const Controllers::Timer& timer) + const Controllers::Timer& timer, + const Controllers::Settings& settingsController) : batteryIcon(true), batteryController {batteryController}, bleController {bleController}, alarmController {alarmController}, - timer {timer} { + timer {timer}, + settingsController {settingsController} { } void StatusIcons::Create() { @@ -112,6 +114,10 @@ void StatusIcons::Update() { lv_label_set_text_fmt(timeRemaining, ":%02d", timerSeconds); } + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { + maxIcons += 1; + } + if (activeIconCounter > maxIcons) { lv_obj_set_hidden(timerContainer, true); lv_obj_set_hidden(soloTimerIcon, false); diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h index 43abb10ca6..343562b21d 100644 --- a/src/displayapp/widgets/StatusIcons.h +++ b/src/displayapp/widgets/StatusIcons.h @@ -6,6 +6,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/alarm/AlarmController.h" +#include "components/settings/Settings.h" #include "displayapp/screens/BatteryIcon.h" #include "utility/DirtyValue.h" @@ -17,7 +18,8 @@ namespace Pinetime { StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::AlarmController& alarmController, - const Controllers::Timer& timer); + const Controllers::Timer& timer, + const Controllers::Settings& settingsController); void Align(); void Create(); @@ -33,6 +35,7 @@ namespace Pinetime { const Controllers::Ble& bleController; const Controllers::AlarmController& alarmController; const Controllers::Timer& timer; + const Controllers::Settings& settingsController; Utility::DirtyValue batteryPercentRemaining {}; Utility::DirtyValue powerPresent {}; From e92258ffddcd8f8f2c68bbdc9f2834e9b7a0048c Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 15 Feb 2025 02:05:58 -0600 Subject: [PATCH 06/10] Remove colon from seconds only text --- src/displayapp/widgets/StatusIcons.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 02ab1cacb8..f3c5311802 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -111,7 +111,7 @@ void StatusIcons::Update() { lv_label_set_text_fmt(timeRemaining, "%02d:%02d", timerMinutes, timerSeconds); } else { maxIcons = 3; - lv_label_set_text_fmt(timeRemaining, ":%02d", timerSeconds); + lv_label_set_text_fmt(timeRemaining, "%02d", timerSeconds); } if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { From 4742286a2c901bea11355f14920670a9773268ab Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 15 Feb 2025 03:03:48 -0600 Subject: [PATCH 07/10] Reduce timer letter spacing to save space --- src/displayapp/widgets/StatusIcons.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index f3c5311802..e589f500ac 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -36,6 +36,7 @@ void StatusIcons::Create() { timeRemaining = lv_label_create(timerContainer, nullptr); lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_obj_set_style_local_text_letter_space(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -1); lv_label_set_text(timeRemaining, "00:00"); bleIcon = lv_label_create(container, nullptr); From 19ae91e4ada446fe30660ee91dea0af709c3a2a2 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 15 Feb 2025 03:24:03 -0600 Subject: [PATCH 08/10] Allow another icon in seconds only --- src/displayapp/widgets/StatusIcons.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index e589f500ac..053661785d 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -111,7 +111,7 @@ void StatusIcons::Update() { maxIcons = 2; lv_label_set_text_fmt(timeRemaining, "%02d:%02d", timerMinutes, timerSeconds); } else { - maxIcons = 3; + maxIcons = 4; lv_label_set_text_fmt(timeRemaining, "%02d", timerSeconds); } From fbe50b9c7d27212bd50a00e222db335d090f2074 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 15 Feb 2025 03:25:23 -0600 Subject: [PATCH 09/10] No need to set default '00:00' text --- src/displayapp/widgets/StatusIcons.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 053661785d..dbb480436b 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -37,7 +37,6 @@ void StatusIcons::Create() { timeRemaining = lv_label_create(timerContainer, nullptr); lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); lv_obj_set_style_local_text_letter_space(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -1); - lv_label_set_text(timeRemaining, "00:00"); bleIcon = lv_label_create(container, nullptr); lv_label_set_text_static(bleIcon, Screens::Symbols::bluetooth); From c4cf62caf75dc3f85fb58287d61e93f754803c98 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sat, 15 Feb 2025 03:35:58 -0600 Subject: [PATCH 10/10] Minutes can fit 2 extra icons in 24H mode --- src/displayapp/widgets/StatusIcons.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index dbb480436b..18250bb9a0 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -115,7 +115,10 @@ void StatusIcons::Update() { } if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - maxIcons += 1; + maxIcons++; + if (timerMinutes > 0) { + maxIcons++; + } } if (activeIconCounter > maxIcons) {