HelenOS sources
This source file includes following definitions.
- ui_progress_create
- ui_progress_destroy
- ui_progress_ctl
- ui_progress_set_rect
- ui_progress_set_value
- ui_progress_paint_part
- ui_progress_paint
- ui_progress_ctl_destroy
- ui_progress_ctl_paint
- ui_progress_ctl_pos_event
#include <errno.h>
#include <gfx/color.h>
#include <gfx/context.h>
#include <gfx/render.h>
#include <gfx/text.h>
#include <io/pos_event.h>
#include <stdlib.h>
#include <str.h>
#include <ui/control.h>
#include <ui/paint.h>
#include <ui/progress.h>
#include "../private/progress.h"
#include "../private/resource.h"
enum {
progress_box_w = 16,
progress_box_h = 16,
progress_label_margin = 8,
progress_cross_n = 5,
progress_cross_w = 2,
progress_cross_h = 2
};
static void ui_progress_ctl_destroy(void *);
static errno_t ui_progress_ctl_paint(void *);
static ui_evclaim_t ui_progress_ctl_pos_event(void *, pos_event_t *);
ui_control_ops_t ui_progress_ops = {
.destroy = ui_progress_ctl_destroy,
.paint = ui_progress_ctl_paint,
.pos_event = ui_progress_ctl_pos_event
};
errno_t ui_progress_create(ui_resource_t *resource, unsigned value,
ui_progress_t **rprogress)
{
ui_progress_t *progress;
errno_t rc;
progress = calloc(1, sizeof(ui_progress_t));
if (progress == NULL)
return ENOMEM;
rc = ui_control_new(&ui_progress_ops, (void *) progress,
&progress->control);
if (rc != EOK) {
free(progress);
return rc;
}
progress->value = value;
progress->res = resource;
*rprogress = progress;
return EOK;
}
void ui_progress_destroy(ui_progress_t *progress)
{
if (progress == NULL)
return;
ui_control_delete(progress->control);
free(progress);
}
ui_control_t *ui_progress_ctl(ui_progress_t *progress)
{
return progress->control;
}
void ui_progress_set_rect(ui_progress_t *progress, gfx_rect_t *rect)
{
progress->rect = *rect;
}
void ui_progress_set_value(ui_progress_t *progress, unsigned value)
{
progress->value = value;
}
static errno_t ui_progress_paint_part(ui_progress_t *progress,
gfx_rect_t *rect, bool remain)
{
gfx_coord2_t pos;
gfx_text_fmt_t fmt;
errno_t rc;
rc = gfx_set_clip_rect(progress->res->gc, rect);
if (rc != EOK)
return rc;
rc = gfx_set_color(progress->res->gc, remain ?
progress->res->entry_bg_color :
progress->res->entry_sel_text_bg_color);
if (rc != EOK)
goto error;
rc = gfx_fill_rect(progress->res->gc, rect);
if (rc != EOK)
goto error;
pos.x = (progress->rect.p0.x + progress->rect.p1.x) / 2;
pos.y = (progress->rect.p0.y + progress->rect.p1.y) / 2;
gfx_text_fmt_init(&fmt);
fmt.font = progress->res->font;
fmt.color = remain ? progress->res->entry_fg_color :
progress->res->entry_sel_text_fg_color;
fmt.halign = gfx_halign_center;
fmt.valign = gfx_valign_center;
rc = gfx_puttext(&pos, &fmt, "42 %");
if (rc != EOK)
goto error;
rc = gfx_update(progress->res->gc);
if (rc != EOK)
goto error;
return gfx_set_clip_rect(progress->res->gc, NULL);
error:
(void)gfx_set_clip_rect(progress->res->gc, NULL);
return rc;
}
errno_t ui_progress_paint(ui_progress_t *progress)
{
gfx_rect_t inside;
gfx_rect_t part;
errno_t rc;
if (progress->res->textmode) {
inside = progress->rect;
} else {
rc = ui_paint_inset_frame(progress->res, &progress->rect,
&inside);
if (rc != EOK)
goto error;
}
part.p0 = inside.p0;
part.p1.x = (inside.p0.x + inside.p1.x) / 2;
part.p1.y = inside.p1.y;
rc = ui_progress_paint_part(progress, &part, false);
if (rc != EOK)
goto error;
part.p0.x = part.p1.x;
part.p1.x = inside.p1.x;
rc = ui_progress_paint_part(progress, &part, true);
if (rc != EOK)
goto error;
rc = gfx_update(progress->res->gc);
if (rc != EOK)
goto error;
return EOK;
error:
return rc;
}
void ui_progress_ctl_destroy(void *arg)
{
ui_progress_t *progress = (ui_progress_t *) arg;
ui_progress_destroy(progress);
}
errno_t ui_progress_ctl_paint(void *arg)
{
ui_progress_t *progress = (ui_progress_t *) arg;
return ui_progress_paint(progress);
}
ui_evclaim_t ui_progress_ctl_pos_event(void *arg, pos_event_t *event)
{
ui_progress_t *progress = (ui_progress_t *) arg;
(void) progress;
return ui_unclaimed;
}
HelenOS homepage, sources at GitHub