aboutsummaryrefslogtreecommitdiff
path: root/src/Core/StateManager.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-08-14 00:02:01 +0200
committerhachem <im@hachem.wtf>2025-08-14 00:02:01 +0200
commit641db1c86bf624527173b0323bd3c832338c3662 (patch)
tree188fe41c2351b8b426b8904ea23faec68f4144a4 /src/Core/StateManager.cpp
parent6afeab30f84bc19fc4fc3dd842e7b093d4c5a9fa (diff)
[add]: State manager
Diffstat (limited to 'src/Core/StateManager.cpp')
-rw-r--r--src/Core/StateManager.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/Core/StateManager.cpp b/src/Core/StateManager.cpp
new file mode 100644
index 0000000..30d6b1d
--- /dev/null
+++ b/src/Core/StateManager.cpp
@@ -0,0 +1,82 @@
+#include "StateManager.h"
+#include "Log.h"
+
+namespace Donut
+{
+ void StateManager::Shutdown()
+ {
+ if (m_CurrentState)
+ m_CurrentState->OnExit();
+
+ DestroyStates();
+ DONUT_INFO("StateManager shutdown");
+ }
+
+ void StateManager::DestroyStates()
+ {
+ m_States.clear();
+ m_CurrentState = nullptr;
+ m_CurrentStateName = "";
+ }
+
+ void StateManager::RegisterState(const std::string& stateName, std::unique_ptr<State> state)
+ {
+ if (m_States.find(stateName) != m_States.end())
+ DONUT_WARN("State '{}' already exists, overwriting", stateName);
+ m_States[stateName] = std::move(state);
+ DONUT_INFO("Registered state: {}", stateName);
+ }
+
+ void StateManager::SwitchToState(const std::string& stateName)
+ {
+ auto it = m_States.find(stateName);
+ if (it == m_States.end())
+ {
+ DONUT_ERROR("Attempted to switch to unknown state: {}", stateName);
+ return;
+ }
+
+ State* newState = it->second.get();
+ if (newState == m_CurrentState)
+ return;
+
+ if (m_CurrentState)
+ m_CurrentState->OnExit();
+
+ m_CurrentState = newState;
+ m_CurrentStateName = stateName;
+ m_CurrentState->OnEnter();
+ DONUT_INFO("Switched to state: {}", stateName);
+ }
+
+ State* StateManager::GetState(const std::string& stateName)
+ {
+ auto it = m_States.find(stateName);
+ if (it != m_States.end())
+ return it->second.get();
+ return nullptr;
+ }
+
+ bool StateManager::HasState(const std::string& stateName) const
+ {
+ return m_States.find(stateName) != m_States.end();
+ }
+
+ void StateManager::Update(float deltaTime)
+ {
+ if (m_CurrentState)
+ m_CurrentState->OnUpdate(deltaTime);
+ }
+
+ void StateManager::Render()
+ {
+ if (m_CurrentState)
+ m_CurrentState->OnRender();
+ }
+
+ void StateManager::OnEvent(Event& event)
+ {
+ if (m_CurrentState)
+ m_CurrentState->OnEvent(event);
+ }
+}