summaryrefslogtreecommitdiff
path: root/src/displayapp/screens/ScreenList.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/displayapp/screens/ScreenList.h')
-rw-r--r--src/displayapp/screens/ScreenList.h111
1 files changed, 87 insertions, 24 deletions
diff --git a/src/displayapp/screens/ScreenList.h b/src/displayapp/screens/ScreenList.h
index 736e3634..56d9abe0 100644
--- a/src/displayapp/screens/ScreenList.h
+++ b/src/displayapp/screens/ScreenList.h
@@ -9,16 +9,33 @@
namespace Pinetime {
namespace Applications {
namespace Screens {
+
+ enum class ScreenListModes {UpDown, RightLeft, LongPress};
template <size_t N>
class ScreenList : public Screen {
public:
- ScreenList(DisplayApp* app, std::array<std::function<std::unique_ptr<Screen>()>, N>&& screens)
- : Screen(app), screens{std::move(screens)}, current{this->screens[0]()} {
+ ScreenList(
+ DisplayApp* app,
+ uint8_t initScreen,
+ std::array<std::function<std::unique_ptr<Screen>()>, N>&& screens,
+ ScreenListModes mode
+ )
+ : Screen(app),
+ initScreen{initScreen},
+ screens{std::move(screens)},
+ mode{mode},
+ current{this->screens[initScreen]()}
+ {
+ screenIndex = initScreen;
}
~ScreenList() override {
-
+ current.reset(nullptr);
+ /*for(uint8_t i = 0; i < screens.size(); i++) {
+ screens[i]().reset(nullptr);
+ }*/
+ lv_obj_clean(lv_scr_act());
}
bool Refresh() override {
@@ -32,34 +49,80 @@ namespace Pinetime {
}
bool OnTouchEvent(TouchEvents event) override {
- switch (event) {
- case TouchEvents::SwipeDown:
- if (screenIndex > 0) {
- current.reset(nullptr);
- app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
- screenIndex--;
- current = screens[screenIndex]();
- }
- return true;
- case TouchEvents::SwipeUp:
- if (screenIndex < screens.size() - 1) {
- current.reset(nullptr);
- app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
- screenIndex++;
- current = screens[screenIndex]();
- }
- return true;
- default:
- return false;
+
+ if ( mode == ScreenListModes::UpDown) {
+ switch (event) {
+ case TouchEvents::SwipeDown:
+ if (screenIndex > 0) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
+ screenIndex--;
+ current = screens[screenIndex]();
+ return true;
+ } else {
+ return false;
+ }
+
+ case TouchEvents::SwipeUp:
+ if (screenIndex < screens.size() - 1) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
+ screenIndex++;
+ current = screens[screenIndex]();
+ }
+ return true;
+ default:
+ return false;
+ }
+ } else if ( mode == ScreenListModes::RightLeft) {
+ switch (event) {
+ case TouchEvents::SwipeRight:
+ if (screenIndex > 0) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::None);
+ screenIndex--;
+ current = screens[screenIndex]();
+ return true;
+ } else {
+ return false;
+ }
+
+ case TouchEvents::SwipeLeft:
+ if (screenIndex < screens.size() - 1) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::None);
+ screenIndex++;
+ current = screens[screenIndex]();
+ }
+ return true;
+ default:
+ return false;
+ }
+ } else if ( event == TouchEvents::LongTap ) {
+ if (screenIndex < screens.size() - 1) {
+ screenIndex++;
+ } else {
+ screenIndex = 0;
+ }
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::None);
+ current = screens[screenIndex]();
+ return true;
}
+
return false;
}
private:
- bool running = true;
- uint8_t screenIndex = 0;
+
+ uint8_t initScreen = 0;
std::array<std::function<std::unique_ptr<Screen>()>, N> screens;
+ ScreenListModes mode = ScreenListModes::UpDown;
+
+ uint8_t screenIndex = 0;
std::unique_ptr<Screen> current;
+
+ bool running = true;
};
}
}