use crate::graphics::{
self, Rectangle, Point,
};
use crate::ui::core:: {
Style, Node, Element, MouseCursor, Layout, Hasher, Widget,
};
use std::hash::Hash;
#[derive(Debug)]
pub struct Image {
image: graphics::Image,
source: Rectangle<u16>,
style: Style,
}
impl Image {
pub fn new(image: &graphics::Image) -> Self {
Image {
image: image.clone(),
source: Rectangle {
x: 0,
y: 0,
width: image.width(),
height: image.height(),
},
style: Style::default().fill_width().fill_height(),
}
}
pub fn clip(mut self, source: Rectangle<u16>) -> Self {
self.source = source;
self
}
pub fn width(mut self, width: u32) -> Self {
self.style = self.style.width(width);
self
}
pub fn height(mut self, height: u32) -> Self {
self.style = self.style.height(height);
self
}
}
impl<Message, Renderer> Widget<Message, Renderer> for Image
where
Renderer: self::Renderer
{
fn node(&self, _renderer: &Renderer) -> Node {
Node::new(self.style)
}
fn draw(
&self,
renderer: &mut Renderer,
layout: Layout<'_>,
_cursor_position: Point,
) -> MouseCursor {
renderer.draw(
layout.bounds(),
self.image.clone(),
self.source,
);
MouseCursor::OutOfBounds
}
fn hash(&self, state: &mut Hasher) {
self.style.hash(state);
}
}
pub trait Renderer {
fn draw(
&mut self,
bounds: Rectangle<f32>,
image: graphics::Image,
source: Rectangle<u16>,
);
}
impl<'a, Message, Renderer> From<Image> for Element<'a, Message, Renderer>
where
Renderer: self::Renderer,
{
fn from(image: Image) -> Element<'a, Message, Renderer> {
Element::new(image)
}
}