(
bbox: BoundingBox,
content_height: f32,
scroll_position_positive: f32,
config: ScrollbarConfig,
)
| 901 | } |
| 902 | |
| 903 | fn compute_vertical_scrollbar_geometry( |
| 904 | bbox: BoundingBox, |
| 905 | content_height: f32, |
| 906 | scroll_position_positive: f32, |
| 907 | config: ScrollbarConfig, |
| 908 | ) -> Option<ScrollbarAxisGeometry> { |
| 909 | let viewport = bbox.height; |
| 910 | let max_scroll = (content_height - viewport).max(0.0); |
| 911 | if viewport <= 0.0 || max_scroll <= 0.0 { |
| 912 | return None; |
| 913 | } |
| 914 | |
| 915 | let thickness = config.width.max(1.0); |
| 916 | let track_len = viewport; |
| 917 | let thumb_len = (track_len * (viewport / content_height.max(viewport))) |
| 918 | .max(config.min_thumb_size.max(1.0)) |
| 919 | .min(track_len); |
| 920 | let thumb_travel = (track_len - thumb_len).max(0.0); |
| 921 | let thumb_offset = if thumb_travel <= 0.0 { |
| 922 | 0.0 |
| 923 | } else { |
| 924 | (scroll_position_positive.clamp(0.0, max_scroll) / max_scroll) * thumb_travel |
| 925 | }; |
| 926 | |
| 927 | Some(ScrollbarAxisGeometry { |
| 928 | track_bbox: BoundingBox::new( |
| 929 | bbox.x + bbox.width - thickness, |
| 930 | bbox.y, |
| 931 | thickness, |
| 932 | track_len, |
| 933 | ), |
| 934 | thumb_bbox: BoundingBox::new( |
| 935 | bbox.x + bbox.width - thickness, |
| 936 | bbox.y + thumb_offset, |
| 937 | thickness, |
| 938 | thumb_len, |
| 939 | ), |
| 940 | max_scroll, |
| 941 | thumb_travel, |
| 942 | }) |
| 943 | } |
| 944 | |
| 945 | fn compute_horizontal_scrollbar_geometry( |
| 946 | bbox: BoundingBox, |
no outgoing calls
no test coverage detected