in src/component/tag/TagComponent.ts [700:873]
protected _activate(): void {
this._editVertexHandler.enable();
const handlerGeometryCreated$ =
observableFrom(<(keyof typeof TagMode)[]>Object.keys(this._createHandlers)).pipe(
map(
(key: keyof typeof TagMode): CreateHandlerBase => {
return this._createHandlers[key];
}),
filter(
(handler: CreateHandlerBase): boolean => {
return !!handler;
}),
mergeMap(
(handler: CreateHandlerBase): Observable<Geometry> => {
return handler.geometryCreated$;
}),
share());
const subs = this._subscriptions;
subs.push(handlerGeometryCreated$
.subscribe(
(geometry: Geometry): void => {
const type: ComponentEventType = "geometrycreate";
const event: ComponentGeometryEvent = {
geometry,
target: this,
type,
};
this.fire(type, event);
}));
subs.push(this._tagCreator.tag$.pipe(
skipWhile(
(tag: CreateTag<Geometry>): boolean => {
return tag == null;
}),
distinctUntilChanged())
.subscribe(
(tag: CreateTag<Geometry>): void => {
const type: ComponentEventType = tag != null ?
"tagcreatestart" :
"tagcreateend";
const event: ComponentStateEvent = {
target: this,
type,
};
this.fire(type, event);
}));
subs.push(handlerGeometryCreated$
.subscribe(
(): void => {
this.changeMode(TagMode.Default);
}));
subs.push(this._creatingConfiguration$
.subscribe(
(configuration: TagConfiguration): void => {
this._disableCreateHandlers();
const mode: keyof typeof TagMode = <keyof typeof TagMode>TagMode[configuration.mode];
const handler: CreateHandlerBase = this._createHandlers[mode];
if (!!handler) {
handler.enable();
}
}));
subs.push(this._renderTags$
.subscribe(
(): void => {
const type: ComponentEventType = "tags";
const event: ComponentStateEvent = {
target: this,
type,
};
this.fire(type, event);
}));
subs.push(this._tagCreator.tag$.pipe(
switchMap(
(tag: CreateTag<Geometry>): Observable<void> => {
return tag != null ?
tag.aborted$.pipe(
map((): void => { return null; })) :
observableEmpty();
}))
.subscribe((): void => { this.changeMode(TagMode.Default); }));
subs.push(this._tagCreator.tag$
.subscribe(
(tag: CreateTag<Geometry>): void => {
if (this._tagScene.hasCreateTag()) {
this._tagScene.removeCreateTag();
}
if (tag != null) {
this._tagScene.addCreateTag(tag);
}
}));
subs.push(this._createGLObjectsChanged$
.subscribe(
(tag: CreateTag<Geometry>): void => {
this._tagScene.updateCreateTagObjects(tag);
}));
subs.push(this._renderTagGLChanged$
.subscribe(
(tag: RenderTag<Tag>): void => {
this._tagScene.updateObjects(tag);
}));
subs.push(this._tagChanged$
.subscribe(
(): void => {
this._tagScene.update();
}));
subs.push(observableCombineLatest(
this._renderTags$.pipe(
startWith([]),
tap(
(): void => {
this._container.domRenderer.render$.next({
name: this._name,
vNode: this._tagDomRenderer.clear(),
});
})),
this._container.renderService.renderCamera$,
this._container.spriteService.spriteAtlas$,
this._container.renderService.size$,
this._tagChanged$.pipe(startWith(null)),
observableMerge(
this._tagCreator.tag$,
this._createGeometryChanged$).pipe(startWith(null))).pipe(
map(
([renderTags, rc, atlas, size, , ct]:
[RenderTag<Tag>[], RenderCamera, ISpriteAtlas, ViewportSize, Tag, CreateTag<Geometry>]):
VirtualNodeHash => {
return {
name: this._name,
vNode: this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size),
};
}))
.subscribe(this._container.domRenderer.render$));
subs.push(this._navigator.stateService.currentState$.pipe(
map(
(frame: AnimationFrame): GLRenderHash => {
const tagScene: TagScene = this._tagScene;
return {
name: this._name,
renderer: {
frameId: frame.id,
needsRender: tagScene.needsRender,
render: tagScene.render.bind(tagScene),
pass: RenderPass.Opaque,
},
};
}))
.subscribe(this._container.glRenderer.render$));
this._navigator.stateService.currentTransform$.pipe(
first())
.subscribe(
(transform: Transform): void => {
this._tagSet.activate(transform);
this._tagScene.add(this._tagSet.getAll());
});
}