Skip to content
Snippets Groups Projects
Commit 0396cd08 authored by Xiao Gui's avatar Xiao Gui
Browse files

bugfix: aux mesh can be selected in persp view

parent ec9066a4
No related branches found
No related tags found
No related merge requests found
......@@ -747,12 +747,22 @@ export class ClickInterceptorService{
}
run(ev: any){
let intercepted = false
for (const clickInc of this.clickInterceptorStack) {
let runNext = false
clickInc(ev, () => {
runNext = true
})
if (!runNext) break
if (!runNext) {
intercepted = true
break
}
}
if (!intercepted) this.fallback(ev)
}
fallback(_ev: any) {
// called when the call has not been intercepted
}
}
import { CommonModule } from "@angular/common"
import { TestBed } from "@angular/core/testing"
import { MockStore, provideMockStore } from "@ngrx/store/testing"
import { ClickInterceptorService } from "src/glue"
import { PANELS } from "src/services/state/ngViewerState/constants"
import { ngViewerSelectorOctantRemoval, ngViewerSelectorPanelMode, ngViewerSelectorPanelOrder } from "src/services/state/ngViewerState/selectors"
import { uiStateMouseOverSegmentsSelector } from "src/services/state/uiState/selectors"
import { viewerStateSetSelectedRegions } from "src/services/state/viewerState/actions"
import { viewerStateCustomLandmarkSelector, viewerStateSelectedRegionsSelector } from "src/services/state/viewerState/selectors"
import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR } from "src/util"
import { NehubaGlueCmp } from "./nehubaViewerGlue.component"
describe('> nehubaViewerGlue.component.ts', () => {
let mockStore: MockStore
beforeEach( () => {
TestBed.configureTestingModule({
imports: [
CommonModule,
],
declarations: [
NehubaGlueCmp
],
providers: [
provideMockStore(),
{
provide: CLICK_INTERCEPTOR_INJECTOR,
useFactory: (clickIntService: ClickInterceptorService) => {
return {
deregister: clickIntService.removeInterceptor.bind(clickIntService),
register: clickIntService.addInterceptor.bind(clickIntService)
} as ClickInterceptor
},
deps: [
ClickInterceptorService
]
},
]
}).overrideComponent(NehubaGlueCmp, {
set: {
template: '',
templateUrl: null
}
}).compileComponents()
mockStore = TestBed.inject(MockStore)
mockStore.overrideSelector(ngViewerSelectorPanelMode, PANELS.FOUR_PANEL)
mockStore.overrideSelector(ngViewerSelectorPanelOrder, '0123')
mockStore.overrideSelector(ngViewerSelectorOctantRemoval, true)
mockStore.overrideSelector(viewerStateCustomLandmarkSelector, [])
mockStore.overrideSelector(viewerStateSelectedRegionsSelector, [])
mockStore.overrideSelector(uiStateMouseOverSegmentsSelector, [])
})
it('> can be init', () => {
const fixture = TestBed.createComponent(NehubaGlueCmp)
expect(fixture.componentInstance).toBeTruthy()
})
describe('> selectHoveredRegion', () => {
let dispatchSpy: jasmine.Spy
let clickIntServ: ClickInterceptorService
beforeEach(() => {
dispatchSpy = spyOn(mockStore, 'dispatch')
clickIntServ = TestBed.inject(ClickInterceptorService)
})
afterEach(() => {
dispatchSpy.calls.reset()
})
describe('> if on hover is empty array', () => {
let fallbackSpy: jasmine.Spy
beforeEach(() => {
fallbackSpy = spyOn(clickIntServ, 'fallback')
TestBed.createComponent(NehubaGlueCmp)
clickIntServ.run(null)
})
it('> dispatch not called', () => {
expect(dispatchSpy).not.toHaveBeenCalled()
})
it('> fallback called', () => {
expect(fallbackSpy).toHaveBeenCalled()
})
})
describe('> if on hover is non object array', () => {
let fallbackSpy: jasmine.Spy
const testObj0 = {
segment: 'hello world'
}
beforeEach(() => {
fallbackSpy = spyOn(clickIntServ, 'fallback')
mockStore.overrideSelector(uiStateMouseOverSegmentsSelector, ['hello world', testObj0])
TestBed.createComponent(NehubaGlueCmp)
clickIntServ.run(null)
})
it('> dispatch not called', () => {
expect(dispatchSpy).not.toHaveBeenCalled()
})
it('> fallback called', () => {
expect(fallbackSpy).toHaveBeenCalled()
})
})
describe('> if on hover array containing at least 1 obj, only dispatch the first obj', () => {
let fallbackSpy: jasmine.Spy
const testObj0 = {
segment: 'hello world'
}
const testObj1 = {
segment: {
foo: 'baz'
}
}
const testObj2 = {
segment: {
hello: 'world'
}
}
beforeEach(() => {
fallbackSpy = spyOn(clickIntServ, 'fallback')
mockStore.overrideSelector(uiStateMouseOverSegmentsSelector, [testObj0, testObj1, testObj2])
})
afterEach(() => {
fallbackSpy.calls.reset()
})
it('> dispatch called with obj1', () => {
TestBed.createComponent(NehubaGlueCmp)
clickIntServ.run(null)
const { segment } = testObj1
expect(dispatchSpy).toHaveBeenCalledWith(
viewerStateSetSelectedRegions({
selectRegions: [segment]
} as any)
)
})
it('> fallback called (does not intercept)', () => {
TestBed.createComponent(NehubaGlueCmp)
clickIntServ.run(null)
expect(fallbackSpy).toHaveBeenCalled()
})
})
})
})
......@@ -282,10 +282,10 @@ export class NehubaGlueCmp implements IViewer, OnChanges, OnDestroy{
}
const nehubaViewerSub = this.newViewer$.pipe(
tap(() => nehubaViewer$.next(null)),
tap(() => nehubaViewer$ && nehubaViewer$.next(null)),
switchMap(this.waitForNehuba.bind(this)),
map(() => this.nehubaContainerDirective.nehubaViewerInstance)
).subscribe(viewer => nehubaViewer$.next(viewer))
).subscribe(viewer => nehubaViewer$ && nehubaViewer$.next(viewer))
this.onDestroyCb.push(() => nehubaViewerSub.unsubscribe())
/**
......@@ -550,11 +550,11 @@ export class NehubaGlueCmp implements IViewer, OnChanges, OnDestroy{
const setupViewerApiSub = this.newViewer$.pipe(
tap(() => {
setViewerHandle(null)
setViewerHandle && setViewerHandle(null)
}),
switchMap(this.waitForNehuba.bind(this))
).subscribe(() => {
setViewerHandle({
setViewerHandle && setViewerHandle({
setNavigationLoc : (coord, realSpace?) => this.nehubaContainerDirective.nehubaViewerInstance.setNavigationState({
position : coord,
positionReal : typeof realSpace !== 'undefined' ? realSpace : true,
......@@ -703,10 +703,14 @@ export class NehubaGlueCmp implements IViewer, OnChanges, OnDestroy{
}
private selectHoveredRegion(ev: any, next: Function){
if (!this.onhoverSegments || !(this.onhoverSegments.length)) return next()
/**
* If label indicies are not defined by the ontology, it will be a string in the format of `{ngId}#{labelIndex}`
*/
const trueOnhoverSegments = this.onhoverSegments && this.onhoverSegments.filter(v => typeof v === 'object')
if (!trueOnhoverSegments || (trueOnhoverSegments.length === 0)) return next()
this.store$.dispatch(
viewerStateSetSelectedRegions({
selectRegions: this.onhoverSegments.slice(0, 1)
selectRegions: trueOnhoverSegments.slice(0, 1)
})
)
next()
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment