* Implement let binding
* Add lambda inputs
* Fix tests
* Fix proto network formatting
* Generate a template Scoped network by default
* Add comment to explain the lambda parameter
* Move binding wrapping out of the template
* Fix errors cause by image frames
* Change tauri build directory back to `../dist` (#1033)
* Select Tool: Deselect selected layer when clicked while holding shift
* Fix formatting
* Change deselecting to happen on mouse up
* Clean up debug and rustfmt
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add Blend node
* Add more implementations
Currently, known buggy implementations:
* Color Burn
* Saturation
Opacity is currently achieved by linear interpolation, this will be changed as soon as all filters are implemented.
* Add more implementations
Currently, known incorrect implementations:
* Color Burn
* Saturation
Not yet Tested:
* Linear Burn
* Linear Dodge
* Vivid Light
* Linear Light
* Pin Light
* Hard Mix
* Subtract
* Divide
Opacity is currently achieved by linear interpolation, this will be changed as soon as all filters are implemented.
* Cleanup
* Removed Unused Code
* Fixed Clamping Issue
* Fixed Inverted Opacity
* Moved Opacity Calculation from individual Blend Functions into 'blend_node' function
* Fix 'Color Burn' blend mode
Currently, known incorrect implementations:
* Saturation
Not yet Tested:
* Linear Burn
* Darker Color
* Linear Dodge
* Lighter Color
* Vivid Light
* Linear Light
* Pin Light
* Hard Mix
* Subtract
* Divide
Opacity is currently achieved by linear interpolation, this will be changed as soon as all filters are implemented.
* Fix 'Saturation' blend mode
Currently, known incorrect implementations:
* None :D
Not yet Tested:
* Linear Burn
* Darker Color
* Linear Dodge
* Lighter Color
* Vivid Light
* Linear Light
* Pin Light
* Hard Mix
* Subtract
* Divide
Opacity is currently achieved by linear interpolation, this will be changed as soon as all filters are implemented.
* Final Cleanups
* Add proper Inputs
* cargo fmt
* Add test for doubling number
* Display implementation for ProtoNetwork
* Switch top and bottom
* Add input types for blend image node
* Fix test
---------
Co-authored-by: 0hypercube <0hypercube@gmail.com>
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* adds lock angle to pen tool
The current [Shift] Break Handle behavior should become Alt instead of Shift
The current [Ctrl] Snap 15° behavior should become Shift instead of Ctrl
Implement the extend-in-this-direction feature called [Ctrl] Lock Angle that exists in the Line tool, but doesn't yet exist in the Pen tool
* avoid clone by passing exlusive ref to tool data field directly
* Rearrange hints
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Restore path handle length to previous length when shift is released while dragging
* Reset previous opposing handle length on Delete and Abort messages
* Move the opposing handle length state to the path tool
* Use MoveManipulatorPoint messages instead of modifying MoveSelectedManipulatorPoints + break handle mirroring on dragging both handles without anchor
* Handle alt + improve reset logic + comments
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* implements pan/zoom to the selected layer(s) on Period
Relates to #989
* adds layer menu support: Layer -> Center View on Selection
* relocate Center View on Selection to View -> Zoom to selected
* use the proper menu title
* Fix default value for output node
* Don't set frame transform to zero
* Fix typo in hash function
* Clear frame on empty image
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Selecting an individual anchor point deselects each of the other points
* git gra
* Selecting intersecting shapes,selects top shape
* Merge commit
* cargo fmt
* fixed: can't drag multiple selected shapes.
* Merge commit
* Merge commit
* Code review tweaks
* Merge commit
* Fixed topmost layer and previous_mouse_position
* Fixed issues when clicking on anchors
* Works
* Function name change
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Create helper for converting d to t values
* Add euclidean option for tangent and normal
* Modified bezier functions signatures to accept ComputeType
* Stylistic changes per review
* Added ComputeType documentation
* Renamed ComputeType to TValue
* Fixed comments
* Fixed failing unit tests
* Code review
* Fix comments in code review
* Renamed compute_type_to_parametric to t_value_to_parametric
---------
Co-authored-by: Linda Zheng <thelindazheng@gmail.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Multiple node outputs
* Add new nodes
* gcore use std by default to allow for testing
* Allow multiple node outputs
* Multiple outputs to frontend
* Add ImageFrameNode to node registry
* Minor cleanup
* Basic transform implementation
* Add some logging to image encoding
* Fix ImageFrameNode
* Add transform input to Imaginate node (#1014)
* Add transform input to imaginate node
* Force the resolution to be edited with no transform
* Add transform to imaginate generation
* Fix compilation
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add labels to node outputs
* Fix seed; disable mask when transform is disconnected; add Imaginate tooltips
* Rename 'Input Multiple' node to 'Input'
* Code review
* Replicate to Svelte
* Show only the primary input chain in the Properties panel
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Generate stable node ids
* checkpoint
* Implement borrow tree
* Add eval function on borrow tree
* Refactor Node trait to fix lifetime issues
* Compiler infinite loop
* Impl compose pair
* Transition to double lifetime on trait
* Change node trait to use a generic arg for the input
* Start adapting node_macro
* Migrate more nodes to new macro
* Fix raster tests
* Port vector nodes
* Make Node trait object safe
* Fix FlatMapResultNode
* Translate most of gstd
* Fix DowncastBothNode
* Refactor node trait once again to allow for HRTB for type erased nodes
* Start working on type erased nodes
* Try getting DowncastBothNode to work
* Introduce Upcasting node + work on BorrowTree
* Make enough 'static to get the code to compile
* Transition DynamicExecutor to use borrow tree
* Make Compose Node use HRTB's
* Fix MapResultNode
* Disable blur test
* Add workaround for Composing type erased nodes
* Convert more nodes in the node_registry
* Convert more of the node_registry
* Add update tree fn and hook up to frontend
* Fix blur node
* Implement CacheNode
* Make frontend use graph compiler
* Fix document_node_types type declaration for most nodes
* Remove unused imports
* Move comment down
* Reuse nodes via borrow tree
* Deprecate trait based value in favor of TaggedValue
* Remove unsafe code in buffer creation
* Fix blur node
* Fix stable node id generation
* Fix types for Image adjustment document nodes
* Fix Imaginate Node
* Remove unused imports
* Remove log
* Fix off by one error
* Remove macro generated imaginate node entry
* Create parameterized add node
* Fix test case
* Remove link from layer_panel.rs
* Fix formatting
* Allow text editing when pressing Enter on a single selected text layer
* Updated LayerDataType import
* Extract the logic to set the edit layer into a function
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* add derive(specta::Type)
* use specta from git
* introduce Uuid type
* remove unnecessary specta::Type
* document export_types test
* upgrade Specta
The previous Specta branch had some hacks that were just for this project. They have all been converted into proper features so they can be merged into main.
* remove some unnecessary specta::Type uses
* add MessageDiscriminantDef explanation
* manually export types with specta
* rename 'specta.rs' to 'export_types.rs'
* rename 'export_types' to 'generate_ts_types'
---------
Co-authored-by: Oscar Beaumont <oscar@otbeaumont.me>
* Added new DocumentResponse variant
* Update Operation::DeleteSelectedManipulatorPoints to update Layer Tree by delegating deletion to Operation::DeleteLayer. Also emits Operation::DeletedSelectedManipulatorPoints to let editor clear Properties panel
* Update process_message() to deal with new DocumentResponse::DeletedSelectedManipulatorPoints match case. When this DocumentResponse is emitted, it clears the Properties panel.
* Added Display trait implementation for DocumentResponse::DeletedSelectedManipulatorPoints. Updated imports in document_message_handler.rs to get the correct types for messages emitted from DocumentResponse::DeletedSelectedManipulatorPoints match case in process_message().
* Removed useless import. Capitalized comments for style consistency.
* Updated messages emitted to clear Properties panel by emitting LayoutMessage::SendLayout's instead, which update the backend widget state
* Revert inclusion of unused imports
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Use builder pattern for widgets
* Arguments to new function
* Add node graph when dragging in image
* Fix duplicate import
* Skip processing under node graph frame if unused
* Reduce node graph rerenders
* DUPLICATE ALL frontend changes into other frontend
* DUPLICATE more changes to another frontend
* Code review
* Allow importing SVG files as bitmaps
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Convert DocumentSave to struct
* Comit the artboard history save in some cases
* Cause index out of bounds error
* Use box to avoid weird wasm error
* Implement the artboard history
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add self hosted runner to ci.yml
* Remove libgtk install
* Use mold as the linker
* Make build logs non verbose
* Fix crash on failure to get GLOBAL_PLATFORM
* Copy the platform enum before calling unwrap_or_default
Co-authored-by: 0hypercube <0hypercube@gmail.com>
* Fixes issue of hints not closing when all documents are closed
* Fix whitespace and rewrite comment
* Close tool hints when you close all documents by doing File->Close All
* Add some more history states
* Fix undo whilst drawing
* Paste image history
* Toggle output and preview history
* Code review nits
* Remove extra '{'
* Fix typo
* Fix about.toml
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Reuse existing gradient
* Double click to insert gradient stop
* Add history states to the gradient tool
* Do trig in viewport space so it is actually perpendicular
* Sync tool options with active gradient
* Deleting points with delete key
* More tolerance on inserting points
* Add the link button
* Transform around pivot
* Remove log
* Fix tests
* Add a hacky two-line layout for the checkbox
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Store drag start as document position
* Don't open graph whilst drawing
* Rename to is_drawing_node_graph_frame
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Don't allow disabling input or output nodes
* Shortcuts to show and preview node
* Update preview tooltip and label
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add UI diffs to rust
* Clean up some js
* Fix lints
* Fix test
* Remove one unnecessary keyword
* Rename to widget path
* Rename new_val to new_value
* Rename newVal to layoutGroup in createLayoutGroup
* Extract get_widget_path to a function
* Base skipping on the layout rather than the target
* Rename to ResendActiveWidget
* Switch info to trace
* Add a link to the documentation about Object.assign
* knitpick js changes
* Add more comments to diff functions
Co-authored-by: mfish33 <maxmfishernj@gmail.com>
* Add drag to connect nodes
* Clean up node graph code
* Close node list with escape or click
* Check if line is contained within box
* Shift the nodes
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Cleanup Vector Nodes
* Add the creating nodes guide
* Rename guide as readme so GitHub shows it by default
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Setup tauri component for graphite editor
Integrate graphite into tauri app
Split interpreted-executor out of graph-craft
* Add gpu execution node
* General Cleanup
* Move the Subpath type to graphene-std
* Add the transform subpath node
* Delete selected nodes
* Inserting node list on right click
* Add several bitmap manipulator nodes
* Convert add node to use f64
* Add posterize node
* Rename names randomly
* Fix naming
* Exposure node
* Fix typo
* Adjust exposure node range
* Comment out vector nodes
* Adjust exposure range again
* Posterise as ints
* Rename input
* Use >= in the to hsl function
* Add exposing inputs to graph
* Use uuids and better node positioning
* Fix accidentally refering to the wrong grid spacing
* Secondary input without primary input
* Cleanup document node types
* Rename to input and addend
* Do not select layer immediatly on drag
* Add LayerReferenceInput MVP widget
* Properties Panel
* Fix dragging marker flicker
* Change mask shape to outline
* Add mask rendering
* Simplify select code
* Remove colours
* Fix inpaint/outpaint and rearrage widget UX
* Add mask blur and mask starting fill parameters
* Guard for the case when the layer is missing
* Add icon to LayerReferenceInput to finalize its UI
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add enum to evaluate for differenciating compute type
* Add euclidean parameterization and update styling in the UI
Co-authored-by: Rob Nadal <robnadal44@gmail.com>
* Update usage of evaluate in graphite
* Add description
* Code review changes
* Update tests
* Improve ComputeType ergonomics
* Large code review/cleanup pass
Co-authored-by: Rob Nadal <robnadal44@gmail.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Node graph API stub
* Rename and fix SetInputValue
* Get list of links from network
* Test populating node graph UI
* Node properties
* Fix viewport bounds
* Slightly change promise usage
* A tiny bit of cleanup I did while reading code
* Cleanup and work towards hooking up node links in Vue template
* Add the brighten colour node
* Run cargo fmt
* Add to and from hsla
* GrayscaleImage node with small perf improvement
* Fix gutter panel resizing
* Display node links from backend
* Add support for connecting node links
* Use existing message
* Fix formatting error
* Add a (currently crashing) brighten node
* Replace brighten node with proto node implementation
* Add support for connecting node links
* Update watch dirs
* Add hue shift node
* Add create_node function to editor api
* Basic insert node UI
* Fix broken names
* Add log
* Fix positioning
* Set connector index to 0
* Add properties for Heu shift / brighten
* Allow deselecting nodes
* Redesign Properties panel collapsible sections
Co-authored-by: Keavon Chambers <keavon@keavon.com>
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Limit saved undo history
* Do not commit path every mouse move event
* Reference count images in history system instead of cloning the image data
* Increase history storage step limit to 100
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add range slider to NumberInput
* Cleanup
* Fix event ordering causing bug in Firefox
* Polish the code
* Switch number input modes to range in relevant places
* Add gradient stops
* Better step adding
* Steps can be dragged past each other
* Swapping and switching gradient/fill
* Fix convert to gradient
* Skip non finite transforms for overlays
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Update the Imaginate feature server API
* Change connection status strategy to prevent console errors
* Possible CORS fix? Maybe revert.
* Update to the final API and fix bugs
* Organize persistence.ts
* Switch to simpler promise handling
* Switch document list storage from localStorage to IndexedDB
* Track document auto-save status to avoid re-auto-saving unnecessarily
* Add button to clear storage on crash
* Bump document version and test file
* Switch to IDB-Keyval instead of raw IDB transactions
* Add cancel hint to Eyedropper tool
* Improve eyedropper overlay CSS
* Make CSS for transparent checkered background reusable
* Add color choice preview to color picker
* Draw text and markers as contrasting white or black
* Add reactive color updating and new/initial swapping
* Add Hex, RGB, HSV, and Opacity inputs
* Add none color and preset buttons
* Add eyedropper button and fix alignment (now visually done)
* Wire up none colors through the backend and style the ColorInput widget
* Add color info chip to ColorInput widget
* Fix all UX bugs
* Add more tooltips
* Fix FloatingMenu recursive loop
* Prevent mouse stray from closing color picker while dragging pickers
Closes#703
* Fix deselect all layers shortcut
* Add temporary eyedropper for Chromium browsers and a coming soon fallback
* Break path by placing anchor on previous one
* Fix offset on click without dragging
* Fix bug where ids reassigned from saved document
* Fix stuck overlay
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Double click to flip sharpness of anchor's handles
* Fix bad length
* Convert mirror distance to toggle
* Revert "Convert mirror distance to toggle"
This reverts commit 76b565002265feb29c899840c4b4696b80a220b2.
* Fix mirror_distance_between_handles being inverted
* Move FloatingMenu template component
* Rewrite the ColorPicker component so it's not horrifically bad code
* Move FloatingMenu into the ColorPicker component
* Little Imaginate fixes
* Add todo
* Add AI Artist layer
* WIP add a button to download the rendered folder under an AI Artist layer
* Successfully download the correct image
* Break out image downloading JS into helper function
* Change file download from using data URLs to blob URLs
* WIP rasterize to blob
* Remove dimensions from AI Artist layer
* Successfully draw rasterized image on layer after calculation
* Working txt2img generation based on user prompt
* Add img2img and the main parameters
* Fix ability to rasterize multi-depth documents with blob URL images by switching them to base64
* Fix test
* Rasterize with artboard background color
* Allow aspect ratio stretch of AI Artist images
* Add automatic resolution choosing
* Add a terminate button, and make the lifecycle more robust
* Add negative prompt
* Add range bounds for parameter inputs
* Add seed
* Add tiling and restore faces
* Add server status check, server hostname customization, and resizing layer to fit AI Artist resolution
* Fix background color of infinite canvas rasterization
* Escape prompt text sent in the JSON
* Revoke blob URLs when cleared/replaced to reduce memory leak
* Fix welcome screen logo color
* Add PreferencesMessageHandler
* Add persistent storage of preferences
* Fix crash introduced in previous commit when moving mouse on page load
* Add tooltips to the AI Artist layer properties
* Integrate AI Artist tool into the raster section of the tool shelf
* Add a refresh button to the connection status
* Fix crash when generating and switching to a different document tab
* Add persistent image storage to AI Artist layers and fix duplication bugs
* Add a generate with random seed button
* Simplify and standardize message names
* Majorly improve robustness of networking code
* Fix race condition causing default server hostname to show disconnected when app loads with AI Artist layer selected (probably, not confirmed fixed)
* Clean up messages and function calls by changing arguments into structs
* Update API to more recent server commit
* Add support for picking the sampling method
* Add machinery for filtering selected layers with type
* Replace placeholder button icons
* Improve the random icon by tilting the dice
* Use selected_layers() instead of repeating that code
* Fix borrow error
* Change message flow in progress towards fixing #797
* Allow loading image on non-active document (fixes#797)
* Reduce code duplication with rasterization
* Add AI Artist tool and layer icons, and remove ugly node layer icon style
* Rename "AI Artist" codename to "Imaginate" feature name
Co-authored-by: otdavies <oliver@psyfer.io>
Co-authored-by: 0hypercube <0hypercube@gmail.com>
* Fix crashes when dragging the bounding box/transform cage of a 0-scale shape.
* Fix crashes when dragging the pivot point of a 0-scale shape
* Fix rotation computation on DAffine2 when scale.x is 0, avoids Nan display
* remove remaining log::info that I introduced in earlier commit
* Fix crash when updating the scale of a transform that was already 0.
* Fix NumberInput behaviour when the requested value changed is does not happen.
* Fix rotation computation when Scale X and Scale Y are both 0. Display 0. This also fixes crashes when modifying the rotation in such case
* Close paths with pen tool
* Issue Z command always at end of path
* Small code review style changes
* Extending paths
* Fix mirror on extend path
* Code review tweaks
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* added arcs impl
Co-authored-by: Hannah Li <hannahli2010@gmail.com>
Co-authored-by: Rob Nadal <RobNadal@users.noreply.github.com>
* fixed arc drawing, todo - fix linear check
Co-authored-by: Hannah Li <hannahli2010@gmail.com>
* fixed linear bug + added comments and tests
Co-authored-by: Hannah Li <hannahli2010@gmail.com>
* added max iteration guard + made params optional + added impl todo
* Add functionality to get arcs between extrema
* Add ArcsOptions to manage optional parameters of the arcs function
* added slider to toggle between arcs impl
Co-authored-by: Rob Nadal <RobNadal@users.noreply.github.com>
* Remove unused types
* address some comments
* added rustdoc for CircularArc struct
* Extract duplicate code into helper, remove loop labels, use window function
* Make JsValue handling consistent in WasmBezier and add comments for the underlying type
* Add enum for MaximizeArcs Auto/On/Off functionality
* Change Auto to Automatic
* fix errors from resolving merge conflict
* fixed error from resolving merge conflicts
* fixed formatting
* address comments
* Small fix
* Add some missing comments
* address comments
* rename variable
* Use unit to show maximize_arcs values
* Change i32 to usize and other minor adjustments
* Change computation for middle t values
* Remove tsconfig
* Fix more usize number handling
Co-authored-by: Hannah Li <hannahli2010@gmail.com>
Co-authored-by: Rob Nadal <RobNadal@users.noreply.github.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* IPP for Mac, flawed initial experiments
* Cleanup and progress, but not compiling yet
* Fix error and rename nonmac -> standard
* Extentd ipp macros to accomodate mac input
* Add Mac versions of shortcuts; refactor and document the input mapper macros
* Change frontend styling for user input labels in floating menus
* Additional macro documentation
* A little more documentation
* Improve entry macro syntax
* Move input mapper macros to a separate file
* Adapt the keyboard shortcuts to the user's OS
* Display keyboard shortcuts in the menu bar based on OS
* Change Input Mapper macro syntax from {} to ()
* Fix esc key bug in Vue
* Tweaks
* Interim solution for Mac-specific hints
* Feed tooltip input hotkeys from their actions
* Fix hotkeys for tools because of missing actions
* Make Vue respect Ctrl/Cmd differences per platform
* Remove commented lines
* Code review pass by me
* Code review suggestions with TrueDoctor
* Turn FutureKeyMapping struct into ActionKeys enum which is a bit cleaner
* Add serde derive attributes for message discriminants
* Re-add serde deserialize
* Fix not mutating ActionKeys conversion; remove custom serializer
* Add serde to dev dependencies
Co-authored-by: Dennis <dennis@kobert.dev>