use crate::{Primitive, Renderer}; use iced_native::{ scrollable, Background, Color, Layout, Point, Rectangle, Scrollable, Widget, }; impl scrollable::Renderer for Renderer { fn draw( &mut self, scrollable: &Scrollable<'_, Message, Self>, layout: Layout<'_>, cursor_position: Point, ) -> Self::Output { let bounds = layout.bounds(); let is_mouse_over = bounds.contains(cursor_position); let content = layout.children().next().unwrap(); let content_bounds = content.bounds(); let cursor_position = if bounds.contains(cursor_position) { Point::new( cursor_position.x, cursor_position.y + scrollable.state.offset as f32, ) } else { Point::new(cursor_position.x, -1.0) }; let (content, mouse_cursor) = scrollable.content.draw(self, content, cursor_position); let primitive = Primitive::Scrollable { bounds, offset: scrollable.state.offset, content: Box::new(content), }; ( Primitive::Group { primitives: if is_mouse_over && content_bounds.height > bounds.height { let ratio = bounds.height / content_bounds.height; let scrollbar_height = bounds.height * ratio; let y_offset = scrollable.state.offset as f32 * ratio; let scrollbar = Primitive::Quad { bounds: Rectangle { x: bounds.x + bounds.width - 12.0, y: bounds.y + y_offset, width: 10.0, height: scrollbar_height, }, background: Background::Color(Color { r: 0.0, g: 0.0, b: 0.0, a: 0.5, }), border_radius: 5, }; vec![primitive, scrollbar] } else { vec![primitive] }, }, mouse_cursor, ) } }