summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-07-22 21:01:59 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-07-22 21:01:59 +0200
commiteb45c51a7b8b9a595e318048712362c8d65d77b3 (patch)
treea32b6449e907f23e031405646a8df1cbd6c020b6 /examples
parentccb87b12da9f4c8e65571d31da2952ff1b5b08d9 (diff)
downloadiced-eb45c51a7b8b9a595e318048712362c8d65d77b3.tar.gz
iced-eb45c51a7b8b9a595e318048712362c8d65d77b3.tar.bz2
iced-eb45c51a7b8b9a595e318048712362c8d65d77b3.zip
Implement `checkbox::Renderer` in `ggez` example
Diffstat (limited to 'examples')
-rw-r--r--examples/ggez/main.rs30
-rw-r--r--examples/ggez/renderer.rs2
-rw-r--r--examples/ggez/renderer/checkbox.rs63
-rw-r--r--examples/ggez/widget.rs1
4 files changed, 88 insertions, 8 deletions
diff --git a/examples/ggez/main.rs b/examples/ggez/main.rs
index 7deef072..770f79b1 100644
--- a/examples/ggez/main.rs
+++ b/examples/ggez/main.rs
@@ -2,7 +2,7 @@ mod renderer;
mod widget;
use renderer::Renderer;
-use widget::{button, Button, Column, Text};
+use widget::{button, Button, Checkbox, Column, Text};
use ggez;
use ggez::event;
@@ -43,24 +43,33 @@ impl event::EventHandler for Game {
let screen = graphics::screen_coordinates(context);
let cursor = {
- let hello = Text::new("Hello, iced!")
- .horizontal_alignment(iced::text::HorizontalAlignment::Center);
+ let hello = Text::new("Hello, iced!");
- let button = Button::new(&mut self.button, "Press me!").width(200);
+ let checkbox =
+ Checkbox::new(true, "Check me!", Message::CheckboxToggled);
+
+ let button = Button::new(&mut self.button, "Press me!")
+ .width(200)
+ .align_self(iced::Align::End);
+
+ let widgets = Column::new()
+ .max_width(600)
+ .spacing(20)
+ .push(hello)
+ .push(checkbox)
+ .push(button);
let content = Column::new()
.width(screen.w as u32)
.height(screen.h as u32)
.align_items(iced::Align::Center)
.justify_content(iced::Justify::Center)
- .spacing(20)
- .push(hello)
- .push(button);
+ .push(widgets);
let renderer =
&mut Renderer::new(context, self.spritesheet.clone());
- let ui: Interface<(), Renderer> =
+ let ui: Interface<Message, Renderer> =
Interface::compute(content.into(), renderer);
let cursor = ui.draw(renderer, iced::Point::new(0.0, 0.0));
@@ -77,6 +86,11 @@ impl event::EventHandler for Game {
}
}
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum Message {
+ CheckboxToggled(bool),
+}
+
fn into_cursor_type(cursor: iced::MouseCursor) -> mouse::MouseCursor {
match cursor {
iced::MouseCursor::OutOfBounds => mouse::MouseCursor::Default,
diff --git a/examples/ggez/renderer.rs b/examples/ggez/renderer.rs
index d21c5ec3..74fc581d 100644
--- a/examples/ggez/renderer.rs
+++ b/examples/ggez/renderer.rs
@@ -1,4 +1,5 @@
mod button;
+mod checkbox;
mod text;
use ggez::graphics::{self, spritebatch::SpriteBatch, Color, Image};
@@ -18,6 +19,7 @@ impl Renderer<'_> {
spritesheet,
}
}
+
pub fn flush(&mut self) {
graphics::draw(
self.context,
diff --git a/examples/ggez/renderer/checkbox.rs b/examples/ggez/renderer/checkbox.rs
new file mode 100644
index 00000000..eac90ac2
--- /dev/null
+++ b/examples/ggez/renderer/checkbox.rs
@@ -0,0 +1,63 @@
+use super::Renderer;
+use ggez::graphics::{DrawParam, Rect};
+use iced::{checkbox, MouseCursor};
+
+const SPRITE: Rect = Rect {
+ x: 98.0,
+ y: 0.0,
+ w: 28.0,
+ h: 28.0,
+};
+
+impl checkbox::Renderer for Renderer<'_> {
+ fn draw(
+ &mut self,
+ cursor_position: iced::Point,
+ bounds: iced::Rectangle<f32>,
+ text_bounds: iced::Rectangle<f32>,
+ is_checked: bool,
+ ) -> MouseCursor {
+ let mouse_over = bounds.contains(cursor_position)
+ || text_bounds.contains(cursor_position);
+
+ let width = self.spritesheet.width() as f32;
+ let height = self.spritesheet.height() as f32;
+
+ self.sprites.add(DrawParam {
+ src: Rect {
+ x: (SPRITE.x + (if mouse_over { SPRITE.w } else { 0.0 }))
+ / width,
+ y: SPRITE.y / height,
+ w: SPRITE.w / width,
+ h: SPRITE.h / height,
+ },
+ dest: ggez::mint::Point2 {
+ x: bounds.x,
+ y: bounds.y,
+ },
+ ..DrawParam::default()
+ });
+
+ if is_checked {
+ self.sprites.add(DrawParam {
+ src: Rect {
+ x: (SPRITE.x + SPRITE.w * 2.0) / width,
+ y: SPRITE.y / height,
+ w: SPRITE.w / width,
+ h: SPRITE.h / height,
+ },
+ dest: ggez::mint::Point2 {
+ x: bounds.x,
+ y: bounds.y,
+ },
+ ..DrawParam::default()
+ });
+ }
+
+ if mouse_over {
+ MouseCursor::Pointer
+ } else {
+ MouseCursor::OutOfBounds
+ }
+ }
+}
diff --git a/examples/ggez/widget.rs b/examples/ggez/widget.rs
index 657a3190..00c013d4 100644
--- a/examples/ggez/widget.rs
+++ b/examples/ggez/widget.rs
@@ -3,3 +3,4 @@ use ggez::graphics::Color;
pub use iced::{button, Button, Column, Row};
pub type Text = iced::Text<Color>;
+pub type Checkbox<Message> = iced::Checkbox<Color, Message>;