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

wip, structure selection tools

parent e2c9b601
No related branches found
No related tags found
No related merge requests found
...@@ -16,8 +16,9 @@ import { StateTransforms } from '../../mol-plugin/state/transforms'; ...@@ -16,8 +16,9 @@ import { StateTransforms } from '../../mol-plugin/state/transforms';
import { StateTransformer } from '../../mol-state'; import { StateTransformer } from '../../mol-state';
import { ModelFromTrajectory } from '../../mol-plugin/state/transforms/model'; import { ModelFromTrajectory } from '../../mol-plugin/state/transforms/model';
import { AnimationControls } from './state/animation'; import { AnimationControls } from './state/animation';
import { OverpaintControls } from './structure/overpaint'; import { StructureOverpaintControls } from './structure/overpaint';
import { RepresentationControls } from './structure/representation'; import { StructureRepresentationControls } from './structure/representation';
import { StructureSelectionControls } from './structure/selection';
export class TrajectoryViewportControls extends PluginUIComponent<{}, { show: boolean, label: string }> { export class TrajectoryViewportControls extends PluginUIComponent<{}, { show: boolean, label: string }> {
state = { show: false, label: '' } state = { show: false, label: '' }
...@@ -259,8 +260,9 @@ export class StructureToolsWrapper extends PluginUIComponent { ...@@ -259,8 +260,9 @@ export class StructureToolsWrapper extends PluginUIComponent {
return <div> return <div>
<div className='msp-section-header'><Icon name='code' /> Structure Tools</div> <div className='msp-section-header'><Icon name='code' /> Structure Tools</div>
<OverpaintControls /> <StructureSelectionControls />
<RepresentationControls /> <StructureOverpaintControls />
<StructureRepresentationControls />
</div>; </div>;
} }
} }
\ No newline at end of file
...@@ -21,8 +21,8 @@ import { getExpression } from './util'; ...@@ -21,8 +21,8 @@ import { getExpression } from './util';
type OverpaintEachReprCallback = (update: StateBuilder.Root, repr: StateObjectCell<PluginStateObject.Molecule.Structure.Representation3D, StateTransform<typeof StateTransforms.Representation.StructureRepresentation3D>>, rootStructure: Structure, overpaint?: StateObjectCell<any, StateTransform<typeof StateTransforms.Representation.OverpaintStructureRepresentation3D>>) => void type OverpaintEachReprCallback = (update: StateBuilder.Root, repr: StateObjectCell<PluginStateObject.Molecule.Structure.Representation3D, StateTransform<typeof StateTransforms.Representation.StructureRepresentation3D>>, rootStructure: Structure, overpaint?: StateObjectCell<any, StateTransform<typeof StateTransforms.Representation.OverpaintStructureRepresentation3D>>) => void
const OverpaintManagerTag = 'overpaint-controls' const OverpaintManagerTag = 'overpaint-controls'
export class OverpaintControls extends PluginUIComponent<{}, { params: PD.Values<ReturnType<typeof OverpaintControls.getParams>> }> { export class StructureOverpaintControls extends PluginUIComponent<{}, { params: PD.Values<ReturnType<typeof StructureOverpaintControls.getParams>> }> {
state = { params: PD.getDefaultValues(OverpaintControls.getParams(this.plugin)) } state = { params: PD.getDefaultValues(StructureOverpaintControls.getParams(this.plugin)) }
static getParams = (plugin: PluginContext) => { static getParams = (plugin: PluginContext) => {
const { types } = plugin.structureRepresentation.registry const { types } = plugin.structureRepresentation.registry
...@@ -96,7 +96,7 @@ export class OverpaintControls extends PluginUIComponent<{}, { params: PD.Values ...@@ -96,7 +96,7 @@ export class OverpaintControls extends PluginUIComponent<{}, { params: PD.Values
<button className='msp-btn msp-btn-block'>Current Selection Overpaint</button> <button className='msp-btn msp-btn-block'>Current Selection Overpaint</button>
</div> </div>
<div> <div>
<ParameterControls params={OverpaintControls.getParams(this.plugin)} values={this.state.params} onChange={p => { <ParameterControls params={StructureOverpaintControls.getParams(this.plugin)} values={this.state.params} onChange={p => {
const params = { ...this.state.params, [p.name]: p.value }; const params = { ...this.state.params, [p.name]: p.value };
this.setState({ params }); this.setState({ params });
}}/> }}/>
......
...@@ -36,8 +36,8 @@ function getCombinedLoci(mode: 'add' | 'remove' | 'only' | 'all', loci: Structur ...@@ -36,8 +36,8 @@ function getCombinedLoci(mode: 'add' | 'remove' | 'only' | 'all', loci: Structur
} }
} }
export class RepresentationControls extends PluginUIComponent<{}, { params: PD.Values<ReturnType<typeof RepresentationControls.getParams>> }> { export class StructureRepresentationControls extends PluginUIComponent<{}, { params: PD.Values<ReturnType<typeof StructureRepresentationControls.getParams>> }> {
state = { params: PD.getDefaultValues(RepresentationControls.getParams(this.plugin)) } state = { params: PD.getDefaultValues(StructureRepresentationControls.getParams(this.plugin)) }
static getParams = (plugin: PluginContext) => { static getParams = (plugin: PluginContext) => {
const { types } = plugin.structureRepresentation.registry const { types } = plugin.structureRepresentation.registry
...@@ -129,7 +129,7 @@ export class RepresentationControls extends PluginUIComponent<{}, { params: PD.V ...@@ -129,7 +129,7 @@ export class RepresentationControls extends PluginUIComponent<{}, { params: PD.V
<button className='msp-btn msp-btn-block'>Current Selection Representation</button> <button className='msp-btn msp-btn-block'>Current Selection Representation</button>
</div> </div>
<div> <div>
<ParameterControls params={RepresentationControls.getParams(this.plugin)} values={this.state.params} onChange={p => { <ParameterControls params={StructureRepresentationControls.getParams(this.plugin)} values={this.state.params} onChange={p => {
const params = { ...this.state.params, [p.name]: p.value }; const params = { ...this.state.params, [p.name]: p.value };
this.setState({ params }); this.setState({ params });
}}/> }}/>
......
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import * as React from 'react';
import { PluginUIComponent } from '../base';
import { MolScriptBuilder as MS } from '../../../mol-script/language/builder';
import { StateSelection } from '../../../mol-state';
import { PluginStateObject } from '../../state/objects';
import { QueryContext, StructureSelection, QueryFn, Queries as _Queries } from '../../../mol-model/structure';
import { compile } from '../../../mol-script/runtime/query/compiler';
import { ButtonsType } from '../../../mol-util/input/input-observer';
import { EmptyLoci } from '../../../mol-model/loci';
const Queries = {
all: () => compile<StructureSelection>(MS.struct.generator.all()),
polymers: () => _Queries.internal.atomicSequence(),
water: () => _Queries.internal.water(),
ligands: () => _Queries.internal.atomicHet(),
coarse: () => _Queries.internal.spheres(),
}
export class StructureSelectionControls extends PluginUIComponent<{}, {}> {
state = {}
select = (query: QueryFn<StructureSelection>) => {
const state = this.plugin.state.dataState
const structures = state.select(StateSelection.Generators.rootsOfType(PluginStateObject.Molecule.Structure))
const { structureSelection } = this.plugin.helpers
structureSelection.clear()
for (const so of structures) {
const s = so.obj!.data
const result = query(new QueryContext(s))
const loci = StructureSelection.toLoci2(result)
// TODO use better API when available
this.plugin.interactivity.lociSelections.apply({
current: { loci },
buttons: ButtonsType.Flag.Secondary,
modifiers: { shift: false, alt: false, control: true, meta: false }
})
}
}
clear = () => {
// TODO use better API when available
this.plugin.interactivity.lociSelections.apply({
current: { loci: EmptyLoci },
buttons: ButtonsType.Flag.Secondary,
modifiers: { shift: false, alt: false, control: true, meta: false }
})
}
render() {
return <div className='msp-transform-wrapper'>
<div className='msp-transform-header'>
<button className='msp-btn msp-btn-block'>Current Selection</button>
</div>
<div>
<div className='msp-btn-row-group'>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.select(Queries.all())}>All</button>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.clear()}>None</button>
</div>
<div className='msp-btn-row-group'>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.select(Queries.polymers())}>Polymers</button>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.select(Queries.ligands())}>Ligands</button>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.select(Queries.water())}>Water</button>
<button className='msp-btn msp-btn-block msp-form-control' onClick={() => this.select(Queries.coarse())}>Coarse</button>
</div>
</div>
</div>
}
}
\ No newline at end of file
...@@ -163,6 +163,7 @@ namespace Interactivity { ...@@ -163,6 +163,7 @@ namespace Interactivity {
} }
} }
// TODO create better API that is independent of a `ClickEvent`
apply(e: ClickEvent) { apply(e: ClickEvent) {
const { current, buttons, modifiers } = e const { current, buttons, modifiers } = e
const normalized: Loci<ModelLoci> = this.normalizedLoci(current) const normalized: Loci<ModelLoci> = this.normalizedLoci(current)
......
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