diff options
Diffstat (limited to 'src/displayapp/screens/ScreenList.h')
-rw-r--r-- | src/displayapp/screens/ScreenList.h | 111 |
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; }; } } |