InfiniTime/src/displayapp/screens/ScreenList.h

109 lines
3.5 KiB
C
Raw Normal View History

#pragma once
2020-11-15 15:49:36 +00:00
#include <array>
#include <functional>
2020-11-15 15:49:36 +00:00
#include <memory>
#include "Screen.h"
2020-11-15 15:49:36 +00:00
#include "../DisplayApp.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
enum class ScreenListModes { UpDown, RightLeft, LongPress };
template <size_t N> class ScreenList : public Screen {
2021-04-24 09:00:45 +00:00
public:
ScreenList(DisplayApp* app,
uint8_t initScreen,
const std::array<std::function<std::unique_ptr<Screen>()>, N>&& screens,
ScreenListModes mode)
: Screen(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;
}
2021-04-24 09:00:45 +00:00
private:
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;
};
}
}
2021-07-19 13:26:12 +00:00
}