Basic UI system

This commit is contained in:
2023-12-21 15:27:49 +01:00
parent 70cc2eae8c
commit 569294f292
5 changed files with 552 additions and 67 deletions

View File

@@ -5,11 +5,16 @@
#include <raylib.h>
typedef u32 BzUIFlags;
typedef u32 BzUIKey;
typedef enum BzUISizeKind {
BZ_UI_SIZE_NULL,
BZ_UI_SIZE_PIXELS,
BZ_UI_SIZE_FIT,
BZ_UI_SIZE_REL_PARENT,
BZ_UI_SIZE_PARENT_PERCENT,
BZ_UI_SIZE_CHILD_SUM,
BZ_UI_SIZE_CHILD_MAX,
} BzUISizeKind;
typedef struct BzUISize {
@@ -17,59 +22,94 @@ typedef struct BzUISize {
f32 value;
} BzUISize;
typedef enum BzUILayoutType {
BZ_UI_LAYOUT_NONE,
BZ_UI_LAYOUT_UNIDIR,
BZ_UI_LAYOUT_FLEX_BOX
} BzUILayoutType;
enum {
// UNIDIRECTIONAL
BZ_UI_UNIDIR_NONE = 0,
BZ_UI_UNIDIR_ROW = (1 << 0),
BZ_UI_UNIDIR_COLUMN = (1 << 1),
BZ_UI_UNIDIR_WRAP = (1 << 2),
// FLEX BOX
BZ_UI_FLEX_NONE = 0,
BZ_UI_FLEX_DIR_ROW = (1 << 0),
BZ_UI_FLEX_DIR_COLUMN = (1 << 1),
BZ_UI_FLEX_ALIGN_START = (1 << 2),
BZ_UI_FLEX_ALIGN_CENTER = (1 << 3),
BZ_UI_FLEX_ALIGN_END = (1 << 4),
BZ_UI_FLEX_JUSTIFY_START = (1 << 5),
BZ_UI_FLEX_JUSTIFY_CENTER = (1 << 6),
BZ_UI_FLEX_JUSTIFY_END = (1 << 7)
};
typedef struct BzUILayout {
BzUILayoutType type;
BzUIFlags flags;
} BzUILayout;
typedef struct BzUIStyle {
i32 fontSize;
i32 borderWidth;
Color textColor;
Color textHoverColor;
Color textActiveColor;
Color bgColor;
Color bgHoverColor;
Color bgActiveColor;
Color borderColor;
Color borderHoverColor;
Color borderActiveColor;
} BzUIStyle;
typedef enum BzUIAxis {
BZ_UI_AXIS_X,
BZ_UI_AXIS_Y,
BZ_UI_AXIS_COUNT,
} BzUIAxis;
typedef u32 BzUIWidgetFlags;
enum {
BZ_UI_WIDGET_CLICKABLE = (1 << 0),
BZ_UI_WIDGET_VIEW_SCROLL = (1 << 1),
BZ_UI_WIDGET_DRAW_TEXT = (1 << 2),
BZ_UI_WIDGET_DRAW_BORDER = (1 << 3),
BZ_UI_WIDGET_NONE = 0,
BZ_UI_WIDGET_CLICKABLE = (1 << 0),
BZ_UI_WIDGET_DRAW_TEXT = (1 << 1),
BZ_UI_WIDGET_DRAW_BORDER = (1 << 2),
BZ_UI_WIDGET_DRAW_BACKGROUND = (1 << 3),
//BZ_UI_WIDGET_DRAW_SPRITE = (1 << 4),
BZ_UI_WIDGET_ALIGN_HORIZ_START = (1 << 5),
BZ_UI_WIDGET_ALIGN_HORIZ_CENTER = (1 << 6),
BZ_UI_WIDGET_ALIGN_HORIZ_END = (1 << 7),
BZ_UI_WIDGET_ALIGN_VERT_START = (1 << 8),
BZ_UI_WIDGET_ALIGN_VERT_CENTER = (1 << 9),
BZ_UI_WIDGET_ALIGN_VERT_END = (1 << 10),
BZ_UI_WIDGET_ALIGN_CENTER = BZ_UI_WIDGET_ALIGN_HORIZ_CENTER | BZ_UI_WIDGET_ALIGN_VERT_CENTER,
};
typedef u32 BzUIKey;
typedef struct BzUIWidget BzUIWidget;
typedef struct BzUIWidget {
BzUIWidget *first;
BzUIWidget *last;
BzUIWidget *next;
BzUIWidget *prev;
BzUIWidget *parent;
typedef struct BzUINode BzUINode;
// Key+generation info
BzUIKey key;
u64 lastFrameTouchedIndex;
typedef struct BzUIInteraction {
bool pressed : 1;
bool down : 1;
bool released : 1;
bool clicked : 1;
//bool dragging : 1;
bool hovering : 1;
} BzUIInteraction;
// Per-frame info provided by builders
BzUIWidgetFlags flags;
typedef struct BzUINodeDesc {
BzUIFlags flags;
const char *string;
BzUIKey key;
BzUISize semanticSize[BZ_UI_AXIS_COUNT];
// recomputed every frame
f32 computedRelPosition[BZ_UI_AXIS_COUNT];
f32 computedSize[BZ_UI_AXIS_COUNT];
Rectangle rect;
} BzUIWidget;
typedef struct BzUIResult {
BzUIWidget *widget;
bool pressed;
bool released;
//bool dragging;
bool hovering;
} BzUIResult;
typedef struct BzUIWidgetDesc {
BzUIWidgetFlags flags;
const char *string;
BzUIKey key;
} BzUIWidgetDesc;
BzUILayout layout;
BzUIStyle style;
} BzUINodeDesc;
typedef struct BzUI BzUI;
@@ -84,15 +124,20 @@ void bzUIEnd(BzUI *ui);
// Widget construction
BzUIWidget *bzUIWidgetMake(const BzUIWidgetDesc *desc);
BzUINode *bzUINodeMake(BzUI *ui, const BzUINodeDesc *desc);
BzUIWidget *bzUIPushParent(BzUIWidget *widget);
BzUIWidget *bzUIPopParent();
BzUINode *bzUIPushParent(BzUI *ui, BzUINode *node);
BzUINode *bzUIPopParent(BzUI *ui);
BzUIResult bzUIGetResult(BzUIWidget *widget);
// Widget layout
void bzUIPushLayout(BzUI *ui, BzUILayout layout);
void bzUIPopLayout(BzUI *ui);
// Widget interaction
BzUIInteraction bzUIGetInteraction(BzUI *ui, BzUINode *node);
// UI
bool bzUIButton(const char *string);
bool bzUIButton(BzUI *ui, const char *string, BzUIStyle *style);
#endif //BREEZE_UI_CORE_H