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

add Model.MaxIndex and use in model-index theme

parent 5b70c14f
Branches
No related tags found
No related merge requests found
/**
* Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
* Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
......@@ -71,12 +71,12 @@ namespace CustomModelProperty {
},
ref: (data: Model, add: boolean) => data.customProperties.reference(builder.descriptor, add),
get: (data: Model) => get(data)?.data,
set: (data: Model, props: Partial<PD.Values<Params>> = {}) => {
set: (data: Model, props: Partial<PD.Values<Params>> = {}, value?: Value) => {
const property = get(data);
const p = PD.merge(builder.defaultParams, property.props, props);
if (!PD.areEqual(builder.defaultParams, property.props, p)) {
// this invalidates property.value
set(data, p, undefined);
set(data, p, value);
// dispose of assets
data.customProperties.assets(builder.descriptor);
}
......@@ -96,7 +96,7 @@ namespace CustomModelProperty {
getParams: () => ({ value: PD.Value(defaultValue, { isHidden: true }) }),
isApplicable: () => true,
obtain: async (ctx: CustomProperty.Context, data: Model, props: Partial<PD.Values<typeof defaultParams>>) => {
return { value: props.value ?? defaultValue };
return { ...PD.getDefaultValues(defaultParams), ...props };
}
});
}
......
......@@ -213,6 +213,9 @@ export namespace Model {
export type Index = number;
export const Index = CustomModelProperty.createSimple<Index>('index', 'static');
export type MaxIndex = number;
export const MaxIndex = CustomModelProperty.createSimple<MaxIndex>('max_index', 'static');
export function getRoot(model: Model) {
return model.parent || model;
}
......
/**
* Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
* Copyright (c) 2020-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
......@@ -52,17 +52,28 @@ export const StructureInfo = PluginBehavior.create({
return { auth, label };
}
private setModelMaxIndex() {
const maxIndex = this.maxModelIndex;
const cells = this.ctx.state.data.select(StateSelection.Generators.rootsOfType(PluginStateObject.Molecule.Model));
for (const c of cells) {
const m = c.obj?.data;
if (m) {
Model.MaxIndex.set(m, { value: maxIndex }, maxIndex);
}
}
}
private handleModel(model: Model, oldModel?: Model) {
if (Model.Index.get(model).value === undefined) {
const oldIndex = oldModel && Model.Index.get(oldModel).value;
const value = oldIndex ?? (this.maxModelIndex + 1);
Model.Index.set(model, { value });
Model.Index.set(model, { value }, value);
}
if (Model.AsymIdOffset.get(model).value === undefined) {
const oldOffset = oldModel && Model.AsymIdOffset.get(oldModel).value;
const value = oldOffset ?? { ...this.asymIdOffset };
Model.AsymIdOffset.set(model, { value });
Model.AsymIdOffset.set(model, { value }, value);
}
}
......@@ -72,7 +83,7 @@ export const StructureInfo = PluginBehavior.create({
const oldIndex = oldStructure && Structure.Index.get(oldStructure).value;
const value = oldIndex ?? (this.maxStructureIndex + 1);
Structure.Index.set(structure, { value });
Structure.Index.set(structure, { value }, value);
}
private handle(ref: string, obj: StateObject<any, StateObject.Type<any>>, oldObj?: StateObject<any, StateObject.Type<any>>) {
......@@ -92,10 +103,12 @@ export const StructureInfo = PluginBehavior.create({
register(): void {
this.ctx.customModelProperties.register(Model.AsymIdOffset, true);
this.ctx.customModelProperties.register(Model.Index, true);
this.ctx.customModelProperties.register(Model.MaxIndex, true);
this.ctx.customStructureProperties.register(Structure.Index, true);
this.subscribeObservable(this.ctx.state.data.events.object.created, o => {
this.handle(o.ref, o.obj);
this.setModelMaxIndex();
});
this.subscribeObservable(this.ctx.state.data.events.object.updated, o => {
......@@ -106,6 +119,7 @@ export const StructureInfo = PluginBehavior.create({
unregister() {
this.ctx.customModelProperties.unregister(Model.AsymIdOffset.descriptor.name);
this.ctx.customModelProperties.unregister(Model.Index.descriptor.name);
this.ctx.customModelProperties.unregister(Model.MaxIndex.descriptor.name);
this.ctx.customStructureProperties.unregister(Structure.Index.descriptor.name);
}
}
......
/**
* Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
* Copyright (c) 2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Jason Pattle <jpattle@exscientia.co.uk>
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Color } from '../../mol-util/color';
......@@ -29,9 +30,8 @@ export function ModelIndexColorTheme(ctx: ThemeDataContext, props: PD.Values<Mod
let legend: ScaleLegend | TableLegend | undefined;
if (ctx.structure) {
const { models } = ctx.structure.root;
const size = Math.max(...models.map(m => Model.Index.get(m)?.value || 0));
// max-index is the same for all models
const size = (Model.MaxIndex.get(ctx.structure.models[0])?.value || -1) + 1;
const palette = getPalette(size, props);
legend = palette.legend;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment