use std::cell::Cell;
use std::rc::Rc;
use teksilo_canvas::live_image::{LiveImageConsumer, LiveImageSource, LiveImageStatus};
use teksilo_canvas::{ImageGeometry, Transform2D};
use crate::signal::Signal;
use crate::widget_id::WidgetId;
#[derive(Clone)]
pub struct LiveImageSignals {
pub frame_size: Signal<Option<(u32, u32)>>,
pub status: Signal<LiveImageStatus>,
}
impl LiveImageSignals {
pub fn new(source: &LiveImageSource) -> Self {
Self {
frame_size: Signal::new(source.size()),
status: Signal::new(source.status()),
}
}
}
impl Default for LiveImageSignals {
fn default() -> Self {
Self {
frame_size: Signal::new(None),
status: Signal::new(LiveImageStatus::Disconnected),
}
}
}
impl std::fmt::Debug for LiveImageSignals {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LiveImageSignals")
.field("frame_size", &self.frame_size.get())
.field("status", &self.status.get())
.finish()
}
}
#[derive(Clone)]
pub struct LiveImageAttachment {
pub(crate) entry: Rc<AttachmentEntry>,
}
pub(crate) struct AttachmentEntry {
pub(crate) consumer: LiveImageConsumer,
pub(crate) signals: LiveImageSignals,
pub(crate) widget: WidgetId,
geometry: Cell<Option<ImageGeometry>>,
snapped_under: Cell<Option<Transform2D>>,
}
impl AttachmentEntry {
pub(crate) fn new(
consumer: LiveImageConsumer,
signals: LiveImageSignals,
widget: WidgetId,
) -> Self {
Self {
consumer,
signals,
widget,
geometry: Cell::new(None),
snapped_under: Cell::new(None),
}
}
}
impl AttachmentEntry {
pub(crate) fn geometry(&self) -> Option<ImageGeometry> {
self.geometry.get()
}
pub(crate) fn snapped_under(&self) -> Option<Transform2D> {
self.snapped_under.get()
}
}
impl LiveImageAttachment {
pub fn consumer(&self) -> &LiveImageConsumer {
&self.entry.consumer
}
pub fn signals(&self) -> &LiveImageSignals {
&self.entry.signals
}
pub fn widget_id(&self) -> WidgetId {
self.entry.widget
}
pub fn set_geometry(&self, geometry: ImageGeometry) {
self.entry.geometry.set(Some(geometry));
}
pub fn geometry(&self) -> Option<ImageGeometry> {
self.entry.geometry()
}
pub fn set_snapped_under(&self, transform: Option<Transform2D>) {
self.entry.snapped_under.set(transform);
}
pub fn is_detached(&self) -> bool {
self.entry.consumer.is_detached()
}
}
impl std::fmt::Debug for LiveImageAttachment {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LiveImageAttachment")
.field("widget", &self.entry.widget)
.field("consumer", &self.entry.consumer)
.finish()
}
}