source: mainline/uspace/lib/ui/src/scrollbar.c@ 5ef85c0

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5ef85c0 was 5ef85c0, checked in by Jiri Svoboda <jiri@…>, 4 years ago

Scrollbar unit tests

  • Property mode set to 100644
File size: 18.7 KB
Line 
1/*
2 * Copyright (c) 2022 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libui
30 * @{
31 */
32/**
33 * @file Scrollbar
34 */
35
36#include <errno.h>
37#include <gfx/color.h>
38#include <gfx/context.h>
39#include <gfx/render.h>
40#include <gfx/text.h>
41#include <io/pos_event.h>
42#include <stdlib.h>
43#include <str.h>
44#include <ui/control.h>
45#include <ui/paint.h>
46#include <ui/pbutton.h>
47#include <ui/scrollbar.h>
48#include "../private/resource.h"
49#include "../private/scrollbar.h"
50
51enum {
52 /** Scrollbar button width */
53 ui_scrollbar_btn_len = 20,
54 /** Scrollbar button width in text mode */
55 ui_scrollbar_btn_len_text = 1,
56 /** Scrollbar thumb frame thickness */
57 ui_scrollbar_thumb_frame_thickness = 1,
58 /** Scrollbar thumb bevel width */
59 ui_scrollbar_thumb_bevel_width = 2,
60 /** Scrollbar default thumb length */
61 ui_scrollbar_def_thumb_len = 20,
62 /** Scrollbar default thumb length in text mode */
63 ui_scrollbar_def_thumb_len_text = 1,
64 /** Scrollbar minimum thumb length */
65 ui_scrollbar_min_thumb_len = 10,
66 /** Scrollbar minimum thumb length in text mode */
67 ui_scrollbar_min_thumb_len_text = 1,
68};
69
70static void ui_scrollbar_btn_up_clicked(ui_pbutton_t *, void *);
71static void ui_scrollbar_btn_down_clicked(ui_pbutton_t *, void *);
72static void ui_scrollbar_ctl_destroy(void *);
73static errno_t ui_scrollbar_ctl_paint(void *);
74static ui_evclaim_t ui_scrollbar_ctl_pos_event(void *, pos_event_t *);
75
76ui_pbutton_cb_t ui_scrollbar_btn_up_cb = {
77 .clicked = ui_scrollbar_btn_up_clicked
78};
79
80ui_pbutton_cb_t ui_scrollbar_btn_down_cb = {
81 .clicked = ui_scrollbar_btn_down_clicked
82};
83
84/** Scrollbar control ops */
85ui_control_ops_t ui_scrollbar_ops = {
86 .destroy = ui_scrollbar_ctl_destroy,
87 .paint = ui_scrollbar_ctl_paint,
88 .pos_event = ui_scrollbar_ctl_pos_event
89};
90
91/** Create new scrollbar.
92 *
93 * @param resource UI resource
94 * @param rscrollbar Place to store pointer to new scrollbar
95 * @return EOK on success, ENOMEM if out of memory
96 */
97errno_t ui_scrollbar_create(ui_resource_t *resource,
98 ui_scrollbar_t **rscrollbar)
99{
100 ui_scrollbar_t *scrollbar;
101 errno_t rc;
102
103 scrollbar = calloc(1, sizeof(ui_scrollbar_t));
104 if (scrollbar == NULL)
105 return ENOMEM;
106
107 rc = ui_control_new(&ui_scrollbar_ops, (void *) scrollbar,
108 &scrollbar->control);
109 if (rc != EOK) {
110 free(scrollbar);
111 return rc;
112 }
113
114 rc = ui_pbutton_create(resource, resource->textmode ? "\u25c4" : "<",
115 &scrollbar->btn_up);
116 if (rc != EOK)
117 goto error;
118
119 ui_pbutton_set_cb(scrollbar->btn_up, &ui_scrollbar_btn_up_cb,
120 (void *) scrollbar);
121
122 rc = ui_pbutton_create(resource, resource->textmode ? "\u25ba" : ">",
123 &scrollbar->btn_down);
124 if (rc != EOK)
125 goto error;
126
127 ui_pbutton_set_cb(scrollbar->btn_down, &ui_scrollbar_btn_down_cb,
128 (void *) scrollbar);
129
130 scrollbar->thumb_len = resource->textmode ?
131 ui_scrollbar_def_thumb_len_text :
132 ui_scrollbar_def_thumb_len;
133
134 scrollbar->res = resource;
135 *rscrollbar = scrollbar;
136 return EOK;
137error:
138 ui_scrollbar_destroy(scrollbar);
139 return rc;
140}
141
142/** Destroy scrollbar.
143 *
144 * @param scrollbar Scrollbar or @c NULL
145 */
146void ui_scrollbar_destroy(ui_scrollbar_t *scrollbar)
147{
148 if (scrollbar == NULL)
149 return;
150
151 ui_pbutton_destroy(scrollbar->btn_up);
152 ui_pbutton_destroy(scrollbar->btn_down);
153 ui_control_delete(scrollbar->control);
154 free(scrollbar);
155}
156
157/** Get base control from scrollbar.
158 *
159 * @param scrollbar Scrollbar
160 * @return Control
161 */
162ui_control_t *ui_scrollbar_ctl(ui_scrollbar_t *scrollbar)
163{
164 return scrollbar->control;
165}
166
167/** Set scrollbar callbacks.
168 *
169 * @param scrollbar Scrollbar
170 * @param cb Scrollbar callbacks
171 * @param arg Callback argument
172 */
173void ui_scrollbar_set_cb(ui_scrollbar_t *scrollbar, ui_scrollbar_cb_t *cb, void *arg)
174{
175 scrollbar->cb = cb;
176 scrollbar->arg = arg;
177}
178
179/** Set scrollbar rectangle.
180 *
181 * @param scrollbar Scrollbar
182 * @param rect New scrollbar rectangle
183 */
184void ui_scrollbar_set_rect(ui_scrollbar_t *scrollbar, gfx_rect_t *rect)
185{
186 ui_scrollbar_geom_t geom;
187
188 scrollbar->rect = *rect;
189
190 ui_scrollbar_get_geom(scrollbar, &geom);
191 ui_pbutton_set_rect(scrollbar->btn_up, &geom.up_btn_rect);
192 ui_pbutton_set_rect(scrollbar->btn_down, &geom.down_btn_rect);
193}
194
195/** Paint outer thumb frame.
196 *
197 * @param scrollbar Scrollbar
198 * @return EOK on success or an error code
199 */
200static errno_t ui_scrollbar_paint_thumb_frame(ui_resource_t *res, gfx_rect_t *rect,
201 gfx_coord_t thickness, gfx_rect_t *inside)
202{
203 gfx_rect_t drect;
204 errno_t rc;
205
206 rc = gfx_set_color(res->gc, res->btn_frame_color);
207 if (rc != EOK)
208 goto error;
209
210 drect.p0.x = rect->p0.x + 1;
211 drect.p0.y = rect->p0.y;
212 drect.p1.x = rect->p1.x - 1;
213 drect.p1.y = rect->p0.y + thickness;
214 rc = gfx_fill_rect(res->gc, &drect);
215 if (rc != EOK)
216 goto error;
217
218 drect.p0.x = rect->p0.x + 1;
219 drect.p0.y = rect->p1.y - thickness;
220 drect.p1.x = rect->p1.x - 1;
221 drect.p1.y = rect->p1.y;
222 rc = gfx_fill_rect(res->gc, &drect);
223 if (rc != EOK)
224 goto error;
225
226 drect.p0.x = rect->p0.x;
227 drect.p0.y = rect->p0.y + 1;
228 drect.p1.x = rect->p0.x + thickness;
229 drect.p1.y = rect->p1.y - 1;
230 rc = gfx_fill_rect(res->gc, &drect);
231 if (rc != EOK)
232 goto error;
233
234 drect.p0.x = rect->p1.x - thickness;
235 drect.p0.y = rect->p0.y + 1;
236 drect.p1.x = rect->p1.x;
237 drect.p1.y = rect->p1.y - 1;
238 rc = gfx_fill_rect(res->gc, &drect);
239 if (rc != EOK)
240 goto error;
241
242 if (inside != NULL) {
243 inside->p0.x = rect->p0.x + thickness;
244 inside->p0.y = rect->p0.y + thickness;
245 inside->p1.x = rect->p1.x - thickness;
246 inside->p1.y = rect->p1.y - thickness;
247 }
248
249 return EOK;
250error:
251 return rc;
252}
253
254/** Paint outset scrollbar bevel.
255 *
256 * @param scrollbar Scrollbar
257 * @return EOK on success or an error code
258 */
259static errno_t ui_scrollbar_paint_outset(ui_scrollbar_t *scrollbar,
260 gfx_rect_t *rect, gfx_rect_t *inside)
261{
262 return ui_paint_bevel(scrollbar->res->gc, rect,
263 scrollbar->res->btn_highlight_color,
264 scrollbar->res->btn_shadow_color, ui_scrollbar_thumb_bevel_width, inside);
265}
266
267/** Determine scrollbar thumb rectagle.
268 *
269 * @param scrollbar Scrollbar
270 */
271static void ui_scrollbar_thumb_rect(ui_scrollbar_t *scrollbar, gfx_rect_t *rect)
272{
273 ui_scrollbar_geom_t geom;
274
275 ui_scrollbar_get_geom(scrollbar, &geom);
276 *rect = geom.thumb_rect;
277}
278
279/** Determine scrollbar through length.
280 *
281 * Return the size of the space within which the thumb can move
282 * (without subtracting the length of the thumb).
283 *
284 * @param scrollbar Scrollbar
285 * @return Scrollbar through length in pixels
286 */
287gfx_coord_t ui_scrollbar_through_length(ui_scrollbar_t *scrollbar)
288{
289 gfx_coord2_t dims;
290 gfx_coord_t w;
291
292 gfx_rect_dims(&scrollbar->rect, &dims);
293 w = scrollbar->res->textmode ? ui_scrollbar_btn_len_text :
294 ui_scrollbar_btn_len;
295 return dims.x - 2 * w;
296}
297
298/** Determine scrollbar move length.
299 *
300 * Return the maximum distance the thumb can move.
301 *
302 * @param scrollbar Scrollbar
303 * @return Scrollbar move length in pixels
304 */
305gfx_coord_t ui_scrollbar_move_length(ui_scrollbar_t *scrollbar)
306{
307 return ui_scrollbar_through_length(scrollbar) -
308 scrollbar->thumb_len;
309}
310
311/** Set scrollbar thumb length.
312 *
313 * @param scrollbar Scrollbar
314 * @param len Thumb length in pixels
315 */
316void ui_scrollbar_set_thumb_length(ui_scrollbar_t *scrollbar, gfx_coord_t len)
317{
318 gfx_coord_t min_len;
319 gfx_coord_t max_len;
320
321 min_len = scrollbar->res->textmode ?
322 ui_scrollbar_min_thumb_len_text :
323 ui_scrollbar_min_thumb_len;
324
325 max_len = ui_scrollbar_through_length(scrollbar);
326 if (len < min_len)
327 len = min_len;
328 if (len > max_len)
329 len = max_len;
330
331 if (len != scrollbar->thumb_len) {
332 (void) ui_scrollbar_thumb_clear(scrollbar);
333 scrollbar->thumb_len = len;
334 (void) ui_scrollbar_paint(scrollbar);
335 }
336}
337
338/** Get scrollbar thumb position.
339 *
340 * @param scrollbar Scrollbar
341 * @return Scrollbar thumb position in pixels
342 */
343gfx_coord_t ui_scrollbar_get_pos(ui_scrollbar_t *scrollbar)
344{
345 return scrollbar->pos;
346}
347
348/** Set scrollbar thumb position.
349 *
350 * The position is clipped to the allowed range.
351 *
352 * @param scrollbar Scrollbar
353 * @parap pos Scrollbar thumb position in pixels
354 */
355void ui_scrollbar_set_pos(ui_scrollbar_t *scrollbar, gfx_coord_t pos)
356{
357 gfx_coord_t length;
358
359 length = ui_scrollbar_move_length(scrollbar);
360 if (pos < 0)
361 pos = 0;
362 if (pos > length)
363 pos = length;
364
365 if (pos != scrollbar->pos) {
366 (void) ui_scrollbar_thumb_clear(scrollbar);
367 scrollbar->pos = pos;
368 (void) ui_scrollbar_paint(scrollbar);
369 ui_scrollbar_moved(scrollbar, pos);
370 }
371}
372
373/** Paint scrollbar in graphics mode.
374 *
375 * @param scrollbar Scrollbar
376 * @return EOK on success or an error code
377 */
378errno_t ui_scrollbar_paint_gfx(ui_scrollbar_t *scrollbar)
379{
380 ui_scrollbar_geom_t geom;
381 gfx_rect_t brect;
382 gfx_rect_t irect;
383 errno_t rc;
384
385 ui_scrollbar_get_geom(scrollbar, &geom);
386
387 /* Paint scrollbar frame */
388
389 rc = ui_paint_inset_frame(scrollbar->res, &scrollbar->rect, NULL);
390 if (rc != EOK)
391 goto error;
392
393 /* Paint scrollbar through */
394
395 rc = gfx_set_color(scrollbar->res->gc,
396 scrollbar->res->sbar_through_color);
397 if (rc != EOK)
398 goto error;
399
400 rc = gfx_fill_rect(scrollbar->res->gc, &geom.through_rect);
401 if (rc != EOK)
402 goto error;
403
404 /* Paint scrollbar thumb */
405
406 rc = ui_scrollbar_paint_thumb_frame(scrollbar->res, &geom.thumb_rect,
407 ui_scrollbar_thumb_frame_thickness, &brect);
408 if (rc != EOK)
409 goto error;
410
411 rc = ui_scrollbar_paint_outset(scrollbar, &brect, &irect);
412 if (rc != EOK)
413 goto error;
414
415 rc = gfx_set_color(scrollbar->res->gc, scrollbar->res->btn_face_color);
416 if (rc != EOK)
417 goto error;
418
419 rc = gfx_fill_rect(scrollbar->res->gc, &irect);
420 if (rc != EOK)
421 goto error;
422
423 rc = ui_pbutton_paint(scrollbar->btn_up);
424 if (rc != EOK)
425 goto error;
426
427 rc = ui_pbutton_paint(scrollbar->btn_down);
428 if (rc != EOK)
429 goto error;
430
431 rc = gfx_update(scrollbar->res->gc);
432 if (rc != EOK)
433 goto error;
434
435 return EOK;
436error:
437 return rc;
438}
439
440/** Paint scrollbar in text mode.
441 *
442 * @param scrollbar Scrollbar
443 * @return EOK on success or an error code
444 */
445errno_t ui_scrollbar_paint_text(ui_scrollbar_t *scrollbar)
446{
447 gfx_coord2_t pos;
448 gfx_text_fmt_t fmt;
449 gfx_coord_t w, i;
450 char *buf;
451 const char *gchar;
452 size_t gcharsz;
453 errno_t rc;
454
455 /* Paint scrollbar through */
456
457 pos = scrollbar->rect.p0;
458 pos.x += ui_scrollbar_btn_len_text;
459
460 gfx_text_fmt_init(&fmt);
461 fmt.font = scrollbar->res->font;
462 fmt.color = scrollbar->res->sbar_through_color;
463 fmt.halign = gfx_halign_left;
464 fmt.valign = gfx_valign_top;
465
466 w = scrollbar->rect.p1.x - scrollbar->rect.p0.x -
467 2 * ui_scrollbar_btn_len_text;
468 assert(w >= 0);
469 if (w < 0)
470 return EINVAL;
471
472 gchar = "\u2592";
473 gcharsz = str_size(gchar);
474
475 buf = malloc(w * gcharsz + 1);
476 if (buf == NULL)
477 return ENOMEM;
478
479 for (i = 0; i < w; i++)
480 str_cpy(buf + i * gcharsz, (w - i) * gcharsz + 1, gchar);
481 buf[w * gcharsz] = '\0';
482
483 rc = gfx_puttext(&pos, &fmt, buf);
484 free(buf);
485 if (rc != EOK)
486 goto error;
487
488 /* Paint scrollbar thumb */
489
490 pos.x += scrollbar->pos;
491
492 gchar = "\u25a0";
493 gcharsz = str_size(gchar);
494 w = scrollbar->thumb_len;
495
496 buf = malloc(w * gcharsz + 1);
497 if (buf == NULL)
498 return ENOMEM;
499
500 for (i = 0; i < w; i++)
501 str_cpy(buf + i * gcharsz, (w - i) * gcharsz + 1, gchar);
502 buf[w * gcharsz] = '\0';
503
504 rc = gfx_puttext(&pos, &fmt, buf);
505 free(buf);
506 if (rc != EOK)
507 goto error;
508
509 rc = ui_pbutton_paint(scrollbar->btn_up);
510 if (rc != EOK)
511 goto error;
512
513 rc = ui_pbutton_paint(scrollbar->btn_down);
514 if (rc != EOK)
515 goto error;
516
517 rc = gfx_update(scrollbar->res->gc);
518 if (rc != EOK)
519 goto error;
520
521 return EOK;
522error:
523 return rc;
524}
525
526/** Paint scrollbar.
527 *
528 * @param scrollbar Scrollbar
529 * @return EOK on success or an error code
530 */
531errno_t ui_scrollbar_paint(ui_scrollbar_t *scrollbar)
532{
533 if (scrollbar->res->textmode)
534 return ui_scrollbar_paint_text(scrollbar);
535 else
536 return ui_scrollbar_paint_gfx(scrollbar);
537}
538
539/** Get scrollbar geometry.
540 *
541 * @param scrollbar Scrollbar
542 * @param geom Structure to fill in with computed geometry
543 */
544void ui_scrollbar_get_geom(ui_scrollbar_t *scrollbar, ui_scrollbar_geom_t *geom)
545{
546 gfx_coord_t btn_len;
547 gfx_rect_t orect;
548 gfx_rect_t irect;
549
550 if (scrollbar->res->textmode) {
551 btn_len = ui_scrollbar_btn_len_text;
552 } else {
553 btn_len = ui_scrollbar_btn_len;
554 }
555
556 if (scrollbar->res->textmode) {
557 irect = scrollbar->rect;
558 orect = scrollbar->rect;
559 } else {
560 ui_paint_get_inset_frame_inside(scrollbar->res,
561 &scrollbar->rect, &irect);
562 ui_paint_get_bevel_inside(scrollbar->res->gc,
563 &scrollbar->rect, 1, &orect);
564 }
565
566 /* Up button */
567 geom->up_btn_rect.p0.x = orect.p0.x;
568 geom->up_btn_rect.p0.y = orect.p0.y;
569 geom->up_btn_rect.p1.x = orect.p0.x + btn_len;
570 geom->up_btn_rect.p1.y = orect.p1.y;
571
572 /* Through */
573 geom->through_rect.p0.x = geom->up_btn_rect.p1.x;
574 geom->through_rect.p0.y = irect.p0.y;
575 geom->through_rect.p1.x = orect.p1.x - btn_len;
576 geom->through_rect.p1.y = irect.p1.y;
577
578 /* Thumb */
579 geom->thumb_rect.p0.x = geom->up_btn_rect.p1.x + scrollbar->pos;
580 geom->thumb_rect.p0.y = orect.p0.y;
581 geom->thumb_rect.p1.x = geom->thumb_rect.p0.x + scrollbar->thumb_len;
582 geom->thumb_rect.p1.y = orect.p1.y;
583
584 /* Down button */
585 geom->down_btn_rect.p0.x = geom->through_rect.p1.x;
586 geom->down_btn_rect.p0.y = orect.p0.y;
587 geom->down_btn_rect.p1.x = orect.p1.x;
588 geom->down_btn_rect.p1.y = orect.p1.y;
589}
590
591/** Clear scrollbar thumb.
592 *
593 * @param scrollbar Scrollbar
594 * @return EOK on success or an error code
595 */
596errno_t ui_scrollbar_thumb_clear(ui_scrollbar_t *scrollbar)
597{
598 gfx_rect_t rect;
599 errno_t rc;
600
601 /* No need to clear thumb in text mode */
602 if (scrollbar->res->textmode)
603 return EOK;
604
605 ui_scrollbar_thumb_rect(scrollbar, &rect);
606
607 rc = gfx_set_color(scrollbar->res->gc, scrollbar->res->wnd_face_color);
608 if (rc != EOK)
609 goto error;
610
611 rc = gfx_fill_rect(scrollbar->res->gc, &rect);
612 if (rc != EOK)
613 goto error;
614
615 return EOK;
616error:
617 return rc;
618}
619
620/** Press down scrollbar.
621 *
622 * @param scrollbar Scrollbar
623 * @param pos Pointer position
624 */
625void ui_scrollbar_press(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
626{
627 if (scrollbar->held)
628 return;
629
630 scrollbar->held = true;
631 scrollbar->press_pos = *pos;
632 scrollbar->last_pos = scrollbar->pos;
633
634 (void) ui_scrollbar_paint(scrollbar);
635}
636
637/** Release scrollbar.
638 *
639 * @param scrollbar Scrollbar
640 * @param pos Pointer position
641 */
642void ui_scrollbar_release(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
643{
644 if (!scrollbar->held)
645 return;
646
647 ui_scrollbar_update(scrollbar, pos);
648 scrollbar->held = false;
649}
650
651/** Pointer moved.
652 *
653 * @param scrollbar Scrollbar
654 * @param pos New pointer position
655 */
656void ui_scrollbar_update(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
657{
658 gfx_coord_t spos;
659
660 if (scrollbar->held) {
661 spos = scrollbar->last_pos + pos->x - scrollbar->press_pos.x;
662 ui_scrollbar_set_pos(scrollbar, spos);
663 }
664}
665
666/** Scrollbar up button was pressed.
667 *
668 * @param scrollbar Scrollbar
669 */
670void ui_scrollbar_up(ui_scrollbar_t *scrollbar)
671{
672 if (scrollbar->cb != NULL && scrollbar->cb->up != NULL)
673 scrollbar->cb->up(scrollbar, scrollbar->arg);
674}
675
676/** Scrollbar down button was pressed.
677 *
678 * @param scrollbar Scrollbar
679 */
680void ui_scrollbar_down(ui_scrollbar_t *scrollbar)
681{
682 if (scrollbar->cb != NULL && scrollbar->cb->up != NULL)
683 scrollbar->cb->down(scrollbar, scrollbar->arg);
684}
685
686/** Scrollbar was moved.
687 *
688 * @param scrollbar Scrollbar
689 */
690void ui_scrollbar_moved(ui_scrollbar_t *scrollbar, gfx_coord_t pos)
691{
692 if (scrollbar->cb != NULL && scrollbar->cb->moved != NULL)
693 scrollbar->cb->moved(scrollbar, scrollbar->arg, pos);
694}
695
696/** Handle scrollbar position event.
697 *
698 * @param scrollbar Scrollbar
699 * @param pos_event Position event
700 * @return @c ui_claimed iff the event is claimed
701 */
702ui_evclaim_t ui_scrollbar_pos_event(ui_scrollbar_t *scrollbar, pos_event_t *event)
703{
704 gfx_coord2_t pos;
705 gfx_rect_t rect;
706 ui_evclaim_t claimed;
707
708 pos.x = event->hpos;
709 pos.y = event->vpos;
710
711 claimed = ui_pbutton_pos_event(scrollbar->btn_up, event);
712 if (claimed == ui_claimed)
713 return ui_claimed;
714
715 claimed = ui_pbutton_pos_event(scrollbar->btn_down, event);
716 if (claimed == ui_claimed)
717 return ui_claimed;
718
719 switch (event->type) {
720 case POS_PRESS:
721 ui_scrollbar_thumb_rect(scrollbar, &rect);
722 if (gfx_pix_inside_rect(&pos, &rect)) {
723 ui_scrollbar_press(scrollbar, &pos);
724 scrollbar->press_pos = pos;
725 return ui_claimed;
726 }
727 break;
728 case POS_RELEASE:
729 if (scrollbar->held) {
730 ui_scrollbar_release(scrollbar, &pos);
731 return ui_claimed;
732 }
733 break;
734 case POS_UPDATE:
735 ui_scrollbar_update(scrollbar, &pos);
736 break;
737 case POS_DCLICK:
738 break;
739 }
740
741 return ui_unclaimed;
742}
743
744/** Scrollbar up button clicked.
745 *
746 * @param pbutton Up button
747 * @param arg Argument (ui_scrollbar_t *)
748 */
749static void ui_scrollbar_btn_up_clicked(ui_pbutton_t *pbutton, void *arg)
750{
751 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
752
753 ui_scrollbar_up(scrollbar);
754}
755
756/** Scrollbar down button clicked.
757 *
758 * @param pbutton Down button
759 * @param arg Argument (ui_scrollbar_t *)
760 */
761static void ui_scrollbar_btn_down_clicked(ui_pbutton_t *pbutton, void *arg)
762{
763 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
764
765 ui_scrollbar_down(scrollbar);
766}
767
768/** Destroy scrollbar control.
769 *
770 * @param arg Argument (ui_scrollbar_t *)
771 */
772void ui_scrollbar_ctl_destroy(void *arg)
773{
774 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *) arg;
775
776 ui_scrollbar_destroy(scrollbar);
777}
778
779/** Paint scrollbar control.
780 *
781 * @param arg Argument (ui_scrollbar_t *)
782 * @return EOK on success or an error code
783 */
784errno_t ui_scrollbar_ctl_paint(void *arg)
785{
786 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *) arg;
787
788 return ui_scrollbar_paint(scrollbar);
789}
790
791/** Handle scrollbar control position event.
792 *
793 * @param arg Argument (ui_scrollbar_t *)
794 * @param pos_event Position event
795 * @return @c ui_claimed iff the event is claimed
796 */
797ui_evclaim_t ui_scrollbar_ctl_pos_event(void *arg, pos_event_t *event)
798{
799 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *) arg;
800
801 return ui_scrollbar_pos_event(scrollbar, event);
802}
803
804/** @}
805 */
Note: See TracBrowser for help on using the repository browser.