use bevy::prelude::{Commands, Component, Entity};
use image::DynamicImage;
use ratatui::widgets::Widget;
use ratatui::{prelude::*, widgets::WidgetRef};
use crate::camera_readback::RatatuiCameraResize;
use crate::widget_halfblocks::RatatuiCameraWidgetHalfblocks;
use crate::widget_luminance::RatatuiCameraWidgetLuminance;
use crate::widget_none::RatatuiCameraWidgetNone;
use crate::{RatatuiCamera, RatatuiCameraEdgeDetection, RatatuiCameraStrategy};
#[derive(Component, Debug)]
pub struct RatatuiCameraWidget {
pub entity: Entity,
pub ratatui_camera: RatatuiCamera,
pub camera_image: DynamicImage,
pub sobel_image: Option<DynamicImage>,
pub strategy: RatatuiCameraStrategy,
pub edge_detection: Option<RatatuiCameraEdgeDetection>,
}
impl Widget for &RatatuiCameraWidget {
fn render(self, area: Rect, buf: &mut Buffer) {
match self.strategy {
RatatuiCameraStrategy::HalfBlocks => {
RatatuiCameraWidgetHalfblocks::new(&self.camera_image).render_ref(area, buf)
}
RatatuiCameraStrategy::Luminance(ref strategy_config) => {
RatatuiCameraWidgetLuminance::new(
&self.camera_image,
&self.sobel_image,
strategy_config,
&self.edge_detection,
)
.render_ref(area, buf);
}
RatatuiCameraStrategy::None => {
RatatuiCameraWidgetNone::new(
&self.camera_image,
&self.sobel_image,
&self.edge_detection,
)
.render_ref(area, buf);
}
}
}
}
impl RatatuiCameraWidget {
pub fn resize(&self, commands: &mut Commands, area: Rect) -> bool {
let dimensions = (area.width as u32 * 2, area.height as u32 * 4);
if self.ratatui_camera.dimensions != dimensions {
commands
.entity(self.entity)
.trigger(RatatuiCameraResize { dimensions });
return true;
}
false
}
pub fn render_autoresize(&self, area: Rect, buf: &mut Buffer, commands: &mut Commands) {
if !self.resize(commands, area) {
self.render(area, buf);
}
}
}