From 5323bb3ce8cf7615bada0ab18316492f44462f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Fri, 10 Sep 2021 21:17:06 +0100 Subject: [PATCH 1/3] Add checkbox rendering logic for iced --- voxygen/src/ui/ice/renderer/style/checkbox.rs | 74 +++++++++++++++++++ voxygen/src/ui/ice/renderer/style/mod.rs | 1 + .../src/ui/ice/renderer/widget/checkbox.rs | 64 ++++++++++++++++ voxygen/src/ui/ice/renderer/widget/mod.rs | 1 + 4 files changed, 140 insertions(+) create mode 100644 voxygen/src/ui/ice/renderer/style/checkbox.rs create mode 100644 voxygen/src/ui/ice/renderer/widget/checkbox.rs diff --git a/voxygen/src/ui/ice/renderer/style/checkbox.rs b/voxygen/src/ui/ice/renderer/style/checkbox.rs new file mode 100644 index 0000000000..943d44fe5f --- /dev/null +++ b/voxygen/src/ui/ice/renderer/style/checkbox.rs @@ -0,0 +1,74 @@ +use super::super::super::widget::image; + +#[derive(Clone, Copy)] +struct Background { + default: image::Handle, + hover: image::Handle, + press: image::Handle, +} + +impl Background { + fn new(image: image::Handle) -> Self { + Self { + default: image, + hover: image, + press: image, + } + } +} + +#[derive(Clone, Copy)] +pub struct Style { + background: Option, + checked: Option, +} + +impl Style { + pub fn new(image: image::Handle, checked: image::Handle) -> Self { + Self { + background: Some(Background::new(image)), + checked: Some(checked), + } + } + + pub fn hover_image(mut self, image: image::Handle) -> Self { + self.background = Some(match self.background { + Some(mut background) => { + background.hover = image; + background + }, + None => Background::new(image), + }); + self + } + + pub fn press_image(mut self, image: image::Handle) -> Self { + self.background = Some(match self.background { + Some(mut background) => { + background.press = image; + background + }, + None => Background::new(image), + }); + self + } + + pub fn pressed(&self) -> Option { self.background.as_ref().map(|b| b.press) } + + pub fn checked(&self) -> Option { self.checked } + + pub fn hovered(&self) -> Option { self.background.as_ref().map(|b| b.hover) } + + pub fn background(&self) -> Option { + self.background.as_ref().map(|b| b.default) + } +} + +impl Default for Style { + fn default() -> Self { + Self { + background: None, + checked: None, + } + } +} diff --git a/voxygen/src/ui/ice/renderer/style/mod.rs b/voxygen/src/ui/ice/renderer/style/mod.rs index 04297da836..8dc82f0179 100644 --- a/voxygen/src/ui/ice/renderer/style/mod.rs +++ b/voxygen/src/ui/ice/renderer/style/mod.rs @@ -1,4 +1,5 @@ pub mod button; +pub mod checkbox; pub mod container; pub mod scrollable; pub mod slider; diff --git a/voxygen/src/ui/ice/renderer/widget/checkbox.rs b/voxygen/src/ui/ice/renderer/widget/checkbox.rs new file mode 100644 index 0000000000..7b51e83ad6 --- /dev/null +++ b/voxygen/src/ui/ice/renderer/widget/checkbox.rs @@ -0,0 +1,64 @@ +use super::super::{super::Rotation, style, IcedRenderer, Primitive}; +use iced::{checkbox, mouse, Rectangle}; + +impl checkbox::Renderer for IcedRenderer { + // TODO: what if this gets large enough to not be copied around? + type Style = style::checkbox::Style; + + const DEFAULT_SIZE: u16 = 20; + const DEFAULT_SPACING: u16 = 15; + + fn draw( + &mut self, + bounds: Rectangle, + is_checked: bool, + is_mouse_over: bool, + (label, _): Self::Output, + style: &Self::Style, + ) -> Self::Output { + let default_rect = || Primitive::Rectangle { + bounds, + linear_color: vek::Rgba::broadcast(1.0), + }; + + let background_image = match (is_checked, is_mouse_over) { + (true, _) => style.pressed(), + (_, true) => style.hovered(), + _ => style.background(), + }; + + let background = background_image + .map(|image| Primitive::Image { + handle: (image, Rotation::None), + bounds, + color: vek::Rgba::broadcast(255), + source_rect: None, + }) + .unwrap_or_else(default_rect); + + ( + Primitive::Group { + primitives: if is_checked { + let check = style + .pressed() + .map(|image| Primitive::Image { + handle: (image, Rotation::None), + bounds, + color: vek::Rgba::broadcast(255), + source_rect: None, + }) + .unwrap_or_else(default_rect); + + vec![background, check, label] + } else { + vec![background, label] + }, + }, + if is_mouse_over { + mouse::Interaction::Pointer + } else { + mouse::Interaction::default() + }, + ) + } +} diff --git a/voxygen/src/ui/ice/renderer/widget/mod.rs b/voxygen/src/ui/ice/renderer/widget/mod.rs index 8f9c84758e..c58b3aa152 100644 --- a/voxygen/src/ui/ice/renderer/widget/mod.rs +++ b/voxygen/src/ui/ice/renderer/widget/mod.rs @@ -1,6 +1,7 @@ mod aspect_ratio_container; mod background_container; mod button; +mod checkbox; mod column; mod compound_graphic; mod container; From f27a7853a3ba9e28ea0f50ee444355c4b92151f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Fri, 10 Sep 2021 21:44:27 +0100 Subject: [PATCH 2/3] Add option for a hovered and checked background --- voxygen/src/ui/ice/renderer/style/checkbox.rs | 23 ++++++++++++++++--- .../src/ui/ice/renderer/widget/checkbox.rs | 9 ++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/voxygen/src/ui/ice/renderer/style/checkbox.rs b/voxygen/src/ui/ice/renderer/style/checkbox.rs index 943d44fe5f..ec6f54f768 100644 --- a/voxygen/src/ui/ice/renderer/style/checkbox.rs +++ b/voxygen/src/ui/ice/renderer/style/checkbox.rs @@ -5,6 +5,7 @@ struct Background { default: image::Handle, hover: image::Handle, press: image::Handle, + hover_checked: image::Handle, } impl Background { @@ -13,6 +14,7 @@ impl Background { default: image, hover: image, press: image, + hover_checked: image, } } } @@ -53,13 +55,28 @@ impl Style { self } - pub fn pressed(&self) -> Option { self.background.as_ref().map(|b| b.press) } + pub fn hover_checked_image(mut self, image: image::Handle) -> Self { + self.background = Some(match self.background { + Some(mut background) => { + background.hover_checked = image; + background + }, + None => Background::new(image), + }); + self + } pub fn checked(&self) -> Option { self.checked } - pub fn hovered(&self) -> Option { self.background.as_ref().map(|b| b.hover) } + pub fn bg_check(&self) -> Option { self.background.as_ref().map(|b| b.press) } - pub fn background(&self) -> Option { + pub fn bg_hover(&self) -> Option { self.background.as_ref().map(|b| b.hover) } + + pub fn bg_hover_check(&self) -> Option { + self.background.as_ref().map(|b| b.hover_checked) + } + + pub fn bg_default(&self) -> Option { self.background.as_ref().map(|b| b.default) } } diff --git a/voxygen/src/ui/ice/renderer/widget/checkbox.rs b/voxygen/src/ui/ice/renderer/widget/checkbox.rs index 7b51e83ad6..bddcfe609e 100644 --- a/voxygen/src/ui/ice/renderer/widget/checkbox.rs +++ b/voxygen/src/ui/ice/renderer/widget/checkbox.rs @@ -22,9 +22,10 @@ impl checkbox::Renderer for IcedRenderer { }; let background_image = match (is_checked, is_mouse_over) { - (true, _) => style.pressed(), - (_, true) => style.hovered(), - _ => style.background(), + (true, true) => style.bg_hover_check(), + (true, false) => style.bg_check(), + (false, true) => style.bg_hover(), + (false, false) => style.bg_default(), }; let background = background_image @@ -40,7 +41,7 @@ impl checkbox::Renderer for IcedRenderer { Primitive::Group { primitives: if is_checked { let check = style - .pressed() + .checked() .map(|image| Primitive::Image { handle: (image, Rotation::None), bounds, From 80190c408d672c7f20fb0b203fbde7b19c620cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Wed, 15 Sep 2021 15:26:19 +0100 Subject: [PATCH 3/3] Improve naming of checkbox images related methods --- voxygen/src/ui/ice/renderer/style/checkbox.rs | 28 ++++++++++--------- .../src/ui/ice/renderer/widget/checkbox.rs | 6 ++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/voxygen/src/ui/ice/renderer/style/checkbox.rs b/voxygen/src/ui/ice/renderer/style/checkbox.rs index ec6f54f768..a113c0911b 100644 --- a/voxygen/src/ui/ice/renderer/style/checkbox.rs +++ b/voxygen/src/ui/ice/renderer/style/checkbox.rs @@ -4,7 +4,7 @@ use super::super::super::widget::image; struct Background { default: image::Handle, hover: image::Handle, - press: image::Handle, + checked: image::Handle, hover_checked: image::Handle, } @@ -13,7 +13,7 @@ impl Background { Self { default: image, hover: image, - press: image, + checked: image, hover_checked: image, } } @@ -22,18 +22,18 @@ impl Background { #[derive(Clone, Copy)] pub struct Style { background: Option, - checked: Option, + check: Option, } impl Style { - pub fn new(image: image::Handle, checked: image::Handle) -> Self { + pub fn new(image: image::Handle, check: image::Handle) -> Self { Self { background: Some(Background::new(image)), - checked: Some(checked), + check: Some(check), } } - pub fn hover_image(mut self, image: image::Handle) -> Self { + pub fn bg_hover_image(mut self, image: image::Handle) -> Self { self.background = Some(match self.background { Some(mut background) => { background.hover = image; @@ -44,10 +44,10 @@ impl Style { self } - pub fn press_image(mut self, image: image::Handle) -> Self { + pub fn bg_checked_image(mut self, image: image::Handle) -> Self { self.background = Some(match self.background { Some(mut background) => { - background.press = image; + background.checked = image; background }, None => Background::new(image), @@ -55,7 +55,7 @@ impl Style { self } - pub fn hover_checked_image(mut self, image: image::Handle) -> Self { + pub fn bg_hover_checked_image(mut self, image: image::Handle) -> Self { self.background = Some(match self.background { Some(mut background) => { background.hover_checked = image; @@ -66,13 +66,15 @@ impl Style { self } - pub fn checked(&self) -> Option { self.checked } + pub fn check(&self) -> Option { self.check } - pub fn bg_check(&self) -> Option { self.background.as_ref().map(|b| b.press) } + pub fn bg_checked(&self) -> Option { + self.background.as_ref().map(|b| b.checked) + } pub fn bg_hover(&self) -> Option { self.background.as_ref().map(|b| b.hover) } - pub fn bg_hover_check(&self) -> Option { + pub fn bg_hover_checked(&self) -> Option { self.background.as_ref().map(|b| b.hover_checked) } @@ -85,7 +87,7 @@ impl Default for Style { fn default() -> Self { Self { background: None, - checked: None, + check: None, } } } diff --git a/voxygen/src/ui/ice/renderer/widget/checkbox.rs b/voxygen/src/ui/ice/renderer/widget/checkbox.rs index bddcfe609e..8641ec7144 100644 --- a/voxygen/src/ui/ice/renderer/widget/checkbox.rs +++ b/voxygen/src/ui/ice/renderer/widget/checkbox.rs @@ -22,8 +22,8 @@ impl checkbox::Renderer for IcedRenderer { }; let background_image = match (is_checked, is_mouse_over) { - (true, true) => style.bg_hover_check(), - (true, false) => style.bg_check(), + (true, true) => style.bg_hover_checked(), + (true, false) => style.bg_checked(), (false, true) => style.bg_hover(), (false, false) => style.bg_default(), }; @@ -41,7 +41,7 @@ impl checkbox::Renderer for IcedRenderer { Primitive::Group { primitives: if is_checked { let check = style - .checked() + .check() .map(|image| Primitive::Image { handle: (image, Rotation::None), bounds,