InfiniTime.git

commit a7f8b59bfb1641dea7f30a267c6bf7e882d9edbf

Author: John Quigley <Elements6007@gmail.com>

Combine Date and Time Settings  (#1465)

Replace separate SettingSetDate and SettingSetTime with a combined screenlist.
Add DotIndicators. Similar to PageIndicator, but for use when separating screens instead of pages of a list.

Co-authored-by: Riku Isokoski <riksu9000@gmail.com>

 src/CMakeLists.txt | 3 
 src/displayapp/Apps.h | 3 
 src/displayapp/DisplayApp.cpp | 10 -
 src/displayapp/screens/settings/SettingSetDate.cpp | 15 +-
 src/displayapp/screens/settings/SettingSetDate.h | 7 +
 src/displayapp/screens/settings/SettingSetDateTime.cpp | 54 ++++++++++++
 src/displayapp/screens/settings/SettingSetDateTime.h | 32 +++++++
 src/displayapp/screens/settings/SettingSetTime.cpp | 12 -
 src/displayapp/screens/settings/SettingSetTime.h | 6 +
 src/displayapp/screens/settings/Settings.h | 17 ++-
 src/displayapp/widgets/DotIndicator.cpp | 28 ++++++
 src/displayapp/widgets/DotIndicator.h | 18 ++++


diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 64b7ffbd662a5b390ad31900ffde366c22874cbf..3eade16b6f33eefe7b6ba35d70a13ab39fae8395 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -407,6 +407,7 @@         displayapp/screens/Styles.cpp
         displayapp/Colors.cpp
         displayapp/widgets/Counter.cpp
         displayapp/widgets/PageIndicator.cpp
+        displayapp/widgets/DotIndicator.cpp
         displayapp/widgets/StatusIcons.cpp
 
         ## Settings
@@ -417,6 +418,7 @@         displayapp/screens/settings/SettingTimeFormat.cpp
         displayapp/screens/settings/SettingWakeUp.cpp
         displayapp/screens/settings/SettingDisplay.cpp
         displayapp/screens/settings/SettingSteps.cpp
+        displayapp/screens/settings/SettingSetDateTime.cpp
         displayapp/screens/settings/SettingSetDate.cpp
         displayapp/screens/settings/SettingSetTime.cpp
         displayapp/screens/settings/SettingChimes.cpp
@@ -616,6 +618,7 @@         displayapp/screens/Alarm.h
         displayapp/Colors.h
         displayapp/widgets/Counter.h
         displayapp/widgets/PageIndicator.h
+        displayapp/widgets/DotIndicator.h
         displayapp/widgets/StatusIcons.h
         drivers/St7789.h
         drivers/SpiNorFlash.h




diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h
index 8aad953517be91c4ea82826df36f9be069619961..89b05d87cb5b83e79c4433b875bf411063ec2d9b 100644
--- a/src/displayapp/Apps.h
+++ b/src/displayapp/Apps.h
@@ -34,8 +34,7 @@       SettingTimeFormat,
       SettingDisplay,
       SettingWakeUp,
       SettingSteps,
-      SettingSetDate,
-      SettingSetTime,
+      SettingSetDateTime,
       SettingChimes,
       SettingShakeThreshold,
       SettingBluetooth,




diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index 69830eadbdd7b8040e5c773083bb44cf0c388c61..725caaf437f0a3b658424096221e5c6e97a3e17a 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -43,8 +43,7 @@ #include "displayapp/screens/settings/SettingTimeFormat.h"
 #include "displayapp/screens/settings/SettingWakeUp.h"
 #include "displayapp/screens/settings/SettingDisplay.h"
 #include "displayapp/screens/settings/SettingSteps.h"
-#include "displayapp/screens/settings/SettingSetDate.h"
-#include "displayapp/screens/settings/SettingSetTime.h"
+#include "displayapp/screens/settings/SettingSetDateTime.h"
 #include "displayapp/screens/settings/SettingChimes.h"
 #include "displayapp/screens/settings/SettingShakeThreshold.h"
 #include "displayapp/screens/settings/SettingBluetooth.h"
@@ -430,11 +429,8 @@       break;
     case Apps::SettingSteps:
       currentScreen = std::make_unique<Screens::SettingSteps>(this, settingsController);
       break;
-    case Apps::SettingSetDate:
-      currentScreen = std::make_unique<Screens::SettingSetDate>(this, dateTimeController);
-      break;
-    case Apps::SettingSetTime:
-      currentScreen = std::make_unique<Screens::SettingSetTime>(this, dateTimeController, settingsController);
+    case Apps::SettingSetDateTime:
+      currentScreen = std::make_unique<Screens::SettingSetDateTime>(this, dateTimeController, settingsController);
       break;
     case Apps::SettingChimes:
       currentScreen = std::make_unique<Screens::SettingChimes>(this, settingsController);




diff --git a/src/displayapp/screens/settings/SettingSetDate.cpp b/src/displayapp/screens/settings/SettingSetDate.cpp
index 421aef0202512e8ed1d3cf655c2e545f1c363caf..fd1bc9b91941d4b94fb3154bd83d2b93ccb581ce 100644
--- a/src/displayapp/screens/settings/SettingSetDate.cpp
+++ b/src/displayapp/screens/settings/SettingSetDate.cpp
@@ -1,4 +1,5 @@
 #include "displayapp/screens/settings/SettingSetDate.h"
+#include "displayapp/screens/settings/SettingSetDateTime.h"
 #include <lvgl/lvgl.h>
 #include <hal/nrf_rtc.h>
 #include <nrf_log.h>
@@ -44,8 +45,11 @@     }
   }
 }
 
-SettingSetDate::SettingSetDate(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::DateTime& dateTimeController)
-  : Screen(app), dateTimeController {dateTimeController} {
+SettingSetDate::SettingSetDate(Pinetime::Applications::DisplayApp* app,
+                               Pinetime::Controllers::DateTime& dateTimeController,
+                               Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime)
+  : Screen(app), dateTimeController {dateTimeController}, settingSetDateTime {settingSetDateTime} {
+
   lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
   lv_label_set_text_static(title, "Set current date");
   lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
@@ -82,8 +86,6 @@   lv_obj_set_style_local_bg_color(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38));
   lblSetTime = lv_label_create(btnSetTime, nullptr);
   lv_label_set_text_static(lblSetTime, "Set");
   lv_obj_set_event_cb(btnSetTime, event_handler);
-  lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
-  lv_obj_set_state(lblSetTime, LV_STATE_DISABLED);
 }
 
 SettingSetDate::~SettingSetDate() {
@@ -103,13 +105,10 @@                              dateTimeController.Hours(),
                              dateTimeController.Minutes(),
                              dateTimeController.Seconds(),
                              nrf_rtc_counter_get(portNRF_RTC_REG));
-  lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
-  lv_obj_set_state(lblSetTime, LV_STATE_DISABLED);
+  settingSetDateTime.Advance();
 }
 
 void SettingSetDate::CheckDay() {
   const int maxDay = MaximumDayOfMonth(monthCounter.GetValue(), yearCounter.GetValue());
   dayCounter.SetMax(maxDay);
-  lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
-  lv_obj_set_state(lblSetTime, LV_STATE_DEFAULT);
 }




diff --git a/src/displayapp/screens/settings/SettingSetDate.h b/src/displayapp/screens/settings/SettingSetDate.h
index a0ffc6831f5441a5baa799ba379ab1dddbb59669..dfb0e0d293a38377f132843f2e1c37c33d0c45b8 100644
--- a/src/displayapp/screens/settings/SettingSetDate.h
+++ b/src/displayapp/screens/settings/SettingSetDate.h
@@ -5,13 +5,17 @@ #include 
 #include "components/datetime/DateTimeController.h"
 #include "displayapp/screens/Screen.h"
 #include "displayapp/widgets/Counter.h"
+#include "displayapp/widgets/DotIndicator.h"
+#include "displayapp/screens/settings/SettingSetDateTime.h"
 
 namespace Pinetime {
   namespace Applications {
     namespace Screens {
       class SettingSetDate : public Screen {
       public:
-        SettingSetDate(DisplayApp* app, Pinetime::Controllers::DateTime& dateTimeController);
+        SettingSetDate(DisplayApp* app,
+                       Pinetime::Controllers::DateTime& dateTimeController,
+                       Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime);
         ~SettingSetDate() override;
 
         void HandleButtonPress();
@@ -19,6 +23,7 @@         void CheckDay();
 
       private:
         Controllers::DateTime& dateTimeController;
+        Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime;
 
         lv_obj_t* btnSetTime;
         lv_obj_t* lblSetTime;




diff --git a/src/displayapp/screens/settings/SettingSetDateTime.cpp b/src/displayapp/screens/settings/SettingSetDateTime.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..905a76abc63d82e32b40db780b84ce87740d79fd
--- /dev/null
+++ b/src/displayapp/screens/settings/SettingSetDateTime.cpp
@@ -0,0 +1,54 @@
+#include "displayapp/screens/settings/SettingSetDateTime.h"
+#include "displayapp/screens/settings/SettingSetDate.h"
+#include "displayapp/screens/settings/SettingSetTime.h"
+#include "displayapp/DisplayApp.h"
+#include "displayapp/screens/ScreenList.h"
+#include "components/settings/Settings.h"
+#include "displayapp/widgets/DotIndicator.h"
+
+using namespace Pinetime::Applications::Screens;
+
+bool SettingSetDateTime::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
+  return screens.OnTouchEvent(event);
+}
+
+SettingSetDateTime::SettingSetDateTime(Pinetime::Applications::DisplayApp* app,
+                                       Pinetime::Controllers::DateTime& dateTimeController,
+                                       Pinetime::Controllers::Settings& settingsController)
+  : Screen(app),
+    dateTimeController {dateTimeController},
+    settingsController {settingsController},
+    screens {app,
+             0,
+             {[this]() -> std::unique_ptr<Screen> {
+                return screenSetDate();
+              },
+              [this]() -> std::unique_ptr<Screen> {
+                return screenSetTime();
+              }},
+             Screens::ScreenListModes::UpDown} {
+}
+
+std::unique_ptr<Screen> SettingSetDateTime::screenSetDate() {
+  Widgets::DotIndicator dotIndicator(0, 2);
+  dotIndicator.Create();
+  return std::make_unique<Screens::SettingSetDate>(app, dateTimeController, *this);
+}
+
+std::unique_ptr<Screen> SettingSetDateTime::screenSetTime() {
+  Widgets::DotIndicator dotIndicator(1, 2);
+  dotIndicator.Create();
+  return std::make_unique<Screens::SettingSetTime>(app, dateTimeController, settingsController, *this);
+}
+
+SettingSetDateTime::~SettingSetDateTime() {
+  lv_obj_clean(lv_scr_act());
+}
+
+void SettingSetDateTime::Advance() {
+  screens.OnTouchEvent(Pinetime::Applications::TouchEvents::SwipeUp);
+}
+
+void SettingSetDateTime::Quit() {
+  running = false;
+}




diff --git a/src/displayapp/screens/settings/SettingSetDateTime.h b/src/displayapp/screens/settings/SettingSetDateTime.h
new file mode 100644
index 0000000000000000000000000000000000000000..dea283f8fbb91df53eac4c8c0506e5ebf3055dc8
--- /dev/null
+++ b/src/displayapp/screens/settings/SettingSetDateTime.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <cstdint>
+#include <lvgl/lvgl.h>
+#include "displayapp/screens/Screen.h"
+#include "displayapp/screens/ScreenList.h"
+
+namespace Pinetime {
+  namespace Applications {
+    namespace Screens {
+      class SettingSetDateTime : public Screen {
+      public:
+        SettingSetDateTime(DisplayApp* app,
+                           Pinetime::Controllers::DateTime& dateTimeController,
+                           Pinetime::Controllers::Settings& settingsController);
+        ~SettingSetDateTime() override;
+
+        bool OnTouchEvent(TouchEvents event) override;
+        void Advance();
+        void Quit();
+
+      private:
+        Controllers::DateTime& dateTimeController;
+        Controllers::Settings& settingsController;
+
+        ScreenList<2> screens;
+        std::unique_ptr<Screen> screenSetDate();
+        std::unique_ptr<Screen> screenSetTime();
+      };
+    }
+  }
+}




diff --git a/src/displayapp/screens/settings/SettingSetTime.cpp b/src/displayapp/screens/settings/SettingSetTime.cpp
index f85fe073cf7f38ac8e4587b0fa296af91c9364e9..7fad33aea306a5d23dfbcf17f652fa95885fd63f 100644
--- a/src/displayapp/screens/settings/SettingSetTime.cpp
+++ b/src/displayapp/screens/settings/SettingSetTime.cpp
@@ -27,8 +27,9 @@ }
 
 SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp* app,
                                Pinetime::Controllers::DateTime& dateTimeController,
-                               Pinetime::Controllers::Settings& settingsController)
-  : Screen(app), dateTimeController {dateTimeController}, settingsController {settingsController} {
+                               Pinetime::Controllers::Settings& settingsController,
+                               Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime)
+  : Screen(app), dateTimeController {dateTimeController}, settingsController {settingsController}, settingSetDateTime {settingSetDateTime} {
 
   lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
   lv_label_set_text_static(title, "Set current time");
@@ -75,8 +76,6 @@   lv_obj_set_style_local_text_color(lblSetTime, LV_LABEL_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_GRAY);
   lv_obj_set_event_cb(btnSetTime, SetTimeEventHandler);
 
   UpdateScreen();
-  lv_obj_set_state(btnSetTime, LV_STATE_DISABLED);
-  lv_obj_set_state(lblSetTime, LV_STATE_DISABLED);
 }
 
 SettingSetTime::~SettingSetTime() {
@@ -91,8 +90,6 @@     } else {
       lv_label_set_text_static(lblampm, "AM");
     }
   }
-  lv_obj_set_state(btnSetTime, LV_STATE_DEFAULT);
-  lv_obj_set_state(lblSetTime, LV_STATE_DEFAULT);
 }
 
 void SettingSetTime::SetTime() {
@@ -107,6 +104,5 @@                              static_cast(hoursValue),
                              static_cast<uint8_t>(minutesValue),
                              0,
                              nrf_rtc_counter_get(portNRF_RTC_REG));
-  lv_obj_set_state(btnSetTime, LV_STATE_DISABLED);
-  lv_obj_set_state(lblSetTime, LV_STATE_DISABLED);
+  settingSetDateTime.Quit();
 }




diff --git a/src/displayapp/screens/settings/SettingSetTime.h b/src/displayapp/screens/settings/SettingSetTime.h
index b61962c1a433cd3548b75cf3335f5d44011d816c..edd89b161f91214a2b6eefa0b3a96500383dea99 100644
--- a/src/displayapp/screens/settings/SettingSetTime.h
+++ b/src/displayapp/screens/settings/SettingSetTime.h
@@ -6,6 +6,8 @@ #include "components/datetime/DateTimeController.h"
 #include "components/settings/Settings.h"
 #include "displayapp/widgets/Counter.h"
 #include "displayapp/screens/Screen.h"
+#include "displayapp/widgets/DotIndicator.h"
+#include "displayapp/screens/settings/SettingSetDateTime.h"
 
 namespace Pinetime {
   namespace Applications {
@@ -14,7 +16,8 @@       class SettingSetTime : public Screen {
       public:
         SettingSetTime(DisplayApp* app,
                        Pinetime::Controllers::DateTime& dateTimeController,
-                       Pinetime::Controllers::Settings& settingsController);
+                       Pinetime::Controllers::Settings& settingsController,
+                       Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime);
         ~SettingSetTime() override;
 
         void SetTime();
@@ -23,6 +26,7 @@
       private:
         Controllers::DateTime& dateTimeController;
         Controllers::Settings& settingsController;
+        Pinetime::Applications::Screens::SettingSetDateTime& settingSetDateTime;
 
         lv_obj_t* lblampm;
         lv_obj_t* btnSetTime;




diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h
index a86db44faaf4bd8e65f8c379a8fdae9fbb8786e1..b88c13b7ad26d8be3507bae3d0f607e792bc52f3 100644
--- a/src/displayapp/screens/settings/Settings.h
+++ b/src/displayapp/screens/settings/Settings.h
@@ -28,7 +28,7 @@
         static constexpr int entriesPerScreen = 4;
 
         // Increment this when more space is needed
-        static constexpr int nScreens = 4;
+        static constexpr int nScreens = 3;
 
         static constexpr std::array<List::Applications, entriesPerScreen * nScreens> entries {{
           {Symbols::sun, "Display", Apps::SettingDisplay},
@@ -37,19 +37,20 @@           {Symbols::clock, "Time format", Apps::SettingTimeFormat},
           {Symbols::home, "Watch face", Apps::SettingWatchFace},
 
           {Symbols::shoe, "Steps", Apps::SettingSteps},
-          {Symbols::clock, "Set date", Apps::SettingSetDate},
-          {Symbols::clock, "Set time", Apps::SettingSetTime},
+          {Symbols::clock, "Date&Time", Apps::SettingSetDateTime},
           {Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
-
           {Symbols::clock, "Chimes", Apps::SettingChimes},
+
           {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold},
           {Symbols::check, "Firmware", Apps::FirmwareValidation},
           {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth},
+          {Symbols::list, "About", Apps::SysInfo},
 
-          {Symbols::list, "About", Apps::SysInfo},
-          {Symbols::none, "None", Apps::None},
-          {Symbols::none, "None", Apps::None},
-          {Symbols::none, "None", Apps::None},
+          // {Symbols::none, "None", Apps::None},
+          // {Symbols::none, "None", Apps::None},
+          // {Symbols::none, "None", Apps::None},
+          // {Symbols::none, "None", Apps::None},
+
         }};
         ScreenList<nScreens> screens;
       };




diff --git a/src/displayapp/widgets/DotIndicator.cpp b/src/displayapp/widgets/DotIndicator.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..209b43bdc3cd842ba4510613d4e98c7880082a17
--- /dev/null
+++ b/src/displayapp/widgets/DotIndicator.cpp
@@ -0,0 +1,28 @@
+#include "displayapp/widgets/DotIndicator.h"
+#include "displayapp/InfiniTimeTheme.h"
+
+using namespace Pinetime::Applications::Widgets;
+
+DotIndicator::DotIndicator(uint8_t nCurrentScreen, uint8_t nScreens) : nCurrentScreen {nCurrentScreen}, nScreens {nScreens} {
+}
+
+void DotIndicator::Create() {
+  lv_obj_t* dotIndicator[nScreens];
+  static constexpr uint8_t dotSize = 12;
+
+  lv_obj_t* container = lv_cont_create(lv_scr_act(), nullptr);
+  lv_cont_set_layout(container, LV_LAYOUT_COLUMN_LEFT);
+  lv_cont_set_fit(container, LV_FIT_TIGHT);
+  lv_obj_set_style_local_pad_inner(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, dotSize);
+  lv_obj_set_style_local_bg_opa(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
+
+  for (int i = 0; i < nScreens; i++) {
+    dotIndicator[i] = lv_obj_create(container, nullptr);
+    lv_obj_set_size(dotIndicator[i], dotSize, dotSize);
+    lv_obj_set_style_local_bg_color(dotIndicator[i], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
+  }
+
+  lv_obj_set_style_local_bg_color(dotIndicator[nCurrentScreen], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
+
+  lv_obj_align(container, nullptr, LV_ALIGN_IN_RIGHT_MID, 0, 0);
+}




diff --git a/src/displayapp/widgets/DotIndicator.h b/src/displayapp/widgets/DotIndicator.h
new file mode 100644
index 0000000000000000000000000000000000000000..49cdca26edf16f16d4329f3465fb56c8daa0837a
--- /dev/null
+++ b/src/displayapp/widgets/DotIndicator.h
@@ -0,0 +1,18 @@
+#pragma once
+#include <lvgl/lvgl.h>
+
+namespace Pinetime {
+  namespace Applications {
+    namespace Widgets {
+      class DotIndicator {
+      public:
+        DotIndicator(uint8_t nCurrentScreen, uint8_t nScreens);
+        void Create();
+
+      private:
+        uint8_t nCurrentScreen;
+        uint8_t nScreens;
+      };
+    }
+  }
+}