From 0186986b0216dc39b6e32525e38725d9ecaa6c48 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Wed, 7 Nov 2018 15:07:07 -0800 Subject: [PATCH] include repr in canvas3d.getLoci return value --- src/apps/canvas/component/viewport.tsx | 4 ++-- src/mol-canvas3d/canvas3d.ts | 10 ++++++---- src/mol-plugin/ui/viewport.tsx | 24 +++++++++++++++++------- src/mol-repr/index.ts | 9 +++++++++ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/apps/canvas/component/viewport.tsx b/src/apps/canvas/component/viewport.tsx index 9f048fd4c..e0a5fdb78 100644 --- a/src/apps/canvas/component/viewport.tsx +++ b/src/apps/canvas/component/viewport.tsx @@ -70,7 +70,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> { const p = await canvas3d.identify(x, y) --highlightQueueLength if (p) { - const loci = canvas3d.getLoci(p) + const { loci } = canvas3d.getLoci(p) if (!areLociEqual(loci, prevHighlightLoci)) { canvas3d.mark(prevHighlightLoci, MarkerAction.RemoveHighlight) @@ -88,7 +88,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> { if (buttons !== ButtonsType.Flag.Primary) return const p = await canvas3d.identify(x, y) if (p) { - const loci = canvas3d.getLoci(p) + const { loci } = canvas3d.getLoci(p) canvas3d.mark(loci, MarkerAction.Toggle) } }) diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index d9460c5ee..2f6bd0b46 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -52,7 +52,7 @@ interface Canvas3D { pick: () => void identify: (x: number, y: number) => Promise<PickingId | undefined> mark: (loci: Loci, action: MarkerAction) => void - getLoci: (pickingId: PickingId) => Loci + getLoci: (pickingId: PickingId) => { loci: Loci, repr?: Representation<any> } readonly reprCount: BehaviorSubject<number> readonly identified: BehaviorSubject<string> @@ -122,14 +122,16 @@ namespace Canvas3D { function getLoci(pickingId: PickingId) { let loci: Loci = EmptyLoci - reprMap.forEach((_, repr) => { - const _loci = repr.getLoci(pickingId) + let repr: Representation.Any = Representation.Empty + reprMap.forEach((_, _repr) => { + const _loci = _repr.getLoci(pickingId) if (!isEmptyLoci(_loci)) { if (!isEmptyLoci(loci)) console.warn('found another loci') loci = _loci + repr = _repr } }) - return loci + return { loci, repr } } function mark(loci: Loci, action: MarkerAction) { diff --git a/src/mol-plugin/ui/viewport.tsx b/src/mol-plugin/ui/viewport.tsx index b1e55009f..a7ace28f1 100644 --- a/src/mol-plugin/ui/viewport.tsx +++ b/src/mol-plugin/ui/viewport.tsx @@ -9,6 +9,7 @@ import * as React from 'react'; import { PluginContext } from '../context'; import { Loci, EmptyLoci, areLociEqual } from 'mol-model/loci'; import { MarkerAction } from 'mol-geo/geometry/marker-data'; +import { ButtonsType } from 'mol-util/input/input-observer'; interface ViewportProps { plugin: PluginContext @@ -36,23 +37,32 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> { } this.handleResize(); - const viewer = this.props.plugin.canvas3d; - viewer.input.resize.subscribe(() => this.handleResize()); + const canvas3d = this.props.plugin.canvas3d; + canvas3d.input.resize.subscribe(() => this.handleResize()); let prevLoci: Loci = EmptyLoci; - viewer.input.move.subscribe(async ({x, y, inside, buttons}) => { + canvas3d.input.move.subscribe(async ({x, y, inside, buttons}) => { if (!inside || buttons) return; - const p = await viewer.identify(x, y); + const p = await canvas3d.identify(x, y); if (p) { - const loci = viewer.getLoci(p); + const { loci } = canvas3d.getLoci(p); if (!areLociEqual(loci, prevLoci)) { - viewer.mark(prevLoci, MarkerAction.RemoveHighlight); - viewer.mark(loci, MarkerAction.Highlight); + canvas3d.mark(prevLoci, MarkerAction.RemoveHighlight); + canvas3d.mark(loci, MarkerAction.Highlight); prevLoci = loci; } } }) + + canvas3d.input.click.subscribe(async ({x, y, buttons}) => { + if (buttons !== ButtonsType.Flag.Primary) return + const p = await canvas3d.identify(x, y) + if (p) { + const { loci } = canvas3d.getLoci(p) + canvas3d.mark(loci, MarkerAction.Toggle) + } + }) } componentWillUnmount() { diff --git a/src/mol-repr/index.ts b/src/mol-repr/index.ts index 574bcb0b0..2ebfe2233 100644 --- a/src/mol-repr/index.ts +++ b/src/mol-repr/index.ts @@ -36,6 +36,15 @@ export interface Representation<D, P extends RepresentationProps = {}> { } export namespace Representation { + export type Any = Representation<any> + export const Empty: Representation<undefined> = { + label: '', params: {}, renderObjects: [], props: {}, + createOrUpdate: () => Task.constant('', undefined), + getLoci: () => EmptyLoci, + mark: () => false, + destroy: () => {} + } + export function createMulti<D, P extends RepresentationProps = {}>(label: string, params: PD.Params, defaultProps: P, reprList: Representation<D, P>[]): Representation<D, P> { let currentProps: P let currentData: D -- GitLab