ref: e5b73212f6addcfdb5e306df63d7135e543c4f8d
src/displayapp/screens/ScreenList.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#pragma once #include <array> #include <functional> #include <memory> #include "displayapp/screens/Screen.h" #include "displayapp/DisplayApp.h" namespace Pinetime { namespace Applications { namespace Screens { enum class ScreenListModes { UpDown, RightLeft, LongPress }; template <size_t N> class ScreenList : public Screen { public: ScreenList(DisplayApp* app, uint8_t initScreen, const std::array<std::function<std::unique_ptr<Screen>()>, N>&& screens, ScreenListModes mode) : app {app}, initScreen {initScreen}, screens {std::move(screens)}, mode {mode}, screenIndex {initScreen}, current {this->screens[initScreen]()} { } ScreenList(const ScreenList&) = delete; ScreenList& operator=(const ScreenList&) = delete; ScreenList(ScreenList&&) = delete; ScreenList& operator=(ScreenList&&) = delete; ~ScreenList() override { lv_obj_clean(lv_scr_act()); } bool OnTouchEvent(TouchEvents event) override { 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: DisplayApp* app; uint8_t initScreen = 0; const std::array<std::function<std::unique_ptr<Screen>()>, N> screens; ScreenListModes mode = ScreenListModes::UpDown; uint8_t screenIndex = 0; std::unique_ptr<Screen> current; }; } } } |