use image;
use position::{Dimension, Rect};
use widget;
use {Color, Ui, Widget};
#[derive(Copy, Clone, WidgetCommon_)]
pub struct Image {
#[conrod(common_builder)]
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,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, WidgetStyle_)]
pub struct Style {
#[conrod(default = "None")]
pub maybe_color: Option<Option<Color>>,
}
impl Image {
pub fn new(image_id: image::Id) -> Self {
Image {
common: widget::CommonBuilder::default(),
image_id: image_id,
src_rect: None,
style: Style::default(),
}
}
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 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);
}
}
}