From 12a75de73d3014cce005dbbc393925b0b1c469da Mon Sep 17 00:00:00 2001 From: Igor Zinken Date: Thu, 17 Dec 2020 19:27:43 +0100 Subject: [PATCH] Restructured sprite factories, fixed bugs with multiple layer addition --- README.md | 9 +- .../document-canvas/document-canvas.vue | 42 +++++--- .../dropbox-file-selector.vue | 2 +- .../dropbox-connector/dropbox-connector.vue | 8 +- .../components/layers/layers.vue | 7 +- .../tool-options-zoom/tool-options-zoom.vue | 8 +- src/components/toolbox/toolbox.vue | 36 ++++++- src/components/ui/zcanvas/drawable-layer.js | 1 + src/definitions/image-types.js | 42 ++++---- .../layer-types.js} | 26 +---- src/definitions/{tools.js => tool-types.js} | 0 src/factories/document-factory.js | 9 +- src/factories/layer-factory.js | 58 +++++++++- src/factories/sprite-factory.js | 100 ++++++++++++++++++ src/mixins/image-to-document-manager.js | 32 ++++-- src/services/resource-service.js | 2 +- src/store/modules/document-module.js | 23 ++-- src/store/modules/tool-module.js | 12 +-- src/styles/_mixins.scss | 2 +- src/utils/canvas-util.js | 65 ------------ src/utils/resource-manager.js | 2 +- .../store/modules/document-module.spec.js | 63 +++++++---- 22 files changed, 348 insertions(+), 201 deletions(-) rename src/{factories/graphic-factory.js => definitions/layer-types.js} (58%) rename src/definitions/{tools.js => tool-types.js} (100%) create mode 100644 src/factories/sprite-factory.js diff --git a/README.md b/README.md index 248cc22..77ddfde 100644 --- a/README.md +++ b/README.md @@ -37,17 +37,16 @@ npm run lint # TODO / Roadmap -* Add layer view to options-panel: allow naming, repositioning, set as mask -* Drawable layers must be added to document (and thus be recalled when switching documents) +* Layer view in options-panel: allow naming, repositioning, set as mask +* Drawable layer bitmap content must be added to layer.bitmap (and thus be recalled when switching documents) * Add brush options > size, transparency -* opening image as new layer doesn't do proper sizing -* scale logic should move from zoomable-canvas into zCanvas (as handleInteraction needs to transform offsets by zoom ratio, see drawable-layer!) +* scale logic should move from zoomable-canvas into zCanvas (as handleInteraction needs to transform offsets by zoom ratio, see DrawableLayer!) * adjust scaling (on widescreen images scale in the width, rather than go for full height and zoomed out mode) * Default canvas background should be transparency blocks (requires zCanvas bg pattern update or just a lowest render layer that isn't part of the document) * Zoom in should be center based * Image position must be made persistent (now isn't on document switch) * Implement selections -* Unload Blobs when images are no longer used in document (see canvas-util disposeSprite, keep instance count of usages) +* Unload Blobs when images are no longer used in document (see sprite-factory disposeSprite, keep instance count of usages) * Export output to image file * Import / export documents from/to disk|Dropbox * Restore project by selecting folder from file system diff --git a/src/components/document-canvas/document-canvas.vue b/src/components/document-canvas/document-canvas.vue index 1f0dc6a..e95935e 100644 --- a/src/components/document-canvas/document-canvas.vue +++ b/src/components/document-canvas/document-canvas.vue @@ -47,12 +47,13 @@ import ZoomableCanvas from "@/components/ui/zcanvas/zoomable-canvas"; import DrawableLayer from "@/components/ui/zcanvas/drawable-layer"; import { scaleToRatio } from "@/utils/image-math"; import { - createSpriteForGraphic, runSpriteFn, flushSpritesInLayer, flushCache, -} from "@/utils/canvas-util"; + createSpriteForLayer, runSpriteFn, flushLayerSprites, flushCache, +} from "@/factories/sprite-factory"; /* internal non-reactive properties */ -let lastDocument, drawableLayer; +let lastDocument; +const layerPool = new Map(); // scale of the on-screen canvas relative to the document let xScale = 1, yScale = 1, zoom = 1, containerSize; @@ -68,6 +69,7 @@ export default { ]), ...mapGetters([ "activeDocument", + "layers", "activeTool", "zoomOptions", ]), @@ -78,7 +80,6 @@ export default { this.scaleCanvas(); }, activeDocument: { - deep: true, handler( document, oldValue = null ) { if ( !document?.layers ) { if ( this.zCanvas ) { @@ -95,22 +96,35 @@ export default { this.scaleCanvas(); }); } - const { name, width, height } = document; - if ( name !== lastDocument ) { - lastDocument = name; + const { id, width, height } = document; + if ( id !== lastDocument ) { + lastDocument = id; flushCache(); // switching between documents } if ( this.zCanvas.width !== width || this.zCanvas.height !== height ) { this.scaleCanvas(); } - document.layers.forEach( layer => { + }, + }, + layers: { + deep: true, + handler( layers ) { + const seen = []; + layers?.forEach( layer => { if ( !layer.visible ) { - flushSpritesInLayer( layer ); + flushLayerSprites( layer ); return; } - layer.graphics.forEach( graphic => { - const sprite = createSpriteForGraphic( this.zCanvas, graphic ); - }); + if ( !layerPool.has( layer.id )) { + const sprite = createSpriteForLayer( this.zCanvas, layer ); + layerPool.set( layer.id, sprite ); + } + seen.push( layer.id ); + }); + [ ...layerPool.keys() ].filter( id => !seen.includes( id )).forEach( id => { + console.warn("remove" + id); + flushLayerSprites( layerPool.get( id )); + layerPool.delete( id ); }); }, }, @@ -123,10 +137,6 @@ export default { isDraggable = true; break; case "brush": - if ( !drawableLayer ) { - drawableLayer = new DrawableLayer( this.activeDocument ); - this.zCanvas.addChild( drawableLayer ); - } break; } runSpriteFn( sprite => sprite.setDraggable( isDraggable || sprite instanceof DrawableLayer )); diff --git a/src/components/dropbox-file-selector/dropbox-file-selector.vue b/src/components/dropbox-file-selector/dropbox-file-selector.vue index 92ab7de..0a2a186 100644 --- a/src/components/dropbox-file-selector/dropbox-file-selector.vue +++ b/src/components/dropbox-file-selector/dropbox-file-selector.vue @@ -243,6 +243,6 @@ export default { width: 64px; height: 64px; vertical-align: top; - @include textOverflow(); + @include truncate(); } diff --git a/src/components/options-panel/components/dropbox-connector/dropbox-connector.vue b/src/components/options-panel/components/dropbox-connector/dropbox-connector.vue index 8c99c09..0ed0099 100644 --- a/src/components/options-panel/components/dropbox-connector/dropbox-connector.vue +++ b/src/components/options-panel/components/dropbox-connector/dropbox-connector.vue @@ -28,7 +28,7 @@ v-t="'loginToDropbox'" type="button" class="button dropbox" - @click="login" + @click="login()" > @@ -62,7 +62,7 @@ export default { }), computed: { awaitingConnection() { - return !this.isauthenticated && !this.authUrl; + return !this.authenticated && !this.authUrl; }, }, async created() { @@ -76,6 +76,7 @@ export default { window.dropboxClientId || localStorage?.getItem( "dropboxClientId" ), window.dropboxRedirect || `${window.location.href}login.html` ); + this.login(); } this.loading = false; }, @@ -101,6 +102,7 @@ export default { } }, openFileBrowser() { + console.warn("alstu?"); this.openModal( DROPBOX_FILE_SELECTOR ); }, showConnectionMessage() { diff --git a/src/components/options-panel/components/layers/layers.vue b/src/components/options-panel/components/layers/layers.vue index 1bfa19a..d321a78 100644 --- a/src/components/options-panel/components/layers/layers.vue +++ b/src/components/options-panel/components/layers/layers.vue @@ -73,7 +73,11 @@ export default { "setActiveLayerIndex", ]), requestLayerAdd() { - this.addLayer( this.$t( "newLayerNum", { num: this.layers.length + 1 })); + this.addLayer({ + name: this.$t( "newLayerNum", { num: this.layers.length + 1 }), + width: this.activeDocument.width, + height: this.activeDocument.height + }); }, requestLayerRemove() { this.removeLayer( this.activeLayer ); @@ -93,6 +97,7 @@ h3 { .layer-list { padding: $spacing-small 0; @include boxSize(); + @include truncate(); border-top: 1px solid $color-lines; border-bottom: 1px solid $color-lines; } diff --git a/src/components/options-panel/components/tool-options-zoom/tool-options-zoom.vue b/src/components/options-panel/components/tool-options-zoom/tool-options-zoom.vue index 68fe13b..485a3e3 100644 --- a/src/components/options-panel/components/tool-options-zoom/tool-options-zoom.vue +++ b/src/components/options-panel/components/tool-options-zoom/tool-options-zoom.vue @@ -34,9 +34,9 @@