|
|
@@ -42,7 +42,7 @@ extern Rml::Context* context;
|
|
|
static EventHandler* event_handler = nullptr;
|
|
|
|
|
|
// The event handlers registered with the manager.
|
|
|
-typedef Rml::SmallUnorderedMap< Rml::String, EventHandler* > EventHandlerMap;
|
|
|
+using EventHandlerMap = Rml::SmallUnorderedMap<Rml::String, Rml::UniquePtr<EventHandler>>;
|
|
|
EventHandlerMap event_handlers;
|
|
|
|
|
|
EventManager::EventManager()
|
|
|
@@ -56,22 +56,15 @@ EventManager::~EventManager()
|
|
|
// Releases all event handlers registered with the manager.
|
|
|
void EventManager::Shutdown()
|
|
|
{
|
|
|
- for (EventHandlerMap::iterator i = event_handlers.begin(); i != event_handlers.end(); ++i)
|
|
|
- delete (*i).second;
|
|
|
-
|
|
|
event_handlers.clear();
|
|
|
event_handler = nullptr;
|
|
|
}
|
|
|
|
|
|
// Registers a new event handler with the manager.
|
|
|
-void EventManager::RegisterEventHandler(const Rml::String& handler_name, EventHandler* handler)
|
|
|
+void EventManager::RegisterEventHandler(const Rml::String& handler_name, Rml::UniquePtr<EventHandler> handler)
|
|
|
{
|
|
|
- // Release any handler bound under the same name.
|
|
|
- EventHandlerMap::iterator iterator = event_handlers.find(handler_name);
|
|
|
- if (iterator != event_handlers.end())
|
|
|
- delete (*iterator).second;
|
|
|
-
|
|
|
- event_handlers[handler_name] = handler;
|
|
|
+ // Any handler bound under the same name will be released.
|
|
|
+ event_handlers[handler_name] = std::move(handler);
|
|
|
}
|
|
|
|
|
|
// Processes an event coming through from RmlUi.
|
|
|
@@ -127,7 +120,7 @@ void EventManager::ProcessEvent(Rml::Event& event, const Rml::String& value)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (event_handler != nullptr)
|
|
|
+ if (event_handler)
|
|
|
event_handler->ProcessEvent(event, commands[i]);
|
|
|
}
|
|
|
}
|
|
|
@@ -138,24 +131,23 @@ Rml::ElementDocument* EventManager::LoadWindow(const Rml::String& window_name)
|
|
|
{
|
|
|
// Set the event handler for the new screen, if one has been registered.
|
|
|
EventHandler* old_event_handler = event_handler;
|
|
|
- EventHandlerMap::iterator iterator = event_handlers.find(window_name);
|
|
|
- if (iterator != event_handlers.end())
|
|
|
- event_handler = (*iterator).second;
|
|
|
+ auto it = event_handlers.find(window_name);
|
|
|
+ if (it != event_handlers.end())
|
|
|
+ event_handler = it->second.get();
|
|
|
else
|
|
|
event_handler = nullptr;
|
|
|
|
|
|
// Attempt to load the referenced RML document.
|
|
|
Rml::String document_path = Rml::String("invaders/data/") + window_name + Rml::String(".rml");
|
|
|
Rml::ElementDocument* document = context->LoadDocument(document_path.c_str());
|
|
|
- if (document == nullptr)
|
|
|
+ if (!document)
|
|
|
{
|
|
|
event_handler = old_event_handler;
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
// Set the element's title on the title; IDd 'title' in the RML.
|
|
|
- Rml::Element* title = document->GetElementById("title");
|
|
|
- if (title != nullptr)
|
|
|
+ if (Rml::Element* title = document->GetElementById("title"))
|
|
|
title->SetInnerRML(document->GetTitle());
|
|
|
|
|
|
document->Show();
|