Basic UI system
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user