Skip to content
Snippets Groups Projects
Commit 227240fb authored by Alexander Rose's avatar Alexander Rose
Browse files

wip highlighting

parent 21d1cc5d
No related branches found
No related tags found
No related merge requests found
......@@ -19,8 +19,8 @@ export const HighlightLoci = PluginBehavior.create({
if (!this.ctx.canvas3d) return;
if (current.repr !== prevRepr || !areLociEqual(current.loci, prevLoci)) {
this.ctx.canvas3d.mark(prevLoci, MarkerAction.RemoveHighlight);
this.ctx.canvas3d.mark(current.loci, MarkerAction.Highlight);
this.ctx.canvas3d.mark(prevLoci, MarkerAction.RemoveHighlight, prevRepr);
this.ctx.canvas3d.mark(current.loci, MarkerAction.Highlight, current.repr);
prevLoci = current.loci;
prevRepr = current.repr;
}
......@@ -38,8 +38,8 @@ export const SelectLoci = PluginBehavior.create({
this.subscribeObservable(this.ctx.behaviors.canvas.selectLoci, current => {
if (!this.ctx.canvas3d) return;
if (current.repr !== prevRepr || !areLociEqual(current.loci, prevLoci)) {
this.ctx.canvas3d.mark(prevLoci, MarkerAction.Deselect);
this.ctx.canvas3d.mark(current.loci, MarkerAction.Select);
this.ctx.canvas3d.mark(prevLoci, MarkerAction.Deselect, prevRepr);
this.ctx.canvas3d.mark(current.loci, MarkerAction.Select, current.repr);
prevLoci = current.loci;
prevRepr = current.repr;
} else {
......
......@@ -8,9 +8,9 @@ import { PluginCommands } from '../../command';
import { PluginContext } from '../../context';
import { StateTree, Transform, State } from 'mol-state';
import { PluginStateSnapshotManager } from 'mol-plugin/state/snapshots';
import { PluginStateObject as SO } from '../../state/objects';
import { PluginStateObject as SO, PluginStateObject } from '../../state/objects';
import { EmptyLoci, EveryLoci } from 'mol-model/loci';
import { MarkerAction } from 'mol-geo/geometry/marker-data';
import { Structure } from 'mol-model/structure';
export function registerDefault(ctx: PluginContext) {
SyncBehaviors(ctx);
......@@ -79,32 +79,24 @@ function setVisibilityVisitor(t: Transform, tree: StateTree, ctx: { state: State
ctx.state.updateCellState(t.ref, { isHidden: ctx.value });
}
// TODO make isHighlighted and isSelect part of StateObjectCell.State and subscribe from there???
// TODO select structures of subtree
// TODO should also work for volumes and shapes
export function Highlight(ctx: PluginContext) {
PluginCommands.State.Highlight.subscribe(ctx, ({ state, ref }) => {
setHighlight(state, ref)
ctx.canvas3d.update()
ctx.canvas3d.requestDraw(true);
const cell = state.select(ref)[0]
const repr = cell && SO.isRepresentation3D(cell.obj) ? cell.obj.data : undefined
if (cell && cell.obj && cell.obj.type === PluginStateObject.Molecule.Structure.type) {
ctx.behaviors.canvas.highlightLoci.next({ loci: Structure.Loci(cell.obj.data) })
} else if (repr) {
ctx.behaviors.canvas.highlightLoci.next({ loci: EveryLoci, repr })
}
});
}
function setHighlight(state: State, root: Transform.Ref) {
StateTree.doPreOrder(state.tree, state.transforms.get(root), { state }, setHighlightVisitor);
}
function setHighlightVisitor(t: Transform, tree: StateTree, ctx: { state: State }) {
const cell = ctx.state.select(t.ref)[0]
if (!cell) return
if (!SO.isRepresentation3D(cell.obj)) return;
cell.obj.data.mark(EveryLoci, MarkerAction.Highlight)
}
export function ClearHighlight(ctx: PluginContext) {
PluginCommands.State.ClearHighlight.subscribe(ctx, ({ state, ref }) => {
ctx.behaviors.canvas.highlightLoci.next({ loci: EmptyLoci })
ctx.canvas3d.mark(EveryLoci, MarkerAction.RemoveHighlight);
ctx.canvas3d.update()
ctx.canvas3d.requestDraw(true);
});
}
......
......@@ -153,7 +153,7 @@ export function ComplexVisual<P extends ComplexParams>(builder: ComplexVisualGeo
}
let changed = false
if (isEveryLoci(loci)) {
if (isEveryLoci(loci) || (Structure.isLoci(loci) && loci.structure === currentStructure)) {
changed = apply(Interval.ofBounds(0, groupCount * instanceCount))
} else {
changed = mark(loci, currentStructure, apply)
......
......@@ -184,7 +184,7 @@ export function UnitsVisual<P extends UnitsParams>(builder: UnitsVisualGeometryB
}
let changed = false
if (isEveryLoci(loci)) {
if (isEveryLoci(loci) || (Structure.isLoci(loci) && loci.structure === currentStructure)) {
changed = apply(Interval.ofBounds(0, groupCount * instanceCount))
} else {
changed = mark(loci, { structure: currentStructure, group: currentGroup }, apply)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment