1d3742e14f
new navigation add some color to the apps redesign menus new settings menu new quick settings code clean up size reduction by converting navigation images to font and more...
110 lines
3.6 KiB
C++
110 lines
3.6 KiB
C++
#pragma once
|
|
|
|
#include <array>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include "Screen.h"
|
|
#include "../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, 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;
|
|
|
|
|
|
};
|
|
}
|
|
}
|
|
} |