added screen manager
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
8
src/screenmanager.cpp
Normal 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
49
src/screenmanager.h
Normal 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
|
Reference in New Issue
Block a user