Apply clippy lints (#278)

This commit is contained in:
TrueDoctor
2021-07-17 11:12:37 +02:00
committed by GitHub
parent d57bfb87ee
commit 4637cbf12b
10 changed files with 43 additions and 61 deletions
+3 -4
View File
@@ -67,7 +67,6 @@ impl Document {
/// Checks whether each layer under `path` intersects with the provided `quad` and adds all intersection layers as paths to `intersections`. /// Checks whether each layer under `path` intersects with the provided `quad` and adds all intersection layers as paths to `intersections`.
pub fn intersects_quad(&self, quad: [DVec2; 4], path: &mut Vec<LayerId>, intersections: &mut Vec<Vec<LayerId>>) { pub fn intersects_quad(&self, quad: [DVec2; 4], path: &mut Vec<LayerId>, intersections: &mut Vec<Vec<LayerId>>) {
self.document_folder(path).unwrap().intersects_quad(quad, path, intersections); self.document_folder(path).unwrap().intersects_quad(quad, path, intersections);
return;
} }
/// Checks whether each layer under the root path intersects with the provided `quad` and returns the paths to all intersecting layers. /// Checks whether each layer under the root path intersects with the provided `quad` and returns the paths to all intersecting layers.
@@ -229,7 +228,7 @@ impl Document {
pub fn layer_axis_aligned_bounding_box(&self, path: &[LayerId]) -> Result<Option<[DVec2; 2]>, DocumentError> { pub fn layer_axis_aligned_bounding_box(&self, path: &[LayerId]) -> Result<Option<[DVec2; 2]>, DocumentError> {
// TODO: Replace with functions of the transform api // TODO: Replace with functions of the transform api
if let &[] = path { if path.is_empty() {
// Special case for root. Root's local is the documents global, so we avoid transforming its transform by itself. // Special case for root. Root's local is the documents global, so we avoid transforming its transform by itself.
self.layer_local_bounding_box(path) self.layer_local_bounding_box(path)
} else { } else {
@@ -265,13 +264,13 @@ impl Document {
Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }]) Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }])
} }
Operation::AddRect { path, insert_index, transform, style } => { Operation::AddRect { path, insert_index, transform, style } => {
let id = self.add_layer(&path, Layer::new(LayerDataTypes::Rect(Rect::new()), *transform, *style), *insert_index)?; let id = self.add_layer(&path, Layer::new(LayerDataTypes::Rect(Rect), *transform, *style), *insert_index)?;
let path = [path.clone(), vec![id]].concat(); let path = [path.clone(), vec![id]].concat();
Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }]) Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }])
} }
Operation::AddLine { path, insert_index, transform, style } => { Operation::AddLine { path, insert_index, transform, style } => {
let id = self.add_layer(&path, Layer::new(LayerDataTypes::Line(Line::new()), *transform, *style), *insert_index)?; let id = self.add_layer(&path, Layer::new(LayerDataTypes::Line(Line), *transform, *style), *insert_index)?;
let path = [path.clone(), vec![id]].concat(); let path = [path.clone(), vec![id]].concat();
Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }]) Some(vec![DocumentResponse::DocumentChanged, DocumentResponse::SelectLayer { path }])
+2 -4
View File
@@ -105,9 +105,7 @@ impl Folder {
pub fn bounding_box(&self, transform: glam::DAffine2) -> Option<[DVec2; 2]> { pub fn bounding_box(&self, transform: glam::DAffine2) -> Option<[DVec2; 2]> {
let mut layers_non_empty_bounding_boxes = self.layers.iter().filter_map(|layer| layer.bounding_box(transform * layer.transform, layer.style)).peekable(); let mut layers_non_empty_bounding_boxes = self.layers.iter().filter_map(|layer| layer.bounding_box(transform * layer.transform, layer.style)).peekable();
if layers_non_empty_bounding_boxes.peek().is_none() { layers_non_empty_bounding_boxes.peek()?;
return None;
}
let mut x_min = f64::MAX; let mut x_min = f64::MAX;
let mut y_min = f64::MAX; let mut y_min = f64::MAX;
@@ -128,7 +126,7 @@ impl Folder {
y_max = bounding_box_max.y y_max = bounding_box_max.y
} }
} }
return Some([DVec2::new(x_min, y_min), DVec2::new(x_max, y_max)]); Some([DVec2::new(x_min, y_min), DVec2::new(x_max, y_max)])
} }
} }
+2 -8
View File
@@ -11,14 +11,8 @@ use super::LayerData;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::fmt::Write; use std::fmt::Write;
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Copy, PartialEq, Deserialize, Serialize)]
pub struct Line {} pub struct Line;
impl Line {
pub fn new() -> Line {
Line {}
}
}
impl LayerData for Line { impl LayerData for Line {
fn to_kurbo_path(&self, transform: glam::DAffine2, _style: style::PathStyle) -> kurbo::BezPath { fn to_kurbo_path(&self, transform: glam::DAffine2, _style: style::PathStyle) -> kurbo::BezPath {
+4 -5
View File
@@ -135,7 +135,7 @@ impl Layer {
name: None, name: None,
data, data,
transform: glam::DAffine2::from_cols_array(&transform), transform: glam::DAffine2::from_cols_array(&transform),
style: style, style,
cache: String::new(), cache: String::new(),
cache_dirty: true, cache_dirty: true,
} }
@@ -171,7 +171,7 @@ impl Layer {
*svg += self.render(); *svg += self.render();
} }
pub fn to_kurbo_path(&mut self) -> BezPath { pub fn to_kurbo_path(&self) -> BezPath {
self.data.to_kurbo_path(self.transform, self.style) self.data.to_kurbo_path(self.transform, self.style)
} }
@@ -198,9 +198,8 @@ impl Layer {
} }
pub fn render_as_folder(&mut self, svg: &mut String) { pub fn render_as_folder(&mut self, svg: &mut String) {
match &mut self.data { if let LayerDataTypes::Folder(f) = &mut self.data {
LayerDataTypes::Folder(f) => f.render(svg, self.transform, self.style), f.render(svg, self.transform, self.style)
_ => {}
} }
} }
} }
+2 -8
View File
@@ -11,14 +11,8 @@ use super::LayerData;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::fmt::Write; use std::fmt::Write;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
pub struct Rect {} pub struct Rect;
impl Rect {
pub fn new() -> Rect {
Rect {}
}
}
impl LayerData for Rect { impl LayerData for Rect {
fn to_kurbo_path(&self, transform: glam::DAffine2, _style: style::PathStyle) -> kurbo::BezPath { fn to_kurbo_path(&self, transform: glam::DAffine2, _style: style::PathStyle) -> kurbo::BezPath {
+2 -4
View File
@@ -31,9 +31,7 @@ impl LayerData for Shape {
let mut path = kurbo::BezPath::new(); let mut path = kurbo::BezPath::new();
let apothem_offset_angle = std::f64::consts::PI / (self.sides as f64); let apothem_offset_angle = std::f64::consts::PI / (self.sides as f64);
let relative_points = (0..self.sides) let relative_points = (0..self.sides).map(|i| apothem_offset_angle * ((i * 2 + ((self.sides + 1) % 2)) as f64)).map(unit_rotation);
.map(|i| apothem_offset_angle * ((i * 2 + ((self.sides + 1) % 2)) as f64))
.map(|radians| unit_rotation(radians));
let (mut min_x, mut min_y, mut max_x, mut max_y) = (f64::MAX, f64::MAX, f64::MIN, f64::MIN); let (mut min_x, mut min_y, mut max_x, mut max_y) = (f64::MAX, f64::MAX, f64::MIN, f64::MIN);
relative_points.clone().for_each(|p| { relative_points.clone().for_each(|p| {
@@ -52,7 +50,7 @@ impl LayerData for Shape {
} }
}) })
.map(|p| DVec2::new(p.x / 2. + 0.5, p.y / 2. + 0.5)) .map(|p| DVec2::new(p.x / 2. + 0.5, p.y / 2. + 0.5))
.map(|unit| transform.transform_point2(unit.into())) .map(|unit| transform.transform_point2(unit))
.map(|pos| kurbo::Point::new(pos.x, pos.y)) .map(|pos| kurbo::Point::new(pos.x, pos.y))
.enumerate() .enumerate()
.for_each(|(i, p)| { .for_each(|(i, p)| {
+1 -1
View File
@@ -108,7 +108,7 @@ impl LayerData {
let offset_transform = DAffine2::from_translation(offset); let offset_transform = DAffine2::from_translation(offset);
let scale_transform = DAffine2::from_scale(DVec2::new(self.scale, self.scale)); let scale_transform = DAffine2::from_scale(DVec2::new(self.scale, self.scale));
let angle_transform = DAffine2::from_angle(self.snapped_angle()); let angle_transform = DAffine2::from_angle(self.snapped_angle());
let translation_transform = DAffine2::from_translation(self.translation.into()); let translation_transform = DAffine2::from_translation(self.translation);
scale_transform * offset_transform * angle_transform * scale_transform * translation_transform scale_transform * offset_transform * angle_transform * scale_transform * translation_transform
} }
pub fn calculate_transform(&self) -> DAffine2 { pub fn calculate_transform(&self) -> DAffine2 {
@@ -110,7 +110,7 @@ impl DocumentMessageHandler {
self.active_document().layer_data.get(path).expect("Layerdata does not exist") self.active_document().layer_data.get(path).expect("Layerdata does not exist")
} }
fn layerdata_mut(&mut self, path: &[LayerId]) -> &mut LayerData { fn layerdata_mut(&mut self, path: &[LayerId]) -> &mut LayerData {
self.active_document_mut().layer_data.entry(path.to_vec()).or_insert(LayerData::new(true)) self.active_document_mut().layer_data.entry(path.to_vec()).or_insert_with(|| LayerData::new(true))
} }
#[allow(dead_code)] #[allow(dead_code)]
fn create_transform_from_layerdata(&self, path: Vec<u64>, responses: &mut VecDeque<Message>) { fn create_transform_from_layerdata(&self, path: Vec<u64>, responses: &mut VecDeque<Message>) {
@@ -124,8 +124,8 @@ impl DocumentMessageHandler {
); );
} }
fn create_document_transform_from_layerdata(&self, viewport_size: &ViewportPosition, responses: &mut VecDeque<Message>) { fn create_document_transform_from_layerdata(&self, viewport_size: &ViewportPosition, responses: &mut VecDeque<Message>) {
let half_viewport = viewport_size.to_dvec2() / 2.; let half_viewport = viewport_size.as_dvec2() / 2.;
let layerdata = self.layerdata(&vec![]); let layerdata = self.layerdata(&[]);
let scaled_half_viewport = half_viewport / layerdata.scale; let scaled_half_viewport = half_viewport / layerdata.scale;
responses.push_back( responses.push_back(
DocumentOperation::SetLayerTransform { DocumentOperation::SetLayerTransform {
@@ -159,7 +159,7 @@ impl DocumentMessageHandler {
.collect(); .collect();
layers_with_indices.sort_by_key(|(_, indices)| indices.clone()); layers_with_indices.sort_by_key(|(_, indices)| indices.clone());
return layers_with_indices.into_iter().map(|(path, _)| path).collect(); layers_with_indices.into_iter().map(|(path, _)| path).collect()
} }
} }
@@ -274,7 +274,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
} }
}) })
.collect::<Vec<usize>>(); .collect::<Vec<usize>>();
doc_title_numbers.sort(); doc_title_numbers.sort_unstable();
let mut new_doc_title_num = 1; let mut new_doc_title_num = 1;
while new_doc_title_num <= self.documents.len() { while new_doc_title_num <= self.documents.len() {
if new_doc_title_num != doc_title_numbers[new_doc_title_num - 1] { if new_doc_title_num != doc_title_numbers[new_doc_title_num - 1] {
@@ -430,7 +430,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
RotateCanvasBegin { snap } => { RotateCanvasBegin { snap } => {
self.rotating = true; self.rotating = true;
self.snapping = snap; self.snapping = snap;
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.snap_rotate = snap; layerdata.snap_rotate = snap;
self.mouse_pos = ipp.mouse.position; self.mouse_pos = ipp.mouse.position;
} }
@@ -441,7 +441,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
self.mouse_pos = ipp.mouse.position; self.mouse_pos = ipp.mouse.position;
} }
TranslateCanvasEnd => { TranslateCanvasEnd => {
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.rotation = layerdata.snapped_angle(); layerdata.rotation = layerdata.snapped_angle();
layerdata.snap_rotate = false; layerdata.snap_rotate = false;
self.translating = false; self.translating = false;
@@ -450,23 +450,23 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
} }
MouseMove => { MouseMove => {
if self.translating { if self.translating {
let delta = ipp.mouse.position.to_dvec2() - self.mouse_pos.to_dvec2(); let delta = ipp.mouse.position.as_dvec2() - self.mouse_pos.as_dvec2();
let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta); let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta);
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.translation = layerdata.translation + transformed_delta; layerdata.translation += transformed_delta;
self.create_document_transform_from_layerdata(&ipp.viewport_size, responses); self.create_document_transform_from_layerdata(&ipp.viewport_size, responses);
} }
if self.rotating { if self.rotating {
let half_viewport = ipp.viewport_size.to_dvec2() / 2.; let half_viewport = ipp.viewport_size.as_dvec2() / 2.;
let rotation = { let rotation = {
let start_vec = self.mouse_pos.to_dvec2() - half_viewport; let start_vec = self.mouse_pos.as_dvec2() - half_viewport;
let end_vec = ipp.mouse.position.to_dvec2() - half_viewport; let end_vec = ipp.mouse.position.as_dvec2() - half_viewport;
start_vec.angle_between(end_vec) start_vec.angle_between(end_vec)
}; };
let snapping = self.snapping; let snapping = self.snapping;
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.rotation += rotation; layerdata.rotation += rotation;
layerdata.snap_rotate = snapping; layerdata.snap_rotate = snapping;
responses.push_back( responses.push_back(
@@ -480,7 +480,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
if self.zooming { if self.zooming {
let difference = self.mouse_pos.y as f64 - ipp.mouse.position.y as f64; let difference = self.mouse_pos.y as f64 - ipp.mouse.position.y as f64;
let amount = 1. + difference * MOUSE_ZOOM_RATE; let amount = 1. + difference * MOUSE_ZOOM_RATE;
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
let new = (layerdata.scale * amount).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX); let new = (layerdata.scale * amount).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX);
layerdata.scale = new; layerdata.scale = new;
responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into()); responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into());
@@ -489,13 +489,13 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
self.mouse_pos = ipp.mouse.position; self.mouse_pos = ipp.mouse.position;
} }
SetCanvasZoom(new) => { SetCanvasZoom(new) => {
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.scale = new.clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX); layerdata.scale = new.clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX);
responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into()); responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into());
self.create_document_transform_from_layerdata(&ipp.viewport_size, responses); self.create_document_transform_from_layerdata(&ipp.viewport_size, responses);
} }
MultiplyCanvasZoom(multiplier) => { MultiplyCanvasZoom(multiplier) => {
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
let new = (layerdata.scale * multiplier).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX); let new = (layerdata.scale * multiplier).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX);
layerdata.scale = new; layerdata.scale = new;
responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into()); responses.push_back(FrontendMessage::SetCanvasZoom { new_zoom: layerdata.scale }.into());
@@ -503,8 +503,8 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
} }
WheelCanvasZoom => { WheelCanvasZoom => {
let scroll = ipp.mouse.scroll_delta.scroll_delta(); let scroll = ipp.mouse.scroll_delta.scroll_delta();
let mouse = ipp.mouse.position.to_dvec2(); let mouse = ipp.mouse.position.as_dvec2();
let viewport_size = ipp.viewport_size.to_dvec2(); let viewport_size = ipp.viewport_size.as_dvec2();
let mut zoom_factor = 1. + scroll.abs() * WHEEL_ZOOM_RATE; let mut zoom_factor = 1. + scroll.abs() * WHEEL_ZOOM_RATE;
if ipp.mouse.scroll_delta.y > 0 { if ipp.mouse.scroll_delta.y > 0 {
zoom_factor = 1. / zoom_factor zoom_factor = 1. / zoom_factor
@@ -515,7 +515,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
let delta = delta_size * -2. * (mouse_percent - (0.5, 0.5).into()); let delta = delta_size * -2. * (mouse_percent - (0.5, 0.5).into());
let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta); let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta);
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
let new = (layerdata.scale * zoom_factor).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX); let new = (layerdata.scale * zoom_factor).clamp(VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_SCALE_MAX);
layerdata.scale = new; layerdata.scale = new;
layerdata.translation += transformed_delta; layerdata.translation += transformed_delta;
@@ -524,16 +524,16 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
} }
WheelCanvasTranslate { use_y_as_x } => { WheelCanvasTranslate { use_y_as_x } => {
let delta = match use_y_as_x { let delta = match use_y_as_x {
false => -ipp.mouse.scroll_delta.to_dvec2(), false => -ipp.mouse.scroll_delta.as_dvec2(),
true => (-ipp.mouse.scroll_delta.y as f64, 0.).into(), true => (-ipp.mouse.scroll_delta.y as f64, 0.).into(),
} * VIEWPORT_SCROLL_RATE; } * VIEWPORT_SCROLL_RATE;
let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta); let transformed_delta = self.active_document().document.root.transform.inverse().transform_vector2(delta);
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.translation += transformed_delta; layerdata.translation += transformed_delta;
self.create_document_transform_from_layerdata(&ipp.viewport_size, responses); self.create_document_transform_from_layerdata(&ipp.viewport_size, responses);
} }
SetCanvasRotation(new) => { SetCanvasRotation(new) => {
let layerdata = self.layerdata_mut(&vec![]); let layerdata = self.layerdata_mut(&[]);
layerdata.rotation = new; layerdata.rotation = new;
self.create_document_transform_from_layerdata(&ipp.viewport_size, responses); self.create_document_transform_from_layerdata(&ipp.viewport_size, responses);
responses.push_back(FrontendMessage::SetCanvasRotation { new_radians: new }.into()); responses.push_back(FrontendMessage::SetCanvasRotation { new_radians: new }.into());
@@ -542,7 +542,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
let paths: Vec<Vec<LayerId>> = self.selected_layers_sorted(); let paths: Vec<Vec<LayerId>> = self.selected_layers_sorted();
let delta = { let delta = {
let root_layer_rotation = self.layerdata_mut(&vec![]).rotation; let root_layer_rotation = self.layerdata_mut(&[]).rotation;
let rotate_to_viewport_space = DAffine2::from_angle(root_layer_rotation).inverse(); let rotate_to_viewport_space = DAffine2::from_angle(root_layer_rotation).inverse();
rotate_to_viewport_space.transform_point2((x, y).into()) rotate_to_viewport_space.transform_point2((x, y).into())
}; };
+2 -2
View File
@@ -14,7 +14,7 @@ impl ViewportPosition {
let y_diff = other.y as i64 - self.y as i64; let y_diff = other.y as i64 - self.y as i64;
f64::sqrt((x_diff * x_diff + y_diff * y_diff) as f64) f64::sqrt((x_diff * x_diff + y_diff * y_diff) as f64)
} }
pub fn to_dvec2(&self) -> DVec2 { pub fn as_dvec2(&self) -> DVec2 {
DVec2::new(self.x as f64, self.y as f64) DVec2::new(self.x as f64, self.y as f64)
} }
} }
@@ -29,7 +29,7 @@ impl ScrollDelta {
pub fn new(x: i32, y: i32, z: i32) -> ScrollDelta { pub fn new(x: i32, y: i32, z: i32) -> ScrollDelta {
ScrollDelta { x, y, z } ScrollDelta { x, y, z }
} }
pub fn to_dvec2(&self) -> DVec2 { pub fn as_dvec2(&self) -> DVec2 {
DVec2::new(self.x as f64, self.y as f64) DVec2::new(self.x as f64, self.y as f64)
} }
pub fn scroll_delta(&self) -> f64 { pub fn scroll_delta(&self) -> f64 {
+1 -1
View File
@@ -56,7 +56,7 @@ impl Fsm for PenToolFsmState {
fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.document.root.transform; let transform = document.document.root.transform;
let pos = transform.inverse() * DAffine2::from_translation(input.mouse.position.to_dvec2()); let pos = transform.inverse() * DAffine2::from_translation(input.mouse.position.as_dvec2());
use PenMessage::*; use PenMessage::*;
use PenToolFsmState::*; use PenToolFsmState::*;