Changeset 8965860c in mainline for uspace/lib/ui/src/scrollbar.c
- Timestamp:
- 2022-03-23T18:35:16Z (2 years ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7ca7215
- Parents:
- d4ea1f6
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/scrollbar.c
rd4ea1f6 r8965860c 53 53 * button on the up/down through generates page up / page down events. 54 54 * 55 * TODO: Up/down buttons/throughs should be equipped with an autorepeat56 * mechanism: after an initial delay, start repeating at a preset rate.55 * Pressing and holding down mouse button on up / down button or up / down 56 * through will auto-scroll (using clickmatic). 57 57 */ 58 58 … … 65 65 #include <stdlib.h> 66 66 #include <str.h> 67 #include <ui/clickmatic.h> 67 68 #include <ui/control.h> 68 69 #include <ui/paint.h> 69 70 #include <ui/pbutton.h> 70 71 #include <ui/scrollbar.h> 72 #include <ui/ui.h> 73 #include <ui/window.h> 74 #include "../private/pbutton.h" 71 75 #include "../private/resource.h" 72 76 #include "../private/scrollbar.h" … … 92 96 93 97 static void ui_scrollbar_up_btn_down(ui_pbutton_t *, void *); 98 static void ui_scrollbar_up_btn_up(ui_pbutton_t *, void *); 94 99 static void ui_scrollbar_down_btn_down(ui_pbutton_t *, void *); 100 static void ui_scrollbar_down_btn_up(ui_pbutton_t *, void *); 95 101 static void ui_scrollbar_ctl_destroy(void *); 96 102 static errno_t ui_scrollbar_ctl_paint(void *); 97 103 static ui_evclaim_t ui_scrollbar_ctl_pos_event(void *, pos_event_t *); 98 104 99 ui_pbutton_cb_t ui_scrollbar_up_btn_cb = { 100 .down = ui_scrollbar_up_btn_down 105 static ui_pbutton_cb_t ui_scrollbar_up_btn_cb = { 106 .down = ui_scrollbar_up_btn_down, 107 .up = ui_scrollbar_up_btn_up 101 108 }; 102 109 103 ui_pbutton_cb_t ui_scrollbar_down_btn_cb = { 104 .down = ui_scrollbar_down_btn_down 110 static ui_pbutton_cb_t ui_scrollbar_down_btn_cb = { 111 .down = ui_scrollbar_down_btn_down, 112 .up = ui_scrollbar_down_btn_up 105 113 }; 106 114 107 115 /** Scrollbar control ops */ 108 ui_control_ops_t ui_scrollbar_ops = {116 static ui_control_ops_t ui_scrollbar_ops = { 109 117 .destroy = ui_scrollbar_ctl_destroy, 110 118 .paint = ui_scrollbar_ctl_paint, … … 112 120 }; 113 121 122 static void ui_scrollbar_cm_up(ui_clickmatic_t *, void *); 123 static void ui_scrollbar_cm_down(ui_clickmatic_t *, void *); 124 static void ui_scrollbar_cm_page_up(ui_clickmatic_t *, void *); 125 static void ui_scrollbar_cm_page_down(ui_clickmatic_t *, void *); 126 127 /** Scrollbar clickmatic up callbacks */ 128 ui_clickmatic_cb_t ui_scrollbar_clickmatic_up_cb = { 129 .clicked = ui_scrollbar_cm_up 130 }; 131 132 /** Scrollbar clickmatic down callbacks */ 133 ui_clickmatic_cb_t ui_scrollbar_clickmatic_down_cb = { 134 .clicked = ui_scrollbar_cm_down 135 }; 136 137 /** Scrollbar clickmatic page up callbacks */ 138 ui_clickmatic_cb_t ui_scrollbar_clickmatic_page_up_cb = { 139 .clicked = ui_scrollbar_cm_page_up 140 }; 141 142 /** Scrollbar clickmatic page down callbacks */ 143 ui_clickmatic_cb_t ui_scrollbar_clickmatic_page_down_cb = { 144 .clicked = ui_scrollbar_cm_page_down 145 }; 146 114 147 /** Create new scrollbar. 115 148 * 116 * @param resource UI resource 149 * @param ui UI 150 * @param window Window containing scrollbar 117 151 * @param rscrollbar Place to store pointer to new scrollbar 118 152 * @return EOK on success, ENOMEM if out of memory 119 153 */ 120 errno_t ui_scrollbar_create(ui_ resource_t *resource,154 errno_t ui_scrollbar_create(ui_t *ui, ui_window_t *window, 121 155 ui_scrollbar_t **rscrollbar) 122 156 { 123 157 ui_scrollbar_t *scrollbar; 158 ui_resource_t *resource; 124 159 errno_t rc; 160 161 resource = ui_window_get_res(window); 125 162 126 163 scrollbar = calloc(1, sizeof(ui_scrollbar_t)); … … 155 192 ui_scrollbar_def_thumb_len; 156 193 157 scrollbar->res = resource; 194 scrollbar->ui = ui; 195 scrollbar->window = window; 158 196 *rscrollbar = scrollbar; 159 197 return EOK; … … 283 321 gfx_rect_t *rect, gfx_rect_t *inside) 284 322 { 285 return ui_paint_bevel(scrollbar->res->gc, rect, 286 scrollbar->res->btn_highlight_color, 287 scrollbar->res->btn_shadow_color, ui_scrollbar_thumb_bevel_width, inside); 288 } 289 290 /** Determine scrollbar thumb rectagle. 291 * 292 * @param scrollbar Scrollbar 293 */ 294 static void ui_scrollbar_thumb_rect(ui_scrollbar_t *scrollbar, gfx_rect_t *rect) 295 { 296 ui_scrollbar_geom_t geom; 297 298 ui_scrollbar_get_geom(scrollbar, &geom); 299 *rect = geom.thumb_rect; 323 ui_resource_t *resource = ui_window_get_res(scrollbar->window); 324 325 return ui_paint_bevel(resource->gc, rect, 326 resource->btn_highlight_color, 327 resource->btn_shadow_color, ui_scrollbar_thumb_bevel_width, inside); 300 328 } 301 329 … … 310 338 gfx_coord_t ui_scrollbar_through_length(ui_scrollbar_t *scrollbar) 311 339 { 340 ui_resource_t *resource; 312 341 gfx_coord2_t dims; 313 342 gfx_coord_t w; 314 343 344 resource = ui_window_get_res(scrollbar->window); 345 315 346 gfx_rect_dims(&scrollbar->rect, &dims); 316 w = scrollbar->res->textmode ? ui_scrollbar_btn_len_text :347 w = resource->textmode ? ui_scrollbar_btn_len_text : 317 348 ui_scrollbar_btn_len; 318 349 return dims.x - 2 * w; … … 339 370 void ui_scrollbar_set_thumb_length(ui_scrollbar_t *scrollbar, gfx_coord_t len) 340 371 { 372 ui_resource_t *resource; 341 373 gfx_coord_t min_len; 342 374 gfx_coord_t max_len; 343 375 344 min_len = scrollbar->res->textmode ? 376 resource = ui_window_get_res(scrollbar->window); 377 378 min_len = resource->textmode ? 345 379 ui_scrollbar_min_thumb_len_text : 346 380 ui_scrollbar_min_thumb_len; … … 353 387 354 388 if (len != scrollbar->thumb_len) { 355 (void) ui_scrollbar_thumb_clear(scrollbar);356 389 scrollbar->thumb_len = len; 357 390 (void) ui_scrollbar_paint(scrollbar); … … 387 420 388 421 if (pos != scrollbar->pos) { 389 (void) ui_scrollbar_thumb_clear(scrollbar);390 422 scrollbar->pos = pos; 391 423 (void) ui_scrollbar_paint(scrollbar); 424 ui_scrollbar_throughs_update(scrollbar, 425 &scrollbar->last_curs_pos); 392 426 ui_scrollbar_moved(scrollbar, pos); 393 427 } … … 401 435 errno_t ui_scrollbar_paint_gfx(ui_scrollbar_t *scrollbar) 402 436 { 437 ui_resource_t *resource; 403 438 ui_scrollbar_geom_t geom; 404 439 gfx_rect_t brect; … … 406 441 errno_t rc; 407 442 443 resource = ui_window_get_res(scrollbar->window); 444 408 445 ui_scrollbar_get_geom(scrollbar, &geom); 409 446 410 447 /* Paint scrollbar frame */ 411 448 412 rc = ui_paint_inset_frame( scrollbar->res, &scrollbar->rect, NULL);449 rc = ui_paint_inset_frame(resource, &scrollbar->rect, NULL); 413 450 if (rc != EOK) 414 451 goto error; 415 452 416 453 /* Paint scrollbar up through */ 417 rc = gfx_set_color( scrollbar->res->gc,418 scrollbar->up_through_held ?419 scrollbar->res->sbar_act_through_color :420 scrollbar->res->sbar_through_color);421 if (rc != EOK) 422 goto error; 423 424 rc = gfx_fill_rect( scrollbar->res->gc, &geom.up_through_rect);454 rc = gfx_set_color(resource->gc, 455 scrollbar->up_through_held && scrollbar->up_through_inside ? 456 resource->sbar_act_through_color : 457 resource->sbar_through_color); 458 if (rc != EOK) 459 goto error; 460 461 rc = gfx_fill_rect(resource->gc, &geom.up_through_rect); 425 462 if (rc != EOK) 426 463 goto error; … … 428 465 /* Paint scrollbar down through */ 429 466 430 rc = gfx_set_color( scrollbar->res->gc,431 scrollbar->down_through_held ?432 scrollbar->res->sbar_act_through_color :433 scrollbar->res->sbar_through_color);434 if (rc != EOK) 435 goto error; 436 437 rc = gfx_fill_rect( scrollbar->res->gc, &geom.down_through_rect);467 rc = gfx_set_color(resource->gc, 468 scrollbar->down_through_held && scrollbar->down_through_inside ? 469 resource->sbar_act_through_color : 470 resource->sbar_through_color); 471 if (rc != EOK) 472 goto error; 473 474 rc = gfx_fill_rect(resource->gc, &geom.down_through_rect); 438 475 if (rc != EOK) 439 476 goto error; … … 441 478 /* Paint scrollbar thumb */ 442 479 443 rc = ui_scrollbar_paint_thumb_frame( scrollbar->res, &geom.thumb_rect,480 rc = ui_scrollbar_paint_thumb_frame(resource, &geom.thumb_rect, 444 481 ui_scrollbar_thumb_frame_thickness, &brect); 445 482 if (rc != EOK) … … 450 487 goto error; 451 488 452 rc = gfx_set_color( scrollbar->res->gc, scrollbar->res->btn_face_color);453 if (rc != EOK) 454 goto error; 455 456 rc = gfx_fill_rect( scrollbar->res->gc, &irect);489 rc = gfx_set_color(resource->gc, resource->btn_face_color); 490 if (rc != EOK) 491 goto error; 492 493 rc = gfx_fill_rect(resource->gc, &irect); 457 494 if (rc != EOK) 458 495 goto error; … … 466 503 goto error; 467 504 468 rc = gfx_update( scrollbar->res->gc);505 rc = gfx_update(resource->gc); 469 506 if (rc != EOK) 470 507 goto error; … … 482 519 errno_t ui_scrollbar_paint_text(ui_scrollbar_t *scrollbar) 483 520 { 521 ui_resource_t *resource; 484 522 gfx_coord2_t pos; 485 523 gfx_text_fmt_t fmt; … … 490 528 errno_t rc; 491 529 530 resource = ui_window_get_res(scrollbar->window); 531 492 532 /* Paint scrollbar through */ 493 533 … … 496 536 497 537 gfx_text_fmt_init(&fmt); 498 fmt.font = scrollbar->res->font;499 fmt.color = scrollbar->res->sbar_through_color;538 fmt.font = resource->font; 539 fmt.color = resource->sbar_through_color; 500 540 fmt.halign = gfx_halign_left; 501 541 fmt.valign = gfx_valign_top; … … 552 592 goto error; 553 593 554 rc = gfx_update( scrollbar->res->gc);594 rc = gfx_update(resource->gc); 555 595 if (rc != EOK) 556 596 goto error; … … 568 608 errno_t ui_scrollbar_paint(ui_scrollbar_t *scrollbar) 569 609 { 570 if (scrollbar->res->textmode) 610 ui_resource_t *resource = ui_window_get_res(scrollbar->window); 611 612 if (resource->textmode) 571 613 return ui_scrollbar_paint_text(scrollbar); 572 614 else … … 581 623 void ui_scrollbar_get_geom(ui_scrollbar_t *scrollbar, ui_scrollbar_geom_t *geom) 582 624 { 625 ui_resource_t *resource; 583 626 gfx_coord_t btn_len; 584 627 gfx_rect_t orect; 585 628 gfx_rect_t irect; 586 629 587 if (scrollbar->res->textmode) { 630 resource = ui_window_get_res(scrollbar->window); 631 632 if (resource->textmode) { 588 633 btn_len = ui_scrollbar_btn_len_text; 589 634 } else { … … 591 636 } 592 637 593 if ( scrollbar->res->textmode) {638 if (resource->textmode) { 594 639 irect = scrollbar->rect; 595 640 orect = scrollbar->rect; 596 641 } else { 597 ui_paint_get_inset_frame_inside( scrollbar->res,642 ui_paint_get_inset_frame_inside(resource, 598 643 &scrollbar->rect, &irect); 599 ui_paint_get_bevel_inside( scrollbar->res->gc,644 ui_paint_get_bevel_inside(resource->gc, 600 645 &scrollbar->rect, 1, &orect); 601 646 } … … 636 681 } 637 682 638 /** Clear scrollbar thumb.639 *640 * @param scrollbar Scrollbar641 * @return EOK on success or an error code642 */643 errno_t ui_scrollbar_thumb_clear(ui_scrollbar_t *scrollbar)644 {645 gfx_rect_t rect;646 errno_t rc;647 648 /* No need to clear thumb in text mode */649 if (scrollbar->res->textmode)650 return EOK;651 652 ui_scrollbar_thumb_rect(scrollbar, &rect);653 654 rc = gfx_set_color(scrollbar->res->gc, scrollbar->res->wnd_face_color);655 if (rc != EOK)656 goto error;657 658 rc = gfx_fill_rect(scrollbar->res->gc, &rect);659 if (rc != EOK)660 goto error;661 662 return EOK;663 error:664 return rc;665 }666 667 683 /** Press down scrollbar thumb. 668 684 * … … 688 704 void ui_scrollbar_up_through_press(ui_scrollbar_t *scrollbar) 689 705 { 690 if (scrollbar->up_through_held) 691 return; 706 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 692 707 693 708 scrollbar->up_through_held = true; 694 (void) ui_scrollbar_paint(scrollbar); 695 696 ui_scrollbar_page_up(scrollbar); 709 scrollbar->up_through_inside = true; 710 711 ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_page_up_cb, 712 (void *) scrollbar); 713 ui_clickmatic_press(clickmatic); 697 714 } 698 715 … … 703 720 void ui_scrollbar_down_through_press(ui_scrollbar_t *scrollbar) 704 721 { 705 if (scrollbar->down_through_held) 706 return; 722 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 707 723 708 724 scrollbar->down_through_held = true; 709 (void) ui_scrollbar_paint(scrollbar); 710 711 ui_scrollbar_page_down(scrollbar); 725 scrollbar->down_through_inside = true; 726 727 ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_page_down_cb, 728 (void *) scrollbar); 729 ui_clickmatic_press(clickmatic); 712 730 } 713 731 … … 719 737 void ui_scrollbar_release(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos) 720 738 { 739 ui_clickmatic_t *clickmatic; 740 721 741 if (scrollbar->thumb_held) { 722 742 ui_scrollbar_update(scrollbar, pos); … … 725 745 726 746 if (scrollbar->up_through_held || scrollbar->down_through_held) { 747 clickmatic = ui_get_clickmatic(scrollbar->ui); 748 ui_clickmatic_release(clickmatic); 749 ui_clickmatic_set_cb(clickmatic, NULL, NULL); 750 727 751 scrollbar->up_through_held = false; 728 752 scrollbar->down_through_held = false; … … 731 755 } 732 756 757 /** Update state of scrollbar throuhgs. 758 * 759 * Update state of scrollbar throughs after mouse cursor or thumb has moved. 760 * 761 * @param scrollbar Scrollbar 762 * @param pos Mouse cursor position 763 */ 764 void ui_scrollbar_throughs_update(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos) 765 { 766 ui_scrollbar_geom_t geom; 767 bool inside_up; 768 bool inside_down; 769 770 ui_scrollbar_get_geom(scrollbar, &geom); 771 772 inside_up = gfx_pix_inside_rect(pos, &geom.up_through_rect); 773 inside_down = gfx_pix_inside_rect(pos, &geom.down_through_rect); 774 775 if (inside_up && !scrollbar->up_through_inside) { 776 scrollbar->up_through_inside = true; 777 (void) ui_scrollbar_paint(scrollbar); 778 } else if (!inside_up && scrollbar->up_through_inside) { 779 scrollbar->up_through_inside = false; 780 (void) ui_scrollbar_paint(scrollbar); 781 } 782 783 if (inside_down && !scrollbar->down_through_inside) { 784 scrollbar->down_through_inside = true; 785 (void) ui_scrollbar_paint(scrollbar); 786 } else if (!inside_down && scrollbar->down_through_inside) { 787 scrollbar->down_through_inside = false; 788 (void) ui_scrollbar_paint(scrollbar); 789 } 790 } 791 733 792 /** Pointer moved. 734 793 * … … 744 803 ui_scrollbar_set_pos(scrollbar, spos); 745 804 } 805 806 ui_scrollbar_throughs_update(scrollbar, pos); 746 807 } 747 808 … … 845 906 case POS_UPDATE: 846 907 ui_scrollbar_update(scrollbar, &pos); 908 scrollbar->last_curs_pos = pos; 847 909 break; 848 910 case POS_DCLICK: … … 861 923 { 862 924 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 863 864 ui_scrollbar_up(scrollbar); 925 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 926 927 ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_up_cb, 928 (void *) scrollbar); 929 ui_clickmatic_press(clickmatic); 930 } 931 932 /** Scrollbar up button released. 933 * 934 * @param pbutton Up button 935 * @param arg Argument (ui_scrollbar_t *) 936 */ 937 static void ui_scrollbar_up_btn_up(ui_pbutton_t *pbutton, void *arg) 938 { 939 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 940 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 941 942 ui_clickmatic_release(clickmatic); 943 ui_clickmatic_set_cb(clickmatic, NULL, NULL); 865 944 } 866 945 … … 873 952 { 874 953 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 875 876 ui_scrollbar_down(scrollbar); 954 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 955 956 ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_down_cb, 957 (void *) scrollbar); 958 ui_clickmatic_press(clickmatic); 959 } 960 961 /** Scrollbar down button released. 962 * 963 * @param pbutton Down button 964 * @param arg Argument (ui_scrollbar_t *) 965 */ 966 static void ui_scrollbar_down_btn_up(ui_pbutton_t *pbutton, void *arg) 967 { 968 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 969 ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui); 970 971 ui_clickmatic_release(clickmatic); 972 ui_clickmatic_set_cb(clickmatic, NULL, NULL); 877 973 } 878 974 … … 908 1004 ui_evclaim_t ui_scrollbar_ctl_pos_event(void *arg, pos_event_t *event) 909 1005 { 910 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *) 1006 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 911 1007 912 1008 return ui_scrollbar_pos_event(scrollbar, event); 913 1009 } 914 1010 1011 /** Scrollbar clickmatic up button click event. 1012 * 1013 * @param clickmatic Clickmatic 1014 * @param arg Argument (ui_scrollbar_t *) 1015 */ 1016 static void ui_scrollbar_cm_up(ui_clickmatic_t *clickmatic, void *arg) 1017 { 1018 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 1019 1020 if (scrollbar->up_btn->inside) 1021 ui_scrollbar_up(scrollbar); 1022 } 1023 1024 /** Scrollbar clickmatic down button click event. 1025 * 1026 * @param clickmatic Clickmatic 1027 * @param arg Argument (ui_scrollbar_t *) 1028 */ 1029 static void ui_scrollbar_cm_down(ui_clickmatic_t *clickmatic, void *arg) 1030 { 1031 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 1032 1033 if (scrollbar->down_btn->inside) 1034 ui_scrollbar_down(scrollbar); 1035 } 1036 1037 /** Scrollbar clickmatic up through click event. 1038 * 1039 * @param clickmatic Clickmatic 1040 * @param arg Argument (ui_scrollbar_t *) 1041 */ 1042 static void ui_scrollbar_cm_page_up(ui_clickmatic_t *clickmatic, void *arg) 1043 { 1044 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 1045 1046 if (scrollbar->up_through_inside) 1047 ui_scrollbar_page_up(scrollbar); 1048 } 1049 1050 /** Scrollbar clickmatic down through click event. 1051 * 1052 * @param clickmatic Clickmatic 1053 * @param arg Argument (ui_scrollbar_t *) 1054 */ 1055 static void ui_scrollbar_cm_page_down(ui_clickmatic_t *clickmatic, void *arg) 1056 { 1057 ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg; 1058 1059 if (scrollbar->down_through_inside) 1060 ui_scrollbar_page_down(scrollbar); 1061 } 1062 915 1063 /** @} 916 1064 */
Note:
See TracChangeset
for help on using the changeset viewer.