Rearrange iced renderer modules, wire up events for the main menu iced ui

This commit is contained in:
Imbris 2020-05-26 20:59:16 -04:00
parent 095345d8c6
commit 04fe308b9c
17 changed files with 125 additions and 111 deletions

View File

@ -158,7 +158,6 @@ rotation_image_ids! {
} }
} }
#[derive(Clone)] // TODO: why does iced require Clone?
pub enum Event { pub enum Event {
LoginAttempt { LoginAttempt {
username: String, username: String,
@ -190,7 +189,12 @@ struct IcedState {
imgs: IcedImgs, imgs: IcedImgs,
quit_button: iced::button::State, quit_button: iced::button::State,
} }
pub type Message = Event;
#[derive(Clone)] // TODO: why does iced require Clone?
enum Message {
Quit,
}
impl IcedState { impl IcedState {
pub fn new(imgs: IcedImgs) -> Self { pub fn new(imgs: IcedImgs) -> Self {
Self { Self {
@ -351,9 +355,9 @@ impl IcedState {
BackgroundContainer::new(Image::new(self.imgs.bg), content).into() BackgroundContainer::new(Image::new(self.imgs.bg), content).into()
} }
pub fn update(message: Message) { pub fn update(&mut self, message: Message, events: &mut Vec<Event>) {
match message { 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 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<Event> { pub fn maintain(&mut self, global_state: &mut GlobalState, dt: Duration) -> Vec<Event> {
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.ui.maintain(global_state.window.renderer_mut(), None);
self.ice_ui.maintain( let (messages, _) = self.ice_ui.maintain(
self.ice_state.view(&self.i18n), self.ice_state.view(&self.i18n),
global_state.window.renderer_mut(), global_state.window.renderer_mut(),
); );
messages
.into_iter()
.for_each(|message| self.ice_state.update(message, &mut events));
events events
} }

View File

@ -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,
}
}
}

View File

@ -1,16 +1,9 @@
// TODO: reorganize modules (e.g. put all these in a widget submodule) mod defaults;
mod aspect_ratio_container; mod style;
mod background_container; mod widgets;
mod button;
mod column;
mod compound_graphic;
mod container;
mod image;
mod row;
mod space;
mod text;
pub use button::Style as ButtonStyle; pub use defaults::Defaults;
pub use style::ButtonStyle;
use super::{ use super::{
super::graphic::{self, Graphic, TexId}, super::graphic::{self, Graphic, TexId},
@ -24,7 +17,6 @@ use crate::{
Error, Error,
}; };
use common::util::srgba_to_linear; use common::util::srgba_to_linear;
//use log::warn;
use std::ops::Range; use std::ops::Range;
use vek::*; use vek::*;
@ -596,19 +588,6 @@ fn default_scissor(renderer: &Renderer) -> Aabr<u16> {
} }
} }
// 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 { impl iced::Renderer for IcedRenderer {
// Default styling // Default styling
type Defaults = Defaults; type Defaults = Defaults;

View File

@ -1,6 +1,5 @@
use super::{super::Rotation, widget::image, Defaults, IcedRenderer, Primitive}; use super::super::widget::image;
use iced::{button, mouse, Color, Element, Layout, Point, Rectangle}; use iced::Color;
use vek::Rgba;
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
struct Background { struct Background {
@ -69,22 +68,22 @@ impl Style {
self self
} }
fn disabled(&self) -> (Option<image::Handle>, Color) { pub fn disabled(&self) -> (Option<image::Handle>, Color) {
( (
self.background.as_ref().map(|b| b.default), self.background.as_ref().map(|b| b.default),
self.disabled_text, self.disabled_text,
) )
} }
fn pressed(&self) -> (Option<image::Handle>, Color) { pub fn pressed(&self) -> (Option<image::Handle>, Color) {
(self.background.as_ref().map(|b| b.press), self.enabled_text) (self.background.as_ref().map(|b| b.press), self.enabled_text)
} }
fn hovered(&self) -> (Option<image::Handle>, Color) { pub fn hovered(&self) -> (Option<image::Handle>, Color) {
(self.background.as_ref().map(|b| b.hover), self.enabled_text) (self.background.as_ref().map(|b| b.hover), self.enabled_text)
} }
fn active(&self) -> (Option<image::Handle>, Color) { pub fn active(&self) -> (Option<image::Handle>, Color) {
( (
self.background.as_ref().map(|b| b.default), self.background.as_ref().map(|b| b.default),
self.enabled_text, 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<M>(
&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)
}
}

View File

@ -0,0 +1,3 @@
mod button;
pub use button::Style as ButtonStyle;

View File

@ -1,4 +1,4 @@
use super::{ use super::super::{
super::widget::{aspect_ratio_container, image}, super::widget::{aspect_ratio_container, image},
IcedRenderer, IcedRenderer,
}; };

View File

@ -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}; use iced::{Element, Layout, Point};
impl background_container::Renderer for IcedRenderer { impl background_container::Renderer for IcedRenderer {

View File

@ -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<M>(
&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)
}
}

View File

@ -1,4 +1,4 @@
use super::{IcedRenderer, Primitive}; use super::super::{IcedRenderer, Primitive};
use iced::{column, mouse, Element, Layout, Point}; use iced::{column, mouse, Element, Layout, Point};
impl column::Renderer for IcedRenderer { impl column::Renderer for IcedRenderer {

View File

@ -1,4 +1,4 @@
use super::{ use super::super::{
super::{widget::compound_graphic, Rotation}, super::{widget::compound_graphic, Rotation},
IcedRenderer, Primitive, IcedRenderer, Primitive,
}; };

View File

@ -1,4 +1,4 @@
use super::IcedRenderer; use super::super::IcedRenderer;
use iced::{container, Element, Layout, Point, Rectangle}; use iced::{container, Element, Layout, Point, Rectangle};
impl container::Renderer for IcedRenderer { impl container::Renderer for IcedRenderer {

View File

@ -1,4 +1,4 @@
use super::{ use super::super::{
super::{widget::image, Rotation}, super::{widget::image, Rotation},
IcedRenderer, Primitive, IcedRenderer, Primitive,
}; };

View File

@ -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;

View File

@ -1,4 +1,4 @@
use super::{IcedRenderer, Primitive}; use super::super::{IcedRenderer, Primitive};
use iced::{mouse, row, Element, Layout, Point}; use iced::{mouse, row, Element, Layout, Point};
impl row::Renderer for IcedRenderer { impl row::Renderer for IcedRenderer {

View File

@ -1,4 +1,4 @@
use super::{IcedRenderer, Primitive}; use super::super::{IcedRenderer, Primitive};
use iced::{mouse, space, Rectangle}; use iced::{mouse, space, Rectangle};
impl space::Renderer for IcedRenderer { impl space::Renderer for IcedRenderer {

View File

@ -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}; use iced::{mouse, Element, Layout, Point};
impl stack::Renderer for IcedRenderer { impl stack::Renderer for IcedRenderer {

View File

@ -1,4 +1,4 @@
use super::{super::FontId, IcedRenderer, Primitive}; use super::super::{super::FontId, IcedRenderer, Primitive};
use glyph_brush::GlyphCruncher; use glyph_brush::GlyphCruncher;
use iced::{mouse, text, Color, HorizontalAlignment, Rectangle, Size, VerticalAlignment}; use iced::{mouse, text, Color, HorizontalAlignment, Rectangle, Size, VerticalAlignment};