diff options
| author | Michele Bini <michele.bini@gmail.com> | 2022-06-03 10:23:25 (GMT) |
|---|---|---|
| committer | Michele Bini <michele.bini@gmail.com> | 2022-06-07 03:20:51 (GMT) |
| commit | 8b322a66a7dc9572a9a2e13b615fdd60b054f8e9 (patch) | |
| tree | 3df311293ae455428b74daa35c99eabfb92714a1 | |
| parent | 984316be128d98aa042a7a5f96aa30cc2637b3e5 (diff) | |
Preallocate blocks for tiled multi-screen menus (requires C++17)
| -rw-r--r-- | src/displayapp/screens/ApplicationList.cpp | 8 | ||||
| -rw-r--r-- | src/displayapp/screens/ApplicationList.h | 56 | ||||
| -rw-r--r-- | src/displayapp/screens/List.cpp | 2 | ||||
| -rw-r--r-- | src/displayapp/screens/List.h | 2 | ||||
| -rw-r--r-- | src/displayapp/screens/Tile.cpp | 2 | ||||
| -rw-r--r-- | src/displayapp/screens/Tile.h | 2 | ||||
| -rw-r--r-- | src/displayapp/screens/settings/Settings.cpp | 9 | ||||
| -rw-r--r-- | src/displayapp/screens/settings/Settings.h | 58 |
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; }; } |
