use crate::layers::layer_info::LegacyLayer; use crate::layers::style::{self, Stroke}; use crate::LayerId; use graphene_core::raster::BlendMode; use graphene_std::vector::subpath::Subpath; use serde::{Deserialize, Serialize}; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; #[repr(C)] #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] // TODO: Rename all instances of `path` to `layer_path` /// Operations that can be performed to mutate the document. pub enum Operation { // TODO: Remove AddFrame { path: Vec, insert_index: isize, transform: [f64; 6], network: graph_craft::document::NodeNetwork, }, /// Sets a blob URL as the image source for an Image or Imaginate layer type. /// **Be sure to call `FrontendMessage::TriggerRevokeBlobUrl` together with this.** SetLayerBlobUrl { layer_path: Vec, blob_url: String, resolution: (f64, f64), }, /// Clears the image to leave the layer un-rendered. /// **Be sure to call `FrontendMessage::TriggerRevokeBlobUrl` together with this.** ClearBlobURL { path: Vec, }, SetPivot { layer_path: Vec, pivot: (f64, f64), }, DeleteLayer { path: Vec, }, DuplicateLayer { path: Vec, }, RenameLayer { layer_path: Vec, new_name: String, }, InsertLayer { layer: Box, destination_path: Vec, insert_index: isize, duplicating: bool, }, CreateFolder { path: Vec, insert_index: isize, }, TransformLayer { path: Vec, transform: [f64; 6], }, TransformLayerInViewport { path: Vec, transform: [f64; 6], }, SetLayerTransformInViewport { path: Vec, transform: [f64; 6], }, SetShapePath { path: Vec, subpath: Subpath, }, SetVectorData { path: Vec, vector_data: graphene_core::vector::VectorData, }, SetSurface { path: Vec, surface_id: graphene_core::SurfaceId, }, SetSvg { path: Vec, svg: String, }, TransformLayerInScope { path: Vec, transform: [f64; 6], scope: [f64; 6], }, SetLayerTransformInScope { path: Vec, transform: [f64; 6], scope: [f64; 6], }, SetLayerScaleAroundPivot { path: Vec, new_scale: (f64, f64), }, SetLayerTransform { path: Vec, transform: [f64; 6], }, SetLayerVisibility { path: Vec, visible: bool, }, SetLayerPreserveAspect { layer_path: Vec, preserve_aspect: bool, }, SetLayerBlendMode { path: Vec, blend_mode: BlendMode, }, SetLayerOpacity { path: Vec, opacity: f64, }, SetLayerFill { path: Vec, fill: style::Fill, }, SetLayerStroke { path: Vec, stroke: Stroke, }, // The following are used only by the legacy overlays system AddEllipse { path: Vec, insert_index: isize, transform: [f64; 6], style: style::PathStyle, }, AddRect { path: Vec, insert_index: isize, transform: [f64; 6], style: style::PathStyle, }, AddLine { path: Vec, insert_index: isize, transform: [f64; 6], style: style::PathStyle, }, AddPolyline { path: Vec, insert_index: isize, transform: [f64; 6], style: style::PathStyle, points: Vec<(f64, f64)>, }, AddShape { path: Vec, insert_index: isize, transform: [f64; 6], style: style::PathStyle, subpath: Subpath, }, SetLayerStyle { path: Vec, style: style::PathStyle, }, } impl Operation { pub fn pseudo_hash(&self) -> u64 { let mut s = DefaultHasher::new(); std::mem::discriminant(self).hash(&mut s); s.finish() } }