use super::*;
use super::super::traits::*;
use canvas::*;
use std::mem;
use std::time::Duration;
pub struct BrushPreview {
current_brush: Arc<Brush>,
brush_properties: BrushProperties,
points: Vec<RawPoint>,
}
impl BrushPreview {
pub fn new() -> BrushPreview {
BrushPreview {
current_brush: create_brush_from_definition(&BrushDefinition::Simple, BrushDrawingStyle::Draw),
brush_properties: BrushProperties::new(),
points: vec![]
}
}
pub fn select_brush(&mut self, brush: &BrushDefinition, drawing_style: BrushDrawingStyle) {
self.current_brush = create_brush_from_definition(brush, drawing_style);
}
pub fn set_brush_properties(&mut self, properties: &BrushProperties) {
self.brush_properties = *properties;
}
pub fn continue_brush_stroke(&mut self, point: RawPoint) {
self.points.push(point);
}
pub fn cancel_brush_stroke(&mut self) {
self.points = vec![];
}
pub fn brush_definition_element(&self) -> BrushDefinitionElement {
let (defn, drawing_style) = self.current_brush.to_definition();
BrushDefinitionElement::new(ElementId::Unassigned, defn, drawing_style)
}
pub fn brush_properties_element(&self) -> BrushPropertiesElement {
BrushPropertiesElement::new(ElementId::Unassigned, self.brush_properties)
}
pub fn brush_element(&self) -> BrushElement {
let brush_points = self.current_brush.brush_points_for_raw_points(&self.points);
BrushElement::new(ElementId::Unassigned, Arc::new(brush_points))
}
pub fn draw_current_brush_stroke(&self, gc: &mut GraphicsPrimitives, update_brush_definition: bool, update_properties: bool) {
let mut vector_properties = VectorProperties::default();
if self.points.len() < 2 {
return;
}
vector_properties.brush = self.current_brush.clone();
if update_brush_definition {
self.brush_definition_element().render(gc, &vector_properties)
}
let new_properties = self.brush_properties_element();
new_properties.update_properties(&mut vector_properties);
if update_properties {
new_properties.render(gc, &vector_properties);
}
let brush_element = self.brush_element();
brush_element.update_properties(&mut vector_properties);
brush_element.render(gc, &vector_properties);
}
pub fn commit_to_animation(&mut self, update_brush_definition: bool, update_properties: bool, when: Duration, layer_id: u64, animation: &Animation) {
use LayerEdit::*;
use PaintEdit::*;
if self.points.len() < 2 {
return;
}
let mut actions = vec![];
if update_brush_definition {
let (defn, drawing_style) = self.current_brush.to_definition();
actions.push(Paint(when, SelectBrush(ElementId::Unassigned, defn, drawing_style)));
}
if update_properties {
actions.push(Paint(when, BrushProperties(ElementId::Unassigned, self.brush_properties.clone())));
}
let mut points = vec![];
mem::swap(&mut self.points, &mut points);
actions.push(Paint(when, BrushStroke(ElementId::Unassigned, Arc::new(points))));
let mut edit = animation.edit_layer(layer_id);
edit.set_pending(&actions);
edit.commit_pending();
}
}