Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/slider.c

    r2ab8ab3 r0eca788  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3838#include <gfx/context.h>
    3939#include <gfx/render.h>
     40#include <gfx/text.h>
    4041#include <io/pos_event.h>
    4142#include <stdlib.h>
     
    5758        /** Slider button height */
    5859        ui_slider_btn_h = 23,
     60        /** Slider button width in text mode */
     61        ui_slider_btn_w_text = 3,
     62        /** Slider button height in text mode */
     63        ui_slider_btn_h_text = 1,
    5964        /** Slider button frame thickness */
    6065        ui_slider_btn_frame_thickness = 1,
     
    8388 *
    8489 * @param resource UI resource
    85  * @param caption Caption
    8690 * @param rslider Place to store pointer to new slider
    8791 * @return EOK on success, ENOMEM if out of memory
    8892 */
    89 errno_t ui_slider_create(ui_resource_t *resource, const char *caption,
    90     ui_slider_t **rslider)
     93errno_t ui_slider_create(ui_resource_t *resource, ui_slider_t **rslider)
    9194{
    9295        ui_slider_t *slider;
     
    239242        rect->p0.x = pos.x;
    240243        rect->p0.y = pos.y;
    241         rect->p1.x = pos.x + ui_slider_btn_w;
    242         rect->p1.y = pos.y + ui_slider_btn_h;
     244
     245        if (slider->res->textmode) {
     246                rect->p1.x = pos.x + ui_slider_btn_w_text;
     247                rect->p1.y = pos.y + ui_slider_btn_h_text;
     248        } else {
     249                rect->p1.x = pos.x + ui_slider_btn_w;
     250                rect->p1.y = pos.y + ui_slider_btn_h;
     251        }
    243252}
    244253
     
    251260{
    252261        gfx_coord2_t dims;
     262        gfx_coord_t w;
    253263
    254264        gfx_rect_dims(&slider->rect, &dims);
    255         return dims.x - ui_slider_btn_w;
    256 }
    257 
    258 /** Paint slider.
    259  *
    260  * @param slider Slider
    261  * @return EOK on success or an error code
    262  */
    263 errno_t ui_slider_paint(ui_slider_t *slider)
     265        w = slider->res->textmode ? ui_slider_btn_w_text :
     266            ui_slider_btn_w;
     267        return dims.x - w;
     268}
     269
     270/** Paint slider in graphics mode.
     271 *
     272 * @param slider Slider
     273 * @return EOK on success or an error code
     274 */
     275errno_t ui_slider_paint_gfx(ui_slider_t *slider)
    264276{
    265277        gfx_coord2_t pos;
     
    315327}
    316328
     329/** Paint slider in text mode.
     330 *
     331 * @param slider Slider
     332 * @return EOK on success or an error code
     333 */
     334errno_t ui_slider_paint_text(ui_slider_t *slider)
     335{
     336        gfx_coord2_t pos;
     337        gfx_text_fmt_t fmt;
     338        gfx_coord_t w, i;
     339        char *buf;
     340        const char *gchar;
     341        size_t gcharsz;
     342        errno_t rc;
     343
     344        /* Paint slider groove */
     345
     346        pos = slider->rect.p0;
     347
     348        gfx_text_fmt_init(&fmt);
     349        fmt.font = slider->res->font;
     350        fmt.color = slider->res->wnd_text_color;
     351        fmt.halign = gfx_halign_left;
     352        fmt.valign = gfx_valign_top;
     353
     354        w = slider->rect.p1.x - slider->rect.p0.x;
     355        gchar = "\u2550";
     356        gcharsz = str_size(gchar);
     357
     358        buf = malloc(w * gcharsz + 1);
     359        if (buf == NULL)
     360                return ENOMEM;
     361
     362        for (i = 0; i < w; i++)
     363                str_cpy(buf + i * gcharsz, (w - i) * gcharsz + 1, gchar);
     364        buf[w * gcharsz] = '\0';
     365
     366        rc = gfx_puttext(&pos, &fmt, buf);
     367        free(buf);
     368        if (rc != EOK)
     369                goto error;
     370
     371        /* Paint slider button */
     372
     373        pos.x += slider->pos;
     374
     375        rc = gfx_puttext(&pos, &fmt, "[O]");
     376        if (rc != EOK)
     377                goto error;
     378
     379        rc = gfx_update(slider->res->gc);
     380        if (rc != EOK)
     381                goto error;
     382
     383        return EOK;
     384error:
     385        return rc;
     386}
     387
     388/** Paint slider.
     389 *
     390 * @param slider Slider
     391 * @return EOK on success or an error code
     392 */
     393errno_t ui_slider_paint(ui_slider_t *slider)
     394{
     395        if (slider->res->textmode)
     396                return ui_slider_paint_text(slider);
     397        else
     398                return ui_slider_paint_gfx(slider);
     399}
     400
    317401/** Clear slider button.
    318402 *
     
    324408        gfx_rect_t rect;
    325409        errno_t rc;
     410
     411        /* No need to clear button in text mode */
     412        if (slider->res->textmode)
     413                return EOK;
    326414
    327415        ui_slider_btn_rect(slider, &rect);
     
    440528                ui_slider_update(slider, &pos);
    441529                break;
     530        case POS_DCLICK:
     531                break;
    442532        }
    443533
Note: See TracChangeset for help on using the changeset viewer.