diff options
| author | 2019-07-23 12:07:00 +0200 | |
|---|---|---|
| committer | 2019-07-23 12:07:00 +0200 | |
| commit | 8f6ea4bdc99ef5960316d2230676495f2d90c30e (patch) | |
| tree | 6c5e6cfa28c91123840ae6117fc045e837d7238c /examples/ggez/renderer/slider.rs | |
| parent | f007929b9c68893cedbe6589b42fa4b21c5e54d6 (diff) | |
| download | iced-8f6ea4bdc99ef5960316d2230676495f2d90c30e.tar.gz iced-8f6ea4bdc99ef5960316d2230676495f2d90c30e.tar.bz2 iced-8f6ea4bdc99ef5960316d2230676495f2d90c30e.zip  | |
Implement `radio::Renderer` and `slider::Renderer` in `ggez` example
Diffstat (limited to 'examples/ggez/renderer/slider.rs')
| -rw-r--r-- | examples/ggez/renderer/slider.rs | 82 | 
1 files changed, 82 insertions, 0 deletions
diff --git a/examples/ggez/renderer/slider.rs b/examples/ggez/renderer/slider.rs new file mode 100644 index 00000000..86757127 --- /dev/null +++ b/examples/ggez/renderer/slider.rs @@ -0,0 +1,82 @@ +use super::Renderer; + +use ggez::graphics::{DrawParam, Rect}; +use iced::{slider, MouseCursor, Point, Rectangle}; +use std::ops::RangeInclusive; + +const RAIL: Rect = Rect { +    x: 98.0, +    y: 56.0, +    w: 1.0, +    h: 4.0, +}; + +const MARKER: Rect = Rect { +    x: RAIL.x + 28.0, +    y: RAIL.y, +    w: 16.0, +    h: 24.0, +}; + +impl slider::Renderer for Renderer<'_> { +    fn draw( +        &mut self, +        cursor_position: Point, +        bounds: Rectangle<f32>, +        state: &slider::State, +        range: RangeInclusive<f32>, +        value: f32, +    ) -> MouseCursor { +        let width = self.spritesheet.width() as f32; +        let height = self.spritesheet.height() as f32; + +        self.sprites.add(DrawParam { +            src: Rect { +                x: RAIL.x / width, +                y: RAIL.y / height, +                w: RAIL.w / width, +                h: RAIL.h / height, +            }, +            dest: ggez::mint::Point2 { +                x: bounds.x + MARKER.w as f32 / 2.0, +                y: bounds.y + 12.5, +            }, +            scale: ggez::mint::Vector2 { +                x: bounds.width - MARKER.w as f32, +                y: 1.0, +            }, +            ..DrawParam::default() +        }); + +        let (range_start, range_end) = range.into_inner(); + +        let marker_offset = (bounds.width - MARKER.w as f32) +            * ((value - range_start) / (range_end - range_start).max(1.0)); + +        let mouse_over = bounds.contains(cursor_position); +        let is_active = state.is_dragging() || mouse_over; + +        self.sprites.add(DrawParam { +            src: Rect { +                x: (MARKER.x + (if is_active { MARKER.w } else { 0.0 })) +                    / width, +                y: MARKER.y / height, +                w: MARKER.w / width, +                h: MARKER.h / height, +            }, +            dest: ggez::mint::Point2 { +                x: bounds.x + marker_offset.round(), +                y: bounds.y + (if state.is_dragging() { 2.0 } else { 0.0 }), +            }, +            ..DrawParam::default() +        }); + +        if state.is_dragging() { +            MouseCursor::Grabbing +        } else if mouse_over { +            MouseCursor::Grab +        } else { +            MouseCursor::OutOfBounds +        } +    } +}  | 
