use masonry::widgets;
use vello::peniko::ImageBrush;
use crate::core::{MessageContext, Mut, ViewMarker};
use crate::view::Prop;
use crate::{MessageResult, Pod, View, ViewCtx, WidgetView};
pub use masonry::properties::ObjectFit;
pub fn image(image: impl Into<ImageBrush>) -> Image {
Image {
image: image.into(),
}
}
#[must_use = "View values do nothing unless provided to Xilem."]
pub struct Image {
image: ImageBrush,
}
impl Image {
pub fn fit<State: 'static, Action: 'static>(
self,
fill: ObjectFit,
) -> Prop<ObjectFit, Self, State, Action> {
self.prop(fill)
}
}
impl ViewMarker for Image {}
impl<State, Action> View<State, Action, ViewCtx> for Image {
type Element = Pod<widgets::Image>;
type ViewState = ();
fn build(&self, ctx: &mut ViewCtx, _: &mut State) -> (Self::Element, Self::ViewState) {
(ctx.create_pod(widgets::Image::new(self.image.clone())), ())
}
fn rebuild(
&self,
prev: &Self,
(): &mut Self::ViewState,
_: &mut ViewCtx,
mut element: Mut<'_, Self::Element>,
_: &mut State,
) {
if prev.image != self.image {
widgets::Image::set_image_data(&mut element, self.image.clone());
}
}
fn teardown(&self, (): &mut Self::ViewState, _: &mut ViewCtx, _: Mut<'_, Self::Element>) {}
fn message(
&self,
(): &mut Self::ViewState,
message: &mut MessageContext,
_: Mut<'_, Self::Element>,
_: &mut State,
) -> MessageResult<Action> {
tracing::error!(
?message,
"Message arrived in Image::message, but Image doesn't consume any messages, this is a bug."
);
MessageResult::Stale
}
}