Built basic UI Grid.

This commit is contained in:
2021-09-07 09:07:53 -07:00
parent 09b3bdb93c
commit f9e366b440
14 changed files with 324 additions and 72 deletions

118
src/ui/grid.c Normal file
View File

@ -0,0 +1,118 @@
/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "grid.h"
void gridInit(grid_t *grid) {
grid->breakpointCount = 0x00;
grid->childCount = 0x00;
grid->width = 0;
grid->height = 0;
grid->x = 0;
grid->y = 0;
}
uint8_t gridAddBreakpoint(
grid_t *grid, float width,
uint8_t rows, uint8_t columns,
float gutterX, float gutterY
) {
uint8_t i;
i = grid->breakpointCount;
grid->grids[i].rows = rows;
grid->grids[i].columns = columns;
grid->grids[i].gutterX = gutterX;
grid->grids[i].gutterY = gutterY;
grid->breakpoints[i].width = width;
grid->breakpointCount++;
return i;
}
gridchild_t * gridAddChild(grid_t *grid) {
gridchild_t *child = grid->children + grid->childCount;
child->defCount = 1;
child->defs[0].columns = 1;
child->defs[0].rows = 1;
child->defs[0].x = 0;
child->defs[0].y = 0;
grid->childCount++;
return child;
}
void gridSetSize(grid_t *grid,
float screenWidth, float screenHeight,
float width, float height,
float x, float y
) {
uint8_t i, breakpoint;
gridchild_t *item;
gridchilddef_t *itemdef;
griddef_t griddef;
float sizeCol, sizeRow, gx, gy, gw, gh;
// Need to resize?
if((
grid->width == width && grid->height == height &&
grid->x == x && grid->y == y
)) {
return;
}
// Update properties
grid->width = width;
grid->height = height;
grid->x = x;
grid->y = y;
// Determine breakpoint
breakpoint = 0xFF;
for(i = 0; i < grid->breakpointCount; i++) {
if(grid->breakpoints[i].width < screenWidth) continue;
breakpoint = i;
}
if(breakpoint == 0xFF) breakpoint = grid->breakpointCount - 1;
griddef = grid->grids[breakpoint];
// Determine the size of a single column
sizeCol = (width - (
griddef.gutterX * (griddef.columns - 1)
)) / griddef.columns;
sizeRow = (height - (
griddef.gutterY * (griddef.rows - 1)
)) / griddef.rows;
// Resize children
for(i = 0; i < grid->childCount; i++) {
// Get the item and the definition.
item = grid->children + i;
itemdef = item->defs + (
breakpoint >= item->defCount ? item->defCount-1 : breakpoint
);
// Get the local X/Y
gx = (sizeCol * itemdef->x) + (griddef.gutterX * itemdef->x);
gy = (sizeRow * itemdef->y) + (griddef.gutterY * itemdef->y);
// Get the width/height
gw = (
(itemdef->columns * sizeCol) +
(mathMax(itemdef->columns - 1, 0) * griddef.gutterX)
);
gh = (
(itemdef->rows * sizeRow) +
(mathMax(itemdef->rows - 1, 0) * griddef.gutterY)
);
item->onResize(
grid->user, i,
screenWidth, screenHeight,
x + gx,y + gy,
gw, gh
);
}
}

77
src/ui/grid.h Normal file
View File

@ -0,0 +1,77 @@
/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include <dawn/dawn.h>
#define BREAKPOINT_COUNT 4
#define GRID_CHILD_COUNT 32
typedef struct {
float width;
} breakpoint_t;
typedef struct {
uint8_t rows;
uint8_t columns;
float gutterX;
float gutterY;
} griddef_t;
typedef void gridchildresizecallback_t(
void *user, int32_t i,
float screenWidth, float screenHeight,
float x, float y,
float width, float height
);
typedef struct {
uint8_t columns;
uint8_t rows;
uint8_t x;
uint8_t y;
} gridchilddef_t;
typedef struct {
gridchilddef_t defs[BREAKPOINT_COUNT];
uint8_t defCount;
gridchildresizecallback_t *onResize;
} gridchild_t;
typedef struct {
griddef_t grids[BREAKPOINT_COUNT];
breakpoint_t breakpoints[BREAKPOINT_COUNT];
gridchild_t children[GRID_CHILD_COUNT];
uint8_t childCount;
float width;
float height;
float x;
float y;
uint8_t breakpointCount;
void *user;
} grid_t;
void gridInit(grid_t *grid);
uint8_t gridAddBreakpoint(
grid_t *grid, float width,
uint8_t rows, uint8_t columns,
float gutterX, float gutterY
);
gridchild_t * gridAddChild(grid_t *grid);
void gridSetSize(grid_t *grid,
float screenWidth, float screenHeight,
float width, float height,
float x, float y
);