From d8e1af835dfc95053d62e6536dd96c602b96a8fc Mon Sep 17 00:00:00 2001 From: Imbris Date: Tue, 26 May 2020 20:59:16 -0400 Subject: [PATCH] Rearrange iced renderer modules, wire up events for the main menu iced ui --- voxygen/src/menu/main/ui.rs | 20 +++-- voxygen/src/ui/ice/renderer/defaults.rs | 12 +++ voxygen/src/ui/ice/renderer/mod.rs | 31 ++------ .../src/ui/ice/renderer/{ => style}/button.rs | 75 ++----------------- voxygen/src/ui/ice/renderer/style/mod.rs | 3 + .../{ => widgets}/aspect_ratio_container.rs | 2 +- .../{ => widgets}/background_container.rs | 2 +- voxygen/src/ui/ice/renderer/widgets/button.rs | 65 ++++++++++++++++ .../ui/ice/renderer/{ => widgets}/column.rs | 2 +- .../{ => widgets}/compound_graphic.rs | 2 +- .../ice/renderer/{ => widgets}/container.rs | 2 +- .../ui/ice/renderer/{ => widgets}/image.rs | 2 +- voxygen/src/ui/ice/renderer/widgets/mod.rs | 10 +++ .../src/ui/ice/renderer/{ => widgets}/row.rs | 2 +- .../ui/ice/renderer/{ => widgets}/space.rs | 2 +- .../ui/ice/renderer/{ => widgets}/stack.rs | 2 +- .../src/ui/ice/renderer/{ => widgets}/text.rs | 2 +- 17 files changed, 125 insertions(+), 111 deletions(-) create mode 100644 voxygen/src/ui/ice/renderer/defaults.rs rename voxygen/src/ui/ice/renderer/{ => style}/button.rs (52%) create mode 100644 voxygen/src/ui/ice/renderer/style/mod.rs rename voxygen/src/ui/ice/renderer/{ => widgets}/aspect_ratio_container.rs (97%) rename voxygen/src/ui/ice/renderer/{ => widgets}/background_container.rs (91%) create mode 100644 voxygen/src/ui/ice/renderer/widgets/button.rs rename voxygen/src/ui/ice/renderer/{ => widgets}/column.rs (95%) rename voxygen/src/ui/ice/renderer/{ => widgets}/compound_graphic.rs (98%) rename voxygen/src/ui/ice/renderer/{ => widgets}/container.rs (95%) rename voxygen/src/ui/ice/renderer/{ => widgets}/image.rs (96%) create mode 100644 voxygen/src/ui/ice/renderer/widgets/mod.rs rename voxygen/src/ui/ice/renderer/{ => widgets}/row.rs (95%) rename voxygen/src/ui/ice/renderer/{ => widgets}/space.rs (82%) rename voxygen/src/ui/ice/renderer/{ => widgets}/stack.rs (93%) rename voxygen/src/ui/ice/renderer/{ => widgets}/text.rs (98%) diff --git a/voxygen/src/menu/main/ui.rs b/voxygen/src/menu/main/ui.rs index b10e64aad1..69bcaf6b77 100644 --- a/voxygen/src/menu/main/ui.rs +++ b/voxygen/src/menu/main/ui.rs @@ -158,7 +158,6 @@ rotation_image_ids! { } } -#[derive(Clone)] // TODO: why does iced require Clone? pub enum Event { LoginAttempt { username: String, @@ -190,7 +189,12 @@ struct IcedState { imgs: IcedImgs, quit_button: iced::button::State, } -pub type Message = Event; + +#[derive(Clone)] // TODO: why does iced require Clone? +enum Message { + Quit, +} + impl IcedState { pub fn new(imgs: IcedImgs) -> Self { Self { @@ -351,9 +355,9 @@ impl IcedState { BackgroundContainer::new(Image::new(self.imgs.bg), content).into() } - pub fn update(message: Message) { + pub fn update(&mut self, message: Message, events: &mut Vec) { match message { - _ => unimplemented!(), + Message::Quit => events.push(Event::Quit), } } } @@ -1121,12 +1125,16 @@ impl<'a> MainMenuUi { pub fn handle_iced_event(&mut self, event: ui::ice::Event) { self.ice_ui.handle_event(event); } pub fn maintain(&mut self, global_state: &mut GlobalState, dt: Duration) -> Vec { - let events = self.update_layout(global_state, dt); + let mut events = self.update_layout(global_state, dt); self.ui.maintain(global_state.window.renderer_mut(), None); - self.ice_ui.maintain( + let (messages, _) = self.ice_ui.maintain( self.ice_state.view(&self.i18n), global_state.window.renderer_mut(), ); + messages + .into_iter() + .for_each(|message| self.ice_state.update(message, &mut events)); + events } diff --git a/voxygen/src/ui/ice/renderer/defaults.rs b/voxygen/src/ui/ice/renderer/defaults.rs new file mode 100644 index 0000000000..2fdf5215f6 --- /dev/null +++ b/voxygen/src/ui/ice/renderer/defaults.rs @@ -0,0 +1,12 @@ +// TODO: expose to user +pub struct Defaults { + pub text_color: iced::Color, +} + +impl Default for Defaults { + fn default() -> Self { + Self { + text_color: iced::Color::WHITE, + } + } +} diff --git a/voxygen/src/ui/ice/renderer/mod.rs b/voxygen/src/ui/ice/renderer/mod.rs index 3ed49040c3..f94e576660 100644 --- a/voxygen/src/ui/ice/renderer/mod.rs +++ b/voxygen/src/ui/ice/renderer/mod.rs @@ -1,16 +1,9 @@ -// TODO: reorganize modules (e.g. put all these in a widget submodule) -mod aspect_ratio_container; -mod background_container; -mod button; -mod column; -mod compound_graphic; -mod container; -mod image; -mod row; -mod space; -mod text; +mod defaults; +mod style; +mod widgets; -pub use button::Style as ButtonStyle; +pub use defaults::Defaults; +pub use style::ButtonStyle; use super::{ super::graphic::{self, Graphic, TexId}, @@ -24,7 +17,6 @@ use crate::{ Error, }; use common::util::srgba_to_linear; -//use log::warn; use std::ops::Range; use vek::*; @@ -596,19 +588,6 @@ fn default_scissor(renderer: &Renderer) -> Aabr { } } -// TODO: expose to user -pub struct Defaults { - pub text_color: iced::Color, -} - -impl Default for Defaults { - fn default() -> Self { - Self { - text_color: iced::Color::WHITE, - } - } -} - impl iced::Renderer for IcedRenderer { // Default styling type Defaults = Defaults; diff --git a/voxygen/src/ui/ice/renderer/button.rs b/voxygen/src/ui/ice/renderer/style/button.rs similarity index 52% rename from voxygen/src/ui/ice/renderer/button.rs rename to voxygen/src/ui/ice/renderer/style/button.rs index 30754d512f..c4f3681771 100644 --- a/voxygen/src/ui/ice/renderer/button.rs +++ b/voxygen/src/ui/ice/renderer/style/button.rs @@ -1,6 +1,5 @@ -use super::{super::Rotation, widget::image, Defaults, IcedRenderer, Primitive}; -use iced::{button, mouse, Color, Element, Layout, Point, Rectangle}; -use vek::Rgba; +use super::super::widget::image; +use iced::Color; #[derive(Clone, Copy)] struct Background { @@ -69,22 +68,22 @@ impl Style { self } - fn disabled(&self) -> (Option, Color) { + pub fn disabled(&self) -> (Option, Color) { ( self.background.as_ref().map(|b| b.default), self.disabled_text, ) } - fn pressed(&self) -> (Option, Color) { + pub fn pressed(&self) -> (Option, Color) { (self.background.as_ref().map(|b| b.press), self.enabled_text) } - fn hovered(&self) -> (Option, Color) { + pub fn hovered(&self) -> (Option, Color) { (self.background.as_ref().map(|b| b.hover), self.enabled_text) } - fn active(&self) -> (Option, Color) { + pub fn active(&self) -> (Option, Color) { ( self.background.as_ref().map(|b| b.default), self.enabled_text, @@ -101,65 +100,3 @@ impl Default for Style { } } } - -impl button::Renderer for IcedRenderer { - // TODO: what if this gets large enough to not be copied around? - type Style = Style; - - const DEFAULT_PADDING: u16 = 0; - - fn draw( - &mut self, - defaults: &Self::Defaults, - bounds: Rectangle, - cursor_position: Point, - is_disabled: bool, - is_pressed: bool, - style: &Self::Style, - content: &Element<'_, M, Self>, - content_layout: Layout<'_>, - ) -> Self::Output { - let is_mouse_over = bounds.contains(cursor_position); - - let (maybe_image, text_color) = if is_disabled { - style.disabled() - } else if is_mouse_over { - if is_pressed { - style.pressed() - } else { - style.hovered() - } - } else { - style.active() - }; - - let (content, _) = content.draw( - self, - &Defaults { text_color }, - content_layout, - cursor_position, - ); - - let primitive = if let Some(handle) = maybe_image { - let background = Primitive::Image { - handle: (handle, Rotation::None), - bounds, - color: Rgba::broadcast(255), - }; - - Primitive::Group { - primitives: vec![background, content], - } - } else { - content - }; - - let mouse_interaction = if is_mouse_over { - mouse::Interaction::Pointer - } else { - mouse::Interaction::default() - }; - - (primitive, mouse_interaction) - } -} diff --git a/voxygen/src/ui/ice/renderer/style/mod.rs b/voxygen/src/ui/ice/renderer/style/mod.rs new file mode 100644 index 0000000000..1e5fe43f73 --- /dev/null +++ b/voxygen/src/ui/ice/renderer/style/mod.rs @@ -0,0 +1,3 @@ +mod button; + +pub use button::Style as ButtonStyle; diff --git a/voxygen/src/ui/ice/renderer/aspect_ratio_container.rs b/voxygen/src/ui/ice/renderer/widgets/aspect_ratio_container.rs similarity index 97% rename from voxygen/src/ui/ice/renderer/aspect_ratio_container.rs rename to voxygen/src/ui/ice/renderer/widgets/aspect_ratio_container.rs index 71c0f13f3b..6732f73adc 100644 --- a/voxygen/src/ui/ice/renderer/aspect_ratio_container.rs +++ b/voxygen/src/ui/ice/renderer/widgets/aspect_ratio_container.rs @@ -1,4 +1,4 @@ -use super::{ +use super::super::{ super::widget::{aspect_ratio_container, image}, IcedRenderer, }; diff --git a/voxygen/src/ui/ice/renderer/background_container.rs b/voxygen/src/ui/ice/renderer/widgets/background_container.rs similarity index 91% rename from voxygen/src/ui/ice/renderer/background_container.rs rename to voxygen/src/ui/ice/renderer/widgets/background_container.rs index 7b90f5b3c0..8ddfa0e26b 100644 --- a/voxygen/src/ui/ice/renderer/background_container.rs +++ b/voxygen/src/ui/ice/renderer/widgets/background_container.rs @@ -1,4 +1,4 @@ -use super::{super::widget::background_container, IcedRenderer, Primitive}; +use super::super::{super::widget::background_container, IcedRenderer, Primitive}; use iced::{Element, Layout, Point}; impl background_container::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/widgets/button.rs b/voxygen/src/ui/ice/renderer/widgets/button.rs new file mode 100644 index 0000000000..ecba1fb37b --- /dev/null +++ b/voxygen/src/ui/ice/renderer/widgets/button.rs @@ -0,0 +1,65 @@ +use super::super::{super::Rotation, Defaults, IcedRenderer, Primitive}; +use iced::{button, mouse, Element, Layout, Point, Rectangle}; +use vek::Rgba; + +impl button::Renderer for IcedRenderer { + // TODO: what if this gets large enough to not be copied around? + type Style = super::super::style::ButtonStyle; + + const DEFAULT_PADDING: u16 = 0; + + fn draw( + &mut self, + _defaults: &Self::Defaults, + bounds: Rectangle, + cursor_position: Point, + is_disabled: bool, + is_pressed: bool, + style: &Self::Style, + content: &Element<'_, M, Self>, + content_layout: Layout<'_>, + ) -> Self::Output { + let is_mouse_over = bounds.contains(cursor_position); + + let (maybe_image, text_color) = if is_disabled { + style.disabled() + } else if is_mouse_over { + if is_pressed { + style.pressed() + } else { + style.hovered() + } + } else { + style.active() + }; + + let (content, _) = content.draw( + self, + &Defaults { text_color }, + content_layout, + cursor_position, + ); + + let primitive = if let Some(handle) = maybe_image { + let background = Primitive::Image { + handle: (handle, Rotation::None), + bounds, + color: Rgba::broadcast(255), + }; + + Primitive::Group { + primitives: vec![background, content], + } + } else { + content + }; + + let mouse_interaction = if is_mouse_over { + mouse::Interaction::Pointer + } else { + mouse::Interaction::default() + }; + + (primitive, mouse_interaction) + } +} diff --git a/voxygen/src/ui/ice/renderer/column.rs b/voxygen/src/ui/ice/renderer/widgets/column.rs similarity index 95% rename from voxygen/src/ui/ice/renderer/column.rs rename to voxygen/src/ui/ice/renderer/widgets/column.rs index 5a6a33bcc3..7dbbbde20f 100644 --- a/voxygen/src/ui/ice/renderer/column.rs +++ b/voxygen/src/ui/ice/renderer/widgets/column.rs @@ -1,4 +1,4 @@ -use super::{IcedRenderer, Primitive}; +use super::super::{IcedRenderer, Primitive}; use iced::{column, mouse, Element, Layout, Point}; impl column::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/compound_graphic.rs b/voxygen/src/ui/ice/renderer/widgets/compound_graphic.rs similarity index 98% rename from voxygen/src/ui/ice/renderer/compound_graphic.rs rename to voxygen/src/ui/ice/renderer/widgets/compound_graphic.rs index 65ef251834..3923f19d1b 100644 --- a/voxygen/src/ui/ice/renderer/compound_graphic.rs +++ b/voxygen/src/ui/ice/renderer/widgets/compound_graphic.rs @@ -1,4 +1,4 @@ -use super::{ +use super::super::{ super::{widget::compound_graphic, Rotation}, IcedRenderer, Primitive, }; diff --git a/voxygen/src/ui/ice/renderer/container.rs b/voxygen/src/ui/ice/renderer/widgets/container.rs similarity index 95% rename from voxygen/src/ui/ice/renderer/container.rs rename to voxygen/src/ui/ice/renderer/widgets/container.rs index cd8a3c2748..f1a4a24355 100644 --- a/voxygen/src/ui/ice/renderer/container.rs +++ b/voxygen/src/ui/ice/renderer/widgets/container.rs @@ -1,4 +1,4 @@ -use super::IcedRenderer; +use super::super::IcedRenderer; use iced::{container, Element, Layout, Point, Rectangle}; impl container::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/image.rs b/voxygen/src/ui/ice/renderer/widgets/image.rs similarity index 96% rename from voxygen/src/ui/ice/renderer/image.rs rename to voxygen/src/ui/ice/renderer/widgets/image.rs index 829bef748b..8f7c9deaf2 100644 --- a/voxygen/src/ui/ice/renderer/image.rs +++ b/voxygen/src/ui/ice/renderer/widgets/image.rs @@ -1,4 +1,4 @@ -use super::{ +use super::super::{ super::{widget::image, Rotation}, IcedRenderer, Primitive, }; diff --git a/voxygen/src/ui/ice/renderer/widgets/mod.rs b/voxygen/src/ui/ice/renderer/widgets/mod.rs new file mode 100644 index 0000000000..eff22e5c8a --- /dev/null +++ b/voxygen/src/ui/ice/renderer/widgets/mod.rs @@ -0,0 +1,10 @@ +mod aspect_ratio_container; +mod background_container; +mod button; +mod column; +mod compound_graphic; +mod container; +mod image; +mod row; +mod space; +mod text; diff --git a/voxygen/src/ui/ice/renderer/row.rs b/voxygen/src/ui/ice/renderer/widgets/row.rs similarity index 95% rename from voxygen/src/ui/ice/renderer/row.rs rename to voxygen/src/ui/ice/renderer/widgets/row.rs index b46747cdea..3de2f1ea26 100644 --- a/voxygen/src/ui/ice/renderer/row.rs +++ b/voxygen/src/ui/ice/renderer/widgets/row.rs @@ -1,4 +1,4 @@ -use super::{IcedRenderer, Primitive}; +use super::super::{IcedRenderer, Primitive}; use iced::{mouse, row, Element, Layout, Point}; impl row::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/space.rs b/voxygen/src/ui/ice/renderer/widgets/space.rs similarity index 82% rename from voxygen/src/ui/ice/renderer/space.rs rename to voxygen/src/ui/ice/renderer/widgets/space.rs index 309d216209..61abfcb1b2 100644 --- a/voxygen/src/ui/ice/renderer/space.rs +++ b/voxygen/src/ui/ice/renderer/widgets/space.rs @@ -1,4 +1,4 @@ -use super::{IcedRenderer, Primitive}; +use super::super::{IcedRenderer, Primitive}; use iced::{mouse, space, Rectangle}; impl space::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/stack.rs b/voxygen/src/ui/ice/renderer/widgets/stack.rs similarity index 93% rename from voxygen/src/ui/ice/renderer/stack.rs rename to voxygen/src/ui/ice/renderer/widgets/stack.rs index f94f4a2f6c..0594a69ae3 100644 --- a/voxygen/src/ui/ice/renderer/stack.rs +++ b/voxygen/src/ui/ice/renderer/widgets/stack.rs @@ -1,4 +1,4 @@ -use super::{super::widget::stack, IcedRenderer, Primitive}; +use super::super::{super::widget::stack, IcedRenderer, Primitive}; use iced::{mouse, Element, Layout, Point}; impl stack::Renderer for IcedRenderer { diff --git a/voxygen/src/ui/ice/renderer/text.rs b/voxygen/src/ui/ice/renderer/widgets/text.rs similarity index 98% rename from voxygen/src/ui/ice/renderer/text.rs rename to voxygen/src/ui/ice/renderer/widgets/text.rs index 5ffb25d44d..b35d471fa2 100644 --- a/voxygen/src/ui/ice/renderer/text.rs +++ b/voxygen/src/ui/ice/renderer/widgets/text.rs @@ -1,4 +1,4 @@ -use super::{super::FontId, IcedRenderer, Primitive}; +use super::super::{super::FontId, IcedRenderer, Primitive}; use glyph_brush::GlyphCruncher; use iced::{mouse, text, Color, HorizontalAlignment, Rectangle, Size, VerticalAlignment};