From df8ce4e9874ce14ccb84cacf0405f8a2cfd3010e Mon Sep 17 00:00:00 2001 From: Xiao Gui <xgui3783@gmail.com> Date: Fri, 26 Oct 2018 13:54:27 +0200 Subject: [PATCH] feat: zooming on mobile works --- .../nehubaViewer/nehubaViewer.component.ts | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.component.ts b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.component.ts index 74d0b014f..b517ac97f 100644 --- a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.component.ts +++ b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.component.ts @@ -2,9 +2,9 @@ import { Component, AfterViewInit, OnDestroy, Output, EventEmitter, ElementRef, import * as export_nehuba from 'third_party/export_nehuba/main.bundle.js' import 'third_party/export_nehuba/chunk_worker.bundle.js' -import { fromEvent, interval } from 'rxjs' +import { fromEvent, interval, Observable } from 'rxjs' import { AtlasWorkerService } from "../../../atlasViewer/atlasViewer.workerService.service"; -import { buffer, map, filter, debounceTime, take, takeUntil, scan, switchMap } from "rxjs/operators"; +import { buffer, map, filter, debounceTime, take, takeUntil, scan, switchMap, takeWhile } from "rxjs/operators"; import { AtlasViewerConstantsServices } from "../../../atlasViewer/atlasViewer.constantService.service"; import { takeOnePipe, identifySrcElement } from "../nehubaContainer.component"; @@ -53,6 +53,8 @@ export class NehubaViewerUnit implements AfterViewInit,OnDestroy{ ondestroySubscriptions: any[] = [] + touchStart$ : Observable<any> + constructor( public elementRef:ElementRef, private workerService : AtlasWorkerService, @@ -259,17 +261,21 @@ export class NehubaViewerUnit implements AfterViewInit,OnDestroy{ }) ) + this.touchStart$ = fromEvent(this.elementRef.nativeElement, 'touchstart').pipe( + map((ev:TouchEvent) => { + const srcElement : HTMLElement = ev.srcElement || (ev as any).originalTarget + return { + startPos: [ev.touches[0].screenX, ev.touches[0].screenY], + elementId: identifySrcElement(srcElement), + srcElement, + event: ev + } + }) + ) + this.ondestroySubscriptions.push( - fromEvent(this.elementRef.nativeElement,'touchstart').pipe( - map((ev:TouchEvent) => { - const srcElement : HTMLElement = ev.srcElement || (ev as any).originalTarget - return { - startPos: [ev.touches[0].screenX, ev.touches[0].screenY], - elementId: identifySrcElement(srcElement), - srcElement - } - }), + this.touchStart$.pipe( switchMap(({startPos, elementId, srcElement}) => fromEvent(this.elementRef.nativeElement,'touchmove').pipe( map((ev: TouchEvent) => (ev.stopPropagation(), ev.preventDefault(), ev)), filter((ev:TouchEvent) => ev.touches.length === 1), @@ -318,6 +324,25 @@ export class NehubaViewerUnit implements AfterViewInit,OnDestroy{ } }) ) + + this.ondestroySubscriptions.push( + this.touchStart$.pipe( + switchMap(() => + fromEvent(this.elementRef.nativeElement, 'touchmove').pipe( + takeWhile((ev:TouchEvent) => ev.touches.length === 2), + map((ev:TouchEvent) => computeDistance( + [ev.touches[0].screenX, ev.touches[0].screenY], + [ev.touches[1].screenX, ev.touches[1].screenY] + )), + scan((acc, curr:number) => acc.length < 2 + ? acc.concat(curr) + : acc.slice(1).concat(curr), []), + filter(dist => dist.length > 1), + map(dist => dist[0] / dist[1]) + )) + ).subscribe(factor => + this.nehubaViewer.ngviewer.navigationState.zoomBy(factor)) + ) } ngOnDestroy(){ this._s$.forEach(_s$=>{ @@ -687,8 +712,7 @@ export class NehubaViewerUnit implements AfterViewInit,OnDestroy{ if(this._s1$)this._s1$.unsubscribe() this._s1$ = this.nehubaViewer.getShownSegmentsObservable({ name : this.parcellationId - }).subscribe(arrayIdx=>this.updateColorMap(arrayIdx)) - + }).throttleTime(100).subscribe(arrayIdx=>this.updateColorMap(arrayIdx)) } private getRgb(labelIndex:number,rgb?:number[]):{red:number,green:number,blue:number}{ @@ -807,4 +831,5 @@ export const ICOSAHEDRON_VTK_URL = URL.createObjectURL( new Blob([ _encoder.enco export const FRAGMENT_MAIN_WHITE = `void main(){emitRGB(vec3(1.0,1.0,1.0));}` export const FRAGMENT_EMIT_WHITE = `emitRGB(vec3(1.0, 1.0, 1.0));` -export const FRAGMENT_EMIT_RED = `emitRGB(vec3(1.0, 0.1, 0.12));` \ No newline at end of file +export const FRAGMENT_EMIT_RED = `emitRGB(vec3(1.0, 0.1, 0.12));` +export const computeDistance = (pt1:[number, number], pt2:[number,number]) => ((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2) ** 0.5 \ No newline at end of file -- GitLab