12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include "Object.h"
- #include "Event.h"
- #include "EventLoop.h"
- #include <AK/Assertions.h>
- #ifdef USE_SDL
- #include <SDL.h>
- #endif
- Object::Object(Object* parent)
- : m_parent(parent)
- {
- if (m_parent)
- m_parent->addChild(*this);
- }
- Object::~Object()
- {
- if (m_parent)
- m_parent->removeChild(*this);
- auto childrenToDelete = move(m_children);
- for (auto* child : childrenToDelete)
- delete child;
- }
- void Object::event(Event& event)
- {
- switch (event.type()) {
- case Event::Timer:
- return timerEvent(static_cast<TimerEvent&>(event));
- case Event::DeferredDestroy:
- delete this;
- break;
- case Event::Invalid:
- ASSERT_NOT_REACHED();
- break;
- default:
- break;
- }
- }
- void Object::addChild(Object& object)
- {
- m_children.append(&object);
- }
- void Object::removeChild(Object& object)
- {
- for (unsigned i = 0; i < m_children.size(); ++i) {
- if (m_children[i] == &object) {
- m_children.remove(i);
- return;
- }
- }
- }
- void Object::timerEvent(TimerEvent&)
- {
- }
- #ifdef USE_SDL
- static dword sdlTimerCallback(dword interval, void* param)
- {
- EventLoop::main().postEvent(static_cast<Object*>(param), make<TimerEvent>());
- return interval;
- }
- #endif
- void Object::startTimer(int ms)
- {
- if (m_timerID) {
- printf("Object{%p} already has a timer!\n", this);
- ASSERT_NOT_REACHED();
- }
- #ifdef USE_SDL
- m_timerID = SDL_AddTimer(ms, sdlTimerCallback, this);
- #endif
- }
- void Object::stopTimer()
- {
- if (!m_timerID)
- return;
- #ifdef USE_SDL
- SDL_RemoveTimer(m_timerID);
- #endif
- m_timerID = 0;
- }
- void Object::deleteLater()
- {
- EventLoop::main().postEvent(this, make<DeferredDestroyEvent>());
- }
|