File StaticWidget.c

File List > engine > src > gameframework > layers > UI > widgets > StaticWidget.c

Go to the documentation of this file

#include "StaticWidget.h"
#include "XMLUIGameLayer.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "Atlas.h"
#include "AssertLib.h"
#include "WidgetVertexOutputHelpers.h"
#include "DataNode.h"
#include "RootWidget.h"


float StaticWidget_GetWidth(struct StaticWidgetData* pStaticData, struct WidgetPadding* pPadding)
{
    AtlasSprite* pAtlasSprite = At_GetSprite(pStaticData->sprite, pStaticData->atlas);
    if (!pAtlasSprite)
    {
        return 0;
    }
    return pStaticData->scale.scaleX * (pAtlasSprite->widthPx + pPadding->paddingLeft + pPadding->paddingRight);
}

float StaticWidget_GetHeight(struct StaticWidgetData* pStaticData, struct WidgetPadding* pPadding)
{
    AtlasSprite* pAtlasSprite = At_GetSprite(pStaticData->sprite, pStaticData->atlas);
    if (!pAtlasSprite)
    {
        return 0;
    }

    return  pStaticData->scale.scaleY * (pAtlasSprite->heightPx + pPadding->paddingTop + pPadding->paddingBottom);
}

void StaticWidget_Destroy(struct StaticWidgetData* pStaticData)
{
    assert(pStaticData->imageName);
    free(pStaticData->imageName);
}

void* StaticWidget_OnOutputVerts(struct StaticWidgetData* pStaticData, float left, float top, struct WidgetPadding* pPadding, VECTOR(WidgetVertex) pOutVerts)
{
    AtlasSprite* pSprite = At_GetSprite(pStaticData->sprite, pStaticData->atlas);
    if(!pSprite)
    {
        return pOutVerts; /* sometimes hit for some reason */
    }
    float width = pSprite->widthPx;
    float height = pSprite->heightPx;

    WidgetQuad quad;
    vec2 translate = {
        left + pPadding->paddingLeft,
        top + pPadding->paddingTop
    };
    PopulateWidgetQuadWholeSprite(&quad, pSprite);
    TranslateWidgetQuad(translate, &quad);
    ScaleWidgetQuad(pStaticData->scale.scaleX, pStaticData->scale.scaleY, &quad);
    pOutVerts = OutputWidgetQuad(pOutVerts, &quad);
    return pOutVerts;
}

void StaticWidget_MakeFromXML(struct StaticWidgetData* pWidgetData, struct DataNode* pDataNode, struct XMLUIData* pUILayerData)
{
    if(pDataNode->fnGetPropType(pDataNode, "sprite") == DN_String)
    {
        size_t len = pDataNode->fnGetStrlen(pDataNode, "sprite");
        if (pWidgetData->imageName)
        {
            free(pWidgetData->imageName);
        }
        pWidgetData->imageName = malloc(len + 1);
        pDataNode->fnGetStrcpy(pDataNode, "sprite", pWidgetData->imageName);
    }
    if(pDataNode->fnGetPropType(pDataNode, "scaleX") == DN_Float)
    {
        pWidgetData->scale.scaleX = pDataNode->fnGetFloat(pDataNode, "scaleX");
    }
    if(pDataNode->fnGetPropType(pDataNode, "scaleY") == DN_Float)
    {
        pWidgetData->scale.scaleY = pDataNode->fnGetFloat(pDataNode, "scaleY");
    }
    if (pWidgetData->imageName)
    {
        pWidgetData->sprite = At_FindSprite(pWidgetData->imageName, pUILayerData->atlas);
        pWidgetData->atlas = pUILayerData->atlas;
    }
}

static float GetWidth(struct UIWidget* pWidget, struct UIWidget* pParent)
{
    struct StaticWidgetData* pStaticData = pWidget->pImplementationData;
    return StaticWidget_GetWidth(pStaticData, &pWidget->padding);
}

static float GetHeight(struct UIWidget* pWidget, struct UIWidget* pParent)
{
    struct StaticWidgetData* pStaticData = pWidget->pImplementationData;
    return StaticWidget_GetHeight(pStaticData, &pWidget->padding);
}

static void LayoutChildren(struct UIWidget* pWidget, struct UIWidget* pParent)
{
    RootWidget_LayoutChildren(pWidget, pParent, 0, 0);
}

static void OnDestroy(struct UIWidget* pWidget)
{
    StaticWidget_Destroy(pWidget->pImplementationData);
    free(pWidget->pImplementationData);
}

static void* OnOutputVerts(struct UIWidget* pWidget, VECTOR(WidgetVertex) pOutVerts)
{
    struct StaticWidgetData* pStaticData = pWidget->pImplementationData;
    pOutVerts = StaticWidget_OnOutputVerts(pStaticData, pWidget->left, pWidget->top, &pWidget->padding, pOutVerts);
    pOutVerts = UI_Helper_OnOutputVerts(pWidget, pOutVerts);
    return pOutVerts;
}

static void MakeWidgetIntoStatic(HWidget hWidget, struct DataNode* pXMLNode, struct XMLUIData* pUILayerData)
{
    struct UIWidget* pWidget = UI_GetWidget(hWidget);

    pWidget->hNext = -1;
    pWidget->hPrev = -1;
    pWidget->hParent = -1;
    pWidget->hFirstChild = -1;
    pWidget->fnGetHeight = &GetHeight;
    pWidget->fnGetWidth = &GetWidth;
    pWidget->fnLayoutChildren = &LayoutChildren;
    pWidget->fnOnDestroy = &OnDestroy;
    pWidget->fnOutputVertices = &OnOutputVerts;
    pWidget->pImplementationData = malloc(sizeof(struct StaticWidgetData));
    struct StaticWidgetData* pWidgetData = pWidget->pImplementationData;
    memset(pWidgetData, 0, sizeof(struct StaticWidgetData));

    pWidgetData->scale.scaleX = 1.0f;
    pWidgetData->scale.scaleY = 1.0f;
    StaticWidget_MakeFromXML(pWidgetData, pXMLNode, pUILayerData);

    pWidget->width.type = WD_Auto;
    pWidget->height.type = WD_Auto;
}

HWidget StaticWidgetNew(HWidget hParent, struct DataNode* pXMLNode, struct XMLUIData* pUILayerData)
{
    HWidget hWidget = UI_NewBlankWidget();
    MakeWidgetIntoStatic(hWidget, pXMLNode, pUILayerData);
    return hWidget;
}