diff options
| author | 2021-10-30 20:38:12 +0700 | |
|---|---|---|
| committer | 2021-10-30 20:38:12 +0700 | |
| commit | 77bab6beeecb148225ee6081e087aa30c0e80c26 (patch) | |
| tree | b4e50368fae1d8227f66a1b6c6ff5eb87ac0e57e /graphics | |
| parent | 0b66095f9ffddad0a6bc6f4e8aa4e2311e89292a (diff) | |
| download | iced-77bab6beeecb148225ee6081e087aa30c0e80c26.tar.gz iced-77bab6beeecb148225ee6081e087aa30c0e80c26.tar.bz2 iced-77bab6beeecb148225ee6081e087aa30c0e80c26.zip | |
Implement `Widget::draw` for `QRCode` in `iced_graphics`
Diffstat (limited to '')
| -rw-r--r-- | graphics/src/widget/qr_code.rs | 94 | 
1 files changed, 47 insertions, 47 deletions
| diff --git a/graphics/src/widget/qr_code.rs b/graphics/src/widget/qr_code.rs index 364b636b..285b8622 100644 --- a/graphics/src/widget/qr_code.rs +++ b/graphics/src/widget/qr_code.rs @@ -5,7 +5,8 @@ use crate::Backend;  use iced_native::layout;  use iced_native::{ -    Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +    Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Vector, +    Widget,  };  use thiserror::Error; @@ -81,56 +82,55 @@ where      fn draw(          &self, -        _renderer: &mut Renderer<B>, +        renderer: &mut Renderer<B>,          _style: &renderer::Style, -        _layout: Layout<'_>, +        layout: Layout<'_>,          _cursor_position: Point,          _viewport: &Rectangle,      ) { -        // let bounds = layout.bounds(); -        // let side_length = self.state.width + 2 * QUIET_ZONE; - -        // // Reuse cache if possible -        // let geometry = self.state.cache.draw(bounds.size(), |frame| { -        //     // Scale units to cell size -        //     frame.scale(f32::from(self.cell_size)); - -        //     // Draw background -        //     frame.fill_rectangle( -        //         Point::ORIGIN, -        //         Size::new(side_length as f32, side_length as f32), -        //         self.light, -        //     ); - -        //     // Avoid drawing on the quiet zone -        //     frame.translate(Vector::new(QUIET_ZONE as f32, QUIET_ZONE as f32)); - -        //     // Draw contents -        //     self.state -        //         .contents -        //         .iter() -        //         .enumerate() -        //         .filter(|(_, value)| **value == qrcode::Color::Dark) -        //         .for_each(|(index, _)| { -        //             let row = index / self.state.width; -        //             let column = index % self.state.width; - -        //             frame.fill_rectangle( -        //                 Point::new(column as f32, row as f32), -        //                 Size::UNIT, -        //                 self.dark, -        //             ); -        //         }); -        // }); - -        // ( -        //     Primitive::Translate { -        //         translation: Vector::new(bounds.x, bounds.y), -        //         content: Box::new(geometry.into_primitive()), -        //     }, -        //     mouse::Interaction::default(), -        // ) -        // TODO +        use iced_native::Renderer as _; + +        let bounds = layout.bounds(); +        let side_length = self.state.width + 2 * QUIET_ZONE; + +        // Reuse cache if possible +        let geometry = self.state.cache.draw(bounds.size(), |frame| { +            // Scale units to cell size +            frame.scale(f32::from(self.cell_size)); + +            // Draw background +            frame.fill_rectangle( +                Point::ORIGIN, +                Size::new(side_length as f32, side_length as f32), +                self.light, +            ); + +            // Avoid drawing on the quiet zone +            frame.translate(Vector::new(QUIET_ZONE as f32, QUIET_ZONE as f32)); + +            // Draw contents +            self.state +                .contents +                .iter() +                .enumerate() +                .filter(|(_, value)| **value == qrcode::Color::Dark) +                .for_each(|(index, _)| { +                    let row = index / self.state.width; +                    let column = index % self.state.width; + +                    frame.fill_rectangle( +                        Point::new(column as f32, row as f32), +                        Size::UNIT, +                        self.dark, +                    ); +                }); +        }); + +        let translation = Vector::new(bounds.x, bounds.y); + +        renderer.with_translation(translation, |renderer| { +            renderer.draw_primitive(geometry.into_primitive()); +        });      }  } | 
