1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use super::ink::*;
use super::super::menu::*;
use super::super::tools::*;
use super::super::model::*;
use ui::*;
use binding::*;
use animation::*;
use futures::*;
use std::sync::*;
pub struct Eraser {
ink: Ink
}
impl Eraser {
pub fn new() -> Eraser {
Eraser {
ink: Ink::new()
}
}
}
impl<Anim: Animation+'static> Tool<Anim> for Eraser {
type ToolData = InkData;
type Model = InkModel;
fn tool_name(&self) -> String { "Eraser".to_string() }
fn image_name(&self) -> String { "eraser".to_string() }
fn create_model(&self, _flo_model: Arc<FloModel<Anim>>) -> InkModel {
let mut model = InkModel::new();
model.size.set(10.0);
model
}
fn create_menu_controller(&self, _flo_model: Arc<FloModel<Anim>>, tool_model: &InkModel) -> Option<Arc<Controller>> {
Some(Arc::new(EraserMenuController::new(&tool_model.size, &tool_model.opacity)))
}
fn actions_for_model(&self, flo_model: Arc<FloModel<Anim>>, tool_model: &InkModel) -> Box<Stream<Item=ToolAction<InkData>, Error=()>+Send> {
let brush_properties = tool_model.brush_properties.clone();
let selected_layer = flo_model.timeline().selected_layer.clone();
let ink_data = computed(move || {
InkData {
brush: BrushDefinition::Ink(InkDefinition::default()),
brush_properties: brush_properties.get(),
selected_layer: selected_layer.get().unwrap_or(0)
}
});
Box::new(follow(ink_data).map(|ink_data| ToolAction::Data(ink_data)))
}
fn actions_for_input<'a>(&'a self, data: Option<Arc<InkData>>, input: Box<'a+Iterator<Item=ToolInput<InkData>>>) -> Box<'a+Iterator<Item=ToolAction<InkData>>> {
use self::ToolAction::*;
use self::BrushPreviewAction::*;
let ink: &Tool<Anim, ToolData=InkData, Model=InkModel> = &self.ink;
let actions = ink.actions_for_input(data, input)
.map(|action| {
match action {
BrushPreview(BrushDefinition(brush, BrushDrawingStyle::Draw)) => BrushPreview(BrushDefinition(brush, BrushDrawingStyle::Erase)),
other => other
}
});
Box::new(actions)
}
}