summaryrefslogblamecommitdiffstats
path: root/src/Widget.cpp
blob: 1a522ca3a37775a67c8223a2613eb8cc2d564649 (plain) (tree)



























































































































                                                                                                                  
#include "Widget.hpp"

void RootWidget::AttachWidget(std::unique_ptr<Widget> widget, Widget * parent)
{
    parent->childs.push_back(widget.get());
    this->allWidgets.push_back(std::move(widget));
}

void RootWidget::AttachWidget(std::unique_ptr<Widget> widget) {
    widget->parent = nullptr;
    this->childs.push_back(widget.get());
    this->allWidgets.push_back(std::move(widget));
}

std::vector<Widget*> RootWidget::GetRenderList()
{
    std::vector<Widget*> renderList;    

    std::function<void(Widget*)> treeWalker = [&](Widget* node) {
        for (auto it : node->childs)
            treeWalker(it);
        renderList.push_back(node);
    };

    for (auto& it : this->childs)
        treeWalker(it);

    return renderList;
}

void RootWidget::UpdateEvents(double mouseX, double mouseY, bool mouseButton) {

    LOG(INFO) << mouseX << "x" << mouseY;

    auto testIsHover = [&](double x, double y, Widget* widget) {
        bool isOnX = widget->x > x && widget->x + widget->w < x;
        bool isOnY = widget->y > y && widget->y + widget->h < y;
        if (mouseButton)
            LOG(INFO) << "X: " << isOnX << " Y: " << isOnY;
        return isOnX && isOnY;
    };

    std::function<void(Widget*)> treeWalker = [&](Widget* node) {
        for (auto it : node->childs)
            treeWalker(it);
        
        if (testIsHover(mouseX,mouseY,node)) {
            if (node->onHover)
                node->onHover(node);
            if (mouseButton && !prevBut)
                if (node->onPress)
                    node->onPress(node);
            else if (!mouseButton && prevBut)
                if (node->onRelease)
                    node->onRelease(node);
        }
        else {
            if (testIsHover(prevX, prevY, node))
                if (node->onUnhover)
                    node->onUnhover(node);
        }
        
        if (node->onUpdate)
            node->onUpdate(node);
    };

    for (auto it : childs)
        treeWalker(it);

    prevX = mouseX;
    prevY = mouseY;
    prevBut = mouseButton;
}

WidgetButton::WidgetButton()
{
    this->state = WidgetState::Idle;

    onHover = [](Widget* widget) {
        WidgetButton* w = dynamic_cast<WidgetButton*>(widget);
        if (w->state != WidgetState::Pressed)
            w->state = WidgetState::Hovering;
        LOG(INFO) << "Hover";
    };

    onPress = [](Widget* widget) {
        WidgetButton* w = dynamic_cast<WidgetButton*>(widget);
        w->state = WidgetState::Pressed;
        LOG(INFO) << "Press";
    };

    onRelease = [](Widget* widget) {
        WidgetButton* w = dynamic_cast<WidgetButton*>(widget);
        w->state = WidgetState::Idle;
        w->onClick(w);
        LOG(INFO) << "Release";
    };

    onUnhover = [](Widget *widget) {
        WidgetButton* w = dynamic_cast<WidgetButton*>(widget);
        if (w->state!=WidgetState::Pressed)
            w->state = WidgetState::Idle;
        LOG(INFO) << "Unhover";
    };

}

std::tuple<double, double, double, double> WidgetButton::GetTexture()
{
    double yOffset;
    switch (this->state) {
    case WidgetState::Idle:
        yOffset = 0.2578;
        break;
    case WidgetState::Hovering:
        yOffset = 0.3359;
        break;
    case WidgetState::Pressed:
        yOffset = 0.1796;
    }

    TextureCoordinates texture = AssetManager::Instance().GetTextureByAssetName("minecraft/textures/gui/widgets");
    return { texture.x,texture.y + texture.h * yOffset,texture.w * 0.7812,texture.h * 0.07812 };
}