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()"
>
@@ -37,7 +37,7 @@
type="button"
class="button dropbox"
:disabled="awaitingConnection"
- @click="openFileBrowser"
+ @click="openFileBrowser()"
>
@@ -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 @@