use {Color, Widget, Ui};
use image;
use position::{Dimension, Rect};
use widget;
#[derive(Copy, Clone)]
pub struct Image {
pub common: widget::CommonBuilder,
pub image_id: image::Id,
pub src_rect: Option<Rect>,
pub style: Style,
}
#[derive(Copy, Clone)]
pub struct State {
pub src_rect: Option<Rect>,
pub image_id: image::Id,
}
widget_style!{
style Style {
- maybe_color: Option<Color> { None }
}
}
impl Image {
pub fn new(image_id: image::Id) -> Self {
Image {
common: widget::CommonBuilder::new(),
image_id: image_id,
src_rect: None,
style: Style::new(),
}
}
pub fn source_rectangle(mut self, rect: Rect) -> Self {
self.src_rect = Some(rect);
self
}
builder_methods!{
pub color { style.maybe_color = Some(Option<Color>) }
}
}
impl Widget for Image {
type State = State;
type Style = Style;
type Event = ();
fn common(&self) -> &widget::CommonBuilder {
&self.common
}
fn common_mut(&mut self) -> &mut widget::CommonBuilder {
&mut self.common
}
fn init_state(&self, _: widget::id::Generator) -> Self::State {
State {
src_rect: None,
image_id: self.image_id,
}
}
fn style(&self) -> Self::Style {
self.style.clone()
}
fn default_x_dimension(&self, ui: &Ui) -> Dimension {
match self.src_rect.as_ref() {
Some(rect) => Dimension::Absolute(rect.w()),
None => widget::default_x_dimension(self, ui),
}
}
fn default_y_dimension(&self, ui: &Ui) -> Dimension {
match self.src_rect.as_ref() {
Some(rect) => Dimension::Absolute(rect.h()),
None => widget::default_y_dimension(self, ui),
}
}
fn update(self, args: widget::UpdateArgs<Self>) -> Self::Event {
let widget::UpdateArgs { state, .. } = args;
let Image { image_id, src_rect, .. } = self;
if state.image_id != image_id {
state.update(|state| state.image_id = image_id);
}
if state.src_rect != src_rect {
state.update(|state| state.src_rect = src_rect);
}
}
}