diff --git a/src/canvas.rs b/src/canvas.rs
index b33abe3..0729189 100644
--- a/src/canvas.rs
+++ b/src/canvas.rs
@@ -14,8 +14,6 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-use std::vec::Vec;
-
use im::{vector, Vector};
use serde::de::{Deserializer, SeqAccess, Visitor};
@@ -128,12 +126,26 @@ impl CanvasElement {
}
}
}
+
+ pub fn draw_selected(&self, ctx: &mut druid::PaintCtx) {
+ match self {
+ CanvasElement::Freehand {
+ path,
+ thickness,
+ ..
+ } => {
+ use druid::RenderContext;
+ ctx.stroke(&path.kurbo_path, &druid::Color::rgb(10.0, 0.0, 255.0), *thickness * 1.4);
+ }
+ }
+ }
}
#[derive(Clone, druid::Data)]
pub struct Canvas {
elements: Vector,
content_size: druid::Size,
+ selected_elements: Vector,
}
impl Canvas {
@@ -141,6 +153,7 @@ impl Canvas {
Canvas {
elements: vector![],
content_size: druid::Size::new(0.0, 0.0),
+ selected_elements: vector![],
}
}
@@ -165,25 +178,43 @@ impl Canvas {
&self.elements
}
- /// Find all CanvasElement that intersect with rect
- pub fn find_intersections(&self, rect: druid::Rect) -> Vec {
- let mut found_elements = Vec::::new();
-
+ pub fn has_elements_interesecting(&self, rect: druid::Rect) -> bool {
for (i, elem) in self.elements.iter().enumerate() {
// Check if the element intersects the eraser rect
if elem.bounding_box().intersect(rect).area() > 0.0 {
if elem.intersects_rect(rect) {
- found_elements.push(i);
+ return true;
}
}
}
+ false
+ }
+ /// Find all CanvasElement that intersect with rect
+ pub fn find_elements_intersecting(&self, rect: druid::Rect) -> Vector {
+ let found_elements = self.elements.iter().enumerate()
+ .filter_map(|(i, elem)| {
+ if elem.bounding_box().intersect(rect).area() > 0.0 {
+ if elem.intersects_rect(rect) {
+ return Some(i);
+ }
+ }
+ None
+ }).collect::>();
found_elements
}
pub fn content_size(&self) -> druid::Size {
self.content_size
}
+
+ pub fn selected_elements(&self) -> &Vector {
+ &self.selected_elements
+ }
+
+ pub fn selected_elements_mut(&mut self) -> &mut Vector {
+ &mut self.selected_elements
+ }
}
impl Serialize for Path {
diff --git a/src/history.rs b/src/history.rs
index 7acc021..5eea309 100644
--- a/src/history.rs
+++ b/src/history.rs
@@ -14,27 +14,26 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-use super::canvas::Canvas;
use im::Vector;
#[derive(Clone, druid::Data)]
-pub struct VersionedCanvas {
+pub struct Versioned {
// We internally guarantee that this vector
// is never empty
- versions: Vector