diff --git a/CMakeLists.txt b/CMakeLists.txt index 33eb39c..414d274 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ set(headers src/iconinterface.h src/menudisplay.h src/menuitem.h + src/screenmanager.h src/tftinstance.h src/textinterface.h src/actions/backproxyaction.h @@ -36,6 +37,7 @@ set(sources src/changevaluedisplay_daylightsavingmode.cpp src/changevaluedisplay_sntp_sync_mode_t.cpp src/menudisplay.cpp + src/screenmanager.cpp src/tftinstance.cpp src/icons/back.cpp src/icons/checked.cpp diff --git a/src/actions/switchscreenaction.h b/src/actions/switchscreenaction.h index 507abbe..b0accf4 100644 --- a/src/actions/switchscreenaction.h +++ b/src/actions/switchscreenaction.h @@ -2,6 +2,7 @@ // local includes #include "actioninterface.h" +#include "screenmanager.h" namespace espgui { template diff --git a/src/screenmanager.cpp b/src/screenmanager.cpp new file mode 100644 index 0000000..619fd22 --- /dev/null +++ b/src/screenmanager.cpp @@ -0,0 +1,8 @@ +#include "screenmanager.h" + +namespace espgui { + +std::unique_ptr currentDisplay; +std::function changeScreenCallback; + +} // namespace espgui diff --git a/src/screenmanager.h b/src/screenmanager.h new file mode 100644 index 0000000..c72b1ab --- /dev/null +++ b/src/screenmanager.h @@ -0,0 +1,49 @@ +#pragma once + +// system includes +#include +#include +#include + +// local includes +#include "display.h" + +namespace espgui { + +extern std::unique_ptr currentDisplay; + +inline void deconstructScreen() +{ + if (currentDisplay) + { + currentDisplay->stop(); + //currentDisplay->~Display(); + currentDisplay = nullptr; + } +} + +template +void switchScreenImpl(Args&&... args) +{ + deconstructScreen(); + + std::unique_ptr ptr = std::make_unique(std::forward(args)...); + currentDisplay = std::move(ptr); + currentDisplay->start(); + currentDisplay->initScreen(); + currentDisplay->update(); + currentDisplay->redraw(); +} + +extern std::function changeScreenCallback; + +template +void switchScreen(Args&&... args) +{ + if (currentDisplay) + changeScreenCallback = [&args...](){ switchScreenImpl(std::forward(args)...); }; + else + switchScreenImpl(std::forward(args)...); +} + +} // namespace espgui