#ifndef __ScreenManager #define __ScreenManager #include class ScreenManager; class BaseScreen { private: ScreenManager* mScreenManager; protected: ScreenManager* getScreenManager(); unsigned long getCurrentTime(); LiquidCrystal* getDisplay(); void printTime(int value); public: BaseScreen(ScreenManager* screenManager) { mScreenManager = screenManager; } virtual ~BaseScreen() {} virtual void onShow() = 0; virtual void onHide() = 0; virtual void onButton() = 0; virtual void onEncoder(long lastPosition, long newPosition) = 0; virtual void onTick() = 0; }; class ScreenManager { private: LiquidCrystal* mDisplay; unsigned long* mCurrentTime; BaseScreen* mCurrent = NULL; public: ScreenManager(LiquidCrystal* display, unsigned long* currentTime) { mDisplay = display; mCurrentTime = currentTime; } inline BaseScreen* getCurrent() { return mCurrent; } inline unsigned long getCurrentTime() { return *mCurrentTime; } inline LiquidCrystal* getDisplay() { return mDisplay; } template void show() { if (mCurrent != NULL) { mCurrent->onHide(); delete(mCurrent); } mCurrent = new T(this); mCurrent->onShow(); } }; #endif