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:
parent
87ed3a1bbd
commit
b556dd6bfd
|
|
@ -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())
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue