New overlay system that reimplements how overlays are drawn (#418)

* New overlay system that reimplements how overlays are drawn

* Fix overlay message declaration

* Fix small mistake

* WIP (broken) changes to plumb the overlay document

* Fix confusion over messaging system architecture

* Removed log

* Overlay system working

* (broken) WIP overlay association

* Finish the overlay system (except test failure)

* Change back IDs in test

* Fixed test, but stilled fails due to revealed real problem with layer reordering selection

* Disable broken test that has a bug in issue #444

Co-authored-by: Dennis <dennis@kobert.dev>
Co-authored-by: otdavies <oliver@psyfer.io>
This commit is contained in:
Keavon Chambers
2021-12-30 09:48:39 -08:00
co-authored by Dennis otdavies
parent 1a70667f63
commit eb96eafe60
22 changed files with 416 additions and 313 deletions
+7 -35
View File
@@ -200,12 +200,10 @@ impl Document {
pub fn visit_all_shapes<F: FnMut(&mut Shape)>(layer: &mut Layer, modify_shape: &mut F) -> bool {
match layer.data {
LayerDataType::Shape(ref mut shape) => {
if !layer.overlay {
modify_shape(shape);
modify_shape(shape);
// This layer should be updated on next render pass
layer.cache_dirty = true;
}
// This layer should be updated on next render pass
layer.cache_dirty = true;
}
LayerDataType::Folder(ref mut folder) => {
for sub_layer in folder.layers_mut() {
@@ -354,24 +352,6 @@ impl Document {
self.set_transform_relative_to_scope(layer, None, transform)
}
fn remove_overlays(&mut self, path: &mut Vec<LayerId>) {
if self.layer(path).unwrap().overlay {
self.delete(path).unwrap()
}
let ids = self.folder(path).map(|folder| folder.layer_ids.clone()).unwrap_or_default();
for id in ids {
path.push(id);
self.remove_overlays(path);
path.pop();
}
}
pub fn clone_without_overlays(&self) -> Self {
let mut document = self.clone();
document.remove_overlays(&mut vec![]);
document
}
/// Mutate the document by applying the `operation` to it. If the operation necessitates a
/// reaction from the frontend, responses may be returned.
pub fn handle_operation(&mut self, operation: &Operation) -> Result<Option<Vec<DocumentResponse>>, DocumentError> {
@@ -390,9 +370,7 @@ impl Document {
let mut ellipse = Shape::ellipse(*style);
ellipse.render_index = -1;
let mut layer = Layer::new(LayerDataType::Shape(ellipse), *transform);
layer.overlay = true;
let layer = Layer::new(LayerDataType::Shape(ellipse), *transform);
self.set_layer(path, layer, -1)?;
Some([vec![DocumentChanged, CreatedLayer { path: path.clone() }]].concat())
@@ -408,9 +386,7 @@ impl Document {
let mut rect = Shape::rectangle(*style);
rect.render_index = -1;
let mut layer = Layer::new(LayerDataType::Shape(rect), *transform);
layer.overlay = true;
let layer = Layer::new(LayerDataType::Shape(rect), *transform);
self.set_layer(path, layer, -1)?;
Some([vec![DocumentChanged, CreatedLayer { path: path.clone() }]].concat())
@@ -426,9 +402,7 @@ impl Document {
let mut line = Shape::line(*style);
line.render_index = -1;
let mut layer = Layer::new(LayerDataType::Shape(line), *transform);
layer.overlay = true;
let layer = Layer::new(LayerDataType::Shape(line), *transform);
self.set_layer(path, layer, -1)?;
Some([vec![DocumentChanged, CreatedLayer { path: path.clone() }]].concat())
@@ -450,9 +424,7 @@ impl Document {
let mut shape = Shape::from_bez_path(bez_path.clone(), *style, false);
shape.render_index = -1;
let mut layer = Layer::new(LayerDataType::Shape(shape), DAffine2::IDENTITY.to_cols_array());
layer.overlay = true;
let layer = Layer::new(LayerDataType::Shape(shape), DAffine2::IDENTITY.to_cols_array());
self.set_layer(path, layer, -1)?;
Some([vec![DocumentChanged, CreatedLayer { path: path.clone() }]].concat())