InfiniTime/src/displayapp/screens/ScreenList.h

110 lines
3.6 KiB
C
Raw Normal View History

#pragma once
2020-11-15 10:49:36 -05:00
#include <array>
#include <functional>
2020-11-15 10:49:36 -05:00
#include <memory>
#include "Screen.h"
2020-11-15 10:49:36 -05:00
#include "../DisplayApp.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
enum class ScreenListModes {UpDown, RightLeft, LongPress};
template <size_t N>
class ScreenList : public Screen {
public:
2021-03-06 14:55:53 -05:00
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 {
lv_obj_clean(lv_scr_act());
}
bool Refresh() override {
running = current->Refresh();
return running;
}
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:
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;
};
}
}
}