Skip to content

Commit

Permalink
Merge e58d242 into 3b45d23
Browse files Browse the repository at this point in the history
  • Loading branch information
Pessimistress committed Feb 15, 2020
2 parents 3b45d23 + e58d242 commit c029693
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 21 deletions.
14 changes: 14 additions & 0 deletions docs/api-reference/composite-layer.md
Expand Up @@ -81,6 +81,20 @@ new GeoJsonLayer({
});
```

## Members

##### `isComposite`

Always `true`.

##### `isLoaded`

`true` if all asynchronous assets are loaded, and all sublayers are also loaded.

##### `parent`

A `Layer` instance if this layer is rendered by a [CompositeLayer](/docs/api-reference/composite-layer.md)


## Methods

Expand Down
11 changes: 11 additions & 0 deletions docs/api-reference/layer.md
Expand Up @@ -489,6 +489,17 @@ The state object allows a layer to store persistent information cross rendering
[Properties](/docs/api-reference/layer.md#constructor) of this layer.


## Members

##### `isLoaded`

`true` if all asynchronous assets are loaded.

##### `parent`

A `Layer` instance if this layer is rendered by a [CompositeLayer](/docs/api-reference/composite-layer.md)


## Methods

> Layer methods are designed to support the creation of new layers or layer sub-classing and are NOT intended to be called by applications.
Expand Down
4 changes: 4 additions & 0 deletions modules/core/src/lib/composite-layer.js
Expand Up @@ -28,6 +28,10 @@ export default class CompositeLayer extends Layer {
return true;
}

get isLoaded() {
return super.isLoaded && this.getSubLayers().every(layer => layer.isLoaded);
}

getSubLayers() {
return (this.internalState && this.internalState.subLayers) || [];
}
Expand Down
4 changes: 4 additions & 0 deletions modules/core/src/lib/layer.js
Expand Up @@ -148,6 +148,10 @@ export default class Layer extends Component {
return this.internalState.uniformTransitions.active;
}

get isLoaded() {
return this.internalState && !this.internalState.isAsyncPropLoading();
}

// Returns true if the layer is pickable and visible.
isPickable() {
return this.props.pickable && this.props.visible;
Expand Down
20 changes: 14 additions & 6 deletions modules/core/src/lifecycle/component-state.js
Expand Up @@ -79,12 +79,20 @@ export default class ComponentState {
}

isAsyncPropLoading(propName) {
const asyncProp = this.asyncProps[propName];
return Boolean(
asyncProp &&
asyncProp.pendingLoadCount > 0 &&
asyncProp.pendingLoadCount !== asyncProp.resolvedLoadCount
);
if (propName) {
const asyncProp = this.asyncProps[propName];
return Boolean(
asyncProp &&
asyncProp.pendingLoadCount > 0 &&
asyncProp.pendingLoadCount !== asyncProp.resolvedLoadCount
);
}
for (const key in this.asyncProps) {
if (this.isAsyncPropLoading(key)) {
return true;
}
}
return false;
}

// Updates all async/overridden props (when new props come in)
Expand Down
4 changes: 4 additions & 0 deletions modules/layers/src/icon-layer/icon-layer.js
Expand Up @@ -175,6 +175,10 @@ export default class IconLayer extends Layer {
}
/* eslint-enable max-statements, complexity */

get isLoaded() {
return super.isLoaded && this.state.iconManager.isLoaded;
}

finalizeState() {
super.finalizeState();
// Release resources held by the icon manager
Expand Down
2 changes: 1 addition & 1 deletion modules/layers/src/icon-layer/icon-manager.js
Expand Up @@ -244,7 +244,7 @@ export default class IconManager {
}
}

get loaded() {
get isLoaded() {
return this._pendingCount === 0;
}

Expand Down
6 changes: 5 additions & 1 deletion modules/test-utils/src/snapshot-test-runner.js
Expand Up @@ -29,7 +29,11 @@ const DEFAULT_TEST_OPTIONS = {
const DEFAULT_TEST_CASE = {
name: 'Unnamed snapshot test',
props: {},
onAfterRender: ({deck, layers, done}) => done(),
onAfterRender: ({deck, layers, done}) => {
if (layers.every(layer => layer.isLoaded)) {
done(); // eslint-disable-line
}
},
goldenImage: ''
};

Expand Down
16 changes: 15 additions & 1 deletion test/modules/core/lib/composite-layer.spec.js
Expand Up @@ -20,7 +20,7 @@

import test from 'tape-catch';
import {LayerManager, CompositeLayer, Layer, COORDINATE_SYSTEM} from 'deck.gl';
import {gl, testLayer} from '@deck.gl/test-utils';
import {gl, testLayer, testInitializeLayer} from '@deck.gl/test-utils';

const SUB_LAYER_ID = 'sub-layer-id';
const BASE_LAYER_ID = 'composite-layer-id';
Expand Down Expand Up @@ -339,3 +339,17 @@ test('CompositeLayer#setState', t => {

t.end();
});

test('CompositeLayer#isLoaded', t => {
const layer = new TestCompositeLayer({
data: Promise.resolve([]),
onDataLoad: () => {
t.ok(layer.isLoaded, 'data is loaded');
t.end();
}
});

testInitializeLayer({layer});

t.notOk(layer.isLoaded, 'is loading data');
});
14 changes: 14 additions & 0 deletions test/modules/core/lib/layer.spec.js
Expand Up @@ -468,3 +468,17 @@ test('Layer#calculateInstancePickingColors', t => {

t.end();
});

test('Layer#isLoaded', t => {
const layer = new SubLayer({
data: Promise.resolve([]),
onDataLoad: () => {
t.ok(layer.isLoaded, 'data is loaded');
t.end();
}
});

testInitializeLayer({layer});

t.notOk(layer.isLoaded, 'is loading data');
});
12 changes: 0 additions & 12 deletions test/render/test-cases/icon-layer.js
Expand Up @@ -141,12 +141,6 @@ export default [
}
})
],
onAfterRender: ({layers, done}) => {
if (layers[0].state.iconManager.loaded) {
// data is loaded
done();
}
},
goldenImage: './test/render/golden-images/icon-lnglat-large.png'
},
// This is based on last test case
Expand Down Expand Up @@ -190,12 +184,6 @@ export default [
}
})
],
onAfterRender: ({layers, done}) => {
if (layers[0].state.iconManager.loaded) {
// data is loaded
done();
}
},
goldenImage: './test/render/golden-images/icon-lnglat-resize-texture.png'
},
{
Expand Down

0 comments on commit c029693

Please sign in to comment.