From 7765e6da50a3448501ee1b639e580c94a4fbda8a Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Sun, 6 Oct 2019 19:22:25 +0200
Subject: Draft `Box` primitive

---
 wgpu/src/lib.rs             |  2 +-
 wgpu/src/primitive.rs       | 11 ++++++++++-
 wgpu/src/renderer.rs        |  3 +++
 wgpu/src/renderer/button.rs | 38 ++++++++++++++++++++++++++++++--------
 4 files changed, 44 insertions(+), 10 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs
index 9a2a336f..d5cfee64 100644
--- a/wgpu/src/lib.rs
+++ b/wgpu/src/lib.rs
@@ -3,5 +3,5 @@ mod primitive;
 mod renderer;
 
 pub use mouse_cursor::MouseCursor;
-pub use primitive::Primitive;
+pub use primitive::{Background, Primitive};
 pub use renderer::{Renderer, Target};
diff --git a/wgpu/src/primitive.rs b/wgpu/src/primitive.rs
index 04b2e99f..e9ab100e 100644
--- a/wgpu/src/primitive.rs
+++ b/wgpu/src/primitive.rs
@@ -1,4 +1,4 @@
-use iced_native::Rectangle;
+use iced_native::{Color, Rectangle};
 
 #[derive(Debug, Clone)]
 pub enum Primitive {
@@ -11,4 +11,13 @@ pub enum Primitive {
         bounds: Rectangle,
         size: f32,
     },
+    Box {
+        bounds: Rectangle,
+        background: Background,
+    },
+}
+
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum Background {
+    Color(Color),
 }
diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs
index df8887e3..56986bd1 100644
--- a/wgpu/src/renderer.rs
+++ b/wgpu/src/renderer.rs
@@ -144,6 +144,9 @@ impl Renderer {
                 scale: wgpu_glyph::Scale { x: *size, y: *size },
                 ..Default::default()
             }),
+            Primitive::Box { bounds, background } => {
+                // TODO: Batch boxes and draw them all at once
+            }
         }
     }
 }
diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs
index 24bc1de6..b9dfb9ac 100644
--- a/wgpu/src/renderer/button.rs
+++ b/wgpu/src/renderer/button.rs
@@ -1,18 +1,40 @@
-use crate::{Primitive, Renderer};
-use iced_native::{button, Button, Layout, Node, Point, Style};
+use crate::{Background, Primitive, Renderer};
+use iced_native::{button, Button, Color, Layout, Length, Node, Point, Style};
 
 impl button::Renderer for Renderer {
-    fn node<Message>(&self, _button: &Button<Message>) -> Node {
-        Node::new(Style::default())
+    fn node<Message>(&self, button: &Button<Message>) -> Node {
+        let style = Style::default()
+            .width(button.width)
+            .min_height(Length::Units(30))
+            .min_width(Length::Units(100))
+            .align_self(button.align_self);
+
+        Node::new(style)
     }
 
     fn draw<Message>(
         &mut self,
-        _button: &Button<Message>,
-        _layout: Layout<'_>,
+        button: &Button<Message>,
+        layout: Layout<'_>,
         _cursor_position: Point,
     ) -> Self::Primitive {
-        // TODO
-        Primitive::None
+        Primitive::Group {
+            primitives: vec![
+                Primitive::Box {
+                    bounds: layout.bounds(),
+                    background: Background::Color(Color {
+                        r: 0.0,
+                        b: 1.0,
+                        g: 0.0,
+                        a: 1.0,
+                    }),
+                },
+                Primitive::Text {
+                    content: button.label.clone(),
+                    size: 20.0,
+                    bounds: layout.bounds(),
+                },
+            ],
+        }
     }
 }
-- 
cgit