summaryrefslogtreecommitdiff
path: root/src/displayapp/screens/settings
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2022-09-11 14:59:49 +0200
committerJean-François Milants <jf@codingfield.com>2022-09-11 14:59:49 +0200
commitada2c09581d2d13acfa5ce9a97671c0ec17863f1 (patch)
tree2f776adc59d0c63e403d2043cb8460e65d6c46fe /src/displayapp/screens/settings
parent18cff286c75f432095db4b188e0f9a8a9e2bd8e8 (diff)
parentc9a5c3fa5c930a5939d3114a6c6b48570d61ca24 (diff)
Merge branch 'develop' into infineat-external-resources
# Conflicts: # src/displayapp/screens/Symbols.h # src/displayapp/screens/settings/SettingWatchFace.cpp # src/displayapp/screens/settings/SettingWatchFace.h
Diffstat (limited to 'src/displayapp/screens/settings')
-rw-r--r--src/displayapp/screens/settings/QuickSettings.cpp76
-rw-r--r--src/displayapp/screens/settings/QuickSettings.h10
-rw-r--r--src/displayapp/screens/settings/SettingChimes.cpp53
-rw-r--r--src/displayapp/screens/settings/SettingChimes.h15
-rw-r--r--src/displayapp/screens/settings/SettingDisplay.cpp6
-rw-r--r--src/displayapp/screens/settings/SettingDisplay.h2
-rw-r--r--src/displayapp/screens/settings/SettingSetDate.cpp203
-rw-r--r--src/displayapp/screens/settings/SettingSetDate.h22
-rw-r--r--src/displayapp/screens/settings/SettingSetTime.cpp190
-rw-r--r--src/displayapp/screens/settings/SettingSetTime.h16
-rw-r--r--src/displayapp/screens/settings/SettingShakeThreshold.cpp4
-rw-r--r--src/displayapp/screens/settings/SettingSteps.cpp1
-rw-r--r--src/displayapp/screens/settings/SettingTimeFormat.h2
-rw-r--r--src/displayapp/screens/settings/SettingWakeUp.cpp8
-rw-r--r--src/displayapp/screens/settings/SettingWatchFace.cpp4
-rw-r--r--src/displayapp/screens/settings/Settings.cpp83
-rw-r--r--src/displayapp/screens/settings/Settings.h41
17 files changed, 265 insertions, 471 deletions
diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp
index 708d5109..b76affc9 100644
--- a/src/displayapp/screens/settings/QuickSettings.cpp
+++ b/src/displayapp/screens/settings/QuickSettings.cpp
@@ -2,19 +2,29 @@
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Symbols.h"
#include "displayapp/screens/BatteryIcon.h"
+#include "components/ble/BleController.h"
+#include "displayapp/InfiniTimeTheme.h"
using namespace Pinetime::Applications::Screens;
namespace {
void ButtonEventHandler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<QuickSettings*>(obj->user_data);
- screen->OnButtonEvent(obj, event);
+ if (event == LV_EVENT_CLICKED) {
+ screen->OnButtonEvent(obj);
+ }
}
void lv_update_task(struct _lv_task_t* task) {
auto* user_data = static_cast<QuickSettings*>(task->user_data);
user_data->UpdateScreen();
}
+
+ enum class ButtonState : lv_state_t {
+ NotificationsOn = LV_STATE_CHECKED,
+ NotificationsOff = LV_STATE_DEFAULT,
+ Sleep = 0x40,
+ };
}
QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
@@ -22,13 +32,16 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
Controllers::DateTime& dateTimeController,
Controllers::BrightnessController& brightness,
Controllers::MotorController& motorController,
- Pinetime::Controllers::Settings& settingsController)
+ Pinetime::Controllers::Settings& settingsController,
+ Controllers::Ble& bleController)
: Screen(app),
- batteryController {batteryController},
dateTimeController {dateTimeController},
brightness {brightness},
motorController {motorController},
- settingsController {settingsController} {
+ settingsController {settingsController},
+ statusIcons(batteryController, bleController) {
+
+ statusIcons.Create();
// This is the distance (padding) between all objects on this screen.
static constexpr uint8_t innerDistance = 10;
@@ -38,9 +51,6 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 0, 0);
- batteryIcon.Create(lv_scr_act());
- lv_obj_align(batteryIcon.GetObject(), nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0);
-
static constexpr uint8_t barHeight = 20 + innerDistance;
static constexpr uint8_t buttonHeight = (LV_VER_RES_MAX - barHeight - innerDistance) / 2;
static constexpr uint8_t buttonWidth = (LV_HOR_RES_MAX - innerDistance) / 2; // wide buttons
@@ -49,7 +59,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
lv_style_init(&btn_style);
lv_style_set_radius(&btn_style, LV_STATE_DEFAULT, buttonHeight / 4);
- lv_style_set_bg_color(&btn_style, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38));
+ lv_style_set_bg_color(&btn_style, LV_STATE_DEFAULT, Colors::bgAlt);
btn1 = lv_btn_create(lv_scr_act(), nullptr);
btn1->user_data = this;
@@ -72,25 +82,29 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
lv_obj_t* lbl_btn;
lbl_btn = lv_label_create(btn2, nullptr);
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::highlight);
+ lv_label_set_text_static(lbl_btn, Symbols::flashlight);
btn3 = lv_btn_create(lv_scr_act(), nullptr);
btn3->user_data = this;
lv_obj_set_event_cb(btn3, ButtonEventHandler);
- lv_btn_set_checkable(btn3, true);
lv_obj_add_style(btn3, LV_BTN_PART_MAIN, &btn_style);
- lv_obj_set_style_local_bg_color(btn3, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_MAKE(0x0, 0xb0, 0x0));
+ lv_obj_set_style_local_bg_color(btn3, LV_BTN_PART_MAIN, static_cast<lv_state_t>(ButtonState::NotificationsOff), LV_COLOR_RED);
+ static constexpr lv_color_t violet = LV_COLOR_MAKE(0x60, 0x00, 0xff);
+ lv_obj_set_style_local_bg_color(btn3, LV_BTN_PART_MAIN, static_cast<lv_state_t>(ButtonState::Sleep), violet);
lv_obj_set_size(btn3, buttonWidth, buttonHeight);
lv_obj_align(btn3, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, buttonXOffset, 0);
btn3_lvl = lv_label_create(btn3, nullptr);
lv_obj_set_style_local_text_font(btn3_lvl, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48);
- if (settingsController.GetNotificationStatus() == Controllers::Settings::Notification::ON) {
- lv_obj_add_state(btn3, LV_STATE_CHECKED);
+ if (settingsController.GetNotificationStatus() == Controllers::Settings::Notification::On) {
lv_label_set_text_static(btn3_lvl, Symbols::notificationsOn);
- } else {
+ lv_obj_set_state(btn3, static_cast<lv_state_t>(ButtonState::NotificationsOn));
+ } else if (settingsController.GetNotificationStatus() == Controllers::Settings::Notification::Off) {
lv_label_set_text_static(btn3_lvl, Symbols::notificationsOff);
+ } else {
+ lv_label_set_text_static(btn3_lvl, Symbols::sleep);
+ lv_obj_set_state(btn3, static_cast<lv_state_t>(ButtonState::Sleep));
}
btn4 = lv_btn_create(lv_scr_act(), nullptr);
@@ -118,34 +132,36 @@ QuickSettings::~QuickSettings() {
void QuickSettings::UpdateScreen() {
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
- batteryIcon.SetBatteryPercentage(batteryController.PercentRemaining());
+ statusIcons.Update();
}
-void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
- if (object == btn2 && event == LV_EVENT_CLICKED) {
-
- running = false;
+void QuickSettings::OnButtonEvent(lv_obj_t* object) {
+ if (object == btn2) {
app->StartApp(Apps::FlashLight, DisplayApp::FullRefreshDirections::Up);
-
- } else if (object == btn1 && event == LV_EVENT_CLICKED) {
+ } else if (object == btn1) {
brightness.Step();
lv_label_set_text_static(btn1_lvl, brightness.GetIcon());
settingsController.SetBrightness(brightness.Level());
- } else if (object == btn3 && event == LV_EVENT_VALUE_CHANGED) {
+ } else if (object == btn3) {
- if (lv_obj_get_state(btn3, LV_BTN_PART_MAIN) & LV_STATE_CHECKED) {
- settingsController.SetNotificationStatus(Controllers::Settings::Notification::ON);
- motorController.RunForDuration(35);
- lv_label_set_text_static(btn3_lvl, Symbols::notificationsOn);
- } else {
- settingsController.SetNotificationStatus(Controllers::Settings::Notification::OFF);
+ if (settingsController.GetNotificationStatus() == Controllers::Settings::Notification::On) {
+ settingsController.SetNotificationStatus(Controllers::Settings::Notification::Off);
lv_label_set_text_static(btn3_lvl, Symbols::notificationsOff);
+ lv_obj_set_state(btn3, static_cast<lv_state_t>(ButtonState::NotificationsOff));
+ } else if (settingsController.GetNotificationStatus() == Controllers::Settings::Notification::Off) {
+ settingsController.SetNotificationStatus(Controllers::Settings::Notification::Sleep);
+ lv_label_set_text_static(btn3_lvl, Symbols::sleep);
+ lv_obj_set_state(btn3, static_cast<lv_state_t>(ButtonState::Sleep));
+ } else {
+ settingsController.SetNotificationStatus(Controllers::Settings::Notification::On);
+ lv_label_set_text_static(btn3_lvl, Symbols::notificationsOn);
+ lv_obj_set_state(btn3, static_cast<lv_state_t>(ButtonState::NotificationsOn));
+ motorController.RunForDuration(35);
}
- } else if (object == btn4 && event == LV_EVENT_CLICKED) {
- running = false;
+ } else if (object == btn4) {
settingsController.SetSettingsMenu(0);
app->StartApp(Apps::Settings, DisplayApp::FullRefreshDirections::Up);
}
diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h
index 40a2a2ef..f555d034 100644
--- a/src/displayapp/screens/settings/QuickSettings.h
+++ b/src/displayapp/screens/settings/QuickSettings.h
@@ -8,7 +8,7 @@
#include "components/motor/MotorController.h"
#include "components/settings/Settings.h"
#include "components/battery/BatteryController.h"
-#include <displayapp/screens/BatteryIcon.h>
+#include "displayapp/widgets/StatusIcons.h"
namespace Pinetime {
@@ -22,16 +22,16 @@ namespace Pinetime {
Controllers::DateTime& dateTimeController,
Controllers::BrightnessController& brightness,
Controllers::MotorController& motorController,
- Pinetime::Controllers::Settings& settingsController);
+ Pinetime::Controllers::Settings& settingsController,
+ Controllers::Ble& bleController);
~QuickSettings() override;
- void OnButtonEvent(lv_obj_t* object, lv_event_t event);
+ void OnButtonEvent(lv_obj_t* object);
void UpdateScreen();
private:
- Pinetime::Controllers::Battery& batteryController;
Controllers::DateTime& dateTimeController;
Controllers::BrightnessController& brightness;
Controllers::MotorController& motorController;
@@ -49,7 +49,7 @@ namespace Pinetime {
lv_obj_t* btn3_lvl;
lv_obj_t* btn4;
- BatteryIcon batteryIcon;
+ Widgets::StatusIcons statusIcons;
};
}
}
diff --git a/src/displayapp/screens/settings/SettingChimes.cpp b/src/displayapp/screens/settings/SettingChimes.cpp
index d53d4da6..7f519f75 100644
--- a/src/displayapp/screens/settings/SettingChimes.cpp
+++ b/src/displayapp/screens/settings/SettingChimes.cpp
@@ -14,6 +14,8 @@ namespace {
}
}
+constexpr std::array<SettingChimes::Option, 3> SettingChimes::options;
+
SettingChimes::SettingChimes(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: Screen(app), settingsController {settingsController} {
@@ -40,37 +42,16 @@ SettingChimes::SettingChimes(Pinetime::Applications::DisplayApp* app, Pinetime::
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
- optionsTotal = 0;
- cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Off");
- cbOption[optionsTotal]->user_data = this;
- lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
- SetRadioButtonStyle(cbOption[optionsTotal]);
- if (settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::None) {
- lv_checkbox_set_checked(cbOption[optionsTotal], true);
- }
-
- optionsTotal++;
- cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Every hour");
- cbOption[optionsTotal]->user_data = this;
- lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
- SetRadioButtonStyle(cbOption[optionsTotal]);
- if (settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::Hours) {
- lv_checkbox_set_checked(cbOption[optionsTotal], true);
- }
-
- optionsTotal++;
- cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Every 30 mins");
- cbOption[optionsTotal]->user_data = this;
- lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
- SetRadioButtonStyle(cbOption[optionsTotal]);
- if (settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::HalfHours) {
- lv_checkbox_set_checked(cbOption[optionsTotal], true);
+ for (unsigned int i = 0; i < options.size(); i++) {
+ cbOption[i] = lv_checkbox_create(container1, nullptr);
+ lv_checkbox_set_text(cbOption[i], options[i].name);
+ if (settingsController.GetChimeOption() == options[i].chimesOption) {
+ lv_checkbox_set_checked(cbOption[i], true);
+ }
+ cbOption[i]->user_data = this;
+ lv_obj_set_event_cb(cbOption[i], event_handler);
+ SetRadioButtonStyle(cbOption[i]);
}
-
- optionsTotal++;
}
SettingChimes::~SettingChimes() {
@@ -80,18 +61,10 @@ SettingChimes::~SettingChimes() {
void SettingChimes::UpdateSelected(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
- for (uint8_t i = 0; i < optionsTotal; i++) {
+ for (uint8_t i = 0; i < options.size(); i++) {
if (object == cbOption[i]) {
lv_checkbox_set_checked(cbOption[i], true);
- if (i == 0) {
- settingsController.SetChimeOption(Controllers::Settings::ChimesOption::None);
- }
- if (i == 1) {
- settingsController.SetChimeOption(Controllers::Settings::ChimesOption::Hours);
- }
- if (i == 2) {
- settingsController.SetChimeOption(Controllers::Settings::ChimesOption::HalfHours);
- }
+ settingsController.SetChimeOption(options[i].chimesOption);
} else {
lv_checkbox_set_checked(cbOption[i], false);
}
diff --git a/src/displayapp/screens/settings/SettingChimes.h b/src/displayapp/screens/settings/SettingChimes.h
index a251e95b..e48432c6 100644
--- a/src/displayapp/screens/settings/SettingChimes.h
+++ b/src/displayapp/screens/settings/SettingChimes.h
@@ -4,6 +4,7 @@
#include <lvgl/lvgl.h>
#include "components/settings/Settings.h"
#include "displayapp/screens/Screen.h"
+#include <array>
namespace Pinetime {
@@ -18,9 +19,19 @@ namespace Pinetime {
void UpdateSelected(lv_obj_t* object, lv_event_t event);
private:
+ struct Option {
+ Controllers::Settings::ChimesOption chimesOption;
+ const char* name;
+ };
+ static constexpr std::array<Option, 3> options = {{
+ {Controllers::Settings::ChimesOption::None, " Off"},
+ {Controllers::Settings::ChimesOption::Hours, " Every hour"},
+ {Controllers::Settings::ChimesOption::HalfHours, " Every 30 mins"}
+ }};
+
+ std::array<lv_obj_t*, options.size()> cbOption;
+
Controllers::Settings& settingsController;
- uint8_t optionsTotal;
- lv_obj_t* cbOption[3];
};
}
}
diff --git a/src/displayapp/screens/settings/SettingDisplay.cpp b/src/displayapp/screens/settings/SettingDisplay.cpp
index bf2087ab..e044a85a 100644
--- a/src/displayapp/screens/settings/SettingDisplay.cpp
+++ b/src/displayapp/screens/settings/SettingDisplay.cpp
@@ -15,7 +15,7 @@ namespace {
}
}
-constexpr std::array<uint16_t, 4> SettingDisplay::options;
+constexpr std::array<uint16_t, 6> SettingDisplay::options;
SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: Screen(app), settingsController {settingsController} {
@@ -30,7 +30,7 @@ SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime
lv_obj_set_pos(container1, 10, 60);
lv_obj_set_width(container1, LV_HOR_RES - 20);
lv_obj_set_height(container1, LV_VER_RES - 50);
- lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
+ lv_cont_set_layout(container1, LV_LAYOUT_PRETTY_TOP);
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(title, "Display timeout");
@@ -46,7 +46,7 @@ SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime
char buffer[12];
for (unsigned int i = 0; i < options.size(); i++) {
cbOption[i] = lv_checkbox_create(container1, nullptr);
- sprintf(buffer, "%3d seconds", options[i] / 1000);
+ sprintf(buffer, "%2ds", options[i] / 1000);
lv_checkbox_set_text(cbOption[i], buffer);
cbOption[i]->user_data = this;
lv_obj_set_event_cb(cbOption[i], event_handler);
diff --git a/src/displayapp/screens/settings/SettingDisplay.h b/src/displayapp/screens/settings/SettingDisplay.h
index dc56419d..eeddaef8 100644
--- a/src/displayapp/screens/settings/SettingDisplay.h
+++ b/src/displayapp/screens/settings/SettingDisplay.h
@@ -20,7 +20,7 @@ namespace Pinetime {
void UpdateSelected(lv_obj_t* object, lv_event_t event);
private:
- static constexpr std::array<uint16_t, 4> options = {5000, 15000, 20000, 30000};
+ static constexpr std::array<uint16_t, 6> options = {5000, 7000, 10000, 15000, 20000, 30000};
Controllers::Settings& settingsController;
lv_obj_t* cbOption[options.size()];
diff --git a/src/displayapp/screens/settings/SettingSetDate.cpp b/src/displayapp/screens/settings/SettingSetDate.cpp
index 7acf0c19..1407a98f 100644
--- a/src/displayapp/screens/settings/SettingSetDate.cpp
+++ b/src/displayapp/screens/settings/SettingSetDate.cpp
@@ -11,13 +11,36 @@ namespace {
constexpr int16_t POS_X_DAY = -72;
constexpr int16_t POS_X_MONTH = 0;
constexpr int16_t POS_X_YEAR = 72;
- constexpr int16_t POS_Y_PLUS = -50;
constexpr int16_t POS_Y_TEXT = -6;
- constexpr int16_t POS_Y_MINUS = 40;
void event_handler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<SettingSetDate*>(obj->user_data);
- screen->HandleButtonPress(obj, event);
+ if (event == LV_EVENT_CLICKED) {
+ screen->HandleButtonPress();
+ }
+ }
+
+ void ValueChangedHandler(void* userData) {
+ auto* screen = static_cast<SettingSetDate*>(userData);
+ screen->CheckDay();
+ }
+
+ int MaximumDayOfMonth(uint8_t month, uint16_t year) {
+ switch (month) {
+ case 2: {
+ if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) {
+ return 29;
+ }
+ return 28;
+ }
+ case 4:
+ case 6:
+ case 9:
+ case 11:
+ return 30;
+ default:
+ return 31;
+ }
}
}
@@ -35,164 +58,54 @@ SettingSetDate::SettingSetDate(Pinetime::Applications::DisplayApp* app, Pinetime
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
- dayValue = static_cast<int>(dateTimeController.Day());
- lblDay = lv_label_create(lv_scr_act(), nullptr);
- lv_label_set_text_fmt(lblDay, "%d", dayValue);
- lv_label_set_align(lblDay, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblDay, lv_scr_act(), LV_ALIGN_CENTER, POS_X_DAY, POS_Y_TEXT);
- lv_obj_set_auto_realign(lblDay, true);
-
- monthValue = static_cast<int>(dateTimeController.Month());
- lblMonth = lv_label_create(lv_scr_act(), nullptr);
- UpdateMonthLabel();
- lv_label_set_align(lblMonth, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblMonth, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MONTH, POS_Y_TEXT);
- lv_obj_set_auto_realign(lblMonth, true);
-
- yearValue = static_cast<int>(dateTimeController.Year());
- if (yearValue < 2021)
- yearValue = 2021;
- lblYear = lv_label_create(lv_scr_act(), nullptr);
- lv_label_set_text_fmt(lblYear, "%d", yearValue);
- lv_label_set_align(lblYear, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblYear, lv_scr_act(), LV_ALIGN_CENTER, POS_X_YEAR, POS_Y_TEXT);
- lv_obj_set_auto_realign(lblYear, true);
-
- btnDayPlus = lv_btn_create(lv_scr_act(), nullptr);
- btnDayPlus->user_data = this;
- lv_obj_set_size(btnDayPlus, 50, 40);
- lv_obj_align(btnDayPlus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_DAY, POS_Y_PLUS);
- lv_obj_set_style_local_value_str(btnDayPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
- lv_obj_set_event_cb(btnDayPlus, event_handler);
-
- btnDayMinus = lv_btn_create(lv_scr_act(), nullptr);
- btnDayMinus->user_data = this;
- lv_obj_set_size(btnDayMinus, 50, 40);
- lv_obj_align(btnDayMinus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_DAY, POS_Y_MINUS);
- lv_obj_set_style_local_value_str(btnDayMinus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "-");
- lv_obj_set_event_cb(btnDayMinus, event_handler);
-
- btnMonthPlus = lv_btn_create(lv_scr_act(), nullptr);
- btnMonthPlus->user_data = this;
- lv_obj_set_size(btnMonthPlus, 50, 40);
- lv_obj_align(btnMonthPlus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MONTH, POS_Y_PLUS);
- lv_obj_set_style_local_value_str(btnMonthPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
- lv_obj_set_event_cb(btnMonthPlus, event_handler);
+ dayCounter.SetValueChangedEventCallback(this, ValueChangedHandler);
+ dayCounter.Create();
+ dayCounter.SetValue(dateTimeController.Day());
+ lv_obj_align(dayCounter.GetObject(), nullptr, LV_ALIGN_CENTER, POS_X_DAY, POS_Y_TEXT);
- btnMonthMinus = lv_btn_create(lv_scr_act(), nullptr);
- btnMonthMinus->user_data = this;
- lv_obj_set_size(btnMonthMinus, 50, 40);
- lv_obj_align(btnMonthMinus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MONTH, POS_Y_MINUS);
- lv_obj_set_style_local_value_str(btnMonthMinus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "-");
- lv_obj_set_event_cb(btnMonthMinus, event_handler);
+ monthCounter.EnableMonthMode();
+ monthCounter.SetValueChangedEventCallback(this, ValueChangedHandler);
+ monthCounter.Create();
+ monthCounter.SetValue(static_cast<int>(dateTimeController.Month()));
+ lv_obj_align(monthCounter.GetObject(), nullptr, LV_ALIGN_CENTER, POS_X_MONTH, POS_Y_TEXT);
- btnYearPlus = lv_btn_create(lv_scr_act(), nullptr);
- btnYearPlus->user_data = this;
- lv_obj_set_size(btnYearPlus, 50, 40);
- lv_obj_align(btnYearPlus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_YEAR, POS_Y_PLUS);
- lv_obj_set_style_local_value_str(btnYearPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
- lv_obj_set_event_cb(btnYearPlus, event_handler);
-
- btnYearMinus = lv_btn_create(lv_scr_act(), nullptr);
- btnYearMinus->user_data = this;
- lv_obj_set_size(btnYearMinus, 50, 40);
- lv_obj_align(btnYearMinus, lv_scr_act(), LV_ALIGN_CENTER, POS_X_YEAR, POS_Y_MINUS);
- lv_obj_set_style_local_value_str(btnYearMinus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "-");
- lv_obj_set_event_cb(btnYearMinus, event_handler);
+ yearCounter.SetValueChangedEventCallback(this, ValueChangedHandler);
+ yearCounter.Create();
+ yearCounter.SetValue(dateTimeController.Year());
+ lv_obj_align(yearCounter.GetObject(), nullptr, LV_ALIGN_CENTER, POS_X_YEAR, POS_Y_TEXT);
btnSetTime = lv_btn_create(lv_scr_act(), nullptr);
btnSetTime->user_data = this;
lv_obj_set_size(btnSetTime, 120, 48);
lv_obj_align(btnSetTime, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+ lv_obj_set_style_local_bg_color(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38));
lv_obj_set_style_local_value_str(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Set");
lv_obj_set_event_cb(btnSetTime, event_handler);
+ lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
}
SettingSetDate::~SettingSetDate() {
lv_obj_clean(lv_scr_act());
}
-void SettingSetDate::HandleButtonPress(lv_obj_t* object, lv_event_t event) {
- if (event != LV_EVENT_CLICKED)
- return;
-
- if (object == btnDayPlus) {
- dayValue++;
- if (dayValue > MaximumDayOfMonth())
- dayValue = 1;
- lv_label_set_text_fmt(lblDay, "%d", dayValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnDayMinus) {
- dayValue--;
- if (dayValue < 1)
- dayValue = MaximumDayOfMonth();
- lv_label_set_text_fmt(lblDay, "%d", dayValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnMonthPlus) {
- monthValue++;
- if (monthValue > 12)
- monthValue = 1;
- UpdateMonthLabel();
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- CheckDay();
- } else if (object == btnMonthMinus) {
- monthValue--;
- if (monthValue < 1)
- monthValue = 12;
- UpdateMonthLabel();
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- CheckDay();
- } else if (object == btnYearPlus) {
- yearValue++;
- lv_label_set_text_fmt(lblYear, "%d", yearValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- CheckDay();
- } else if (object == btnYearMinus) {
- yearValue--;
- lv_label_set_text_fmt(lblYear, "%d", yearValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- CheckDay();
- } else if (object == btnSetTime) {
- NRF_LOG_INFO("Setting date (manually) to %04d-%02d-%02d", yearValue, monthValue, dayValue);
- dateTimeController.SetTime(static_cast<uint16_t>(yearValue),
- static_cast<uint8_t>(monthValue),
- static_cast<uint8_t>(dayValue),
- 0,
- dateTimeController.Hours(),
- dateTimeController.Minutes(),
- dateTimeController.Seconds(),
- nrf_rtc_counter_get(portNRF_RTC_REG));
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
- }
-}
-
-int SettingSetDate::MaximumDayOfMonth() const {
- switch (monthValue) {
- case 2:
- if ((((yearValue % 4) == 0) && ((yearValue % 100) != 0)) || ((yearValue % 400) == 0))
- return 29;
- return 28;
- case 4:
- case 6:
- case 9:
- case 11:
- return 30;
- default:
- return 31;
- }
+void SettingSetDate::HandleButtonPress() {
+ const uint16_t yearValue = yearCounter.GetValue();
+ const uint8_t monthValue = monthCounter.GetValue();
+ const uint8_t dayValue = dayCounter.GetValue();
+ NRF_LOG_INFO("Setting date (manually) to %04d-%02d-%02d", yearValue, monthValue, dayValue);
+ dateTimeController.SetTime(yearValue,
+ monthValue,
+ dayValue,
+ 0,
+ dateTimeController.Hours(),
+ dateTimeController.Minutes(),
+ dateTimeController.Seconds(),
+ nrf_rtc_counter_get(portNRF_RTC_REG));
+ lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
}
void SettingSetDate::CheckDay() {
- int maxDay = MaximumDayOfMonth();
- if (dayValue > maxDay) {
- dayValue = maxDay;
- lv_label_set_text_fmt(lblDay, "%d", dayValue);
- lv_obj_align(lblDay, lv_scr_act(), LV_ALIGN_CENTER, POS_X_DAY, POS_Y_TEXT);
- }
-}
-
-void SettingSetDate::UpdateMonthLabel() {
- lv_label_set_text_static(
- lblMonth,
- Pinetime::Controllers::DateTime::MonthShortToStringLow(static_cast<Pinetime::Controllers::DateTime::Months>(monthValue)));
+ const int maxDay = MaximumDayOfMonth(monthCounter.GetValue(), yearCounter.GetValue());
+ dayCounter.SetMax(maxDay);
+ lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
}
diff --git a/src/displayapp/screens/settings/SettingSetDate.h b/src/displayapp/screens/settings/SettingSetDate.h
index a1795942..af0d654e 100644
--- a/src/displayapp/screens/settings/SettingSetDate.h
+++ b/src/displayapp/screens/settings/SettingSetDate.h
@@ -4,6 +4,7 @@
#include <lvgl/lvgl.h>
#include "components/datetime/DateTimeController.h"
#include "displayapp/screens/Screen.h"
+#include "displayapp/widgets/Counter.h"
namespace Pinetime {
namespace Applications {
@@ -13,28 +14,17 @@ namespace Pinetime {
SettingSetDate(DisplayApp* app, Pinetime::Controllers::DateTime& dateTimeController);
~SettingSetDate() override;
- void HandleButtonPress(lv_obj_t* object, lv_event_t event);
+ void HandleButtonPress();
+ void CheckDay();
private:
Controllers::DateTime& dateTimeController;
- int dayValue;
- int monthValue;
- int yearValue;
- lv_obj_t* lblDay;
- lv_obj_t* lblMonth;
- lv_obj_t* lblYear;
- lv_obj_t* btnDayPlus;
- lv_obj_t* btnDayMinus;
- lv_obj_t* btnMonthPlus;
- lv_obj_t* btnMonthMinus;
- lv_obj_t* btnYearPlus;
- lv_obj_t* btnYearMinus;
lv_obj_t* btnSetTime;
- int MaximumDayOfMonth() const;
- void CheckDay();
- void UpdateMonthLabel();
+ Widgets::Counter dayCounter = Widgets::Counter(1, 31, jetbrains_mono_bold_20);
+ Widgets::Counter monthCounter = Widgets::Counter(1, 12, jetbrains_mono_bold_20);
+ Widgets::Counter yearCounter = Widgets::Counter(1970, 9999, jetbrains_mono_bold_20);
};
}
}
diff --git a/src/displayapp/screens/settings/SettingSetTime.cpp b/src/displayapp/screens/settings/SettingSetTime.cpp
index 037611f3..47b786e4 100644
--- a/src/displayapp/screens/settings/SettingSetTime.cpp
+++ b/src/displayapp/screens/settings/SettingSetTime.cpp
@@ -5,21 +5,22 @@
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Symbols.h"
#include "components/settings/Settings.h"
+#include "displayapp/InfiniTimeTheme.h"
using namespace Pinetime::Applications::Screens;
namespace {
- constexpr int16_t POS_X_HOURS = -72;
- constexpr int16_t POS_X_MINUTES = 0;
- constexpr int16_t POS_X_SECONDS = 72;
- constexpr int16_t POS_Y_PLUS = -50;
- constexpr int16_t POS_Y_TEXT = -6;
- constexpr int16_t POS_Y_MINUS = 40;
- constexpr int16_t OFS_Y_COLON = -2;
+ constexpr int16_t POS_Y_TEXT = -7;
- void event_handler(lv_obj_t* obj, lv_event_t event) {
+ void SetTimeEventHandler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<SettingSetTime*>(obj->user_data);
- screen->HandleButtonPress(obj, event);
+ if (event == LV_EVENT_CLICKED) {
+ screen->SetTime();
+ }
+ }
+ void ValueChangedHandler(void* userData) {
+ auto* screen = static_cast<SettingSetTime*>(userData);
+ screen->UpdateScreen();
}
}
@@ -27,6 +28,7 @@ SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp* app,
Pinetime::Controllers::DateTime& dateTimeController,
Pinetime::Controllers::Settings& settingsController)
: Screen(app), dateTimeController {dateTimeController}, settingsController {settingsController} {
+
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(title, "Set current time");
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
@@ -34,160 +36,72 @@ SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp* app,
lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
-
lv_label_set_text_static(icon, Symbols::clock);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
- hoursValue = static_cast<int>(dateTimeController.Hours());
- lblHours = lv_label_create(lv_scr_act(), nullptr);
- lv_obj_set_style_local_text_font(lblHours, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
- lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
- lv_label_set_align(lblHours, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblHours, lv_scr_act(), LV_ALIGN_CENTER, POS_X_HOURS, POS_Y_TEXT);
- lv_obj_set_auto_realign(lblHours, true);
-
- lv_obj_t* lblColon1 = lv_label_create(lv_scr_act(), nullptr);
- lv_obj_set_style_local_text_font(lblColon1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
- lv_label_set_text_static(lblColon1, ":");
- lv_label_set_align(lblColon1, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblColon1, lv_scr_act(), LV_ALIGN_CENTER, (POS_X_HOURS + POS_X_MINUTES) / 2, POS_Y_TEXT + OFS_Y_COLON);
+ lv_obj_t* staticLabel = lv_label_create(lv_scr_act(), nullptr);
+ lv_obj_set_style_local_text_font(staticLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
+ lv_label_set_text_static(staticLabel, "00:00:00");
+ lv_obj_align(staticLabel, lv_scr_act(), LV_ALIGN_CENTER, 0, POS_Y_TEXT);
- minutesValue = static_cast<int>(dateTimeController.Minutes());
- lblMinutes = lv_label_create(lv_scr_act(), nullptr);
- lv_obj_set_style_local_text_font(lblMinutes, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
- lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
- lv_label_set_align(lblMinutes, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblMinutes, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MINUTES, POS_Y_TEXT);
- lv_obj_set_auto_realign(lblMinutes, true);
-
- lv_obj_t* lblColon2 = lv_label_create(lv_scr_act(), nullptr);
- lv_obj_set_style_local_text_font(lblColon2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
- lv_label_set_text_static(lblColon2, ":");
- lv_label_set_align(lblColon2, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblColon2, lv_scr_act(), LV_ALIGN_CENTER, (POS_X_MINUTES + POS_X_SECONDS) / 2, POS_Y_TEXT + OFS_Y_COLON);
+ hourCounter.Create();
+ if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
+ hourCounter.EnableTwelveHourMode();
+ }
+ hourCounter.SetValue(dateTimeController.Hours());
+ lv_obj_align(hourCounter.GetObject(), nullptr, LV_ALIGN_CENTER, -75, POS_Y_TEXT);
+ hourCounter.SetValueChangedEventCallback(this, ValueChangedHandler);
- lv_obj_t* lblSeconds = lv_label_create(lv_scr_act(), nullptr);
- lv_obj_set_style_local_text_font(lblSeconds, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
- lv_label_set_text_static(lblSeconds, "00");
- lv_label_set_align(lblSeconds, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblSeconds, lv_scr_act(), LV_ALIGN_CENTER, POS_X_SECONDS, POS_Y_TEXT);
+ minuteCounter.Create();
+ minuteCounter.SetValue(dateTimeController.Minutes());
+ lv_obj_align(minuteCounter.GetObject(), nullptr, LV_ALIGN_CENTER, 0, POS_Y_TEXT);
+ minuteCounter.SetValueChangedEventCallback(this, ValueChangedHandler);
lblampm = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
lv_label_set_text_static(lblampm, " ");
- lv_label_set_align(lblampm, LV_LABEL_ALIGN_CENTER);
- lv_obj_align(lblampm, lv_scr_act(), LV_ALIGN_CENTER, POS_X_SECONDS, POS_Y_PLUS);
-
- btnHoursPlus = lv_btn_create(lv_scr_act(), nullptr);
- btnHoursPlus->user_data = this;
- lv_obj_set_size(btnHoursPlus, 50, 40);
- lv_obj_align(btnHoursPlus, lv_scr_act(), LV_ALIGN_CENTER, -72, -50);
- lv_obj_set_style_local_value_str(btnHoursPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
- lv_obj_set_event_cb(btnHoursPlus, event_handler);
-
- btnHoursMinus = lv_btn_create(lv_scr_act(), nullptr);
- btnHoursMinus->user_data = this;
- lv_obj_set_size(btnHoursMinus, 50, 40);
- lv_obj_align(btnHoursMinus, lv_scr_act(), LV_ALIGN_CENTER, -72, 40);
- lv_obj_set_style_local_value_str(btnHoursMinus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "-");
- lv_obj_set_event_cb(btnHoursMinus, event_handler);
-
- btnMinutesPlus = lv_btn_create(lv_scr_act(), nullptr);
- btnMinutesPlus->user_data = this;
- lv_obj_set_size(btnMinutesPlus, 50, 40);
- lv_obj_align(btnMinutesPlus, lv_scr_act(), LV_ALIGN_CENTER, 0, -50);
- lv_obj_set_style_local_value_str(btnMinutesPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
- lv_obj_set_event_cb(btnMinutesPlus, event_handler);
-
- btnMinutesMinus = lv_btn_create(lv_scr_act(), nullptr);
- btnMinutesMinus->user_data = this;
- lv_obj_set_size(btnMinutesMinus, 50, 40);
- lv_obj_align(btnMinutesMinus, lv_scr_act(), LV_ALIGN_CENTER, 0, 40);
- lv_obj_set_style_local_value_str(btnMinutesMinus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "-");
- lv_obj_set_event_cb(btnMinutesMinus, event_handler);
+ lv_obj_align(lblampm, lv_scr_act(), LV_ALIGN_CENTER, 75, -50);
btnSetTime = lv_btn_create(lv_scr_act(), nullptr);
btnSetTime->user_data = this;
- lv_obj_set_size(btnSetTime, 120, 48);
+ lv_obj_set_size(btnSetTime, 120, 50);
lv_obj_align(btnSetTime, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
lv_obj_set_style_local_value_str(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Set");
- lv_obj_set_event_cb(btnSetTime, event_handler);
+ lv_obj_set_style_local_bg_color(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Colors::bgAlt);
+ lv_obj_set_style_local_value_color(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_GRAY);
+ lv_obj_set_event_cb(btnSetTime, SetTimeEventHandler);
- SetHourLabels();
+ UpdateScreen();
+ lv_obj_set_state(btnSetTime, LV_STATE_DISABLED);
}
SettingSetTime::~SettingSetTime() {
lv_obj_clean(lv_scr_act());
}
-void SettingSetTime::SetHourLabels() {
+void SettingSetTime::UpdateScreen() {
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
- switch (hoursValue) {
- case 0:
- lv_label_set_text_static(lblHours, "12");
- lv_label_set_text_static(lblampm, "AM");
- break;
- case 1 ... 11:
- lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
- lv_label_set_text_static(lblampm, "AM");
- break;
- case 12:
- lv_label_set_text_static(lblHours, "12");
- lv_label_set_text_static(lblampm, "PM");
- break;
- case 13 ... 23:
- lv_label_set_text_fmt(lblHours, "%02d", hoursValue - 12);
- lv_label_set_text_static(lblampm, "PM");
- break;
+ if (hourCounter.GetValue() >= 12) {
+ lv_label_set_text_static(lblampm, "PM");
+ } else {
+ lv_label_set_text_static(lblampm, "AM");
}
- } else {
- lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
}
+ lv_obj_set_state(btnSetTime, LV_STATE_DEFAULT);
}
-void SettingSetTime::HandleButtonPress(lv_obj_t* object, lv_event_t event) {
- if (event != LV_EVENT_CLICKED)
- return;
-
- if (object == btnHoursPlus) {
- hoursValue++;
- if (hoursValue > 23) {
- hoursValue = 0;
- }
- SetHourLabels();
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnHoursMinus) {
- hoursValue--;
- if (hoursValue < 0) {
- hoursValue = 23;
- }
- SetHourLabels();
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnMinutesPlus) {
- minutesValue++;
- if (minutesValue > 59) {
- minutesValue = 0;
- }
- lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnMinutesMinus) {
- minutesValue--;
- if (minutesValue < 0) {
- minutesValue = 59;
- }
- lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
- } else if (object == btnSetTime) {
- NRF_LOG_INFO("Setting time (manually) to %02d:%02d:00", hoursValue, minutesValue);
- dateTimeController.SetTime(dateTimeController.Year(),
- static_cast<uint8_t>(dateTimeController.Month()),
- dateTimeController.Day(),
- static_cast<uint8_t>(dateTimeController.DayOfWeek()),
- static_cast<uint8_t>(hoursValue),
- static_cast<uint8_t>(minutesValue),
- 0,
- nrf_rtc_counter_get(portNRF_RTC_REG));
- lv_btn_set_state(btnSetTime, LV_BTN_STATE_DISABLED);
- }
+void SettingSetTime::SetTime() {
+ const int hoursValue = hourCounter.GetValue();
+ const int minutesValue = minuteCounter.GetValue();
+ NRF_LOG_INFO("Setting time (manually) to %02d:%02d:00", hoursValue, minutesValue);
+ dateTimeController.SetTime(dateTimeController.Year(),
+ static_cast<uint8_t>(dateTimeController.Month()),
+ dateTimeController.Day(),
+ static_cast<uint8_t>(dateTimeController.DayOfWeek()),
+ static_cast<uint8_t>(hoursValue),
+ static_cast<uint8_t>(minutesValue),
+ 0,
+ nrf_rtc_counter_get(portNRF_RTC_REG));
+ lv_obj_set_state(btnSetTime, LV_STATE_DISABLED);
}
diff --git a/src/displayapp/screens/settings/SettingSetTime.h b/src/displayapp/screens/settings/SettingSetTime.h
index d02c332e..e0b42bdd 100644
--- a/src/displayapp/screens/settings/SettingSetTime.h
+++ b/src/displayapp/screens/settings/SettingSetTime.h
@@ -4,6 +4,7 @@
#include <lvgl/lvgl.h>
#include "components/datetime/DateTimeController.h"
#include "components/settings/Settings.h"
+#include "displayapp/widgets/Counter.h"
#include "displayapp/screens/Screen.h"
namespace Pinetime {
@@ -16,24 +17,17 @@ namespace Pinetime {
Pinetime::Controllers::Settings& settingsController);
~SettingSetTime() override;
- void HandleButtonPress(lv_obj_t* object, lv_event_t event);
+ void SetTime();
+ void UpdateScreen();
private:
Controllers::DateTime& dateTimeController;
Controllers::Settings& settingsController;
- void SetHourLabels();
-
- int hoursValue;
- int minutesValue;
- lv_obj_t* lblHours;
- lv_obj_t* lblMinutes;
lv_obj_t* lblampm;
- lv_obj_t* btnHoursPlus;
- lv_obj_t* btnHoursMinus;
- lv_obj_t* btnMinutesPlus;
- lv_obj_t* btnMinutesMinus;
lv_obj_t* btnSetTime;
+ Widgets::Counter hourCounter = Widgets::Counter(0, 23, jetbrains_mono_42);
+ Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_42);
};
}
}
diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp
index aac1eaff..de46f7de 100644
--- a/src/displayapp/screens/settings/SettingShakeThreshold.cpp
+++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp
@@ -3,6 +3,7 @@
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"
+#include "displayapp/InfiniTimeTheme.h"
using namespace Pinetime::Applications::Screens;
@@ -123,8 +124,7 @@ void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) {
vCalTime = xTaskGetTickCount();
lv_label_set_text_static(calLabel, "Ready!");
lv_obj_set_click(positionArc, false);
- lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_MAKE(0x0, 0xb0, 0x0));
- lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_MAKE(0x0, 0xb0, 0x0));
+ lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, Colors::highlight);
} else if (lv_btn_get_state(calButton) == LV_BTN_STATE_RELEASED) {
calibrating = 0;
lv_obj_set_click(positionArc, true);
diff --git a/src/displayapp/screens/settings/SettingSteps.cpp b/src/displayapp/screens/settings/SettingSteps.cpp
index e92600c2..af5bd6e9 100644
--- a/src/displayapp/screens/settings/SettingSteps.cpp
+++ b/src/displayapp/screens/settings/SettingSteps.cpp
@@ -17,7 +17,6 @@ SettingSteps::SettingSteps(Pinetime::Applications::DisplayApp* app, Pinetime::Co
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr);
- // lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111));
lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10);
lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
diff --git a/src/displayapp/screens/settings/SettingTimeFormat.h b/src/displayapp/screens/settings/SettingTimeFormat.h
index 818edf0c..01ca2c9b 100644
--- a/src/displayapp/screens/settings/SettingTimeFormat.h
+++ b/src/displayapp/screens/settings/SettingTimeFormat.h
@@ -20,7 +20,7 @@ namespace Pinetime {
void UpdateSelected(lv_obj_t* object, lv_event_t event);
private:
- static constexpr std::array<const char*, 2> options = {" 12-hour", " 24-hour"};
+ static constexpr std::array<const char*, 2> options = {"12-hour", "24-hour"};
Controllers::Settings& settingsController;
lv_obj_t* cbOption[options.size()];
};
diff --git a/src/displayapp/screens/settings/SettingWakeUp.cpp b/src/displayapp/screens/settings/SettingWakeUp.cpp
index 4a4b60f8..59275e2f 100644
--- a/src/displayapp/screens/settings/SettingWakeUp.cpp
+++ b/src/displayapp/screens/settings/SettingWakeUp.cpp
@@ -42,7 +42,7 @@ SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::
optionsTotal = 0;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Single Tap");
+ lv_checkbox_set_text_static(cbOption[optionsTotal], "Single Tap");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)) {
@@ -50,7 +50,7 @@ SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::
}
optionsTotal++;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Double Tap");
+ lv_checkbox_set_text_static(cbOption[optionsTotal], "Double Tap");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@@ -58,7 +58,7 @@ SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::
}
optionsTotal++;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Raise Wrist");
+ lv_checkbox_set_text_static(cbOption[optionsTotal], "Raise Wrist");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist)) {
@@ -66,7 +66,7 @@ SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::
}
optionsTotal++;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text_static(cbOption[optionsTotal], " Shake Wake");
+ lv_checkbox_set_text_static(cbOption[optionsTotal], "Shake Wake");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) {
diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp
index 8cbbcf7b..788dd8e8 100644
--- a/src/displayapp/screens/settings/SettingWatchFace.cpp
+++ b/src/displayapp/screens/settings/SettingWatchFace.cpp
@@ -38,7 +38,7 @@ bool SettingWatchFace::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
}
std::unique_ptr<Screen> SettingWatchFace::CreateScreen1() {
- std::array<const char*, 4> watchfaces {" Digital face", " Analog face", " PineTimeStyle", " Terminal"};
+ std::array<const char*, 4> watchfaces {"Digital face", "Analog face", "PineTimeStyle", "Terminal"};
return std::make_unique<Screens::CheckboxList>(0, 2, app, settingsController, title,
symbol, &Controllers::Settings::SetClockFace,
&Controllers::Settings::GetClockFace,
@@ -46,7 +46,7 @@ std::unique_ptr<Screen> SettingWatchFace::CreateScreen1() {
}
std::unique_ptr<Screen> SettingWatchFace::CreateScreen2() {
- std::array<const char*, 4> watchfaces {" Infineat face", "", "", ""};
+ std::array<const char*, 4> watchfaces {"Infineat face", "", "", ""};
return std::make_unique<Screens::CheckboxList>(1, 2, app, settingsController, title,
symbol, &Controllers::Settings::SetClockFace,
&Controllers::Settings::GetClockFace,
diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp
index a91b8f77..ffa01d18 100644
--- a/src/displayapp/screens/settings/Settings.cpp
+++ b/src/displayapp/screens/settings/Settings.cpp
@@ -1,33 +1,27 @@
#include "displayapp/screens/settings/Settings.h"
#include <lvgl/lvgl.h>
-#include <array>
-#include "displayapp/screens/List.h"
+#include <functional>
#include "displayapp/Apps.h"
#include "displayapp/DisplayApp.h"
-#include "displayapp/screens/Symbols.h"
using namespace Pinetime::Applications::Screens;
+constexpr std::array<List::Applications, Settings::entries.size()> Settings::entries;
+
+auto Settings::CreateScreenList() const {
+ std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
+ for (size_t i = 0; i < screens.size(); i++) {
+ screens[i] = [this, i]() -> std::unique_ptr<Screen> {
+ return CreateScreen(i);
+ };
+ }
+ return screens;
+}
+
Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: Screen(app),
settingsController {settingsController},
- screens {app,
- settingsController.GetSettingsMenu(),
- {
- [this]() -> std::unique_ptr<Screen> {
- return CreateScreen1();
- },
- [this]() -> std::unique_ptr<Screen> {
- return CreateScreen2();
- },
- [this]() -> std::unique_ptr<Screen> {
- return CreateScreen3();
- },
- [this]() -> std::unique_ptr<Screen> {
- return CreateScreen4();
- },
- },
- Screens::ScreenListModes::UpDown} {
+ screens {app, settingsController.GetSettingsMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} {
}
Settings::~Settings() {
@@ -38,48 +32,11 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
return screens.OnTouchEvent(event);
}
-std::unique_ptr<Screen> Settings::CreateScreen1() {
- std::array<Screens::List::Applications, 4> applications {{
- {Symbols::sun, "Display", Apps::SettingDisplay},
- {Symbols::eye, "Wake Up", Apps::SettingWakeUp},
- {Symbols::clock, "Time format", Apps::SettingTimeFormat},
- {Symbols::home, "Watch face", Apps::SettingWatchFace},
- }};
-
- return std::make_unique<Screens::List>(0, 4, app, settingsController, applications);
-}
-
-std::unique_ptr<Screen> Settings::CreateScreen2() {
- std::array<Screens::List::Applications, 4> applications {{
- {Symbols::shoe, "Steps", Apps::SettingSteps},
- {Symbols::clock, "Set date", Apps::SettingSetDate},
- {Symbols::clock, "Set time", Apps::SettingSetTime},
- {Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
- }};
-
- return std::make_unique<Screens::List>(1, 4, app, settingsController, applications);
-}
-
-std::unique_ptr<Screen> Settings::CreateScreen3() {
-
- std::array<Screens::List::Applications, 4> applications {{
- {Symbols::clock, "Chimes", Apps::SettingChimes},
- {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold},
- {Symbols::check, "Firmware", Apps::FirmwareValidation},
- {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth},
- }};
-
- return std::make_unique<Screens::List>(2, 4, app, settingsController, applications);
-}
-
-std::unique_ptr<Screen> Settings::CreateScreen4() {
-
- std::array<Screens::List::Applications, 4> applications {{
- {Symbols::list, "About", Apps::SysInfo},
- {Symbols::none, "None", Apps::None},
- {Symbols::none, "None", Apps::None},
- {Symbols::none, "None", Apps::None},
- }};
+std::unique_ptr<Screen> Settings::CreateScreen(unsigned int screenNum) const {
+ std::array<List::Applications, entriesPerScreen> screens;
+ for (int i = 0; i < entriesPerScreen; i++) {
+ screens[i] = entries[screenNum * entriesPerScreen + i];
+ }
- return std::make_unique<Screens::List>(3, 4, app, settingsController, applications);
+ return std::make_unique<Screens::List>(screenNum, nScreens, app, settingsController, screens);
}
diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h
index be090075..a86db44f 100644
--- a/src/displayapp/screens/settings/Settings.h
+++ b/src/displayapp/screens/settings/Settings.h
@@ -1,8 +1,11 @@
#pragma once
-#include <cstdint>
+#include <array>
+#include <memory>
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/ScreenList.h"
+#include "displayapp/screens/Symbols.h"
+#include "displayapp/screens/List.h"
namespace Pinetime {
@@ -17,14 +20,38 @@ namespace Pinetime {
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
private:
- Controllers::Settings& settingsController;
+ auto CreateScreenList() const;
+ std::unique_ptr<Screen> CreateScreen(unsigned int screenNum) const;
- ScreenList<4> screens;
+ Controllers::Settings& settingsController;
- std::unique_ptr<Screen> CreateScreen1();
- std::unique_ptr<Screen> CreateScreen2();
- std::unique_ptr<Screen> CreateScreen3();
- std::unique_ptr<Screen> CreateScreen4();
+ static constexpr int entriesPerScreen = 4;
+
+ // Increment this when more space is needed
+ static constexpr int nScreens = 4;
+
+ static constexpr std::array<List::Applications, entriesPerScreen * nScreens> entries {{
+ {Symbols::sun, "Display", Apps::SettingDisplay},
+ {Symbols::eye, "Wake Up", Apps::SettingWakeUp},
+ {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::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::none, "None", Apps::None},
+ {Symbols::none, "None", Apps::None},
+ {Symbols::none, "None", Apps::None},
+ }};
+ ScreenList<nScreens> screens;
};
}
}