* Fix scale nudging for multiple selection
* Use message discriminant for filtering where possible
* Remove unnecessary parameter from `selected_bounds_document_space`
* Fix the error `target.closest is not a function`
* Minor cleanup
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
- Move message handler payload data into structs
- Organize the file structure used by `editor/src/messages/portfolio/document` `/node_graph` and `/graph_operation`
- Make derive attributes use `serde::Serialize, serde::Deserialize` consistently instead of `use serde::{Deserialize, Serialize};` imports
- Various other code cleanup and refactoring
* Ungroup layer external consistency and fix bug
* no message
* no message
* no message
* no message
* fix-bug
* Code review: make code more idiomatic
* Fix layres reversed when ungroup with index != -1
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* New folder placed directly above the topmost selected layer in the hierarchy (at the level of the least nested layer)
* fix bug
* Replace `.collect().contains()` with `.any()` and `if` statement with `.then_some()`
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* added struct and registered fill from stroke node. not functional yet.
* properly registered new node
* finished fill-from-stroke feature. works on both closed and open shapes. supports line caps and line joins.
* fixed import issues and miter limit handling
* fix outline function. use both subpaths for solid shapes now
* code quality improvements
* use radius instead of diameter, functionality not yet working for shapes as transform is not properly applied before calculating new shapes.
* Updated to follow new VectorData structure. Fully functional.
* fix repeat node
* remove comment
* add a test, remove unused code.
* Create a forgetable undo/redo function used by AbortTransaction
* Rework and fix new undo/redo functions
* Add space before comments
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Searchable font list
* Bug fixes and UX polish for edge cases
* More work, still more bugs to fix
* Don't update highlight when not open
* Bug fixes
* Additional bug fixes and code review
* Fix keyboard input being sent to backend
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Create a history step when importing SVG files
* Removed additional usvg::Tree::from_str call based on feedback, used DocumentHistoryBackward in case it fails
* no message
* no message
* no message
* Make layers reserve their names when grouped
* remove redundancy
* replace String::from("") with String::new()
* Fix test
* Restore unrequested line break changes
* Avoid unwraps
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add auto saving
* Fix autosave dispatching message but not saving document
* Clamp set_timeout delay
* Auto save all documents instead of only the active
* Add with_editor to simplify code
* Update consts
* Simplify some more
* Fix typo
* Code review
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Use doubles in graph
* Format .graphite files onto one line
* Rename new node to Vector2
* No primary input
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* #1578 sliding point works(1st approx)
TODO:
* don't move too close to the side points
* double click works incorrect?
* do we need to jump from segment to segment?
* #1578 disallow move slide point too close to side points
* fix double click + ctrl insertion
* #1578 select insertion point (except `ctrl` case)
* #1578 far depends on line width & more accurate seg finding
* #1578 insert point on most top suitable selected layer
* #1581 draw insertion point by overlay + `Esc` abort
* #1581 sharp stay unchanged on double click
* #1581 fix incorrect handle of scaling
* #1581 `square` selection point & too close in px(instead of magic)
* #1581 bug fix: insertion point on unselection
* #1581 use `color: Option` instead of `SelectionType`
* Some code review, still need to review shape_editor.rs
* #1581 insert sharp point on a straight segment
Also correct insertion on quadratic segments
`ManipulatorGroup::have_handle` have such form because `handle = Some(self.anchor)` often used instead of `handle = None`
* Final code review pass
* Code review pass
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Cache base64 representation of images when converting to graphic group
* Fix build
* Fix build again
* Actually fix it this time
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* WIP, transforms broken with rot/scale
* Transform around bounding box centre
* Add units and tooltips
---------
Co-authored-by: 0hypercube <0hypercube@gmail.com>
* Add Poisson-disk sampling node and Bezier-rs 0.4 release
* Additional optimizations
* More performance optimizations with help from 0Hypercube
* Add comments
* Display graph errors in the viewport
* Polish up the styling
* Clear click targets while graph can't be rendered
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>