OMOTE/Platformio/OmoteUI/core/ScreenManager.cpp
MatthewColvin 7b7045f62b convert Screen manager to use vector to allow popper of screen to use the Page.
Add ability to delay destruction of an object in LVGL after the core object has been destructed. This was added for animations to work .

make pop up Screen to allow for easy pushing of pages by wrapping it in a screen.

Use this all in the settings page to launch a fake display settings
2023-10-08 12:32:59 -05:00

56 lines
No EOL
1.8 KiB
C++

#include "ScreenManager.hpp"
#include "PopUpScreen.hpp"
using namespace UI::Screen;
Manager Manager::mManager = Manager();
Manager &Manager::getInstance() { return mManager; }
Manager::Manager() {}
void Manager::pushScreen(Screen::Base::Ptr aScreen,
lv_scr_load_anim_t aPushAnimation) {
aScreen->SetPushAnimation(aPushAnimation);
pushScreen(std::move(aScreen));
}
void Manager::pushScreen(Screen::Base::Ptr aScreen) {
mScreens.push_back(std::move(aScreen));
mScreens.back()->Show();
}
void Manager::pushPopUp(Page::Base::Ptr aPopUpPage,
lv_scr_load_anim_t aPushAnimation) {
pushScreen(std::make_unique<PopUpScreen>(std::move(aPopUpPage)),
aPushAnimation);
}
UI::Screen::Base::Ptr Manager::popScreen(Screen::Base *aScreenToRemove) {
auto screenToPop = std::find_if(
mScreens.begin(), mScreens.end(), [aScreenToRemove](auto &screenInStack) {
return screenInStack.get() == aScreenToRemove;
});
bool isPopOffTopOfStack = mScreens.end() - 1 == screenToPop;
Screen::Base::Ptr retVal = nullptr;
if (screenToPop != mScreens.end()) {
retVal = std::move(*screenToPop);
mScreens.erase(screenToPop);
if (isPopOffTopOfStack) {
// Make sure to show correct top of stack
// since we popped the top screen off
mScreens.back()->Show();
}
}
// In order to make sure the Transition can complete
// flag the removed screen to stay alive in case it falls
// out of scope and gets deleted quickly after this.
retVal->SetKeepAliveTime(mScreens.back()->GetTransitionTime() + 500);
return retVal;
}
bool Manager::distributeKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
// Send Key Even to top Screen for handling
return mScreens.back()->KeyEvent(aKeyEvent);
}