directional resize
This commit is contained in:
parent
e998b6c287
commit
46e6e378d0
@ -180,7 +180,7 @@ int main(void)
|
|||||||
(ug_div_t){.x=SIZE_PX(0), .y=SIZE_PX(0), .w=SIZE_PX(100), .h=SIZE_MM(75.0)});
|
(ug_div_t){.x=SIZE_PX(0), .y=SIZE_PX(0), .w=SIZE_PX(100), .h=SIZE_MM(75.0)});
|
||||||
ug_container_floating(ctx, "better name",
|
ug_container_floating(ctx, "better name",
|
||||||
(ug_div_t){.x=SIZE_PX(-10), .y=SIZE_PT(-16), .w=SIZE_MM(100), .h=SIZE_PX(15)});
|
(ug_div_t){.x=SIZE_PX(-10), .y=SIZE_PT(-16), .w=SIZE_MM(100), .h=SIZE_PX(15)});
|
||||||
|
ug_container_sidebar(ctx, "Sidebar", (ug_size_t)SIZE_PX(300), UG_SIDE_BOTTOM);
|
||||||
ug_frame_end(ctx);
|
ug_frame_end(ctx);
|
||||||
|
|
||||||
// fill background
|
// fill background
|
||||||
|
109
ugui.c
109
ugui.c
@ -13,6 +13,11 @@
|
|||||||
#define DEF_PPI 96.0
|
#define DEF_PPI 96.0
|
||||||
#define STACK_STEP 64
|
#define STACK_STEP 64
|
||||||
|
|
||||||
|
#define RESIZEALL UG_CNT_RESIZE_RIGHT | \
|
||||||
|
UG_CNT_RESIZE_BOTTOM | \
|
||||||
|
UG_CNT_RESIZE_LEFT | \
|
||||||
|
UG_CNT_RESIZE_TOP
|
||||||
|
|
||||||
#define PPI_PPM(ppi, scale) (ppi * scale * 0.03937008)
|
#define PPI_PPM(ppi, scale) (ppi * scale * 0.03937008)
|
||||||
#define PPI_PPD(ppi, scale) (PPI_PPM(ppi, scale) * 0.3528)
|
#define PPI_PPD(ppi, scale) (PPI_PPM(ppi, scale) * 0.3528)
|
||||||
#define IS_VALID_UNIT(u) (u==UG_UNIT_PX||u==UG_UNIT_MM||u==UG_UNIT_PT)
|
#define IS_VALID_UNIT(u) (u==UG_UNIT_PX||u==UG_UNIT_MM||u==UG_UNIT_PT)
|
||||||
@ -357,7 +362,7 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
// be resized from the bottom and right border
|
// be resized from the bottom and right border
|
||||||
// TODO: bring selected container to the top of the stack
|
// TODO: bring selected container to the top of the stack
|
||||||
if (!(ctx->mouse.down_mask & UG_BTN_LEFT) ||
|
if (!(ctx->mouse.down_mask & UG_BTN_LEFT) ||
|
||||||
!(cnt->flags & (UG_CNT_RESIZABLE | UG_CNT_MOVABLE)))
|
!(cnt->flags & (RESIZEALL | UG_CNT_MOVABLE)))
|
||||||
goto cnt_draw;
|
goto cnt_draw;
|
||||||
|
|
||||||
ug_vec2_t mpos = ctx->mouse.pos;
|
ug_vec2_t mpos = ctx->mouse.pos;
|
||||||
@ -365,9 +370,9 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
|
|
||||||
// handle movable windows
|
// handle movable windows
|
||||||
if (cnt->flags & UG_CNT_MOVABLE) {
|
if (cnt->flags & UG_CNT_MOVABLE) {
|
||||||
minx = rca->x;
|
minx = rca->x + bl;
|
||||||
maxx = rca->x + rca->w - br;
|
maxx = rca->x + rca->w - br;
|
||||||
miny = rca->y;
|
miny = rca->y + bt;
|
||||||
maxy = rca->y + bt + hh;
|
maxy = rca->y + bt + hh;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||||
// if a relative container has been moved consider it no
|
// if a relative container has been moved consider it no
|
||||||
@ -384,25 +389,57 @@ static void update_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cnt->flags & UG_CNT_RESIZABLE) {
|
// right border resize
|
||||||
// right border resize
|
if (cnt->flags & UG_CNT_RESIZE_RIGHT) {
|
||||||
minx = rca->x + rca->w - br;
|
minx = rca->x + rca->w - br;
|
||||||
maxx = rca->x + rca->w;
|
maxx = rca->x + rca->w;
|
||||||
miny = rca->y;
|
miny = rca->y;
|
||||||
maxy = rca->y + rca->h;
|
maxy = rca->y + rca->h;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||||
rect->w += ctx->mouse.delta.x;
|
rect->w += ctx->mouse.delta.x;
|
||||||
rca->w += ctx->mouse.delta.x;
|
rca->w += ctx->mouse.delta.x;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// bottom border resize
|
// left border resize
|
||||||
|
if (cnt->flags & UG_CNT_RESIZE_LEFT) {
|
||||||
|
minx = rca->x - bl;
|
||||||
|
maxx = rca->x;
|
||||||
|
miny = rca->y;
|
||||||
|
maxy = rca->y + rca->h;
|
||||||
|
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||||
|
rect->w -= ctx->mouse.delta.x;
|
||||||
|
rca->w -= ctx->mouse.delta.x;
|
||||||
|
|
||||||
|
rect->x += ctx->mouse.delta.x;
|
||||||
|
rca->x += ctx->mouse.delta.x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bottom border resize
|
||||||
|
if (cnt->flags & UG_CNT_RESIZE_BOTTOM) {
|
||||||
minx = rca->x;
|
minx = rca->x;
|
||||||
maxx = rca->x + rca->w;
|
maxx = rca->x + rca->w;
|
||||||
miny = rca->y + rca->h - bb;
|
miny = rca->y + rca->h - bb;
|
||||||
maxy = rca->y + rca->h;
|
maxy = rca->y + rca->h;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||||
rect->h += ctx->mouse.delta.y;
|
rect->h += ctx->mouse.delta.y;
|
||||||
rca->h += ctx->mouse.delta.y;
|
rca->h += ctx->mouse.delta.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// top border resize
|
||||||
|
if (cnt->flags & UG_CNT_RESIZE_TOP) {
|
||||||
|
minx = rca->x;
|
||||||
|
maxx = rca->x + rca->w;
|
||||||
|
miny = rca->y - bt;
|
||||||
|
maxy = rca->y;
|
||||||
|
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
||||||
|
rect->h -= ctx->mouse.delta.y;
|
||||||
|
rca->h -= ctx->mouse.delta.y;
|
||||||
|
|
||||||
|
rect->y += ctx->mouse.delta.y;
|
||||||
|
rca->y += ctx->mouse.delta.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +498,7 @@ int ug_container_floating(ug_ctx_t *ctx, const char *name, ug_div_t div)
|
|||||||
cnt->id = id;
|
cnt->id = id;
|
||||||
cnt->max_size = max_size;
|
cnt->max_size = max_size;
|
||||||
cnt->rect = div_to_rect(ctx, &div);
|
cnt->rect = div_to_rect(ctx, &div);
|
||||||
cnt->flags = UG_CNT_MOVABLE | UG_CNT_RESIZABLE |
|
cnt->flags = UG_CNT_MOVABLE | RESIZEALL |
|
||||||
UG_CNT_SCROLL_X | UG_CNT_SCROLL_Y ;
|
UG_CNT_SCROLL_X | UG_CNT_SCROLL_Y ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,6 +508,60 @@ int ug_container_floating(ug_ctx_t *ctx, const char *name, ug_div_t div)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ug_container_sidebar(ug_ctx_t *ctx, const char *name, ug_size_t size, int side)
|
||||||
|
{
|
||||||
|
TEST_CTX(ctx);
|
||||||
|
|
||||||
|
ug_id_t id = 0;
|
||||||
|
if (name) {
|
||||||
|
id = hash(name, strlen(name));
|
||||||
|
} else {
|
||||||
|
int blob[3] = { size.size.i, size.unit, side};
|
||||||
|
id = hash(blob, sizeof(blob));
|
||||||
|
}
|
||||||
|
|
||||||
|
ug_container_t *cnt = get_container(ctx, id);
|
||||||
|
|
||||||
|
if (cnt->id) {
|
||||||
|
// nothing? maybe we can skip updating all dimensions and stuff
|
||||||
|
} else {
|
||||||
|
cnt->id = id;
|
||||||
|
cnt->max_size = max_size;
|
||||||
|
cnt->flags = UG_CNT_SCROLL_X | UG_CNT_SCROLL_Y;
|
||||||
|
ug_rect_t rect = {0};
|
||||||
|
switch (side) {
|
||||||
|
case UG_SIDE_BOTTOM:
|
||||||
|
cnt->flags |= UG_CNT_RESIZE_TOP;
|
||||||
|
// FIXME: we do not support relative zero position yet
|
||||||
|
rect.y = -1;
|
||||||
|
rect.h = size_to_px(ctx, size);
|
||||||
|
break;
|
||||||
|
case UG_SIDE_TOP:
|
||||||
|
cnt->flags |= UG_CNT_RESIZE_BOTTOM;
|
||||||
|
rect.h = size_to_px(ctx, size);
|
||||||
|
break;
|
||||||
|
case UG_SIDE_RIGHT:
|
||||||
|
cnt->flags |= UG_CNT_RESIZE_LEFT;
|
||||||
|
rect.x = -1;
|
||||||
|
rect.w = size_to_px(ctx, size);
|
||||||
|
break;
|
||||||
|
case UG_SIDE_LEFT:
|
||||||
|
cnt->flags |= UG_CNT_RESIZE_RIGHT;
|
||||||
|
rect.w = size_to_px(ctx, size);
|
||||||
|
break;
|
||||||
|
default: return -1;
|
||||||
|
}
|
||||||
|
cnt->rect = rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_container(ctx, cnt);
|
||||||
|
|
||||||
|
// TODO: change available context space to reflect adding a sidebar
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*=============================================================================*
|
/*=============================================================================*
|
||||||
* Input Handling *
|
* Input Handling *
|
||||||
*=============================================================================*/
|
*=============================================================================*/
|
||||||
|
20
ugui.h
20
ugui.h
@ -39,10 +39,13 @@ typedef struct {
|
|||||||
|
|
||||||
// the container flags
|
// the container flags
|
||||||
enum {
|
enum {
|
||||||
UG_CNT_MOVABLE = BIT(0), // can be moved
|
UG_CNT_MOVABLE = BIT(0), // can be moved
|
||||||
UG_CNT_RESIZABLE = BIT(1), // can be resized
|
UG_CNT_RESIZE_RIGHT = BIT(1), // can be resized
|
||||||
UG_CNT_SCROLL_X = BIT(2), // can have horizontal scrolling
|
UG_CNT_RESIZE_BOTTOM = BIT(2), // can be resized
|
||||||
UG_CNT_SCROLL_Y = BIT(3), // can have vertical scrolling
|
UG_CNT_RESIZE_LEFT = BIT(3), // can be resized
|
||||||
|
UG_CNT_RESIZE_TOP = BIT(4), // can be resized
|
||||||
|
UG_CNT_SCROLL_X = BIT(5), // can have horizontal scrolling
|
||||||
|
UG_CNT_SCROLL_Y = BIT(6), // can have vertical scrolling
|
||||||
};
|
};
|
||||||
|
|
||||||
// style, defines default height, width, color, margins, borders, etc
|
// style, defines default height, width, color, margins, borders, etc
|
||||||
@ -111,6 +114,13 @@ typedef enum {
|
|||||||
UG_CMD_RECT,
|
UG_CMD_RECT,
|
||||||
} ug_cmd_type_t;
|
} ug_cmd_type_t;
|
||||||
|
|
||||||
|
// window side
|
||||||
|
enum {
|
||||||
|
UG_SIDE_TOP = 0,
|
||||||
|
UG_SIDE_BOTTOM,
|
||||||
|
UG_SIDE_LEFT,
|
||||||
|
UG_SIDE_RIGHT,
|
||||||
|
};
|
||||||
|
|
||||||
// mouse buttons
|
// mouse buttons
|
||||||
enum {
|
enum {
|
||||||
@ -196,7 +206,7 @@ int ug_container_popup(ug_ctx_t *ctx, const char *name, ug_rect_t rect);
|
|||||||
// top of the window
|
// top of the window
|
||||||
int ug_container_menu_bar(ug_ctx_t *ctx, const char *name, int height);
|
int ug_container_menu_bar(ug_ctx_t *ctx, const char *name, int height);
|
||||||
// a sidebar is a variable size container anchored to one side of the window
|
// a sidebar is a variable size container anchored to one side of the window
|
||||||
int ug_container_sidebar(ug_ctx_t *ctx, const char *name, int width);
|
int ug_container_sidebar(ug_ctx_t *ctx, const char *name, ug_size_t size, int side);
|
||||||
// a body is a container that scales with the window, sits at it's center and cannot
|
// a body is a container that scales with the window, sits at it's center and cannot
|
||||||
// be resized
|
// be resized
|
||||||
int ug_container_body(ug_ctx_t *ctx, const char *name);
|
int ug_container_body(ug_ctx_t *ctx, const char *name);
|
||||||
|
Loading…
Reference in New Issue
Block a user