use std::rc::Rc;
use teksilo_tokens::{BorderRole, SurfaceRole};
use crate::build_context::BuildContext;
use crate::signal::Signal;
use crate::widget_id::WidgetId;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DropZoneVisualState {
Idle,
HoverAccept,
HoverReject,
}
impl DropZoneVisualState {
pub fn surface_role(self) -> SurfaceRole {
match self {
Self::Idle => SurfaceRole::Sunken,
Self::HoverAccept => SurfaceRole::AccentSubtle,
Self::HoverReject => SurfaceRole::StatusError,
}
}
pub fn border_role(self) -> BorderRole {
match self {
Self::Idle => BorderRole::Strong,
Self::HoverAccept => BorderRole::Accent,
Self::HoverReject => BorderRole::Error,
}
}
}
#[derive(Clone)]
pub struct DropZoneStyleConfig {
pub state: Signal<DropZoneVisualState>,
pub content: WidgetId,
}
pub trait DropZoneStyle: 'static {
fn make_body(&self, cfg: &DropZoneStyleConfig, ctx: &mut BuildContext) -> WidgetId;
}
pub type SharedDropZoneStyle = Rc<dyn DropZoneStyle>;