k3Menu CSS-style properties
This commit is contained in:
parent
71d75f2aa7
commit
ab903ed4c0
@ -131,6 +131,7 @@ void k3FontDraw(struct k3Font *this, float xStart, float yStart, float sz, const
|
|||||||
struct k3Tex *tex = this->pages[g->page];
|
struct k3Tex *tex = this->pages[g->page];
|
||||||
size_t texW = this->texW;
|
size_t texW = this->texW;
|
||||||
size_t texH = this->texH;
|
size_t texH = this->texH;
|
||||||
|
|
||||||
k3BatchAdd(tex,
|
k3BatchAdd(tex,
|
||||||
(struct k3RectF) {(float) g->x / texW, (float) g->y / texH, (float) g->width / texW, (float) g->height / texH},
|
(struct k3RectF) {(float) g->x / texW, (float) g->y / texH, (float) g->width / texW, (float) g->height / texH},
|
||||||
(struct k3RectF) {
|
(struct k3RectF) {
|
||||||
@ -138,7 +139,7 @@ void k3FontDraw(struct k3Font *this, float xStart, float yStart, float sz, const
|
|||||||
y + ((-g->height - g->yoffset) * this->lineScale + 1) * sz,
|
y + ((-g->height - g->yoffset) * this->lineScale + 1) * sz,
|
||||||
g->width * this->lineScale * sz,
|
g->width * this->lineScale * sz,
|
||||||
g->height * this->lineScale * sz
|
g->height * this->lineScale * sz
|
||||||
}, 0, color);
|
}, 0, color, 0);
|
||||||
|
|
||||||
x += g->xadvance * this->lineScale * sz;
|
x += g->xadvance * this->lineScale * sz;
|
||||||
}
|
}
|
||||||
|
91
src/k3menu.c
91
src/k3menu.c
@ -70,9 +70,30 @@ bool k3MEventSend(struct k3MEvent *ev) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void obj_draw(struct k3MObj *this) {
|
||||||
|
struct k3MProperty *borderRadiusProp = k3MFindProperty(this, k3M_PROP_BORDER_RADIUS, false);
|
||||||
|
float borderRadius = borderRadiusProp ? borderRadiusProp->si[0] : 0;
|
||||||
|
|
||||||
|
struct k3MProperty *bgColorProp = k3MFindProperty(this, k3M_PROP_BG_COLOR, false);
|
||||||
|
vec4 bgColor = {0, 0, 0, 0};
|
||||||
|
if(bgColorProp) {
|
||||||
|
bgColor[0] = bgColorProp->si[0] / 255.0;
|
||||||
|
bgColor[1] = bgColorProp->si[1] / 255.0;
|
||||||
|
bgColor[2] = bgColorProp->si[2] / 255.0;
|
||||||
|
bgColor[3] = bgColorProp->si[3] / 255.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
k3BatchAdd(NULL, (struct k3RectF) {0, 0, 1, 1}, (struct k3RectF) {
|
||||||
|
this->x, this->y,
|
||||||
|
this->w, this->h
|
||||||
|
}, 0, bgColor, borderRadius);
|
||||||
|
}
|
||||||
|
|
||||||
static bool label_draw(struct k3MEvent *ev, uint8_t *ud) {
|
static bool label_draw(struct k3MEvent *ev, uint8_t *ud) {
|
||||||
struct k3MLabel *this = (void*) ev->target;
|
struct k3MLabel *this = (void*) ev->target;
|
||||||
|
|
||||||
|
obj_draw((void*) this);
|
||||||
|
|
||||||
if(this->txt) {
|
if(this->txt) {
|
||||||
k3FontDraw(this->font, this->x, this->y, this->sz, this->txt, (vec4) {1, 1, 1, 1});
|
k3FontDraw(this->font, this->x, this->y, this->sz, this->txt, (vec4) {1, 1, 1, 1});
|
||||||
}
|
}
|
||||||
@ -118,51 +139,29 @@ void k3MAddChild(struct k3MObj *parent, struct k3MObj *child) {
|
|||||||
child->parent = parent;
|
child->parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static struct k3Menu *k3ScreenFuncMouse(struct k3Menu *_, int16_t x, int16_t y, int ev) {
|
void k3MOverrideProperty(struct k3MObj *obj, struct k3MProperty n) {
|
||||||
struct k3Screen *this = (void*) _;
|
struct k3MProperty *o = k3MFindProperty(obj, n.type, true);
|
||||||
|
|
||||||
if(ev == k3_MENU_MOUSE_MOVE) {
|
if(!o) {
|
||||||
struct k3Menu *newHovered = k3ContainerFuncMouse(_, x, y, k3_MENU_MOUSE_TEST);
|
obj->properties = realloc(obj->properties, ++obj->propertyCount * sizeof(*obj->properties));
|
||||||
if(this->hovered != newHovered) {
|
o = &obj->properties[obj->propertyCount - 1];
|
||||||
if(this->hovered && this->hovered->funcmouse) {
|
|
||||||
this->hovered->funcmouse(this->hovered, x, y, k3_MENU_MOUSE_OUT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->hovered = newHovered;
|
memcpy(o, &n, sizeof(n));
|
||||||
|
}
|
||||||
|
|
||||||
if(this->hovered && this->hovered->funcmouse) {
|
struct k3MProperty *k3MFindProperty(struct k3MObj *obj, enum k3MPropertyType t, bool direct) {
|
||||||
this->hovered->funcmouse(this->hovered, x, y, k3_MENU_MOUSE_IN);
|
for(size_t i = 0; i < obj->propertyCount; i++) {
|
||||||
}
|
if(obj->properties[i].type == t) {
|
||||||
} else {
|
return &obj->properties[i];
|
||||||
if(this->hovered && this->hovered->funcmouse) {
|
|
||||||
return this->hovered->funcmouse(this->hovered, x, y, k3_MENU_MOUSE_MOVE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(this->hovered && this->hovered->funcmouse) {
|
if(direct || !obj->parent) {
|
||||||
struct k3Menu *ret = this->hovered->funcmouse(this->hovered, x, y, ev);
|
|
||||||
this->keyboardFocus = ret;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
static void k3ScreenFuncKey(struct k3Menu *_, int key, int action, int modifiers) {
|
|
||||||
struct k3Screen *this = (void*) _;
|
|
||||||
|
|
||||||
if(this->keyboardFocus && this->keyboardFocus->funckey) {
|
|
||||||
this->keyboardFocus->funckey(this->keyboardFocus, key, action, modifiers);
|
|
||||||
}
|
}
|
||||||
|
return k3MFindProperty(obj->parent, t, direct);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void k3ScreenFuncChar(struct k3Menu *_, uint32_t codepoint) {
|
|
||||||
struct k3Screen *this = (void*) _;
|
|
||||||
|
|
||||||
if(this->keyboardFocus && this->keyboardFocus->funcchar) {
|
|
||||||
this->keyboardFocus->funcchar(this->keyboardFocus, codepoint);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
static bool screen_ev(struct k3MEvent *ev, uint8_t *ud) {
|
static bool screen_ev(struct k3MEvent *ev, uint8_t *ud) {
|
||||||
struct k3MScreen *this = (void*) ev->target;
|
struct k3MScreen *this = (void*) ev->target;
|
||||||
|
|
||||||
@ -194,6 +193,12 @@ static bool screen_ev(struct k3MEvent *ev, uint8_t *ud) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(innermost != this->lastHover) {
|
||||||
|
this->lastHover->hovered = false;
|
||||||
|
innermost->hovered = true;
|
||||||
|
this->lastHover = innermost;
|
||||||
|
}
|
||||||
|
|
||||||
if(innermost != (void*) this) {
|
if(innermost != (void*) this) {
|
||||||
|
|
||||||
if(ev->code == k3M_EVENT_MOUSE_PRESS) {
|
if(ev->code == k3M_EVENT_MOUSE_PRESS) {
|
||||||
@ -242,6 +247,8 @@ static bool screen_ev(struct k3MEvent *ev, uint8_t *ud) {
|
|||||||
struct k3MScreen *k3MScreen() {
|
struct k3MScreen *k3MScreen() {
|
||||||
struct k3MScreen *ret = calloc(1, sizeof(*ret));
|
struct k3MScreen *ret = calloc(1, sizeof(*ret));
|
||||||
|
|
||||||
|
ret->lastHover = (void*) ret;
|
||||||
|
|
||||||
k3MRegisterEventHandler(ret, k3M_EVENT_ALL, screen_ev, NULL, 0);
|
k3MRegisterEventHandler(ret, k3M_EVENT_ALL, screen_ev, NULL, 0);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -250,12 +257,9 @@ struct k3MScreen *k3MScreen() {
|
|||||||
static bool textbutton_draw(struct k3MEvent *ev, uint8_t *ud) {
|
static bool textbutton_draw(struct k3MEvent *ev, uint8_t *ud) {
|
||||||
struct k3MTextButton *this = (void*) ev->target;
|
struct k3MTextButton *this = (void*) ev->target;
|
||||||
|
|
||||||
if(this->txt) {
|
obj_draw((void*) this);
|
||||||
k3BatchAdd(NULL, (struct k3RectF) {}, (struct k3RectF) {
|
|
||||||
this->x, this->y,
|
|
||||||
this->w, this->h
|
|
||||||
}, 0, (vec4) {1, 1, 1, 0.2 + 0.1 * this->hovered});
|
|
||||||
|
|
||||||
|
if(this->txt) {
|
||||||
struct k3RectF txtsz;
|
struct k3RectF txtsz;
|
||||||
k3FontSz(this->font, this->sz, this->txt, &txtsz);
|
k3FontSz(this->font, this->sz, this->txt, &txtsz);
|
||||||
|
|
||||||
@ -280,12 +284,9 @@ struct k3MTextButton *k3MTextButton(struct k3Font *font, float sz, const char *t
|
|||||||
static bool textinput_draw(struct k3MEvent *ev, uint8_t *ud) {
|
static bool textinput_draw(struct k3MEvent *ev, uint8_t *ud) {
|
||||||
struct k3MTextInput *this = (void*) ev->target;
|
struct k3MTextInput *this = (void*) ev->target;
|
||||||
|
|
||||||
if(this->txt) {
|
obj_draw((void*) this);
|
||||||
k3BatchAdd(NULL, (struct k3RectF) {}, (struct k3RectF) {
|
|
||||||
this->x, this->y,
|
|
||||||
this->w, this->h
|
|
||||||
}, 0, (vec4) {1, 1, 1, 0.2});
|
|
||||||
|
|
||||||
|
if(this->txt) {
|
||||||
int isPlaceholder = strlen(this->txt) == 0;
|
int isPlaceholder = strlen(this->txt) == 0;
|
||||||
const char *txt = isPlaceholder ? this->placeholder : this->txt;
|
const char *txt = isPlaceholder ? this->placeholder : this->txt;
|
||||||
|
|
||||||
|
20
src/k3menu.h
20
src/k3menu.h
@ -61,6 +61,19 @@ typedef struct k3MEventHandler {
|
|||||||
uint16_t code;
|
uint16_t code;
|
||||||
} k3MEventHandler;
|
} k3MEventHandler;
|
||||||
|
|
||||||
|
enum k3MPropertyType {
|
||||||
|
k3M_PROP_BG_COLOR,
|
||||||
|
k3M_PROP_BORDER_RADIUS,
|
||||||
|
};
|
||||||
|
struct k3MProperty {
|
||||||
|
enum k3MPropertyType type;
|
||||||
|
union {
|
||||||
|
intmax_t si[4];
|
||||||
|
void *ptr;
|
||||||
|
uint8_t buf[32];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
struct k3MObj {
|
struct k3MObj {
|
||||||
struct k3MObj *parent;
|
struct k3MObj *parent;
|
||||||
|
|
||||||
@ -76,6 +89,9 @@ struct k3MObj {
|
|||||||
|
|
||||||
k3MEventHandler *handlers;
|
k3MEventHandler *handlers;
|
||||||
size_t handlerCount;
|
size_t handlerCount;
|
||||||
|
|
||||||
|
struct k3MProperty *properties;
|
||||||
|
size_t propertyCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define k3MenuSetBounds(a, x, y, w, h) k3MenuSetBounds_((struct k3MObj*) (a), (x), (y), (w), (h))
|
#define k3MenuSetBounds(a, x, y, w, h) k3MenuSetBounds_((struct k3MObj*) (a), (x), (y), (w), (h))
|
||||||
@ -89,6 +105,9 @@ bool k3MEventSend(struct k3MEvent *ev);
|
|||||||
int k3MRemoveChild(struct k3MObj *parent, struct k3MObj *child);
|
int k3MRemoveChild(struct k3MObj *parent, struct k3MObj *child);
|
||||||
void k3MAddChild(struct k3MObj *parent, struct k3MObj *child);
|
void k3MAddChild(struct k3MObj *parent, struct k3MObj *child);
|
||||||
|
|
||||||
|
void k3MOverrideProperty(struct k3MObj *obj, struct k3MProperty);
|
||||||
|
struct k3MProperty *k3MFindProperty(struct k3MObj *obj, enum k3MPropertyType, bool direct);
|
||||||
|
|
||||||
struct k3MLabel {
|
struct k3MLabel {
|
||||||
struct k3MObj;
|
struct k3MObj;
|
||||||
|
|
||||||
@ -102,6 +121,7 @@ struct k3MScreen {
|
|||||||
struct k3MObj;
|
struct k3MObj;
|
||||||
|
|
||||||
struct k3MObj *keyboardFocus;
|
struct k3MObj *keyboardFocus;
|
||||||
|
struct k3MObj *lastHover;
|
||||||
};
|
};
|
||||||
struct k3MScreen *k3MScreen();
|
struct k3MScreen *k3MScreen();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user