better
This commit is contained in:
parent
17a2bc32b8
commit
6d01741426
97
ugui.c
97
ugui.c
@ -257,6 +257,10 @@ static ug_container_t *get_container(ug_ctx_t *ctx, ug_id_t id)
|
||||
// also handle resizing, moving, ect. if allowed by the container
|
||||
static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
{
|
||||
ug_rect_t *rect, *rca;
|
||||
rect = &cnt->rect;
|
||||
rca = &cnt->rca;
|
||||
|
||||
// if the container is new it has never been converted to pixels
|
||||
if (cnt->unit != UG_UNIT_PX) {
|
||||
float scale = 1.0;
|
||||
@ -265,23 +269,23 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
case UG_UNIT_PT: scale = ctx->ppd; break;
|
||||
default: break;
|
||||
}
|
||||
cnt->rect.x = roundf(cnt->rect.fx * scale);
|
||||
cnt->rect.y = roundf(cnt->rect.fy * scale);
|
||||
cnt->rect.w = roundf(cnt->rect.fw * scale);
|
||||
cnt->rect.h = roundf(cnt->rect.fh * scale);
|
||||
rect->x = roundf(rect->fx * scale);
|
||||
rect->y = roundf(rect->fy * scale);
|
||||
rect->w = roundf(rect->fw * scale);
|
||||
rect->h = roundf(rect->fh * scale);
|
||||
|
||||
cnt->unit = UG_UNIT_PX;
|
||||
} else if (ctx->ppi != ctx->last_ppi) {
|
||||
// if the scale has been updated than we need to scale the container
|
||||
// as well
|
||||
float scale = ctx->ppi / ctx->last_ppi;
|
||||
cnt->rect.x = roundf(cnt->rect.x * scale);
|
||||
cnt->rect.y = roundf(cnt->rect.y * scale);
|
||||
cnt->rect.w = roundf(cnt->rect.w * scale);
|
||||
cnt->rect.h = roundf(cnt->rect.h * scale);
|
||||
rect->x = roundf(rect->x * scale);
|
||||
rect->y = roundf(rect->y * scale);
|
||||
rect->w = roundf(rect->w * scale);
|
||||
rect->h = roundf(rect->h * scale);
|
||||
}
|
||||
|
||||
cnt->rca = cnt->rect;
|
||||
*rca = *rect;
|
||||
|
||||
/*
|
||||
* Container style:
|
||||
@ -322,26 +326,20 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
int ch = ctx->size.h;
|
||||
|
||||
// 0 -> take all the space, <0 -> take absolute
|
||||
if (cnt->rect.w < 0) cnt->rca.w = -cnt->rect.w;
|
||||
if (cnt->rect.h < 0) cnt->rca.h = -cnt->rect.h;
|
||||
if (rect->w < 0) rca->w = -rect->w;
|
||||
if (rect->h < 0) rca->h = -rect->h;
|
||||
|
||||
// handle relative position
|
||||
// and move to fit borders
|
||||
if (cnt->rect.w == 0) cnt->rca.w = cw - br - bl;
|
||||
else cnt->rca.w += bl + br;
|
||||
if (cnt->rect.h == 0) cnt->rca.h = ch - bt - bb;
|
||||
else if (cnt->flags & UG_CNT_MOVABLE) cnt->rca.h += hh + 2*bt + bb;
|
||||
else cnt->rca.h += bt + bb;
|
||||
|
||||
|
||||
// the window may have been resized so cap the position to the window size
|
||||
// FIXME: is MAX(cw - bl, 0) better?
|
||||
if (cnt->rect.x > cw) cnt->rca.x = cw;
|
||||
if (cnt->rect.y > ch) cnt->rca.y = ch;
|
||||
if (rect->w == 0) rca->w = cw - br - bl;
|
||||
else rca->w += bl + br;
|
||||
if (rect->h == 0) rca->h = ch - bt - bb;
|
||||
else if (cnt->flags & UG_CNT_MOVABLE) rca->h += hh + 2*bt + bb;
|
||||
else rca->h += bt + bb;
|
||||
|
||||
// <0 -> relative to the right margin
|
||||
if (cnt->rect.x < 0) cnt->rca.x = cw - cnt->rca.w + cnt->rca.x;
|
||||
if (cnt->rect.y < 0) cnt->rca.y = ch - cnt->rca.h + cnt->rca.y;
|
||||
if (rect->x < 0) rca->x = cw - rca->w + rca->x;
|
||||
if (rect->y < 0) rca->y = ch - rca->h + rca->y;
|
||||
|
||||
// if we had focus the frame before, then do shit
|
||||
if (ctx->hover.cnt_last != cnt->id)
|
||||
@ -359,37 +357,44 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
|
||||
// handle movable windows
|
||||
if (cnt->flags & UG_CNT_MOVABLE) {
|
||||
minx = cnt->rca.x;
|
||||
maxx = cnt->rca.x + cnt->rca.w - br;
|
||||
miny = cnt->rca.y;
|
||||
maxy = cnt->rca.y + bt + hh;
|
||||
minx = rca->x;
|
||||
maxx = rca->x + rca->w - br;
|
||||
miny = rca->y;
|
||||
maxy = rca->y + bt + hh;
|
||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||
cnt->rect.x += ctx->mouse.delta.x;
|
||||
cnt->rect.y += ctx->mouse.delta.y;
|
||||
cnt->rca.x += ctx->mouse.delta.x;
|
||||
cnt->rca.y += ctx->mouse.delta.y;
|
||||
// if a relative container has been moved consider it no
|
||||
// longer relative
|
||||
if (rect->x < 0)
|
||||
rect->x = cw + rect->x - rect->w - bl - br;
|
||||
if (rect->y < 0)
|
||||
rect->y = ch + rect->y - rect->h - 2*bt - bb - hh;
|
||||
|
||||
rect->x += ctx->mouse.delta.x;
|
||||
rect->y += ctx->mouse.delta.y;
|
||||
rca->x += ctx->mouse.delta.x;
|
||||
rca->y += ctx->mouse.delta.y;
|
||||
}
|
||||
}
|
||||
|
||||
if (cnt->flags & UG_CNT_RESIZABLE) {
|
||||
// right border resize
|
||||
minx = cnt->rca.x + cnt->rca.w - br;
|
||||
maxx = cnt->rca.x + cnt->rca.w;
|
||||
miny = cnt->rca.y;
|
||||
maxy = cnt->rca.y + cnt->rca.h;
|
||||
minx = rca->x + rca->w - br;
|
||||
maxx = rca->x + rca->w;
|
||||
miny = rca->y;
|
||||
maxy = rca->y + rca->h;
|
||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||
cnt->rect.w += ctx->mouse.delta.x;
|
||||
cnt->rca.w += ctx->mouse.delta.x;
|
||||
rect->w += ctx->mouse.delta.x;
|
||||
rca->w += ctx->mouse.delta.x;
|
||||
}
|
||||
|
||||
// bottom border resize
|
||||
minx = cnt->rca.x;
|
||||
maxx = cnt->rca.x + cnt->rca.w;
|
||||
miny = cnt->rca.y + cnt->rca.h - bb;
|
||||
maxy = cnt->rca.y + cnt->rca.h;
|
||||
minx = rca->x;
|
||||
maxx = rca->x + rca->w;
|
||||
miny = rca->y + rca->h - bb;
|
||||
maxy = rca->y + rca->h;
|
||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||
cnt->rect.h += ctx->mouse.delta.y;
|
||||
cnt->rca.h += ctx->mouse.delta.y;
|
||||
rect->h += ctx->mouse.delta.y;
|
||||
rca->h += ctx->mouse.delta.y;
|
||||
}
|
||||
}
|
||||
|
||||
@ -405,7 +410,7 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
cnt_draw:
|
||||
|
||||
// push outline
|
||||
draw_rect = cnt->rca;
|
||||
draw_rect = *rca;
|
||||
push_rect_command(ctx, &draw_rect, s->cnt.border.color);
|
||||
|
||||
// titlebar
|
||||
@ -418,7 +423,7 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||
}
|
||||
|
||||
// push main body
|
||||
draw_rect = cnt->rca;
|
||||
draw_rect = *rca;
|
||||
draw_rect.x += bl;
|
||||
draw_rect.y += bt;
|
||||
draw_rect.w -= bl + br;
|
||||
|
Loading…
Reference in New Issue
Block a user