added screen manager

This commit is contained in:
2021-08-20 13:50:04 +02:00
parent ad0d90339e
commit 80bcc7ef07
4 changed files with 60 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ set(headers
src/iconinterface.h src/iconinterface.h
src/menudisplay.h src/menudisplay.h
src/menuitem.h src/menuitem.h
src/screenmanager.h
src/tftinstance.h src/tftinstance.h
src/textinterface.h src/textinterface.h
src/actions/backproxyaction.h src/actions/backproxyaction.h
@@ -36,6 +37,7 @@ set(sources
src/changevaluedisplay_daylightsavingmode.cpp src/changevaluedisplay_daylightsavingmode.cpp
src/changevaluedisplay_sntp_sync_mode_t.cpp src/changevaluedisplay_sntp_sync_mode_t.cpp
src/menudisplay.cpp src/menudisplay.cpp
src/screenmanager.cpp
src/tftinstance.cpp src/tftinstance.cpp
src/icons/back.cpp src/icons/back.cpp
src/icons/checked.cpp src/icons/checked.cpp

View File

@@ -2,6 +2,7 @@
// local includes // local includes
#include "actioninterface.h" #include "actioninterface.h"
#include "screenmanager.h"
namespace espgui { namespace espgui {
template<typename Tscreen, typename ...Targs> template<typename Tscreen, typename ...Targs>

8
src/screenmanager.cpp Normal file
View File

@@ -0,0 +1,8 @@
#include "screenmanager.h"
namespace espgui {
std::unique_ptr<Display> currentDisplay;
std::function<void()> changeScreenCallback;
} // namespace espgui

49
src/screenmanager.h Normal file
View File

@@ -0,0 +1,49 @@
#pragma once
// system includes
#include <memory>
#include <functional>
#include <utility>
// local includes
#include "display.h"
namespace espgui {
extern std::unique_ptr<Display> currentDisplay;
inline void deconstructScreen()
{
if (currentDisplay)
{
currentDisplay->stop();
//currentDisplay->~Display();
currentDisplay = nullptr;
}
}
template<typename T, typename... Args>
void switchScreenImpl(Args&&... args)
{
deconstructScreen();
std::unique_ptr<T> ptr = std::make_unique<T>(std::forward<Args>(args)...);
currentDisplay = std::move(ptr);
currentDisplay->start();
currentDisplay->initScreen();
currentDisplay->update();
currentDisplay->redraw();
}
extern std::function<void()> changeScreenCallback;
template<typename T, typename... Args>
void switchScreen(Args&&... args)
{
if (currentDisplay)
changeScreenCallback = [&args...](){ switchScreenImpl<T>(std::forward<Args>(args)...); };
else
switchScreenImpl<T>(std::forward<Args>(args)...);
}
} // namespace espgui