summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Bini <michele.bini@gmail.com>2022-06-03 10:23:25 (GMT)
committerMichele Bini <michele.bini@gmail.com>2022-06-07 03:20:51 (GMT)
commit8b322a66a7dc9572a9a2e13b615fdd60b054f8e9 (patch)
tree3df311293ae455428b74daa35c99eabfb92714a1
parent984316be128d98aa042a7a5f96aa30cc2637b3e5 (diff)
Preallocate blocks for tiled multi-screen menus (requires C++17)
-rw-r--r--src/displayapp/screens/ApplicationList.cpp8
-rw-r--r--src/displayapp/screens/ApplicationList.h56
-rw-r--r--src/displayapp/screens/List.cpp2
-rw-r--r--src/displayapp/screens/List.h2
-rw-r--r--src/displayapp/screens/Tile.cpp2
-rw-r--r--src/displayapp/screens/Tile.h2
-rw-r--r--src/displayapp/screens/settings/Settings.cpp9
-rw-r--r--src/displayapp/screens/settings/Settings.h58
8 files changed, 75 insertions, 64 deletions
diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp
index 5284433..0de5b54 100644
--- a/src/displayapp/screens/ApplicationList.cpp
+++ b/src/displayapp/screens/ApplicationList.cpp
@@ -6,7 +6,6 @@
using namespace Pinetime::Applications::Screens;
-constexpr std::array<Tile::Applications, ApplicationList::applications.size()> ApplicationList::applications;
auto ApplicationList::CreateScreenList() const {
std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
@@ -38,11 +37,6 @@ bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
}
std::unique_ptr<Screen> ApplicationList::CreateScreen(unsigned int screenNum) const {
- std::array<Tile::Applications, appsPerScreen> apps;
- for (int i = 0; i < appsPerScreen; i++) {
- apps[i] = applications[screenNum * appsPerScreen + i];
- }
-
- return std::make_unique<Screens::Tile>(screenNum, nScreens, app, settingsController, batteryController, dateTimeController, apps);
+ return std::make_unique<Screens::Tile>(screenNum, nScreens, app, settingsController, batteryController, dateTimeController, applications[screenNum]);
}
diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h
index dfd9119..d2ede1b 100644
--- a/src/displayapp/screens/ApplicationList.h
+++ b/src/displayapp/screens/ApplicationList.h
@@ -31,29 +31,39 @@ namespace Pinetime {
Controllers::DateTime& dateTimeController;
static constexpr int appsPerScreen = 6;
- static constexpr std::array<Tile::Applications, appsPerScreen * 3> applications {{
- {Symbols::stopWatch, Apps::StopWatch},
- {Symbols::clock, Apps::Alarm},
- {Symbols::hourGlass, Apps::Timer},
- {Symbols::shoe, Apps::Steps},
- {Symbols::heartBeat, Apps::HeartRate},
- {Symbols::music, Apps::Music},
-
- {Symbols::paintbrush, Apps::Paint},
- {Symbols::paddle, Apps::Paddle},
- {"2", Apps::Twos},
- {Symbols::chartLine, Apps::Motion},
- {Symbols::drum, Apps::Metronome},
- {Symbols::map, Apps::Navigation},
-
- {Symbols::drum, Apps::Jumpscore},
- {Symbols::none, Apps::None},
- {Symbols::none, Apps::None},
- {Symbols::none, Apps::None},
- {Symbols::none, Apps::None},
- {Symbols::none, Apps::None},
- }};
- static constexpr int nScreens = (applications.size() + appsPerScreen - 1) / appsPerScreen;
+ static constexpr auto applications{[]() constexpr{
+ constexpr Tile::Applications list[] = {
+ {Symbols::stopWatch, Apps::StopWatch},
+ {Symbols::clock, Apps::Alarm},
+ {Symbols::hourGlass, Apps::Timer},
+ {Symbols::shoe, Apps::Steps},
+ {Symbols::heartBeat, Apps::HeartRate},
+ {Symbols::music, Apps::Music},
+
+ {Symbols::paintbrush, Apps::Paint},
+ {Symbols::paddle, Apps::Paddle},
+ {"2", Apps::Twos},
+ {Symbols::chartLine, Apps::Motion},
+ {Symbols::drum, Apps::Metronome},
+ {Symbols::map, Apps::Navigation},
+
+ {Symbols::drum, Apps::Jumpscore},
+ };
+ std::array<std::array<Tile::Applications, appsPerScreen>, ((std::size(list) + appsPerScreen - 1) / appsPerScreen)> r{};;
+ int idx = 0;
+ for (auto& f : r) {
+ for (auto& e : f) {
+ if (idx < std::size(list)) {
+ e = list[idx];
+ } else {
+ e = { Symbols::none, Apps::None };
+ }
+ idx++;
+ }
+ }
+ return r;
+ }()};
+ static constexpr auto nScreens = std::size(applications);
ScreenList<nScreens> screens;
};
}
diff --git a/src/displayapp/screens/List.cpp b/src/displayapp/screens/List.cpp
index 0bc7da8..333605f 100644
--- a/src/displayapp/screens/List.cpp
+++ b/src/displayapp/screens/List.cpp
@@ -15,7 +15,7 @@ List::List(uint8_t screenID,
uint8_t numScreens,
DisplayApp* app,
Controllers::Settings& settingsController,
- std::array<Applications, MAXLISTITEMS>& applications)
+ const std::array<Applications, MAXLISTITEMS>& applications)
: Screen(app), settingsController {settingsController} {
// Set the background to Black
diff --git a/src/displayapp/screens/List.h b/src/displayapp/screens/List.h
index 88ef28e..d3f10a5 100644
--- a/src/displayapp/screens/List.h
+++ b/src/displayapp/screens/List.h
@@ -24,7 +24,7 @@ namespace Pinetime {
uint8_t numScreens,
DisplayApp* app,
Controllers::Settings& settingsController,
- std::array<Applications, MAXLISTITEMS>& applications);
+ const std::array<Applications, MAXLISTITEMS>& applications);
~List() override;
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp
index cce1d2e..eb07f2b 100644
--- a/src/displayapp/screens/Tile.cpp
+++ b/src/displayapp/screens/Tile.cpp
@@ -28,7 +28,7 @@ Tile::Tile(uint8_t screenID,
Controllers::Settings& settingsController,
Pinetime::Controllers::Battery& batteryController,
Controllers::DateTime& dateTimeController,
- std::array<Applications, 6>& applications)
+ const std::array<Applications, 6>& applications)
: Screen(app), batteryController {batteryController}, dateTimeController {dateTimeController} {
settingsController.SetAppMenu(screenID);
diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h
index 4874714..ae85dea 100644
--- a/src/displayapp/screens/Tile.h
+++ b/src/displayapp/screens/Tile.h
@@ -27,7 +27,7 @@ namespace Pinetime {
Controllers::Settings& settingsController,
Pinetime::Controllers::Battery& batteryController,
Controllers::DateTime& dateTimeController,
- std::array<Applications, 6>& applications);
+ const std::array<Applications, 6>& applications);
~Tile() override;
diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp
index 1c964c4..c3fbb4f 100644
--- a/src/displayapp/screens/settings/Settings.cpp
+++ b/src/displayapp/screens/settings/Settings.cpp
@@ -6,8 +6,6 @@
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++) {
@@ -33,10 +31,5 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
}
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>(screenNum, nScreens, app, settingsController, screens);
+ return std::make_unique<Screens::List>(screenNum, nScreens, app, settingsController, entries[screenNum]);
}
diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h
index ad4bf08..96c9e4e 100644
--- a/src/displayapp/screens/settings/Settings.h
+++ b/src/displayapp/screens/settings/Settings.h
@@ -25,28 +25,42 @@ namespace Pinetime {
Controllers::Settings& settingsController;
static constexpr int entriesPerScreen = 4;
- static constexpr std::array<List::Applications, entriesPerScreen * 4> 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},
- }};
- static constexpr int nScreens = (entries.size() + entriesPerScreen - 1) / entriesPerScreen;
+ static constexpr auto entries{[]() constexpr{
+ using namespace Pinetime::Applications::Screens;
+ using namespace Pinetime::Applications;
+ constexpr List::Applications list[] = {
+ {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},
+ };
+ std::array<std::array<List::Applications, entriesPerScreen>, ((std::size(list) + entriesPerScreen - 1) / entriesPerScreen)> r{};;
+ int idx = 0;
+ for (auto& f : r) {
+ for (auto& e : f) {
+ if (idx < std::size(list)) {
+ e = list[idx];
+ } else {
+ e = { Symbols::none, "", Apps::None };
+ }
+ idx++;
+ }
+ }
+ return r;
+ }()};
+ static constexpr auto nScreens = std::size(entries);
ScreenList<nScreens> screens;
};
}