From afacb35f9bf87ae10f59091b18b001a4c114a589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Sat, 12 Oct 2019 05:07:00 +0200 Subject: [PATCH] Draw sliders in `iced_wgpu` --- wgpu/src/renderer/slider.rs | 125 ++++++++++++++++++++++++++++++++-- wgpu/src/shader/quad.frag | 2 +- wgpu/src/shader/quad.frag.spv | Bin 3196 -> 3212 bytes 3 files changed, 119 insertions(+), 8 deletions(-) diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs index d1a30244..4ae3abc4 100644 --- a/wgpu/src/renderer/slider.rs +++ b/wgpu/src/renderer/slider.rs @@ -1,17 +1,128 @@ use crate::{Primitive, Renderer}; -use iced_native::{slider, Layout, MouseCursor, Node, Point, Slider, Style}; +use iced_native::{ + slider, Background, Color, Layout, Length, MouseCursor, Node, Point, + Rectangle, Slider, Style, +}; + +const HANDLE_WIDTH: f32 = 8.0; +const HANDLE_HEIGHT: f32 = 22.0; impl slider::Renderer for Renderer { - fn node(&self, _slider: &Slider) -> Node { - Node::new(Style::default()) + fn node(&self, slider: &Slider) -> Node { + let style = Style::default() + .width(slider.width) + .height(Length::Units(HANDLE_HEIGHT as u16)) + .min_width(Length::Units(100)); + + Node::new(style) } fn draw( &mut self, - _slider: &Slider, - _layout: Layout<'_>, - _cursor_position: Point, + slider: &Slider, + layout: Layout<'_>, + cursor_position: Point, ) -> Self::Output { - (Primitive::None, MouseCursor::OutOfBounds) + let bounds = layout.bounds(); + + let is_mouse_over = bounds.contains(cursor_position); + + let rail_y = bounds.y + (bounds.height / 2.0).round(); + + let (rail_top, rail_bottom) = ( + Primitive::Quad { + bounds: Rectangle { + x: bounds.x, + y: rail_y, + width: bounds.width, + height: 2.0, + }, + background: Background::Color(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: 0, + }, + Primitive::Quad { + bounds: Rectangle { + x: bounds.x, + y: rail_y + 2.0, + width: bounds.width, + height: 2.0, + }, + background: Background::Color(Color::WHITE), + border_radius: 0, + }, + ); + + let (range_start, range_end) = slider.range.clone().into_inner(); + + let handle_offset = (bounds.width - HANDLE_WIDTH) + * ((slider.value - range_start) + / (range_end - range_start).max(1.0)); + + let (handle_border, handle) = ( + Primitive::Quad { + bounds: Rectangle { + x: bounds.x + handle_offset.round() - 1.0, + y: rail_y - HANDLE_HEIGHT / 2.0 - 1.0, + width: HANDLE_WIDTH + 2.0, + height: HANDLE_HEIGHT + 2.0, + }, + background: Background::Color(Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 1.0, + }), + border_radius: 5, + }, + Primitive::Quad { + bounds: Rectangle { + x: bounds.x + handle_offset.round(), + y: rail_y - HANDLE_HEIGHT / 2.0, + width: HANDLE_WIDTH, + height: HANDLE_HEIGHT, + }, + background: Background::Color(if slider.state.is_dragging() { + Color { + r: 0.85, + g: 0.85, + b: 0.85, + a: 1.0, + } + } else if is_mouse_over { + Color { + r: 0.9, + g: 0.9, + b: 0.9, + a: 1.0, + } + } else { + Color { + r: 0.95, + g: 0.95, + b: 0.95, + a: 1.0, + } + }), + border_radius: 4, + }, + ); + + ( + Primitive::Group { + primitives: vec![rail_top, rail_bottom, handle_border, handle], + }, + if slider.state.is_dragging() { + MouseCursor::Grabbing + } else if is_mouse_over { + MouseCursor::Grab + } else { + MouseCursor::OutOfBounds + }, + ) } } diff --git a/wgpu/src/shader/quad.frag b/wgpu/src/shader/quad.frag index 987744db..849f581e 100644 --- a/wgpu/src/shader/quad.frag +++ b/wgpu/src/shader/quad.frag @@ -30,7 +30,7 @@ void main() { float radius_alpha = 1.0; if(v_BorderRadius > 0.0) { - radius_alpha = rounded(gl_FragCoord.xy, v_Pos, v_Scale, v_BorderRadius, 1.0); + radius_alpha = rounded(gl_FragCoord.xy, v_Pos, v_Scale, v_BorderRadius, 0.5); } o_Color = vec4(v_Color.xyz, v_Color.w * radius_alpha); diff --git a/wgpu/src/shader/quad.frag.spv b/wgpu/src/shader/quad.frag.spv index 063287b38f733283eacdd56d08b4ec879a148ac6..71b91b44f7cc7dda15caea27aeb00d1d99874601 100644 GIT binary patch delta 701 zcmZ9KO-lk%6o&7Njvou5RwY3tEu*#(Q6eENtu_)Z(n`uQN2kWhJ~X3Uo0wIc z`X4QNpJ62N!pk}Dd+zzTXXbbIJ)4QyOG#ralQb#w`jII+H^vzMyZ&Y6>hfAuuX-ix zn7C<7@Mci77jo?hm3;ST+ikdBnB@n)eK?IeFK~8L%OC#OCsu7)ZbH&|7%=%o@oV`p zp(1QVoOCpJRn`|QVMe?oOAX@GTamqwIQ6>0XFOlvF?wiNAtlRW#(8s$r{%XMcss~C zLGME9u~1Sj*_Q$u;4sscCZQX#P4(vps#!Pb z@UfnRDS<{5B#{Izl3bScf`i0d?^Yh`D(M5WsyhJ8q02B7Ka;!C74#ICkgksSyW=nKSYz_a)d2E$@< G&G`dz;z+*$ delta 685 zcmZ9KIZFdk6oubRGFgg%Rw{xDRw4=(A|fim!ongdgcKGgE@(75Ste@SCK2pxWPXKM zNq&+4!@~28GZ^yVaPK*HeQ)M%;%7XUuxHc8SSD>U=H)$Ca$3e1@2mQ0EuG7&SDKY8 zS;r*Jzbf@e zC@7cg3jqyq*l9zXFpb!{=95Q+Dl99Fi4yuMCH_Ff>LCuBvQ_CY|8`J;R$ zysC!ylRysoUZg$C*Q|Y+f6@OF!=Z6vH_}*QSFcr;?Flp>zbi0+Yw;iS`o;8$^9zUZ BN1Olv