|
Ivan Mahonin |
b53a5c |
#include "nuklear.h"
|
|
Ivan Mahonin |
b53a5c |
#include "nuklear_internal.h"
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* ===============================================================
|
|
Ivan Mahonin |
b53a5c |
*
|
|
Ivan Mahonin |
b53a5c |
* PROGRESS
|
|
Ivan Mahonin |
b53a5c |
*
|
|
Ivan Mahonin |
b53a5c |
* ===============================================================*/
|
|
Ivan Mahonin |
b53a5c |
NK_LIB nk_size
|
|
Ivan Mahonin |
b53a5c |
nk_progress_behavior(nk_flags *state, struct nk_input *in,
|
|
Ivan Mahonin |
b53a5c |
struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, nk_bool modifiable)
|
|
Ivan Mahonin |
b53a5c |
{
|
|
Ivan Mahonin |
b53a5c |
int left_mouse_down = 0;
|
|
Ivan Mahonin |
b53a5c |
int left_mouse_click_in_cursor = 0;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
nk_widget_state_reset(state);
|
|
Ivan Mahonin |
b53a5c |
if (!in || !modifiable) return value;
|
|
Ivan Mahonin |
b53a5c |
left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down;
|
|
Ivan Mahonin |
b53a5c |
left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in,
|
|
Ivan Mahonin |
b53a5c |
NK_BUTTON_LEFT, cursor, nk_true);
|
|
Ivan Mahonin |
b53a5c |
if (nk_input_is_mouse_hovering_rect(in, r))
|
|
Ivan Mahonin |
b53a5c |
*state = NK_WIDGET_STATE_HOVERED;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
if (in && left_mouse_down && left_mouse_click_in_cursor) {
|
|
Ivan Mahonin |
b53a5c |
if (left_mouse_down && left_mouse_click_in_cursor) {
|
|
Ivan Mahonin |
b53a5c |
float ratio = NK_MAX(0, (float)(in->mouse.pos.x - cursor.x)) / (float)cursor.w;
|
|
Ivan Mahonin |
b53a5c |
value = (nk_size)NK_CLAMP(0, (float)max * ratio, (float)max);
|
|
Ivan Mahonin |
b53a5c |
in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor.x + cursor.w/2.0f;
|
|
Ivan Mahonin |
b53a5c |
*state |= NK_WIDGET_STATE_ACTIVE;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
/* set progressbar widget state */
|
|
Ivan Mahonin |
b53a5c |
if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, r))
|
|
Ivan Mahonin |
b53a5c |
*state |= NK_WIDGET_STATE_ENTERED;
|
|
Ivan Mahonin |
b53a5c |
else if (nk_input_is_mouse_prev_hovering_rect(in, r))
|
|
Ivan Mahonin |
b53a5c |
*state |= NK_WIDGET_STATE_LEFT;
|
|
Ivan Mahonin |
b53a5c |
return value;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
NK_LIB void
|
|
Ivan Mahonin |
b53a5c |
nk_draw_progress(struct nk_command_buffer *out, nk_flags state,
|
|
Ivan Mahonin |
b53a5c |
const struct nk_style_progress *style, const struct nk_rect *bounds,
|
|
Ivan Mahonin |
b53a5c |
const struct nk_rect *scursor, nk_size value, nk_size max)
|
|
Ivan Mahonin |
b53a5c |
{
|
|
Ivan Mahonin |
b53a5c |
const struct nk_style_item *background;
|
|
Ivan Mahonin |
b53a5c |
const struct nk_style_item *cursor;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
NK_UNUSED(max);
|
|
Ivan Mahonin |
b53a5c |
NK_UNUSED(value);
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* select correct colors/images to draw */
|
|
Ivan Mahonin |
b53a5c |
if (state & NK_WIDGET_STATE_ACTIVED) {
|
|
Ivan Mahonin |
b53a5c |
background = &style->active;
|
|
Ivan Mahonin |
b53a5c |
cursor = &style->cursor_active;
|
|
Ivan Mahonin |
b53a5c |
} else if (state & NK_WIDGET_STATE_HOVER){
|
|
Ivan Mahonin |
b53a5c |
background = &style->hover;
|
|
Ivan Mahonin |
b53a5c |
cursor = &style->cursor_hover;
|
|
Ivan Mahonin |
b53a5c |
} else {
|
|
Ivan Mahonin |
b53a5c |
background = &style->normal;
|
|
Ivan Mahonin |
b53a5c |
cursor = &style->cursor_normal;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* draw background */
|
|
Ivan Mahonin |
b53a5c |
switch(background->type) {
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_IMAGE:
|
|
Ivan Mahonin |
b53a5c |
nk_draw_image(out, *bounds, &background->data.image, nk_white);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_NINE_SLICE:
|
|
Ivan Mahonin |
b53a5c |
nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_COLOR:
|
|
Ivan Mahonin |
b53a5c |
nk_fill_rect(out, *bounds, style->rounding, background->data.color);
|
|
Ivan Mahonin |
b53a5c |
nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* draw cursor */
|
|
Ivan Mahonin |
b53a5c |
switch(cursor->type) {
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_IMAGE:
|
|
Ivan Mahonin |
b53a5c |
nk_draw_image(out, *scursor, &cursor->data.image, nk_white);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_NINE_SLICE:
|
|
Ivan Mahonin |
b53a5c |
nk_draw_nine_slice(out, *scursor, &cursor->data.slice, nk_white);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
case NK_STYLE_ITEM_COLOR:
|
|
Ivan Mahonin |
b53a5c |
nk_fill_rect(out, *scursor, style->rounding, cursor->data.color);
|
|
Ivan Mahonin |
b53a5c |
nk_stroke_rect(out, *scursor, style->rounding, style->border, style->border_color);
|
|
Ivan Mahonin |
b53a5c |
break;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
NK_LIB nk_size
|
|
Ivan Mahonin |
b53a5c |
nk_do_progress(nk_flags *state,
|
|
Ivan Mahonin |
b53a5c |
struct nk_command_buffer *out, struct nk_rect bounds,
|
|
Ivan Mahonin |
b53a5c |
nk_size value, nk_size max, nk_bool modifiable,
|
|
Ivan Mahonin |
b53a5c |
const struct nk_style_progress *style, struct nk_input *in)
|
|
Ivan Mahonin |
b53a5c |
{
|
|
Ivan Mahonin |
b53a5c |
float prog_scale;
|
|
Ivan Mahonin |
b53a5c |
nk_size prog_value;
|
|
Ivan Mahonin |
b53a5c |
struct nk_rect cursor;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(style);
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(out);
|
|
Ivan Mahonin |
b53a5c |
if (!out || !style) return 0;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* calculate progressbar cursor */
|
|
Ivan Mahonin |
b53a5c |
cursor.w = NK_MAX(bounds.w, 2 * style->padding.x + 2 * style->border);
|
|
Ivan Mahonin |
b53a5c |
cursor.h = NK_MAX(bounds.h, 2 * style->padding.y + 2 * style->border);
|
|
Ivan Mahonin |
b53a5c |
cursor = nk_pad_rect(bounds, nk_vec2(style->padding.x + style->border, style->padding.y + style->border));
|
|
Ivan Mahonin |
b53a5c |
prog_scale = (float)value / (float)max;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* update progressbar */
|
|
Ivan Mahonin |
b53a5c |
prog_value = NK_MIN(value, max);
|
|
Ivan Mahonin |
b53a5c |
prog_value = nk_progress_behavior(state, in, bounds, cursor,max, prog_value, modifiable);
|
|
Ivan Mahonin |
b53a5c |
cursor.w = cursor.w * prog_scale;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
/* draw progressbar */
|
|
Ivan Mahonin |
b53a5c |
if (style->draw_begin) style->draw_begin(out, style->userdata);
|
|
Ivan Mahonin |
b53a5c |
nk_draw_progress(out, *state, style, &bounds, &cursor, value, max);
|
|
Ivan Mahonin |
b53a5c |
if (style->draw_end) style->draw_end(out, style->userdata);
|
|
Ivan Mahonin |
b53a5c |
return prog_value;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
NK_API nk_bool
|
|
Ivan Mahonin |
b53a5c |
nk_progress(struct nk_context *ctx, nk_size *cur, nk_size max, nk_bool is_modifyable)
|
|
Ivan Mahonin |
b53a5c |
{
|
|
Ivan Mahonin |
b53a5c |
struct nk_window *win;
|
|
Ivan Mahonin |
b53a5c |
struct nk_panel *layout;
|
|
Ivan Mahonin |
b53a5c |
const struct nk_style *style;
|
|
Ivan Mahonin |
b53a5c |
struct nk_input *in;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
struct nk_rect bounds;
|
|
Ivan Mahonin |
b53a5c |
enum nk_widget_layout_states state;
|
|
Ivan Mahonin |
b53a5c |
nk_size old_value;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(ctx);
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(cur);
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(ctx->current);
|
|
Ivan Mahonin |
b53a5c |
NK_ASSERT(ctx->current->layout);
|
|
Ivan Mahonin |
b53a5c |
if (!ctx || !ctx->current || !ctx->current->layout || !cur)
|
|
Ivan Mahonin |
b53a5c |
return 0;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
win = ctx->current;
|
|
Ivan Mahonin |
b53a5c |
style = &ctx->style;
|
|
Ivan Mahonin |
b53a5c |
layout = win->layout;
|
|
Ivan Mahonin |
b53a5c |
state = nk_widget(&bounds, ctx);
|
|
Ivan Mahonin |
b53a5c |
if (!state) return 0;
|
|
Ivan Mahonin |
b53a5c |
|
|
Ivan Mahonin |
b53a5c |
in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
|
|
Ivan Mahonin |
b53a5c |
old_value = *cur;
|
|
Ivan Mahonin |
b53a5c |
*cur = nk_do_progress(&ctx->last_widget_state, &win->buffer, bounds,
|
|
Ivan Mahonin |
b53a5c |
*cur, max, is_modifyable, &style->progress, in);
|
|
Ivan Mahonin |
b53a5c |
return (*cur != old_value);
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
NK_API nk_size
|
|
Ivan Mahonin |
b53a5c |
nk_prog(struct nk_context *ctx, nk_size cur, nk_size max, nk_bool modifyable)
|
|
Ivan Mahonin |
b53a5c |
{
|
|
Ivan Mahonin |
b53a5c |
nk_progress(ctx, &cur, max, modifyable);
|
|
Ivan Mahonin |
b53a5c |
return cur;
|
|
Ivan Mahonin |
b53a5c |
}
|
|
Ivan Mahonin |
b53a5c |
|