Commit Graph

328 Commits

Author SHA1 Message Date
Azeem Bande-Ali
d4674e5856 Add support for saving and opening files (#325)
* 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>
2021-08-14 00:56:52 -07:00
Keavon Chambers
8551121793 Disallow snake_case variable names in frontend 2021-08-12 21:49:03 -07:00
Keavon Chambers
395e2b86ea Miscellaneous minor code cleanup
# Conflicts:
#	graphene/Cargo.toml
2021-08-12 20:34:36 -07:00
Keavon Chambers
3ae376e0e8 Replace promise with await in MenuList.vue 2021-08-12 19:25:57 -07:00
Keavon Chambers
e494b43029 Add number labels to ruler marks 2021-08-12 02:55:00 -07:00
Keavon Chambers
71eed244d1 Update terminology in the docs 2021-08-12 00:39:29 -07:00
Keavon Chambers
99a7dbdb97 Clean up popovers: background color and placeholder text 2021-08-11 23:53:05 -07:00
Keavon Chambers
e065046841 Revert "Fix floating menu positioning behavior when web page has scrollbars (#263) (#341)"
This reverts commit 02fd00da10.
2021-08-11 23:49:31 -07:00
Henry Sloan
0dda197d65 Ignore mouse events without any button state changes (#343) 2021-08-11 22:26:46 -07:00
0HyperCube
a828f38327 Fix floating menu positioning behavior when web page has scrollbars (#263) (#341)
* Fix color picker position on scrolled window

* Robust fix with proper usage of CSS stacking contexts

* Fix mobile device scaling

Co-authored-by: Keavon Chambers <keavon@keavon.com>
2021-08-11 16:56:18 -07:00
Paul Kupper
d7ca140199 Fix n-gon intersection (#342)
* Fix n-gon intersection

* Fix not all layers selected with box selection

* Code golf for TrueDoctor
2021-08-11 14:58:10 -07:00
Keavon Chambers
e00b040ce1 Update npm dependencies 2021-08-10 20:25:21 -07:00
dependabot[bot]
e152b34b12 Bump url-parse from 1.5.1 to 1.5.3 in /frontend (#339)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-10 20:18:57 -07:00
dependabot[bot]
a90c8784c2 Bump path-parse from 1.0.6 to 1.0.7 in /frontend (#340)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-10 20:08:57 -07:00
Keavon Chambers
8bdca0b301 Fix documentation links 2021-08-10 20:03:30 -07:00
Keavon Chambers
a570ff22e8 Improve document zooming to work based on nice steps (#336)
* Improve document zooming to work based on nice steps

* Code review improvements
2021-08-10 16:21:18 -07:00
Keaton Brandt
1ee94f41f0 Fix clicking on menu bar sub-menu entries (#337)
* Fix a bug where clicking a submenu would cause the parent menu to be closed before the submenu click could be registered. Also ignores package-lock.json.

* Remove package-lock gitignore

* Add back empty line
2021-08-10 14:54:09 -07:00
Keavon Chambers
ca40e373bf Upgrade packages and a couple fix warnings 2021-08-09 18:41:29 -07:00
Keavon Chambers
f73ee29fdd Add DisplayError to show user errors from the backend 2021-08-08 16:52:09 -07:00
Keavon Chambers
4b9c2eb793 Restructure project directories (#333)
`/client/web` -> `/frontend`
`/client/cli` -> *delete for now*
`/client/native` -> *delete for now*
`/core/editor` -> `/editor`
`/core/document` -> `/graphene`
`/core/renderer` -> `/charcoal`
`/core/proc-macro` -> `/proc-macros` *(now plural)*
2021-08-07 05:17:18 -07:00
Keavon Chambers
f26a0e26b0 Refactor RadioInput widget (#332) 2021-08-07 03:15:40 -07:00
TrueDoctor
da290f1e63 Transform API (#301)
* 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
2021-08-06 12:34:30 +02:00
Keavon Chambers
a9364f5122 Refactor document tab management from Panel.vue into utilities/documents.ts 2021-08-04 12:39:39 -07:00
dependabot[bot]
9a59d87857 Bump tar from 5.0.5 to 5.0.7 in /client/web (#329)
Bumps [tar](https://github.com/npm/node-tar) from 5.0.5 to 5.0.7.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v5.0.5...v5.0.7)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-03 17:11:16 -07:00
Henry Sloan
340c10a62b Change eyedropper to use correct message (#327) 2021-08-03 13:35:26 -07:00
Keavon Chambers
bff82fe238 Add a selected_layers() function and refactor code to use it (#314)
* Add a selected_layers() function 

* Refactor AlignSelectedLayers

Co-authored-by: Dennis Kobert <dennis@kobert.dev>
2021-08-01 10:29:23 +02:00
Keavon Chambers
19398e1dc8 Add checkbox to MenuBarInput widget 2021-07-31 18:20:51 -07:00
Henry Sloan
4cf0686801 Change flipping to use the joint bounding box of the selection (#323)
* Change flipping to use the joint bounding box

* Fix minor untested changes

* Replace unwrap with question mark
2021-07-31 15:18:54 -07:00
Keavon Chambers
170cda7357 Add DialogModal and use it for close confirmations and "coming soon" features (#322)
Closes #269
Closes #196

* Add DialogModal and use it for close confirmations and "coming soon" features

* Code cleanup; add Enter key to accept emphasized dialog button
2021-07-31 14:30:31 -07:00
Keavon Chambers
e1698c2783 Add TextButton widget (#321) 2021-07-31 04:58:25 -07:00
Keavon Chambers
8ed28daaf4 Fix two small bugs introduced in #311 2021-07-30 18:46:23 -07:00
Keavon Chambers
864a348e30 Add "Sides" label to Shape Tool's options bar number input 2021-07-30 15:45:49 -07:00
Keavon Chambers
ba83cfd958 Add the ability for NumberInput widgets to display labels
Part of #313
2021-07-29 13:56:45 -07:00
Keavon Chambers
ab651268d8 Layer opacity (#312)
Closes #187

* Add layer opacity input

* Improve Rust code cleanliness
2021-07-27 23:15:23 -07:00
Keavon Chambers
a288d51543 Add features to NumberInput widget; refactor widgets and tool options (#311)
Closes #310

* Add features to NumberInput widget; refactor widgets and tool options

* Fix swap/reset working colors using @click instead of :action
2021-07-27 18:28:21 -07:00
Keavon Chambers
8c91683c5b Fix antialiasing caused by <svg> width/height 100% 2021-07-25 17:25:39 -07:00
Henry Sloan
8e904c11cb Move blend mode declaration and implementation (#308) 2021-07-25 13:01:50 -07:00
Henry Sloan
91a93c1dc0 Avoid looping behavior with color selection (#305) 2021-07-25 02:31:50 -04:00
Henry Sloan
3920f81f58 Add alignment of selected layers (#296)
* Add alignment of selected layers

* Refactor alignment to a document message

* Condense align messages into a tuple variant

* Rename dimension to axis and fix redundant math

* Add correct Center alignment

* Add TODO comment for nested transforms

* Add TODO for merging bounding boxes

* Move align enums to document_message_handler

* Run cargo clippy

* Clean up unwraps with filter_map
2021-07-24 19:35:48 -04:00
Henry Sloan
7d3239ecac MVP eyedropper tool for fill colors (#300)
* Implement eyedropper for layer fill colors

* Add shortcut for eyedropper

* Add right mouse sampling for secondary color
2021-07-24 18:29:32 -04:00
TrueDoctor
03c5847d7e Various small fixes and cleanups (#299) 2021-07-24 17:59:01 +02:00
Keavon Chambers
f7d7257d50 Swap "Layer" and "Document" menu bar entries 2021-07-24 01:54:27 -07:00
Henry Sloan
57940d8cac Rename align operations and icons (#295)
* Rename align operations and icons

* Fix icon import paths
2021-07-24 00:42:48 -04:00
Henry Sloan
a65b525a5d Add dragging of layers with the select tool (#293)
* Add dragging of layers with the select tool

* Transform mouse positions based on root transform

* Add TODOs regarding root inverse transforms
2021-07-23 21:51:14 -04:00
Keavon Chambers
1821d3001a Fix inconsistent whitespace 2021-07-23 17:48:39 -07:00
Keavon Chambers
9daffb3dad Improve various code and docs spelling/grammar 2021-07-23 17:25:05 -07:00
TrueDoctor
70d1f77096 Hints backend (#234)
* Generate hints from list of actions

* Remove redundant Key from output

* Improve formatting

* Change logging verbosity for hints
2021-07-23 16:09:24 -07:00
TrueDoctor
ed0a0c49d0 Rearrange layers refactor (#281)
* Keep selection during reordering

* Fix paste layer selection

* Remove junk from layer matadata

* Add function to get non_selected_layers

* Cleanup

* Add tests
2021-07-24 00:54:30 +02:00
Henry Sloan
988dd7b400 Change tool option kinds to PascalCase (#292) 2021-07-23 14:47:55 -07:00
George Atkinson
86962fad3a Blend modes (#252)
* Add backend for selecting layer blend mode

* Change dropdown input to support callback on change

* Add debug messages

* Fix canvas update for blend-modes

* Finish up and polish blend modes implementations

* Add changes from code review

Co-authored-by: Keavon Chambers <keavon@keavon.com>
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
2021-07-23 10:21:07 -07:00