Polish a few things (#81)

* Implement/suppress various compiler/clippy lints

* Change `tool_init` to take `ToolType` by value

* Factor out error conversion into a function

* Consume parameters with `todo`

* Make `workspace` stuff public

Making them public also removes the warnings
without having to suppress them.

Also, this commit removes the unused import of
`EditorError`

* Remove allow(unused_variables), use vars in `todo`

Also implements `Debug` on `DocumentToolData`
This commit is contained in:
T0mstone 2021-04-22 17:05:25 +02:00 committed by Keavon Chambers
parent 87ed3a1bbd
commit b556dd6bfd
11 changed files with 54 additions and 49 deletions

View File

@ -1,14 +1,18 @@
use crate::shims::Error;
use crate::wrappers::{translate_key, translate_tool, Color}; use crate::wrappers::{translate_key, translate_tool, Color};
use crate::EDITOR_STATE; use crate::EDITOR_STATE;
use crate::{shims::Error, utils};
use editor_core::events; use editor_core::events;
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
fn convert_error(err: editor_core::EditorError) -> JsValue {
Error::new(&err.to_string()).into()
}
/// Modify the currently selected tool in the document state store /// Modify the currently selected tool in the document state store
#[wasm_bindgen] #[wasm_bindgen]
pub fn select_tool(tool: String) -> Result<(), JsValue> { pub fn select_tool(tool: String) -> Result<(), JsValue> {
EDITOR_STATE.with(|editor| match translate_tool(&tool) { EDITOR_STATE.with(|editor| match translate_tool(&tool) {
Some(tool) => editor.borrow_mut().handle_event(events::Event::SelectTool(tool)).map_err(|err| Error::new(&err.to_string()).into()), Some(tool) => editor.borrow_mut().handle_event(events::Event::SelectTool(tool)).map_err(convert_error),
None => Err(Error::new(&format!("Couldn't select {} because it was not recognized as a valid tool", tool)).into()), None => Err(Error::new(&format!("Couldn't select {} because it was not recognized as a valid tool", tool)).into()),
}) })
} }
@ -19,7 +23,7 @@ pub fn select_tool(tool: String) -> Result<(), JsValue> {
pub fn on_mouse_move(x: u32, y: u32) -> Result<(), JsValue> { pub fn on_mouse_move(x: u32, y: u32) -> Result<(), JsValue> {
// TODO: Convert these screenspace viewport coordinates to canvas coordinates based on the current zoom and pan // TODO: Convert these screenspace viewport coordinates to canvas coordinates based on the current zoom and pan
let ev = events::Event::MouseMove(events::ViewportPosition { x, y }); let ev = events::Event::MouseMove(events::ViewportPosition { x, y });
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(|err| Error::new(&err.to_string()).into()) EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(convert_error)
} }
/// A mouse button depressed within screenspace the bounds of the viewport /// A mouse button depressed within screenspace the bounds of the viewport
@ -31,7 +35,7 @@ pub fn on_mouse_down(x: u32, y: u32, mouse_keys: u8) -> Result<(), JsValue> {
position: events::ViewportPosition { x, y }, position: events::ViewportPosition { x, y },
mouse_keys, mouse_keys,
}); });
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(|err| Error::new(&err.to_string()).into()) EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(convert_error)
} }
/// A mouse button released /// A mouse button released
@ -43,7 +47,7 @@ pub fn on_mouse_up(x: u32, y: u32, mouse_keys: u8) -> Result<(), JsValue> {
position: events::ViewportPosition { x, y }, position: events::ViewportPosition { x, y },
mouse_keys, mouse_keys,
}); });
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(|err| Error::new(&err.to_string()).into()) EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(convert_error)
} }
/// A keyboard button depressed within screenspace the bounds of the viewport /// A keyboard button depressed within screenspace the bounds of the viewport
@ -52,7 +56,7 @@ pub fn on_key_down(name: String) -> Result<(), JsValue> {
let key = translate_key(&name); let key = translate_key(&name);
log::trace!("key down {:?}, name: {}", key, name); log::trace!("key down {:?}, name: {}", key, name);
let ev = events::Event::KeyDown(key); let ev = events::Event::KeyDown(key);
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(|err| Error::new(&err.to_string()).into()) EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(convert_error)
} }
/// A keyboard button released /// A keyboard button released
@ -61,7 +65,7 @@ pub fn on_key_up(name: String) -> Result<(), JsValue> {
let key = translate_key(&name); let key = translate_key(&name);
log::trace!("key up {:?}, name: {}", key, name); log::trace!("key up {:?}, name: {}", key, name);
let ev = events::Event::KeyUp(key); let ev = events::Event::KeyUp(key);
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(|err| Error::new(&err.to_string()).into()) EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(ev)).map_err(convert_error)
} }
/// Update primary color /// Update primary color
@ -69,7 +73,7 @@ pub fn on_key_up(name: String) -> Result<(), JsValue> {
pub fn update_primary_color(primary_color: Color) -> Result<(), JsValue> { pub fn update_primary_color(primary_color: Color) -> Result<(), JsValue> {
EDITOR_STATE EDITOR_STATE
.with(|editor| editor.borrow_mut().handle_event(events::Event::SelectPrimaryColor(primary_color.inner()))) .with(|editor| editor.borrow_mut().handle_event(events::Event::SelectPrimaryColor(primary_color.inner())))
.map_err(|err: editor_core::EditorError| Error::new(&err.to_string()).into()) .map_err(convert_error)
} }
/// Update secondary color /// Update secondary color
@ -77,21 +81,17 @@ pub fn update_primary_color(primary_color: Color) -> Result<(), JsValue> {
pub fn update_secondary_color(secondary_color: Color) -> Result<(), JsValue> { pub fn update_secondary_color(secondary_color: Color) -> Result<(), JsValue> {
EDITOR_STATE EDITOR_STATE
.with(|editor| editor.borrow_mut().handle_event(events::Event::SelectSecondaryColor(secondary_color.inner()))) .with(|editor| editor.borrow_mut().handle_event(events::Event::SelectSecondaryColor(secondary_color.inner())))
.map_err(|err: editor_core::EditorError| Error::new(&err.to_string()).into()) .map_err(convert_error)
} }
/// Swap primary and secondary color /// Swap primary and secondary color
#[wasm_bindgen] #[wasm_bindgen]
pub fn swap_colors() -> Result<(), JsValue> { pub fn swap_colors() -> Result<(), JsValue> {
EDITOR_STATE EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(events::Event::SwapColors)).map_err(convert_error)
.with(|editor| editor.borrow_mut().handle_event(events::Event::SwapColors))
.map_err(|err: editor_core::EditorError| Error::new(&err.to_string()).into())
} }
/// Reset primary and secondary colors to their defaults /// Reset primary and secondary colors to their defaults
#[wasm_bindgen] #[wasm_bindgen]
pub fn reset_colors() -> Result<(), JsValue> { pub fn reset_colors() -> Result<(), JsValue> {
EDITOR_STATE EDITOR_STATE.with(|editor| editor.borrow_mut().handle_event(events::Event::ResetColors)).map_err(convert_error)
.with(|editor| editor.borrow_mut().handle_event(events::Event::ResetColors))
.map_err(|err: editor_core::EditorError| Error::new(&err.to_string()).into())
} }

View File

@ -5,32 +5,32 @@ type DocumentId = u32;
/// Modify the active Document in the editor state store /// Modify the active Document in the editor state store
#[wasm_bindgen] #[wasm_bindgen]
pub fn set_active_document(document_id: DocumentId) { pub fn set_active_document(document_id: DocumentId) {
todo!() todo!("set_active_document {}", document_id)
} }
/// Query the name of a specific document /// Query the name of a specific document
#[wasm_bindgen] #[wasm_bindgen]
pub fn get_document_name(document_id: DocumentId) -> String { pub fn get_document_name(document_id: DocumentId) -> String {
todo!() todo!("get_document_name {}", document_id)
} }
/// Query the id of the most recently interacted with document /// Query the id of the most recently interacted with document
#[wasm_bindgen] #[wasm_bindgen]
pub fn get_active_document() -> DocumentId { pub fn get_active_document() -> DocumentId {
todo!() todo!("get_active_document")
} }
use editor_core::workspace::PanelId; use editor_core::workspace::PanelId;
/// Notify the editor that the mouse hovers above a panel /// Notify the editor that the mouse hovers above a panel
#[wasm_bindgen] #[wasm_bindgen]
pub fn panel_hover_enter(panel_id: PanelId) { pub fn panel_hover_enter(panel_id: PanelId) {
todo!() todo!("panel_hover_enter {}", panel_id)
} }
/// Query a list of currently available operations /// Query a list of currently available operations
#[wasm_bindgen] #[wasm_bindgen]
pub fn get_available_operations() -> Vec<JsValue> { pub fn get_available_operations() -> Vec<JsValue> {
todo!(); todo!("get_available_operations")
// vec!["example1", "example2"].into_iter().map(JsValue::from).collect() // vec!["example1", "example2"].into_iter().map(JsValue::from).collect()
} }

View File

@ -17,7 +17,7 @@ impl ShapePoints {
ShapePoints { ShapePoints {
center: center.into(), center: center.into(),
extent: extent.into(), extent: extent.into(),
sides: sides, sides,
} }
} }
@ -36,7 +36,7 @@ impl ShapePoints {
// Gets the length of one side // Gets the length of one side
#[inline] #[inline]
pub fn side_length(&self) -> f64 { pub fn side_length(&self) -> f64 {
self.apothem_offset_angle().sin() * (self.sides as f64) * (2 as f64) self.apothem_offset_angle().sin() * (self.sides as f64) * 2f64
} }
} }
@ -45,7 +45,7 @@ impl std::fmt::Display for ShapePoints {
fn rotate(v: &Vec2, theta: f64) -> Vec2 { fn rotate(v: &Vec2, theta: f64) -> Vec2 {
let cosine = theta.cos(); let cosine = theta.cos();
let sine = theta.sin(); let sine = theta.sin();
return Vec2::new(v.x * cosine - v.y * sine, v.x * sine + v.y * cosine); Vec2::new(v.x * cosine - v.y * sine, v.x * sine + v.y * cosine)
} }
info!("sides{}", self.sides); info!("sides{}", self.sides);
for i in 0..self.sides { for i in 0..self.sides {
@ -72,7 +72,7 @@ impl Iterator for ShapePathIter {
fn rotate(v: &Vec2, theta: f64) -> Vec2 { fn rotate(v: &Vec2, theta: f64) -> Vec2 {
let cosine = theta.cos(); let cosine = theta.cos();
let sine = theta.sin(); let sine = theta.sin();
return Vec2::new(v.x * cosine - v.y * sine, v.x * sine + v.y * cosine); Vec2::new(v.x * cosine - v.y * sine, v.x * sine + v.y * cosine)
} }
self.ix += 1; self.ix += 1;
match self.ix { match self.ix {
@ -102,9 +102,9 @@ impl Add<Vec2> for ShapePoints {
impl kurbo::Shape for ShapePoints { impl kurbo::Shape for ShapePoints {
type PathElementsIter = ShapePathIter; type PathElementsIter = ShapePathIter;
#[inline]
fn perimeter(&self, _accuracy: f64) -> f64 { fn path_elements(&self, _tolerance: f64) -> Self::PathElementsIter {
self.side_length() * (self.sides as f64) todo!()
} }
#[inline] #[inline]
@ -112,8 +112,9 @@ impl kurbo::Shape for ShapePoints {
self.apothem() * self.perimeter(2.1) self.apothem() * self.perimeter(2.1)
} }
fn path_elements(&self, _tolerance: f64) -> Self::PathElementsIter { #[inline]
todo!() fn perimeter(&self, _accuracy: f64) -> f64 {
self.side_length() * (self.sides as f64)
} }
fn winding(&self, _pt: Point) -> i32 { fn winding(&self, _pt: Point) -> i32 {

View File

@ -1,3 +1,6 @@
// since our policy is tabs, we want to stop clippy from warning about that
#![allow(clippy::tabs_in_doc_comments)]
#[macro_use] #[macro_use]
mod macros; mod macros;

View File

@ -10,6 +10,6 @@ pub struct Crop;
impl Tool for Crop { impl Tool for Crop {
fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) { fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) {
todo!(); todo!("{}::handle_input {:?} {:?} {:?}", module_path!(), event, document, tool_data)
} }
} }

View File

@ -25,12 +25,14 @@ pub trait Fsm {
fn transition(self, event: &Event, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, responses: &mut Vec<Response>, operations: &mut Vec<Operation>) -> Self; fn transition(self, event: &Event, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, responses: &mut Vec<Response>, operations: &mut Vec<Operation>) -> Self;
} }
#[derive(Debug)]
pub struct DocumentToolData { pub struct DocumentToolData {
pub mouse_state: MouseState, pub mouse_state: MouseState,
pub mod_keys: ModKeys, pub mod_keys: ModKeys,
pub primary_color: Color, pub primary_color: Color,
pub secondary_color: Color, pub secondary_color: Color,
} }
pub struct ToolData { pub struct ToolData {
pub active_tool_type: ToolType, pub active_tool_type: ToolType,
pub tools: HashMap<ToolType, Box<dyn Tool>>, pub tools: HashMap<ToolType, Box<dyn Tool>>,
@ -97,11 +99,11 @@ impl ToolFsmState {
} }
fn default_tool_settings() -> HashMap<ToolType, ToolSettings> { fn default_tool_settings() -> HashMap<ToolType, ToolSettings> {
let tool_init = |tool: &ToolType| (*tool, tool.default_settings()); let tool_init = |tool: ToolType| (tool, tool.default_settings());
std::array::IntoIter::new([ std::array::IntoIter::new([
tool_init(&ToolType::Select), tool_init(ToolType::Select),
tool_init(&ToolType::Ellipse), tool_init(ToolType::Ellipse),
tool_init(&ToolType::Shape), // TODO: Add more tool defaults tool_init(ToolType::Shape), // TODO: Add more tool defaults
]) ])
.collect() .collect()
} }

View File

@ -10,6 +10,6 @@ pub struct Navigate;
impl Tool for Navigate { impl Tool for Navigate {
fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) { fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) {
todo!(); todo!("{}::handle_input {:?} {:?} {:?}", module_path!(), event, document, tool_data)
} }
} }

View File

@ -10,6 +10,6 @@ pub struct Path;
impl Tool for Path { impl Tool for Path {
fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) { fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) {
todo!(); todo!("{}::handle_input {:?} {:?} {:?}", module_path!(), event, document, tool_data)
} }
} }

View File

@ -10,6 +10,6 @@ pub struct Pen;
impl Tool for Pen { impl Tool for Pen {
fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) { fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) {
todo!(); todo!("{}::handle_input {:?} {:?} {:?}", module_path!(), event, document, tool_data)
} }
} }

View File

@ -10,6 +10,6 @@ pub struct Sample;
impl Tool for Sample { impl Tool for Sample {
fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) { fn handle_input(&mut self, event: &Event, document: &Document, tool_data: &DocumentToolData) -> (Vec<Response>, Vec<Operation>) {
todo!(); todo!("{}::handle_input {:?} {:?} {:?}", module_path!(), event, document, tool_data)
} }
} }

View File

@ -1,9 +1,8 @@
use crate::EditorError;
pub type PanelId = usize; pub type PanelId = usize;
pub struct Workspace { pub struct Workspace {
hovered_panel: PanelId, pub hovered_panel: PanelId,
root: PanelGroup, pub root: PanelGroup,
} }
impl Workspace { impl Workspace {
@ -19,9 +18,9 @@ impl Workspace {
// get_serialized_layout() // get_serialized_layout()
} }
struct PanelGroup { pub struct PanelGroup {
contents: Vec<Contents>, pub contents: Vec<Contents>,
layout_direction: LayoutDirection, pub layout_direction: LayoutDirection,
} }
impl PanelGroup { impl PanelGroup {
@ -33,17 +32,17 @@ impl PanelGroup {
} }
} }
enum Contents { pub enum Contents {
PanelArea(PanelArea), PanelArea(PanelArea),
Group(PanelGroup), Group(PanelGroup),
} }
struct PanelArea { pub struct PanelArea {
panels: Vec<PanelId>, pub panels: Vec<PanelId>,
active: PanelId, pub active: PanelId,
} }
enum LayoutDirection { pub enum LayoutDirection {
Horizontal, Horizontal,
Vertical, Vertical,
} }