From 43e07540d78dda31c47a9acd35ef7060d70011cd Mon Sep 17 00:00:00 2001 From: Olivier ROMAN Date: Wed, 5 Feb 2025 16:43:40 +0100 Subject: [PATCH 1/2] add date format setting --- src/CMakeLists.txt | 2 + src/components/settings/Settings.h | 13 ++++ src/displayapp/DisplayApp.cpp | 2 +- .../screens/settings/SettingClockFormat.cpp | 61 +++++++++++++++ .../screens/settings/SettingClockFormat.h | 24 ++++++ .../screens/settings/SettingDateFormat.cpp | 63 +++++++++++++++ .../screens/settings/SettingDateFormat.h | 24 ++++++ .../screens/settings/SettingTimeFormat.cpp | 77 ++++++++----------- .../screens/settings/SettingTimeFormat.h | 18 +++-- 9 files changed, 228 insertions(+), 56 deletions(-) create mode 100644 src/displayapp/screens/settings/SettingClockFormat.cpp create mode 100644 src/displayapp/screens/settings/SettingClockFormat.h create mode 100644 src/displayapp/screens/settings/SettingDateFormat.cpp create mode 100644 src/displayapp/screens/settings/SettingDateFormat.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e2b69b8b02..0f44e827fb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -408,6 +408,8 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/Settings.cpp displayapp/screens/settings/SettingWatchFace.cpp displayapp/screens/settings/SettingTimeFormat.cpp + displayapp/screens/settings/SettingClockFormat.cpp + displayapp/screens/settings/SettingDateFormat.cpp displayapp/screens/settings/SettingWeatherFormat.cpp displayapp/screens/settings/SettingWakeUp.cpp displayapp/screens/settings/SettingDisplay.cpp diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 602de3a585..a7b7dfe775 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -10,6 +10,7 @@ namespace Pinetime { class Settings { public: enum class ClockType : uint8_t { H24, H12 }; + enum class DateFormat : uint8_t { YYYYMMDD, DDMMYYYY, MMDDYYYY, DayDDMonthYYYY }; enum class WeatherFormat : uint8_t { Metric, Imperial }; enum class Notification : uint8_t { On, Off, Sleep }; enum class ChimesOption : uint8_t { None, Hours, HalfHours }; @@ -181,6 +182,17 @@ namespace Pinetime { return settings.clockType; }; + void SetDateFormat(DateFormat dateFormat) { + if (dateFormat != settings.dateFormat) { + settingsChanged = true; + } + settings.dateFormat = dateFormat; + }; + + DateFormat GetDateFormat() const { + return settings.dateFormat; + }; + void SetWeatherFormat(WeatherFormat weatherFormat) { if (weatherFormat != settings.weatherFormat) { settingsChanged = true; @@ -311,6 +323,7 @@ namespace Pinetime { bool alwaysOnDisplay = false; ClockType clockType = ClockType::H24; + DateFormat dateFormat = DateFormat::DayDDMonthYYYY; WeatherFormat weatherFormat = WeatherFormat::Metric; Notification notificationStatus = Notification::On; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 6671ac9e51..060658c33e 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -597,7 +597,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio currentScreen = std::make_unique(this, std::move(items), settingsController, filesystem); } break; case Apps::SettingTimeFormat: - currentScreen = std::make_unique(settingsController); + currentScreen = std::make_unique(this, settingsController); break; case Apps::SettingWeatherFormat: currentScreen = std::make_unique(settingsController); diff --git a/src/displayapp/screens/settings/SettingClockFormat.cpp b/src/displayapp/screens/settings/SettingClockFormat.cpp new file mode 100644 index 0000000000..fb41271c0e --- /dev/null +++ b/src/displayapp/screens/settings/SettingClockFormat.cpp @@ -0,0 +1,61 @@ +#include "displayapp/screens/settings/SettingClockFormat.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct ClockOption { + Pinetime::Controllers::Settings::ClockType clockType; + const char* name; + }; + + constexpr std::array clockOptions = {{ + {Pinetime::Controllers::Settings::ClockType::H12, "12-hour"}, + {Pinetime::Controllers::Settings::ClockType::H24, "24-hour"}, + }}; + + std::array CreateClockOptionArray() { + std::array clockOptionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= clockOptions.size()) { + clockOptionArray[i].name = ""; + clockOptionArray[i].enabled = false; + } else { + clockOptionArray[i].name = clockOptions[i].name; + clockOptionArray[i].enabled = true; + } + } + return clockOptionArray; + } + + uint32_t GetDefaultClockOption(Pinetime::Controllers::Settings::ClockType currentOption) { + for (size_t i = 0; i < clockOptions.size(); i++) { + if (clockOptions[i].clockType == currentOption) { + return i; + } + } + return 0; + } +} + +SettingClockFormat::SettingClockFormat(Pinetime::Controllers::Settings& settingsController) + : clockCheckboxList( + 0, + 1, + "Time format", + Symbols::clock, + GetDefaultClockOption(settingsController.GetClockType()), + [&settings = settingsController](uint32_t index) { + settings.SetClockType(clockOptions[index].clockType); + settings.SaveSettings(); + }, + CreateClockOptionArray()) { +} + +SettingClockFormat::~SettingClockFormat() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingClockFormat.h b/src/displayapp/screens/settings/SettingClockFormat.h new file mode 100644 index 0000000000..99123a4163 --- /dev/null +++ b/src/displayapp/screens/settings/SettingClockFormat.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + namespace Applications { + namespace Screens { + class SettingClockFormat : public Screen { + public: + SettingClockFormat(Pinetime::Controllers::Settings& settingsController); + ~SettingClockFormat() override; + + private: + CheckboxList clockCheckboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingDateFormat.cpp b/src/displayapp/screens/settings/SettingDateFormat.cpp new file mode 100644 index 0000000000..7019ee3b7d --- /dev/null +++ b/src/displayapp/screens/settings/SettingDateFormat.cpp @@ -0,0 +1,63 @@ +#include "displayapp/screens/settings/SettingDateFormat.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct DateOption { + Pinetime::Controllers::Settings::DateFormat dateFormat; + const char* name; + }; + + constexpr std::array dateOptions = {{ + {Pinetime::Controllers::Settings::DateFormat::YYYYMMDD, "yyyy-mm-dd"}, + {Pinetime::Controllers::Settings::DateFormat::DDMMYYYY, "dd/mm/yyyy"}, + {Pinetime::Controllers::Settings::DateFormat::MMDDYYYY, "mm/dd/yyyy"}, + {Pinetime::Controllers::Settings::DateFormat::DayDDMonthYYYY, "Day DD Month YYYY"}, + }}; + + std::array CreateDateOptionArray() { + std::array dateOptionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= dateOptions.size()) { + dateOptionArray[i].name = ""; + dateOptionArray[i].enabled = false; + } else { + dateOptionArray[i].name = dateOptions[i].name; + dateOptionArray[i].enabled = true; + } + } + return dateOptionArray; + } + + uint32_t GetDefaultDateOption(Pinetime::Controllers::Settings::DateFormat currentOption) { + for (size_t i = 0; i < dateOptions.size(); i++) { + if (dateOptions[i].dateFormat == currentOption) { + return i; + } + } + return 0; + } +} + +SettingDateFormat::SettingDateFormat(Pinetime::Controllers::Settings& settingsController) + : dateCheckboxList( + 0, + 1, + "Date format", + Symbols::clock, + GetDefaultDateOption(settingsController.GetDateFormat()), + [&settings = settingsController](uint32_t index) { + settings.SetDateFormat(dateOptions[index].dateFormat); + settings.SaveSettings(); + }, + CreateDateOptionArray()) { +} + +SettingDateFormat::~SettingDateFormat() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingDateFormat.h b/src/displayapp/screens/settings/SettingDateFormat.h new file mode 100644 index 0000000000..94e64a3068 --- /dev/null +++ b/src/displayapp/screens/settings/SettingDateFormat.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + namespace Applications { + namespace Screens { + class SettingDateFormat : public Screen { + public: + SettingDateFormat(Pinetime::Controllers::Settings& settingsController); + ~SettingDateFormat() override; + + private: + CheckboxList dateCheckboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingTimeFormat.cpp b/src/displayapp/screens/settings/SettingTimeFormat.cpp index df46d8a829..94bcc7f241 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.cpp +++ b/src/displayapp/screens/settings/SettingTimeFormat.cpp @@ -1,61 +1,44 @@ #include "displayapp/screens/settings/SettingTimeFormat.h" -#include +#include "displayapp/screens/settings/SettingClockFormat.h" +#include "displayapp/screens/settings/SettingDateFormat.h" #include "displayapp/DisplayApp.h" -#include "displayapp/screens/Styles.h" -#include "displayapp/screens/Screen.h" -#include "displayapp/screens/Symbols.h" +#include "displayapp/screens/ScreenList.h" +#include "components/settings/Settings.h" +#include "displayapp/widgets/DotIndicator.h" using namespace Pinetime::Applications::Screens; -namespace { - struct Option { - Pinetime::Controllers::Settings::ClockType clockType; - const char* name; - }; - - constexpr std::array options = {{ - {Pinetime::Controllers::Settings::ClockType::H12, "12-hour"}, - {Pinetime::Controllers::Settings::ClockType::H24, "24-hour"}, - }}; +bool SettingTimeFormat::OnTouchEvent(Pinetime::Applications::TouchEvents event) { + return screens.OnTouchEvent(event); +} - std::array CreateOptionArray() { - std::array optionArray; - for (size_t i = 0; i < CheckboxList::MaxItems; i++) { - if (i >= options.size()) { - optionArray[i].name = ""; - optionArray[i].enabled = false; - } else { - optionArray[i].name = options[i].name; - optionArray[i].enabled = true; - } - } - return optionArray; - } +SettingTimeFormat::SettingTimeFormat(Pinetime::Applications::DisplayApp* app, + Pinetime::Controllers::Settings& settingsController) + : settingsController {settingsController}, + screens {app, + 0, + {[this]() -> std::unique_ptr { + return screenClockFormat(); + }, + [this]() -> std::unique_ptr { + return screenDateFormat(); + }}, + Screens::ScreenListModes::UpDown} { +} - uint32_t GetDefaultOption(Pinetime::Controllers::Settings::ClockType currentOption) { - for (size_t i = 0; i < options.size(); i++) { - if (options[i].clockType == currentOption) { - return i; - } - } - return 0; - } +std::unique_ptr SettingTimeFormat::screenDateFormat() { + Widgets::DotIndicator dotIndicator(1, 2); + dotIndicator.Create(); + return std::make_unique(settingsController); } -SettingTimeFormat::SettingTimeFormat(Pinetime::Controllers::Settings& settingsController) - : checkboxList( - 0, - 1, - "Time format", - Symbols::clock, - GetDefaultOption(settingsController.GetClockType()), - [&settings = settingsController](uint32_t index) { - settings.SetClockType(options[index].clockType); - settings.SaveSettings(); - }, - CreateOptionArray()) { +std::unique_ptr SettingTimeFormat::screenClockFormat() { + Widgets::DotIndicator dotIndicator(0, 2); + dotIndicator.Create(); + return std::make_unique(settingsController); } SettingTimeFormat::~SettingTimeFormat() { lv_obj_clean(lv_scr_act()); } + diff --git a/src/displayapp/screens/settings/SettingTimeFormat.h b/src/displayapp/screens/settings/SettingTimeFormat.h index c33f75c0e9..75230150e6 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.h +++ b/src/displayapp/screens/settings/SettingTimeFormat.h @@ -1,25 +1,27 @@ #pragma once -#include #include #include - -#include "components/settings/Settings.h" #include "displayapp/screens/Screen.h" -#include "displayapp/screens/CheckboxList.h" +#include "displayapp/screens/ScreenList.h" namespace Pinetime { - namespace Applications { namespace Screens { - class SettingTimeFormat : public Screen { public: - SettingTimeFormat(Pinetime::Controllers::Settings& settingsController); + SettingTimeFormat(DisplayApp* app, + Pinetime::Controllers::Settings& settingsController); ~SettingTimeFormat() override; + bool OnTouchEvent(TouchEvents event) override; + private: - CheckboxList checkboxList; + Controllers::Settings& settingsController; + + ScreenList<2> screens; + std::unique_ptr screenDateFormat(); + std::unique_ptr screenClockFormat(); }; } } From a6a718d9d419c93b4167fe1599679e98f6bc4205 Mon Sep 17 00:00:00 2001 From: Olivier ROMAN Date: Wed, 5 Feb 2025 17:53:04 +0100 Subject: [PATCH 2/2] clang-format --- src/displayapp/screens/settings/SettingTimeFormat.cpp | 4 +--- src/displayapp/screens/settings/SettingTimeFormat.h | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/displayapp/screens/settings/SettingTimeFormat.cpp b/src/displayapp/screens/settings/SettingTimeFormat.cpp index 94bcc7f241..c803eff0ce 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.cpp +++ b/src/displayapp/screens/settings/SettingTimeFormat.cpp @@ -12,8 +12,7 @@ bool SettingTimeFormat::OnTouchEvent(Pinetime::Applications::TouchEvents event) return screens.OnTouchEvent(event); } -SettingTimeFormat::SettingTimeFormat(Pinetime::Applications::DisplayApp* app, - Pinetime::Controllers::Settings& settingsController) +SettingTimeFormat::SettingTimeFormat(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) : settingsController {settingsController}, screens {app, 0, @@ -41,4 +40,3 @@ std::unique_ptr SettingTimeFormat::screenClockFormat() { SettingTimeFormat::~SettingTimeFormat() { lv_obj_clean(lv_scr_act()); } - diff --git a/src/displayapp/screens/settings/SettingTimeFormat.h b/src/displayapp/screens/settings/SettingTimeFormat.h index 75230150e6..8f91e7eae5 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.h +++ b/src/displayapp/screens/settings/SettingTimeFormat.h @@ -10,8 +10,7 @@ namespace Pinetime { namespace Screens { class SettingTimeFormat : public Screen { public: - SettingTimeFormat(DisplayApp* app, - Pinetime::Controllers::Settings& settingsController); + SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingTimeFormat() override; bool OnTouchEvent(TouchEvents event) override;