* removed all use of document indicies
* -add u64 support for wasm bridge
* fixed rust formating
* Cleaned up FrontendDocumentState in js-messages
* Tiny tweaks from code review
* - moved more of closeDocumentWithConfirmation to rust
- updated serde_wasm_bindgen to add feature flag
* changed to upsteam version of serde_wasm_bindgen
* cargo fmt
* -fix event propigation on delete
- Js message change class extention to typedef
* changed another typedef
* cargo fmt
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* wasm: do the async initialization only once
This allows the rest of the app to access wasm synchronously.
This allows removing of a global.
* provide the wasm via vue provide/inject.
There's still code directly accessing the wasm. That will be changed later.
* MenuBarInput: use injected wasm instead of the global instance
* Let the App handle event listeners
* move stateful modules into state/
* state/fullscreen: create per instance
* App: load the initial document list on mount.
This got lost a few commits ago. Now it's back.
* state/dialog: create per instance
* util/input: remove dependency on global dialog instance
* state/documents: create per instance
* reponse-handler: move into EditorWasm
* comingSoon: move into dialog
* wasm: allow instantiating multiple editors
* input handlers: do not look at canvases outside the mounted App
* input: listen on the container instead of the window when possible
* - removed proxy from wasm-loader
- integrated with js-dispatcher
- state functions to classes
- integrated some upstream changes
* fix errors caused by merge
* Getting closer:
- added global state to track all instances
- fix fullscreen close trigger
- wasm-loader is statefull
- panic across instanes
* - fix outline while using editor
- removed circular import rule
- added editorInstance to js message constructor
* - changed input handler to a class
- still need a better way of handeling it in App.vue
* - fixed single instance of inputManager to weakmap
* - fix no-explicit-any in a few places
- removed global state from input.ts
* simplified two long lines
* removed global state
* removed $data from App
* add mut self to functions in api.rs
* Update Workspace.vue
remove outdated import
* fixed missing import
* Changes throughout code review; note this causes some bugs to be fixed in a later commit
* PR review round 1
* - fix coming soon bugs
- changed folder structure
* moved declaration to .d.ts
* - changed from classes to functions
- moved decs back to app.vue
* removed need to export js function to rust
* changed folder structure
* fixed indentation breaking multiline strings
* Fix eslint rule to whitelist @/../
* Simplify strip-indents implementation
* replace type assertions with better annotations or proper runtime checks
* Small tweaks and code rearranging improvements after second code review pass
* maybe fix mouse events
* Add back preventDefault for mouse scroll
* code review round 2
* Comment improvements
* -removed runtime checks
- fixed layers not showing
* - extened proxy to cover classes
- stopped multiple panics from logging
- Stop wasm-bindgen from mut ref counting our struct
* cleaned up messageConstructors exports
* Fix input and fullscreen regressions
Co-authored-by: Max Fisher <maxmfishernj@gmail.com>
Co-authored-by: mfish33 <32677537+mfish33@users.noreply.github.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Upgrade Graphite to Rust 2021 edition; upgrade dependencies
* Fix CI
* Move changes to the project Cargo.tomls
* Remove unnecessary 2021 edition upgrade tweak
* Show version number before and after updating rustc
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
# Conflicts:
# Cargo.lock
* Implement Path Tool
* Draw a red rectangle where the first point on the shape is
* Correctly render anchors, handles, and connecting lines
* Fix drain() which can panic
* Refactor frontend messages to work as return values not callbacks
* Reduce the number of unnecessary frontend updates
* Fix stack overflow by using a loop
* Group Document Render calls and put them at the end
* Speed hacks for dirtification
* Add performance
* Bunch folder changed updates
* Add triggers to redraw overlays to movement_handler
* Polish the pixel-perfect rendering of vector manipulators
* Restore scrollbars that were disabled
* Cleanup
* WIP Add shape outline rendering
* Fix compiling
* Add outlines to selected shapes
* Fix outlines rendering over handles and anchors
* Fix dirtification
* Add a comment
* Address code review feedback
* Formatting
* Small tweaks
Co-authored-by: Oliver Davies <oliver@psyfer.io>
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Refactor ViewportPosition from u32 (UVec2) to f64 (DVec2)
* Fix pseudo_hash call
* Replace hash function with proper function for uuid generation
* Cargo fmt
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Add support for saving a document
This is similar to the "export" functionality, except that
we store all metadata needed to open the file again.
Currently we store the internal representation of the layer
which is probably pretty fragile.
Example document:
```json
{
"nodes": {},
"root": {
"blend_mode": "Normal",
"cache": "...",
"cache_dirty": false,
"data": {
"Folder": {
"layer_ids": [
3902938778642561358
],
"layers": [
{
"blend_mode": "Normal",
"cache": "...",
"cache_dirty": false,
"data": {
"Shape": {
"path": [
{
"MoveTo": {
"x": 0.0,
"y": 0.0
}
},
{
"LineTo": {
"x": 1.0,
"y": 0.0
}
},
{
"LineTo": {
"x": 1.0,
"y": 1.0
}
},
{
"LineTo": {
"x": 0.0,
"y": 1.0
}
},
"ClosePath"
],
"render_index": 1,
"solid": true,
"style": {
"fill": {
"color": {
"alpha": 1.0,
"blue": 0.0,
"green": 0.0,
"red": 0.0
}
},
"stroke": null
}
}
},
"name": null,
"opacity": 1.0,
"thumbnail_cache": "...",
"transform": {
"matrix2": [
223.0,
0.0,
-0.0,
348.0
],
"translation": [
-188.0,
-334.0
]
},
"visible": true
}
],
"next_assignment_id": 3902938778642561359
}
},
"name": null,
"opacity": 1.0,
"thumbnail_cache": "...",
"transform": {
"matrix2": [
1.0,
0.0,
0.0,
1.0
],
"translation": [
479.0,
563.0
]
},
"visible": true
},
"version": 0
}
```
* Add support for opening a saved document
User can select a file using the browser's file input selector.
We parse it as JSON and load it into the internal representation.
Concerns:
- The file format is fragile
- Loading data directly into internal data structures usually creates
security vulnerabilities
- Error handling: The user is not informed of errors
* Serialize Document and skip "cache" fields in Layer
Instead of serializing the root layer, we serialize the
Document struct directly. Additionally, we mark the
"cache" fields in layer as "skip" fields so they
don't get serialized.
* Opened files use the filename as the tab title
* Split "new document" and "open document" handling
Open document needs name and content to be provided so having a
different interface is cleaner. Also did some refactoring to reuse code.
* Show error to user when a file fails to open
* Clean up code: better variable naming and structure
* Use document name for saved and exported files
We pass through the document name in the export and save
messages. Additionally, we check if the appropriate file
suffixes (.graphite and .svg) need to be added before
passing it to the frontend.
* Refactor document name generation
* Don't assign a default of 1 to Documents that start with something
other than DEFAULT_DOCUMENT_NAME
* Improve runtime complexity by using binary instead of linear search
* Update Layer panel upon document selection
* Add File>Open/Ctrl+O; File>Save (As)/Ctrl+(Shift)+S; browse filters extension; split out download()/upload() into files.ts; change unsaved close dialog text
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Enforce cache dirtification
* Turn all shapes into one struct
* Remove working folder
* Remove old shapes
* Major restructuring
* Refactor Ellipse, Rectangle and ShapeTool
* Simplify bounding box calculation for folder
* Fix panic in select tool
* Refactorselect tool
* Refactor Align
* Refactor flipping layers
* Zoom to fit all
* Refactor tools to avoid state keeping
* Refactor more tools to use state that is passed along
* Fix whitespace + change selection box style
* Set viewbox of svg export based on the contents
* Initial implementation of copy and paste for layers
* Sort layers on copy and add tests
* Fix logger init for test
* Fix `copy_paste_deleted_layers` test
* Readd erroneously removed svg
* Make Layer serializable and cleanup
* Add test for copy and pasting folders
* Cleanup
* Rename left_mouseup
* Cleanup
* Add length check to test
* Fix typo
* Make mouseup, mousedown more consistent
* Convert polygon and rectangle tool to kurbo::BezPath
* Add glam
* Add affine transform to elipse and remove circle
* Format
* Add svg group and add matrix for group
* Convert all operations to use matricies
* Work uses same transform as root
* Format
* Frontend fixed to render changes to working colors when changed from backend (#180)
* Backend and Frontend modification to show working color mods
* Remove comments & change precedence for tool and doc actions
* Add keybind for resetting work colors
* Minor Frontend changes
* Remove early sample "greet" code
* Add a contributing section to the project README
* Add moving document around
* Add document transform for tools
* Update to GraphiteEditor's fork
* Use write in foreach for rendering group / folder
* Add missing TranslateDown action
* Use points for line operation
* Format
* Add todo to change to shape's aspect ratio
* Remove empty if
* Initial pass at refactor
* Fix polyline test
* Use document message to modify document transform
* Messages -> Operations
* Transform layer
* Format
* Use DAffine2::IDENTITY
* Clean up kurbo generation for line and rect
* Use .into for rectangle points
* Rename cols to transform
* Rename other cols to transform
* Add todo for into_iter
* Remove unnecessary clone
Co-authored-by: akshay1992kalbhor <akshay1992kalbhor@gmail.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add input manager
* WIP lifetime hell
* Hell yeah, dark lifetime magic
* Replace events with actions in tools
* Fix borrow in GlobalEventHandler
* Fix typo in response-handler
* Distribute dispatch structure
* Add translation from events to actions
* Port default key actions to input_mapper
* Split actions macro
* Add handling for Ambiguous Mouse events
* Fix warnings and clippy lints
* Add actions macro
* WIP rework
* Add AsMessage macro
* Add implementation for derived enums
* Add macro implementation for top level message
* Add #[child] attribute to indicate derivation
* Replace some mentions of Actions and Responses with Message
* It compiles !!!
* Add functionality to some message handlers
* Add document rendering
* ICE
* Rework the previous code while keeping basic functionality
* Reduce parent-top-level macro args to only two
* Add workaround for ICE
* Fix cyclic reference in document.rs
* Make derive_transitive_child a bit more powerful
This addresses the todo that was left,
enabling arbitrary expressions to be passed as the last
parameter of a #[parent] attribute
* Adapt frontend message format
* Make responses use VecDeque
Our responses are a queue so we should use a queue type for them
* Move traits to sensible location
* Are we rectangle yet?
* Simplify, improve & document `derive_discriminant`
* Change `child` to `sub_discriminant`
This only applies to `ToDiscriminant`.
Code using `#[impl_message]` continues to work.
* Add docs for `derive_transitive_child`
* Finish docs and improve macros
The improvements are that impl_message now uses trait
resolution to obtain the parent's discriminant
and that derive_as_message now allows for non-unit
variants (which we don't use but it's nice to have,
just in case)
* Remove logging call
* Move files around and cleanup structure
* Fix proc macro doc tests
* Improve actions_fn!() macro
* Add ellipse tool
* Pass populated actions list to the input mapper
* Add KeyState bitvector
* Merge mouse buttons into "keyboard"
* Add macro for initialization of key mapper table
* Add syntactic sugar for the macro
* Implement mapping function
* Translate the remaining tools
* Fix shape tool
* Add keybindings for line and pen tool
* Fix modifiers
* Cleanup
* Add doc comments for the actions macro
* Fix formatting
* Rename MouseMove to PointerMove
* Add keybinds for tools
* Apply review suggestions
* Rename KeyMappings -> KeyMappingEntries
* Apply review changes
Co-authored-by: T0mstone <realt0mstone@gmail.com>
Co-authored-by: Paul Kupper <kupper.pa@gmail.com>
* Add proc-macro crate with two macros
* Let cargo recalculate the Cargo.lock
* Add tests and refactor some code to allow testing
also the impl for parse_hint_helper_attrs now preserves order
(which is essential for testing)