#include "widget.h"
#include <algorithm>

void Widget::input(const kku::SystemEvent &event)
{
    if (_blocker)
        _blocker->input(event);
    else
    {
        for (auto& child : _children)
            child->input(event);
    }
}

void Widget::update(const kku::microsec& dt)
{
    for (auto& child : _children)
        child->update(dt);
}

void Widget::display() const
{
    for (const auto& child : _children)
        child->display();
}

void Widget::move(const kku::Vector2<float>& delta)
{
    for (auto& child : _children)
        child->move(delta);
}

void Widget::setVisibility(bool is_visible)
{
    _is_visible = is_visible;
    for (auto& child : _children)
        child->setVisibility(_is_visible);
}

bool Widget::isVisible() const
{
    return _is_visible;
}

void Widget::addChild(const std::shared_ptr<Widget>& child)
{
    child->setParent(shared_from_this());

    const auto iterator = std::find(_children.begin(), _children.end(), child);
    if (iterator == _children.end())
        _children.emplace_back(child);
}

void Widget::setParent(const std::shared_ptr<Widget>& parent)
{
    if (_parent != parent)
    {
        _parent = parent;
        _parent->addChild(shared_from_this());
    }
}

void Widget::blockBy(const std::shared_ptr<Widget>& blocker)
{
    _blocker = blocker;
}

void Widget::unblock()
{
    _blocker = nullptr;
}
