/* * Created by Brett on 16/01/23. * Licensed under GNU General Public License V3.0 * See LICENSE file for license detail */ #ifndef BLT_WINDOW_H #define BLT_WINDOW_H #include #include #ifndef BLT_MAP_FUNC #include #define BLT_MAP_FUNC std::unordered_map #endif #define KEY_MAP BLT_MAP_FUNC namespace blt { class window; #define WINDOW_MAP BLT_MAP_FUNC extern WINDOW_MAP activeWindows; class window { protected: bool m_windowOpen = true; int m_width, m_height; std::vector> renderFunctions{}; std::vector> keyListeners{}; std::vector> mouseListeners{}; KEY_MAP keysDown{}; KEY_MAP mouseDown{}; public: window() { activeWindows.insert({this, this}); } window(int width, int height) { activeWindows.insert({this, this}); m_width = width; m_height = height; } virtual void createWindow() = 0; virtual void startMainLoop() = 0; virtual void destroyWindow() = 0; virtual ~window() { activeWindows.insert({this, nullptr}); }; virtual inline bool setResizeable(bool resizeEnabled) = 0; virtual inline bool setWindowSize(int width, int height) = 0; [[nodiscard]] inline int getWidth() const {return m_width;}; [[nodiscard]] inline int getHeight() const {return m_height;}; [[nodiscard]] virtual inline bool isWindowOpen() const {return m_windowOpen;}; virtual inline void closeWindow(){ m_windowOpen = false; } virtual inline void registerLoopFunction(std::function func) { renderFunctions.push_back(func); } virtual inline bool isKeyDown(int key) const { return keysDown.at(key); } virtual inline bool isMouseDown(int button) const {return mouseDown.at(button);}; // Function signature is window pointer to this, key press, pressed/released (true/false) virtual inline void registerKeyListener(const std::function& listener) { keyListeners.push_back(listener); } // Function signature is window pointer to this, mouse button press, pressed/released (true/false) virtual inline void registerMouseListener(const std::function& listener) { mouseListeners.push_back(listener); } }; } #endif