Implement basic circle stamping (#53)

This commit is contained in:
T0mstone
2021-03-29 01:44:34 +02:00
committed by GitHub
parent c437f1bd22
commit 94f50377a3
10 changed files with 85 additions and 46 deletions

View File

@@ -22,7 +22,7 @@ pub enum Event {
#[derive(Debug, Clone)]
#[repr(C)]
pub enum Response {
UpdateCanvas,
UpdateCanvas { document: String },
}
#[derive(Debug, Clone, Default)]

View File

@@ -1,6 +1,6 @@
pub mod events;
use crate::tools::ToolState;
use crate::{Color, EditorError};
use crate::{Color, EditorError, EditorState};
use document_core::{Circle, Point, SvgElement};
use events::{Event, Response};
pub type Callback = Box<dyn Fn(Response)>;
@@ -9,60 +9,68 @@ pub struct Dispatcher {
}
impl Dispatcher {
pub fn handle_event(&self, tool_state: &mut ToolState, event: Event) -> Result<(), EditorError> {
pub fn handle_event(&self, state: &mut EditorState, event: Event) -> Result<(), EditorError> {
match event {
Event::SelectTool(tool_type) => {
tool_state.active_tool = tool_type;
state.tools.active_tool = tool_type;
Ok(())
}
Event::SelectPrimaryColor(color) => {
tool_state.primary_color = color;
state.tools.primary_color = color;
Ok(())
}
Event::SelectSecondaryColor(color) => {
tool_state.secondary_color = color;
state.tools.secondary_color = color;
Ok(())
}
Event::SwapColors => {
std::mem::swap(&mut tool_state.primary_color, &mut tool_state.secondary_color);
std::mem::swap(&mut state.tools.primary_color, &mut state.tools.secondary_color);
Ok(())
}
Event::ResetColors => {
tool_state.primary_color = Color::BLACK;
tool_state.secondary_color = Color::WHITE;
state.tools.primary_color = Color::BLACK;
state.tools.secondary_color = Color::WHITE;
Ok(())
}
Event::MouseDown(mouse_state) => {
tool_state.mouse_state = mouse_state;
state.tools.mouse_state = mouse_state;
// the state has changed so we add a trace point
tool_state.record_trace_point();
state.tools.record_trace_point();
self.emit_response(Response::UpdateCanvas);
// self.emit_response(Response::UpdateCanvas { document: state.document.render() });
Ok(())
}
Event::MouseUp(mouse_state) => {
tool_state.mouse_state = mouse_state;
state.tools.mouse_state = mouse_state;
// the state has changed so we add a trace point
tool_state.record_trace_point();
state.tools.record_trace_point();
self.emit_response(Response::UpdateCanvas);
state.document.svg.push(SvgElement::Circle(Circle {
center: Point {
x: mouse_state.position.x as f64,
y: mouse_state.position.y as f64,
},
radius: 10.0,
}));
self.emit_response(Response::UpdateCanvas { document: state.document.render() });
Ok(())
}
Event::MouseMovement(pos) => {
tool_state.mouse_state.position = pos;
tool_state.record_trace_point();
state.tools.mouse_state.position = pos;
state.tools.record_trace_point();
Ok(())
}
Event::ModifierKeyDown(mod_keys) => {
tool_state.mod_keys = mod_keys;
state.tools.mod_keys = mod_keys;
// the state has changed so we add a trace point
tool_state.record_trace_point();
state.tools.record_trace_point();
Ok(())
}
Event::ModifierKeyUp(mod_keys) => {
tool_state.mod_keys = mod_keys;
state.tools.mod_keys = mod_keys;
// the state has changed so we add a trace point
tool_state.record_trace_point();
state.tools.record_trace_point();
Ok(())
}
Event::KeyPress(key) => todo!(),

View File

@@ -17,25 +17,35 @@ pub use dispatcher::events;
pub use dispatcher::Callback;
use dispatcher::Dispatcher;
use document_core::Document;
use tools::ToolState;
use workspace::Workspace;
// TODO: serialize with serde to save the current editor state
pub struct Editor {
pub struct EditorState {
tools: ToolState,
workspace: Workspace,
document: Document,
}
// TODO: serialize with serde to save the current editor state
pub struct Editor {
state: EditorState,
dispatcher: Dispatcher,
}
impl Editor {
pub fn new(callback: Callback) -> Self {
Self {
tools: ToolState::new(),
workspace: Workspace::new(),
state: EditorState {
tools: ToolState::new(),
workspace: Workspace::new(),
document: Document::default(),
},
dispatcher: Dispatcher::new(callback),
}
}
pub fn handle_event(&mut self, event: events::Event) -> Result<(), EditorError> {
self.dispatcher.handle_event(&mut self.tools, event)
self.dispatcher.handle_event(&mut self.state, event)
}
}