#pragma once #include #include #include #include #include #include #include #include #include #include "page.hpp" struct ApplicationData {}; class App { public: App(Rml::Context* ctx, ApplicationData* appData); ~App(); void SetupListeners(std::function bindCallback); void RegisterListener(Rml::Element* element, std::unique_ptr listener); template void RegisterPage(const std::string &pageName) { static_assert(std::is_base_of::value, "T must derive from PageBase"); pages[pageName] = std::make_unique(pageName, this); } bool NavigateTo(const std::string &pageName); bool LoadUi(); void Reload(); static std::string GetAssetsPath(); void Shutdown(); private: ApplicationData *appData; Rml::Context* ctx; Rml::ElementDocument* doc; Rml::Element* pageOutlet = nullptr; std::vector> listeners; std::function onBindListeners; std::unordered_map> pages; PageBase* currentPage = nullptr; PageBase* GetOrCreatePage(const std::string& pageName); static bool ReadFile(const std::string& path, std::string& outContent); void TeardownCurrentPage(); bool hasShutdown = false; };