Quellcode durchsuchen

global state interface

bioinsilico vor 2 Jahren
Ursprung
Commit
b52e1506af
27 geänderte Dateien mit 202 neuen und 128 gelöschten Zeilen
  1. 11 1
      CHANGELOG.md
  2. 1 1
      package.json
  3. 5 4
      src/RcsbFv3D/RcsbFv3DComponent.tsx
  4. 5 4
      src/RcsbFvSequence/RcsbFvSequence.tsx
  5. 3 2
      src/RcsbFvSequence/SequenceViews/AbstractView.tsx
  6. 14 13
      src/RcsbFvSequence/SequenceViews/CustomView/CustomView.tsx
  7. 6 6
      src/RcsbFvSequence/SequenceViews/RcsbView/CallbackManagerFactoryImplementation/AssemblyCallbackManager.ts
  8. 6 5
      src/RcsbFvSequence/SequenceViews/RcsbView/CallbackManagerFactoryInterface.ts
  9. 1 1
      src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryImplementation/AssemblyPfvManagerFactory.tsx
  10. 6 5
      src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryInterface.ts
  11. 3 3
      src/RcsbFvSequence/SequenceViews/RcsbView/RcsbView.tsx
  12. 1 1
      src/RcsbFvState/AssemblyModelSate.ts
  13. 0 0
      src/RcsbFvState/RcsbFvSelectorManager.ts
  14. 26 0
      src/RcsbFvState/RcsbFvStateInterface.ts
  15. 26 0
      src/RcsbFvState/RcsbFvStateManager.ts
  16. 4 3
      src/RcsbFvStructure/RcsbFvStructure.tsx
  17. 4 3
      src/RcsbFvStructure/StructureViewerInterface.ts
  18. 1 1
      src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager.ts
  19. 11 10
      src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarCallbackManager.ts
  20. 4 3
      src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarManagerFactory.ts
  21. 0 2
      src/RcsbFvStructure/StructureViewers/MolstarViewer/StructureRepresentation.ts
  22. 4 3
      src/RcsbFvStructure/StructureViewers/StructureViewer.ts
  23. 14 14
      src/examples/css-config/index.ts
  24. 1 1
      src/examples/external-mapping/FeatureViewerConfig.ts
  25. 20 19
      src/examples/multiple-chain/index.tsx
  26. 11 10
      src/examples/single-chain/index.ts
  27. 14 13
      src/examples/structural-alignment/index.ts

+ 11 - 1
CHANGELOG.md

@@ -2,7 +2,7 @@
 
 [Semantic Versioning](https://semver.org/)
 
-## [1.5.0-models] - 2022-06-15
+## [2.0.0-models] - 2022-06-15
 ### Dependency update
 - rcsb-saguaro-app v4.4.0-models
 - rcsb-saguaro v2.1.2
@@ -12,6 +12,16 @@
 - React v18
 - Updated multiple dependencies
 
+### Major refactoring
+- `StructureViewerInterface` abstraction to 3D structure viewer
+  - `ViewerCallbackManagerInterface` defines 3D viewer callbacks
+  - `ViewerActionManagerInterface` defines 3D viewer API
+  - `ViewerModelMapManagerInterface` manager provides information of the loaded structures
+- Global state interface `RcsbFvStateInterface` manages selections and loaded data 
+
+### Breaking change
+- `FeatureViewInterface` callback methods argument `selectorManager: RcsbFvSelectorManager` has been refactored to `stateManager: RcsbFvStateManager`
+
 ## [1.4.4] - 2022-05-26
 ### Dependency update
 - rcsb-saguaro-app v4.3.6

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "@rcsb/rcsb-saguaro-3d",
-  "version": "1.5.0-models.7",
+  "version": "2.0.0-models.7",
   "description": "RCSB Molstar/Saguaro Web App",
   "main": "build/dist/app.js",
   "files": [

+ 5 - 4
src/RcsbFv3D/RcsbFv3DComponent.tsx

@@ -15,8 +15,9 @@ import {
 } from "../RcsbFvContextManager/RcsbFvContextManager";
 import {Subscription} from "rxjs";
 import {PluginContext} from "molstar/lib/mol-plugin/context";
-import {RcsbFvSelectorManager} from "../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../RcsbFvState/RcsbFvSelectorManager";
 import {CSSProperties, MouseEvent} from "react";
+import {RcsbFvStateManager} from "../RcsbFvState/RcsbFvStateManager";
 
 export interface RcsbFv3DCssConfig {
     overwriteCss?: boolean;
@@ -44,7 +45,7 @@ interface RcsbFv3DComponentState<T,R,S,U> {
 
 export class RcsbFv3DComponent<T,R,S,U> extends React.Component <RcsbFv3DComponentInterface<T,R,S,U>, RcsbFv3DComponentState<T,R,S,U>> {
 
-    private readonly selectorManager: RcsbFvSelectorManager = new RcsbFvSelectorManager();
+    private readonly stateManager: RcsbFvStateManager = new RcsbFvStateManager();
     private subscription: Subscription;
     private readonly ROOT_DIV_ID: string = "rootPanelDiv";
 
@@ -69,7 +70,7 @@ export class RcsbFv3DComponent<T,R,S,U> extends React.Component <RcsbFv3DCompone
                             {...this.state.structurePanelConfig}
                             componentId={this.props.id}
                             structureViewer={this.props.structureViewer}
-                            selectorManager={this.selectorManager}
+                            stateManager={this.stateManager}
                         />
                     </div>
                     <div style={this.sequenceCssConfig(this.props.cssConfig?.sequencePanel)}  >
@@ -78,7 +79,7 @@ export class RcsbFv3DComponent<T,R,S,U> extends React.Component <RcsbFv3DCompone
                             config={this.state.sequencePanelConfig.config}
                             componentId={this.props.id}
                             structureViewer={this.props.structureViewer}
-                            selectorManager={this.selectorManager}
+                            stateManager={this.stateManager}
                             title={this.state.sequencePanelConfig.title}
                             subtitle={this.state.sequencePanelConfig.subtitle}
                             unmount={this.props.unmount}

+ 5 - 4
src/RcsbFvSequence/RcsbFvSequence.tsx

@@ -6,8 +6,9 @@ import {
 } from "../RcsbFvStructure/StructureViewerInterface";
 import {PluginContext} from "molstar/lib/mol-plugin/context";
 import {RcsbFv, RcsbFvTrackDataElementInterface} from "@rcsb/rcsb-saguaro";
-import {RcsbFvSelectorManager} from "../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../RcsbFvState/RcsbFvSelectorManager";
 import {RcsbView, RcsbViewInterface} from "./SequenceViews/RcsbView/RcsbView";
+import {RcsbFvStateManager} from "../RcsbFvState/RcsbFvStateManager";
 
 export interface RcsbFvSequenceInterface<T,R,U>{
     type: "custom" | "rcsb";
@@ -22,7 +23,7 @@ interface CallbackConfig {
 }
 
 type StructureViewerType<R> = ViewerCallbackManagerInterface & ViewerActionManagerInterface<R>;
-export class RcsbFvSequence<T,R,U> extends React.Component <RcsbFvSequenceInterface<T,R,U> & CallbackConfig & {unmount:(flag:boolean)=>void, structureViewer: StructureViewerType<R>, selectorManager:RcsbFvSelectorManager, componentId:string}, RcsbFvSequenceInterface<T,R,U> > {
+export class RcsbFvSequence<T,R,U> extends React.Component <RcsbFvSequenceInterface<T,R,U> & CallbackConfig & {unmount:(flag:boolean)=>void, structureViewer: StructureViewerType<R>,  stateManager: RcsbFvStateManager, componentId:string}, RcsbFvSequenceInterface<T,R,U> > {
 
     render() {
         if(this.props.type == "custom"){
@@ -31,7 +32,7 @@ export class RcsbFvSequence<T,R,U> extends React.Component <RcsbFvSequenceInterf
                 {...config}
                 componentId={this.props.componentId}
                 structureViewer={this.props.structureViewer}
-                selectorManager={this.props.selectorManager}
+                stateManager={this.props.stateManager}
                 title={this.props.title}
                 subtitle={this.props.subtitle}
                 unmount={this.props.unmount}
@@ -42,7 +43,7 @@ export class RcsbFvSequence<T,R,U> extends React.Component <RcsbFvSequenceInterf
                 {...config}
                 componentId={this.props.componentId}
                 structureViewer={this.props.structureViewer}
-                selectorManager={this.props.selectorManager}
+                stateManager={this.props.stateManager}
                 title={this.props.title}
                 subtitle={this.props.subtitle}
                 unmount={this.props.unmount}

+ 3 - 2
src/RcsbFvSequence/SequenceViews/AbstractView.tsx

@@ -6,15 +6,16 @@ import {RcsbFvDOMConstants} from "../../RcsbFvConstants/RcsbFvConstants";
 import {
     SaguaroPluginModelMapType, ViewerCallbackManagerInterface, ViewerActionManagerInterface
 } from "../../RcsbFvStructure/StructureViewerInterface";
-import {RcsbFvSelectorManager} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {SequenceViewInterface} from "./SequenceViewInterface";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 export interface AbstractViewInterface<R> {
     componentId: string;
     title?: string;
     subtitle?: string;
     structureViewer: ViewerCallbackManagerInterface & ViewerActionManagerInterface<R>;
-    selectorManager: RcsbFvSelectorManager;
+    stateManager: RcsbFvStateManager;
     unmount:(flag:boolean,callback:()=>void)=>void;
 }
 

+ 14 - 13
src/RcsbFvSequence/SequenceViews/CustomView/CustomView.tsx

@@ -8,11 +8,12 @@ import {
     RcsbFvTrackDataElementInterface
 } from "@rcsb/rcsb-saguaro";
 import * as React from "react";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
 import {
     SaguaroPluginModelMapType,
     StructureViewerPublicInterface
 } from "../../../RcsbFvStructure/StructureViewerInterface";
+import {RcsbFvStateManager} from "../../../RcsbFvState/RcsbFvStateManager";
 
 export type CustomViewStateInterface<R> = Omit<CustomViewInterface<R>, "modelChangeCallback">;
 
@@ -20,7 +21,7 @@ export interface CustomViewInterface<R> {
     blockConfig: FeatureBlockInterface<R> | Array<FeatureBlockInterface<R>>;
     blockSelectorElement?: (blockSelector: BlockSelectorManager) => JSX.Element;
     modelChangeCallback?: (modelMap: SaguaroPluginModelMapType) => CustomViewStateInterface<R>;
-    blockChangeCallback?: (plugin: StructureViewerPublicInterface<R>, pfvList: Array<RcsbFv>, selection: RcsbFvSelectorManager) => void;
+    blockChangeCallback?: (plugin: StructureViewerPublicInterface<R>, pfvList: Array<RcsbFv>, stateManager: RcsbFvStateManager) => void;
 }
 
 export interface FeatureBlockInterface<R> {
@@ -34,11 +35,11 @@ export interface FeatureViewInterface<R> {
     boardId?:string;
     boardConfig: RcsbFvBoardConfigInterface;
     rowConfig: Array<RcsbFvRowConfigInterface>;
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<R>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => void;
-    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<R>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => void;
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<R>, selectorManager: RcsbFvSelectorManager, hoverRegion: Array<RcsbFvTrackDataElementInterface>) => void;
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<R>, pfv: RcsbFv, selectorManager: RcsbFvSelectorManager) => void;
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<R>, pfv: RcsbFv, selectorManager: RcsbFvSelectorManager) => void;
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<R>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => void;
+    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<R>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => void;
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<R>, stateManager: RcsbFvStateManager, hoverRegion: Array<RcsbFvTrackDataElementInterface>) => void;
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<R>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => void;
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<R>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => void;
 }
 
 export class BlockSelectorManager {
@@ -128,7 +129,7 @@ export class CustomView<R> extends AbstractView<CustomViewInterface<R>, CustomVi
         this.buildBlockFv();
         asyncScheduler.schedule(()=>{
             if(typeof this.state.blockChangeCallback === "function")
-                this.state.blockChangeCallback(this.props.structureViewer, Array.from(this.blockMap.get(this.blockViewSelector.getActiveBlock())!.values()).map(boardId=>(this.rcsbFvMap.get(boardId)!)), this.props.selectorManager);
+                this.state.blockChangeCallback(this.props.structureViewer, Array.from(this.blockMap.get(this.blockViewSelector.getActiveBlock())!.values()).map(boardId=>(this.rcsbFvMap.get(boardId)!)), this.props.stateManager);
             else
                 this.structureSelectionCallback();
         },1000);
@@ -164,13 +165,13 @@ export class CustomView<R> extends AbstractView<CustomViewInterface<R>, CustomVi
                     selectionChangeCallBack:(selection: RcsbFvTrackDataElementInterface[])=>{
                         if(this.innerSelectionFlag)
                             return;
-                        this.boardMap.get(boardId)!.sequenceSelectionChangeCallback(this.props.structureViewer, this.props.selectorManager, selection);
+                        this.boardMap.get(boardId)!.sequenceSelectionChangeCallback(this.props.structureViewer, this.props.stateManager, selection);
                     },
                     highlightHoverCallback:(elements:Array<RcsbFvTrackDataElementInterface>)=>{
-                        this.boardMap.get(boardId)!.sequenceHoverCallback(this.props.structureViewer, this.props.selectorManager, elements);
+                        this.boardMap.get(boardId)!.sequenceHoverCallback(this.props.structureViewer, this.props.stateManager, elements);
                     },
                     elementClickCallBack: (element: RcsbFvTrackDataElementInterface)=>{
-                        this.boardMap.get(boardId)!.sequenceElementClickCallback(this.props.structureViewer, this.props.selectorManager, element);
+                        this.boardMap.get(boardId)!.sequenceElementClickCallback(this.props.structureViewer, this.props.stateManager, element);
                     }
                 },
                 rowConfigData: this.boardMap.get(boardId)!.rowConfig
@@ -188,7 +189,7 @@ export class CustomView<R> extends AbstractView<CustomViewInterface<R>, CustomVi
             const pfv: RcsbFv | undefined = this.rcsbFvMap.get(boardId);
             if(pfv == null)
                 return;
-            this.boardMap.get(boardId)?.structureSelectionCallback(this.props.structureViewer, pfv, this.props.selectorManager);
+            this.boardMap.get(boardId)?.structureSelectionCallback(this.props.structureViewer, pfv, this.props.stateManager);
         });
         this.innerSelectionFlag = false;
     }
@@ -198,7 +199,7 @@ export class CustomView<R> extends AbstractView<CustomViewInterface<R>, CustomVi
             const pfv: RcsbFv | undefined = this.rcsbFvMap.get(boardId);
             if(pfv == null)
                 return;
-            this.boardMap.get(boardId)?.structureHoverCallback(this.props.structureViewer, pfv, this.props.selectorManager);
+            this.boardMap.get(boardId)?.structureHoverCallback(this.props.structureViewer, pfv, this.props.stateManager);
         });
     }
 

+ 6 - 6
src/RcsbFvSequence/SequenceViews/RcsbView/CallbackManagerFactoryImplementation/AssemblyCallbackManager.ts

@@ -116,8 +116,8 @@ class AssemblyCallbackManager<R> extends AbstractCallbackManager<R,undefined> {
     }
 
     protected async innerPluginSelect(mode:'select'|'hover'): Promise<void> {
-        const allSel: Array<SaguaroRegionList> | undefined = this.selectorManager.getSelection(mode);
-        const lastSel: SaguaroRegionList|null = this.selectorManager.getLastSelection('select');
+        const allSel: Array<SaguaroRegionList> | undefined = this.stateManager.selectionState.getSelection(mode);
+        const lastSel: SaguaroRegionList|null = this.stateManager.selectionState.getLastSelection('select');
         const modelId: string = this.assemblyModelSate.getString("modelId");
         const labelAsymId: string = this.assemblyModelSate.getString("labelAsymId");
         const operatorName: string|undefined = this.assemblyModelSate.getOperator()?.name;
@@ -131,7 +131,7 @@ class AssemblyCallbackManager<R> extends AbstractCallbackManager<R,undefined> {
             const authId: string | undefined = this.assemblyModelSate.getChainInfo(lastSel?.labelAsymId!)?.auth;
             await this.modelChangeCallback(this.assemblyModelSate.getMap(), authId, lastSel?.operatorName);
         }else if(modelId && labelAsymId){
-            const sel: SaguaroRegionList | undefined = this.selectorManager.getSelectionWithCondition(
+            const sel: SaguaroRegionList | undefined = this.stateManager.selectionState.getSelectionWithCondition(
                 modelId,
                 labelAsymId,
                 mode,
@@ -152,7 +152,7 @@ class AssemblyCallbackManager<R> extends AbstractCallbackManager<R,undefined> {
         const operatorName: string|undefined = this.assemblyModelSate.getOperator()?.name;
 
         this.plugin.clearSelection('select', {modelId, labelAsymId, operatorName});
-        this.selectorManager.clearSelection('select', {labelAsymId, operatorName});
+        this.stateManager.selectionState.clearSelection('select', {labelAsymId, operatorName});
         if(selection == null || selection.length === 0) {
             this.resetPluginView();
         }else{
@@ -183,7 +183,7 @@ class AssemblyCallbackManager<R> extends AbstractCallbackManager<R,undefined> {
                     'select',
                     'add'
                 );
-                this.selectorManager.addSelectionFromRegion(
+                this.stateManager.selectionState.addSelectionFromRegion(
                     modelId,
                     labelAsymId,
                     {begin:x, end:y, isEmpty: true, source: 'sequence'},
@@ -192,7 +192,7 @@ class AssemblyCallbackManager<R> extends AbstractCallbackManager<R,undefined> {
                 );
             }else{
                 this.plugin.select(processGaps(modelId, labelAsymId, e, operatorName), 'select', 'add');
-                this.selectorManager.addSelectionFromRegion(modelId, labelAsymId, {begin:x, end:y, source: 'sequence'}, 'select', operatorName);
+                this.stateManager.selectionState.addSelectionFromRegion(modelId, labelAsymId, {begin:x, end:y, source: 'sequence'}, 'select', operatorName);
             }
         });
     }

+ 6 - 5
src/RcsbFvSequence/SequenceViews/RcsbView/CallbackManagerFactoryInterface.ts

@@ -7,9 +7,10 @@ import {DataContainer} from "../../../Utils/DataContainer";
 import {
     RcsbFvModulePublicInterface
 } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvModule/RcsbFvModuleInterface";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
-import {AssemblyModelSate} from "./AssemblyModelSate";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
+import {AssemblyModelSate} from "../../../RcsbFvState/AssemblyModelSate";
 import {PfvManagerInterface} from "./PfvManagerFactoryInterface";
+import {RcsbFvStateManager} from "../../../RcsbFvState/RcsbFvStateManager";
 
 export interface CallbackManagerInterface<U> {
     pluginSelectCallback(mode:'select'|'hover'): Promise<void>;
@@ -26,7 +27,7 @@ export interface CallbackManagerFactoryInterface<R,U> {
 
 export interface CallbackConfigInterface<R> {
     rcsbFvContainer: DataContainer<RcsbFvModulePublicInterface>;
-    selectorManager: RcsbFvSelectorManager;
+    stateManager: RcsbFvStateManager;
     assemblyModelSate: AssemblyModelSate;
     plugin: ViewerCallbackManagerInterface & ViewerActionManagerInterface<R>;
     pfvFactory: PfvManagerInterface;
@@ -34,7 +35,7 @@ export interface CallbackConfigInterface<R> {
 
 export abstract class AbstractCallbackManager<R,U> implements CallbackManagerInterface<U> {
     protected readonly rcsbFvContainer: DataContainer<RcsbFvModulePublicInterface>;
-    protected readonly selectorManager: RcsbFvSelectorManager;
+    protected readonly stateManager: RcsbFvStateManager;
     protected readonly assemblyModelSate: AssemblyModelSate;
     protected selectedComponentId: string|undefined;
     protected readonly plugin: ViewerCallbackManagerInterface & ViewerActionManagerInterface<R>;
@@ -43,7 +44,7 @@ export abstract class AbstractCallbackManager<R,U> implements CallbackManagerInt
 
     constructor(config: CallbackConfigInterface<R>) {
         this.rcsbFvContainer = config.rcsbFvContainer;
-        this.selectorManager = config.selectorManager;
+        this.stateManager = config.stateManager;
         this.assemblyModelSate = config.assemblyModelSate;
         this.plugin = config.plugin;
         this.pfvFactory = config.pfvFactory;

+ 1 - 1
src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryImplementation/AssemblyPfvManagerFactory.tsx

@@ -66,7 +66,7 @@ class AssemblyPfvManager<R> extends AbstractPfvManager<{instanceSequenceConfig:
             onChangeCallback.set(v.entryId,(x)=>{
                 this.assemblyModelSate.set({entryId: v.entryId, labelAsymId: x.asymId, modelId: k});
                 asyncScheduler.schedule(()=>{
-                    this.selectorManager.setLastSelection('select', null);
+                    this.stateManager.selectionState.setLastSelection('select', null);
                     this.pfvChangeCallback(undefined);
                 },100);
             });

+ 6 - 5
src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryInterface.ts

@@ -3,18 +3,19 @@ import {
     RcsbFvAdditionalConfig,
     RcsbFvModulePublicInterface
 } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvModule/RcsbFvModuleInterface";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
-import {AssemblyModelSate} from "./AssemblyModelSate";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
+import {AssemblyModelSate} from "../../../RcsbFvState/AssemblyModelSate";
 import {
     OperatorInfo,
     SaguaroPluginModelMapType, ViewerCallbackManagerInterface, ViewerActionManagerInterface
 } from "../../../RcsbFvStructure/StructureViewerInterface";
 import {RcsbFvBoardConfigInterface} from "@rcsb/rcsb-saguaro";
+import {RcsbFvStateManager} from "../../../RcsbFvState/RcsbFvStateManager";
 
 export interface PfvManagerFactoryConfigInterface<R,U> {
     rcsbFvDivId: string;
     rcsbFvContainer: DataContainer<RcsbFvModulePublicInterface>;
-    selectorManager: RcsbFvSelectorManager;
+    stateManager: RcsbFvStateManager;
     assemblyModelSate: AssemblyModelSate;
     plugin: ViewerCallbackManagerInterface & ViewerActionManagerInterface <R>;
     boardConfigContainer: DataContainer<Partial<RcsbFvBoardConfigInterface>>;
@@ -40,7 +41,7 @@ export abstract class AbstractPfvManager<T,R,U> implements PfvManagerInterface {
 
     protected readonly rcsbFvDivId: string;
     protected readonly rcsbFvContainer: DataContainer<RcsbFvModulePublicInterface>;
-    protected readonly selectorManager: RcsbFvSelectorManager;
+    protected readonly stateManager: RcsbFvStateManager;
     protected readonly assemblyModelSate: AssemblyModelSate;
     protected readonly plugin: ViewerCallbackManagerInterface & ViewerActionManagerInterface <R>;
     protected readonly boardConfigContainer: DataContainer<Partial<RcsbFvBoardConfigInterface>>;
@@ -50,7 +51,7 @@ export abstract class AbstractPfvManager<T,R,U> implements PfvManagerInterface {
     protected constructor(config:T & PfvManagerFactoryConfigInterface<R,U>){
         this.rcsbFvDivId = config.rcsbFvDivId;
         this.rcsbFvContainer = config.rcsbFvContainer;
-        this.selectorManager = config.selectorManager;
+        this.stateManager = config.stateManager;
         this.assemblyModelSate = config.assemblyModelSate;
         this.plugin = config.plugin;
         this.additionalConfig = config.additionalConfig;

+ 3 - 3
src/RcsbFvSequence/SequenceViews/RcsbView/RcsbView.tsx

@@ -6,7 +6,7 @@ import {AbstractView, AbstractViewInterface} from "../AbstractView";
 import {RcsbFvBoardConfigInterface, RcsbFvTrackDataElementInterface} from "@rcsb/rcsb-saguaro";
 import {OperatorInfo, SaguaroPluginModelMapType} from "../../../RcsbFvStructure/StructureViewerInterface";
 import {RcsbFvAdditionalConfig, RcsbFvModulePublicInterface} from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvModule/RcsbFvModuleInterface";
-import {AssemblyModelSate} from "./AssemblyModelSate";
+import {AssemblyModelSate} from "../../../RcsbFvState/AssemblyModelSate";
 import {DataContainer} from "../../../Utils/DataContainer";
 import {
     PfvManagerInterface,
@@ -40,7 +40,7 @@ export class RcsbView<T,R,U> extends AbstractView<RcsbViewInterface<T,R,U>, {},
         this.pfvFactory = this.props.pfvManagerFactory.getPfvManager({
             ...this.props.pfvParams,
             rcsbFvContainer: this.rcsbFvContainer,
-            selectorManager: this.props.selectorManager,
+            stateManager: this.props.stateManager,
             plugin: this.props.structureViewer,
             assemblyModelSate: this.assemblyModelSate,
             boardConfigContainer: this.boardConfigContainer,
@@ -51,7 +51,7 @@ export class RcsbView<T,R,U> extends AbstractView<RcsbViewInterface<T,R,U>, {},
         });
         this.callbackManager = this.props.callbackManagerFactory.getCallbackManager({
             rcsbFvContainer: this.rcsbFvContainer,
-            selectorManager: this.props.selectorManager,
+            stateManager: this.props.stateManager,
             plugin: this.props.structureViewer,
             assemblyModelSate: this.assemblyModelSate,
             pfvFactory: this.pfvFactory

+ 1 - 1
src/RcsbFvSequence/SequenceViews/RcsbView/AssemblyModelSate.ts → src/RcsbFvState/AssemblyModelSate.ts

@@ -1,4 +1,4 @@
-import {ChainInfo, OperatorInfo, SaguaroPluginModelMapType} from "../../../RcsbFvStructure/StructureViewerInterface";
+import {ChainInfo, OperatorInfo, SaguaroPluginModelMapType} from "../RcsbFvStructure/StructureViewerInterface";
 
 interface AssemblyModelStateInterface {
     modelId: string;

+ 0 - 0
src/RcsbFvSelection/RcsbFvSelectorManager.ts → src/RcsbFvState/RcsbFvSelectorManager.ts


+ 26 - 0
src/RcsbFvState/RcsbFvStateInterface.ts

@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2021 RCSB PDB and contributors, licensed under MIT, See LICENSE file for more info.
+* @author Joan Segura Mora <joan.segura@rcsb.org>
+*/
+
+
+import {RcsbFvSelectorManager} from "./RcsbFvSelectorManager";
+import {AssemblyModelSate} from "./AssemblyModelSate";
+import {Subscription} from "rxjs";
+
+export type RcsbFvStateType = {
+    type: "selection-change"|"model-change";
+    view: "1d-view" | "3d-view"
+};
+
+export interface RcsbFvStateInterface {
+
+    readonly selectionState: RcsbFvSelectorManager;
+    readonly assemblyModelSate: AssemblyModelSate;
+
+
+    subscribe(o:(state:RcsbFvStateType)=>void): Subscription;
+
+    next(state:RcsbFvStateType): void;
+
+}

+ 26 - 0
src/RcsbFvState/RcsbFvStateManager.ts

@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2021 RCSB PDB and contributors, licensed under MIT, See LICENSE file for more info.
+* @author Joan Segura Mora <joan.segura@rcsb.org>
+*/
+
+import {RcsbFvStateInterface, RcsbFvStateType} from "./RcsbFvStateInterface";
+import {RcsbFvSelectorManager} from "./RcsbFvSelectorManager";
+import {AssemblyModelSate} from "./AssemblyModelSate";
+import {Subject, Subscription} from "rxjs";
+
+export class RcsbFvStateManager implements RcsbFvStateInterface {
+
+    readonly assemblyModelSate: AssemblyModelSate = new AssemblyModelSate();
+    readonly selectionState: RcsbFvSelectorManager = new RcsbFvSelectorManager();
+
+    private readonly subject: Subject<RcsbFvStateType> = new Subject<RcsbFvStateType>();
+
+    next(state: RcsbFvStateType): void {
+        this.subject.next(state);
+    }
+
+    subscribe(o: (state: RcsbFvStateType) => void): Subscription {
+       return  this.subject.subscribe(o);
+    }
+
+}

+ 4 - 3
src/RcsbFvStructure/RcsbFvStructure.tsx

@@ -1,14 +1,15 @@
 import * as React from "react";
 import {StructureViewerInterface} from "./StructureViewerInterface";
 import {RcsbFvDOMConstants} from "../RcsbFvConstants/RcsbFvConstants";
-import {RcsbFvSelectorManager} from "../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../RcsbFvState/RcsbFvSelectorManager";
+import {RcsbFvStateManager} from "../RcsbFvState/RcsbFvStateManager";
 
 export interface RcsbFvStructureConfigInterface<R,S> {
     loadConfig: R | Array<R>;
     structureViewerConfig: S;
 }
 
-export class RcsbFvStructure<R,S> extends React.Component <RcsbFvStructureConfigInterface<R,S> & {structureViewer: StructureViewerInterface<R,S>, componentId: string, selectorManager: RcsbFvSelectorManager}, RcsbFvStructureConfigInterface<R,S> > {
+export class RcsbFvStructure<R,S> extends React.Component <RcsbFvStructureConfigInterface<R,S> & {structureViewer: StructureViewerInterface<R,S>, componentId: string,  stateManager: RcsbFvStateManager}, RcsbFvStructureConfigInterface<R,S> > {
 
     render():JSX.Element {
         return (
@@ -20,7 +21,7 @@ export class RcsbFvStructure<R,S> extends React.Component <RcsbFvStructureConfig
 
     async componentDidMount() {
         this.updateDimensions();
-        this.props.structureViewer.init(this.props.selectorManager, this.props.structureViewerConfig);
+        this.props.structureViewer.init(this.props.stateManager, this.props.structureViewerConfig);
         if(this.props.loadConfig)
             await this.props.structureViewer.load(this.props.loadConfig);
         window.addEventListener('resize', this.updateDimensions.bind(this));

+ 4 - 3
src/RcsbFvStructure/StructureViewerInterface.ts

@@ -1,7 +1,8 @@
 import {PluginContext} from "molstar/lib/mol-plugin/context";
 import {StructureRepresentationRegistry} from "molstar/lib/mol-repr/structure/registry";
 import {ColorTheme} from "molstar/lib/mol-theme/color";
-import {RcsbFvSelectorManager, RegionSelectionInterface} from "../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager, RegionSelectionInterface} from "../RcsbFvState/RcsbFvSelectorManager";
+import {RcsbFvStateManager} from "../RcsbFvState/RcsbFvStateManager";
 
 export type ChainType = "polymer"|"water"|"branched"|"non-polymer"|"macrolide";
 export type OperatorInfo = {ids:string[], name: string};
@@ -32,13 +33,13 @@ export interface SaguaroRegionList extends SaguaroChain{
 }
 
 export interface StructureViewerInterface<R,S> extends StructureViewerPublicInterface<R>,ViewerCallbackManagerInterface {
-    init: (selection: RcsbFvSelectorManager, args:S) => void;
+    init: (stateManager: RcsbFvStateManager, args:S) => void;
 }
 
 export interface StructureViewerPublicInterface<R> extends ViewerActionManagerInterface<R>{}
 
 export interface ViewerManagerFactoryInterface<R,S extends {}> {
-    getViewerManagerFactory(selection: RcsbFvSelectorManager, args: S): {callbackManager:ViewerCallbackManagerInterface;actionManager:ViewerActionManagerInterface<R>};
+    getViewerManagerFactory(stateManager: RcsbFvStateManager, args: S): {callbackManager:ViewerCallbackManagerInterface;actionManager:ViewerActionManagerInterface<R>};
 }
 
 export interface ViewerCallbackManagerInterface {

+ 1 - 1
src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager.ts

@@ -6,7 +6,7 @@ import {
     ViewerModelMapManagerInterface
 } from "../../StructureViewerInterface";
 import {Viewer} from "@rcsb/rcsb-molstar/build/src/viewer";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
 import {DataContainer, DataContainerReader} from "../../../Utils/DataContainer";
 import {MolstarModelMapManager} from "./MolstarModelMapManager";
 import {Structure, StructureElement, StructureSelection} from "molstar/lib/mol-model/structure";

+ 11 - 10
src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarCallbackManager.ts

@@ -18,14 +18,15 @@ import {PluginContext} from "molstar/lib/mol-plugin/context";
 import {StateObject} from "molstar/lib/mol-state";
 import {Viewer} from "@rcsb/rcsb-molstar/build/src/viewer";
 import {Subscription} from "rxjs";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
 import {DataContainer, DataContainerReader} from "../../../Utils/DataContainer";
+import {RcsbFvStateManager} from "../../../RcsbFvState/RcsbFvStateManager";
 
 
 export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
 
     private readonly viewer: Viewer;
-    private readonly selection: RcsbFvSelectorManager;
+    private readonly  stateManager: RcsbFvStateManager;
     private readonly loadingFlag: DataContainerReader<boolean>;
     private readonly modelMapManager: Omit<ViewerModelMapManagerInterface<null>,'add'>;
     private readonly innerSelectionFlag: DataContainer<boolean>;
@@ -34,9 +35,9 @@ export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
     private modelChangeCallbackSubs: Subscription;
     private modelChangeCallback: (chainMap:SaguaroPluginModelMapType)=>void;
 
-    constructor(config:{viewer: Viewer;selection: RcsbFvSelectorManager;loadingFlag: DataContainerReader<boolean>;modelMapManager: Omit<ViewerModelMapManagerInterface<null>,'add'>;innerSelectionFlag: DataContainer<boolean>;}) {
+    constructor(config:{viewer: Viewer; stateManager: RcsbFvStateManager;loadingFlag: DataContainerReader<boolean>;modelMapManager: Omit<ViewerModelMapManagerInterface<null>,'add'>;innerSelectionFlag: DataContainer<boolean>;}) {
         this.viewer = config.viewer;
-        this.selection = config.selection;
+        this.stateManager = config.stateManager;
         this.loadingFlag = config.loadingFlag;
         this.modelMapManager = config.modelMapManager;
         this.innerSelectionFlag = config.innerSelectionFlag;
@@ -67,7 +68,7 @@ export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
                     });
                 }
             }
-            this.selection.setSelectionFromResidueSelection(sequenceData, 'hover', 'structure');
+            this.stateManager.selectionState.setSelectionFromResidueSelection(sequenceData, 'hover', 'structure');
             g();
         });
     }
@@ -108,7 +109,7 @@ export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
                         for (const e of surroundingsLoci.elements) {
                             StructureElement.Location.set(surroundingsLoc, surroundingsLoci.structure, e.unit, e.unit.elements[0]);
                             if(SP.entity.type(surroundingsLoc) === 'polymer'){
-                                this.selection.setLastSelection('select', {
+                                this.stateManager.selectionState.setLastSelection('select', {
                                     modelId: currentModelId,
                                     labelAsymId: SP.chain.label_asym_id(surroundingsLoc),
                                     regions: []
@@ -117,17 +118,17 @@ export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
                         }
                         this.innerSelectionFlag.set(false);
                     }else if( SP.entity.type(loc) === 'polymer' ) {
-                        this.selection.setLastSelection('select', {
+                        this.stateManager.selectionState.setLastSelection('select', {
                             modelId: currentModelId,
                             labelAsymId: SP.chain.label_asym_id(loc),
                             operatorName: SP.unit.operator_name(loc),
                             regions: []
                         });
                     }else{
-                        this.selection.setLastSelection('select', null);
+                        this.stateManager.selectionState.setLastSelection('select', null);
                     }
             }else{
-                this.selection.setLastSelection('select', null);
+                this.stateManager.selectionState.setLastSelection('select', null);
             }
             const sequenceData: Array<SaguaroSet> = new Array<SaguaroSet>();
             for(const structure of this.viewer.plugin.managers.structure.hierarchy.current.structures){
@@ -153,7 +154,7 @@ export class MolstarCallbackManager implements ViewerCallbackManagerInterface{
 
                 }
             }
-            this.selection.setSelectionFromResidueSelection(sequenceData, 'select', 'structure');
+            this.stateManager.selectionState.setSelectionFromResidueSelection(sequenceData, 'select', 'structure');
             g();
         });
     }

+ 4 - 3
src/RcsbFvStructure/StructureViewers/MolstarViewer/MolstarManagerFactory.ts

@@ -4,11 +4,12 @@ import {Viewer, ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
 import {MolstarModelMapManager} from "./MolstarModelMapManager";
 import {MolstarCallbackManager} from "./MolstarCallbackManager";
 import {DataContainer} from "../../../Utils/DataContainer";
-import {RcsbFvSelectorManager} from "../../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager} from "../../../RcsbFvState/RcsbFvSelectorManager";
+import {RcsbFvStateManager} from "../../../RcsbFvState/RcsbFvStateManager";
 
 export class MolstarManagerFactory implements ViewerManagerFactoryInterface<LoadMolstarInterface,{viewerElement:string|HTMLElement,viewerProps:Partial<ViewerProps>}> {
 
-    public getViewerManagerFactory(selection: RcsbFvSelectorManager, viewerParams: {viewerElement: string | HTMLElement, viewerProps: Partial<ViewerProps>}) {
+    public getViewerManagerFactory(stateManager: RcsbFvStateManager, viewerParams: {viewerElement: string | HTMLElement, viewerProps: Partial<ViewerProps>}) {
         const loadingFlag: DataContainer<boolean> = new DataContainer(false);
         const innerSelectionFlag: DataContainer<boolean> = new DataContainer(false);
         const viewer = new Viewer(viewerParams.viewerElement, {
@@ -25,7 +26,7 @@ export class MolstarManagerFactory implements ViewerManagerFactoryInterface<Load
         const modelMapManager:MolstarModelMapManager = new MolstarModelMapManager(viewer);
         const callbackManager: MolstarCallbackManager =  new MolstarCallbackManager({
             viewer: viewer,
-            selection: selection,
+            stateManager: stateManager,
             loadingFlag: loadingFlag,
             modelMapManager: modelMapManager,
             innerSelectionFlag: innerSelectionFlag

+ 0 - 2
src/RcsbFvStructure/StructureViewers/MolstarViewer/StructureRepresentation.ts

@@ -8,8 +8,6 @@ import {StateObjectSelector} from "molstar/lib/mol-state";
 import {PluginStateObject} from "molstar/lib/mol-plugin-state/objects";
 import {StateObject} from "molstar/lib/mol-state/object";
 import {StateTransformer} from "molstar/lib/mol-state/transformer";
-import {Structure, StructureElement, StructureProperties as SP} from "molstar/lib/mol-model/structure";
-import {ChainInfo} from "../../StructureViewerInterface";
 
 type StructureObject = StateObjectSelector<PluginStateObject.Molecule.Structure, StateTransformer<StateObject<any, StateObject.Type<any>>, StateObject<any, StateObject.Type<any>>, any>>
 

+ 4 - 3
src/RcsbFvStructure/StructureViewers/StructureViewer.ts

@@ -11,9 +11,10 @@ import {
 import {PluginContext} from "molstar/lib/mol-plugin/context";
 import {
     RcsbFvSelectorManager
-} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {StructureRepresentationRegistry} from "molstar/lib/mol-repr/structure/registry";
 import {ColorTheme} from "molstar/lib/mol-theme/color";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 
 
@@ -26,8 +27,8 @@ export class StructureViewer<R,S> implements StructureViewerInterface<R,S> {
         this.structureViewerManagerFactory = structureViewerManagerFactory;
     }
 
-    public init(selection: RcsbFvSelectorManager, args:S): void {
-        const {actionManager,callbackManager} = this.structureViewerManagerFactory.getViewerManagerFactory(selection, args);
+    public init( stateManager: RcsbFvStateManager, args:S): void {
+        const {actionManager,callbackManager} = this.structureViewerManagerFactory.getViewerManagerFactory(stateManager, args);
         this.actionManager = actionManager;
         this.callbackManager = callbackManager;
     }

+ 14 - 14
src/examples/css-config/index.ts

@@ -5,7 +5,6 @@ import {
     FeatureBlockInterface,
     FeatureViewInterface
 } from "../../RcsbFvSequence/SequenceViews/CustomView/CustomView";
-import * as React from "react";
 import {
     RcsbFv,
     RcsbFvDisplayTypes,
@@ -15,7 +14,7 @@ import {
 import {
     RcsbFvSelectorManager,
     RegionSelectionInterface
-} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {StructureViewerPublicInterface, SaguaroRegionList} from "../../RcsbFvStructure/StructureViewerInterface";
 import {AlignmentManager} from "./AlignmentManager";
 import {Mat4} from "molstar/lib/mol-math/linear-algebra";
@@ -24,6 +23,7 @@ import {
     LoadMolstarInterface
 } from "../../RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager";
 import {ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 const sequence_101m: string = "MVLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRVKHLKTEAEMKASEDLKKHGVTVLTALGAILKKKGHHEAELKPLAQSHATKHKIPIKYLEFISEAIIHVLHSRHPGNFGADAQGAMNKALELFRKDIAAKYKELGYQG";
 const alignment = [{
@@ -113,9 +113,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
         includeAxis: true
     },
     rowConfig: rowConfig,
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
-        selectorManager.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
-        selectorManager.clearSelection("select", {modelId:"101m_model", labelAsymId:"A"});
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
+        stateManager.selectionState.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
+        stateManager.selectionState.clearSelection("select", {modelId:"101m_model", labelAsymId:"A"});
         if(sequenceRegion.length > 0) {
             const regions = sequenceRegion.map(r => ({
                 modelId: "1ash_model",
@@ -126,7 +126,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                 labelAsymId: "A",
                 region: {begin: alignmentManager.getTargetPosition(r.begin), end: alignmentManager.getTargetPosition(r.end ?? r.begin), source: "sequence"} as RegionSelectionInterface
             })));
-            selectorManager.addSelectionFromMultipleRegions(regions, "select");
+            stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
             plugin.select(regions.map(r => ({
                 ...r,
                 begin: r.region.begin,
@@ -140,7 +140,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             plugin.resetCamera();
         }
     },
-    sequenceElementClickCallback: async (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => {
+    sequenceElementClickCallback: async (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
         plugin.removeComponent("1ash_component");
         plugin.removeComponent("101m_component");
         if(d.begin === d.end || !d.end){
@@ -148,7 +148,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             await plugin.createComponent("101m_component", "101m_model", "A", alignmentManager.getTargetPosition(d.begin)!, alignmentManager.getTargetPosition(d.begin)!, "ball-and-stick");
         }
     },
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
         if (elements == null || elements.length == 0){
             plugin.clearSelection("hover");
         }else {
@@ -168,9 +168,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                 ), "hover", "set");
         }
     },
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel_1ash: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "select");
-        const sel_101m: SaguaroRegionList | undefined = selection.getSelectionWithCondition("101m_model", "A", "select");
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel_1ash: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "select");
+        const sel_101m: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("101m_model", "A", "select");
         pfv.clearSelection("select");
         if(sel_1ash == null && sel_101m == null) {
             plugin.resetCamera();
@@ -185,9 +185,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                     })), mode: "select"});
         }
     },
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel_1ash: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "hover");
-        const sel_101m: SaguaroRegionList | undefined = selection.getSelectionWithCondition("101m_model", "A", "hover");
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel_1ash: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "hover");
+        const sel_101m: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("101m_model", "A", "hover");
         if(sel_1ash == null && sel_101m == null)
             pfv.clearSelection("hover");
         else if(sel_1ash)

+ 1 - 1
src/examples/external-mapping/FeatureViewerConfig.ts

@@ -1,6 +1,6 @@
 import {FeatureViewInterface} from "../../RcsbFvSequence/SequenceViews/CustomView/CustomView";
 import {StructureViewerPublicInterface, SaguaroRegionList} from "../../RcsbFvStructure/StructureViewerInterface";
-import {RcsbFvSelectorManager, RegionSelectionInterface} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+import {RcsbFvSelectorManager, RegionSelectionInterface} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {
     RcsbFv,
     RcsbFvDisplayTypes,

+ 20 - 19
src/examples/multiple-chain/index.tsx

@@ -15,7 +15,7 @@ import {
 import {
     RcsbFvSelectorManager,
     RegionSelectionInterface
-} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {
     StructureViewerPublicInterface, SaguaroRegionList
 } from "../../RcsbFvStructure/StructureViewerInterface";
@@ -24,6 +24,7 @@ import {
     LoadMolstarInterface
 } from "../../RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager";
 import {ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 const rowConfigChainA: Array<RcsbFvRowConfigInterface> = [
     {
@@ -95,8 +96,8 @@ const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
         includeAxis: true
     },
     rowConfig: rowConfigChainA,
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
-        selectorManager.clearSelection("select", {modelId:"1acb_board", labelAsymId:"A"});
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
+        stateManager.selectionState.clearSelection("select", {modelId:"1acb_board", labelAsymId:"A"});
         plugin.clearSelection("select", {modelId: "1acb_board", labelAsymId: "A"})
         if(sequenceRegion.length > 0) {
             const regions = sequenceRegion.map(r => ({
@@ -104,7 +105,7 @@ const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
                 labelAsymId: "A",
                 region: {begin: r.begin, end: r.end ?? r.begin, source: "sequence"} as RegionSelectionInterface
             }));
-            selectorManager.addSelectionFromMultipleRegions(regions, "select");
+            stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
             plugin.select(regions.map(r => ({
                 ...r,
                 begin: r.region.begin,
@@ -114,11 +115,11 @@ const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
             plugin.resetCamera();
         }
     },
-    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => {
+    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
         if(d!=null)
             plugin.cameraFocus("1acb_board", "A", d.begin, d.end ?? d.begin);
     },
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
         if(elements == null || elements.length == 0)
             plugin.clearSelection("hover");
         else
@@ -129,8 +130,8 @@ const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
                 end: e.end ?? e.begin
             })), "hover", "set");
     },
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1acb_board", "A", "select");
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "A", "select");
         if(sel == null) {
             pfv.clearSelection("select");
             plugin.resetCamera();
@@ -138,8 +139,8 @@ const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
             pfv.setSelection({elements: sel.regions, mode: "select"});
         }
     },
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1acb_board", "A", "hover");
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "A", "hover");
         if(sel == null)
             pfv.clearSelection("hover");
         else
@@ -158,8 +159,8 @@ const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
         includeAxis: true
     },
     rowConfig: rowConfigChainB,
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
-        selectorManager.clearSelection("select", {modelId:"1acb_board", labelAsymId:"B"});
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
+        stateManager.selectionState.clearSelection("select", {modelId:"1acb_board", labelAsymId:"B"});
         plugin.clearSelection("select", {modelId: "1acb_board", labelAsymId: "B"})
         if(sequenceRegion.length > 0) {
             const regions = sequenceRegion.map(r => ({
@@ -167,7 +168,7 @@ const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
                 labelAsymId: "B",
                 region: {begin: r.begin, end: r.end ?? r.begin, source: "sequence"} as RegionSelectionInterface
             }));
-            selectorManager.addSelectionFromMultipleRegions(regions, "select");
+            stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
             plugin.select(regions.map(r => ({
                 ...r,
                 begin: r.region.begin,
@@ -177,11 +178,11 @@ const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
             plugin.resetCamera();
         }
     },
-    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => {
+    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
         if(d!=null)
             plugin.cameraFocus("1acb_board", "B", d.begin, d.end ?? d.begin);
     },
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
         if(elements == null || elements.length == 0)
             plugin.clearSelection("hover");
         else
@@ -192,8 +193,8 @@ const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
                 end: e.end ?? e.begin
             })), "hover", "set");
     },
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1acb_board", "B", "select");
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "B", "select");
         if(sel == null) {
             pfv.clearSelection("select");
             plugin.resetCamera();
@@ -201,8 +202,8 @@ const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
             pfv.setSelection({elements: sel.regions, mode: "select"});
         }
     },
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1acb_board", "B", "hover");
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "B", "hover");
         if(sel == null)
             pfv.clearSelection("hover");
         else

+ 11 - 10
src/examples/single-chain/index.ts

@@ -14,7 +14,7 @@ import {
 import {
     RcsbFvSelectorManager,
     RegionSelectionInterface
-} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {
     StructureViewerPublicInterface, SaguaroRegionList
 } from "../../RcsbFvStructure/StructureViewerInterface";
@@ -23,6 +23,7 @@ import {
     LoadMolstarInterface
 } from "../../RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager";
 import {ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 const rowConfig: Array<RcsbFvRowConfigInterface> = [
     {
@@ -63,15 +64,15 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
         includeAxis: true
     },
     rowConfig: rowConfig,
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
-        selectorManager.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
+        stateManager.selectionState.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
         if(sequenceRegion.length > 0) {
             const regions = sequenceRegion.map(r => ({
                 modelId: "1ash_model",
                 labelAsymId: "A",
                 region: {begin: r.begin, end: r.end ?? r.begin, source: "sequence"} as RegionSelectionInterface
             }));
-            selectorManager.addSelectionFromMultipleRegions(regions, "select");
+            stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
             plugin.select(regions.map(r => ({
                 ...r,
                 begin: r.region.begin,
@@ -82,11 +83,11 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             plugin.resetCamera();
         }
     },
-    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => {
+    sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
         if(d!=null)
             plugin.cameraFocus("1ash_model", "A", d.begin, d.end ?? d.begin);
     },
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
         if(elements == null || elements.length == 0)
             plugin.clearSelection("hover");
         else
@@ -97,8 +98,8 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                 end: e.end ?? e.begin
             })), "hover", "set");
     },
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "select");
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "select");
         if(sel == null) {
             pfv.clearSelection("select");
             plugin.resetCamera();
@@ -106,8 +107,8 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             pfv.setSelection({elements: sel.regions, mode: "select"});
         }
     },
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "hover");
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "hover");
         if(sel == null)
             pfv.clearSelection("hover");
         else

+ 14 - 13
src/examples/structural-alignment/index.ts

@@ -14,7 +14,7 @@ import {
 import {
     RcsbFvSelectorManager,
     RegionSelectionInterface
-} from "../../RcsbFvSelection/RcsbFvSelectorManager";
+} from "../../RcsbFvState/RcsbFvSelectorManager";
 import {StructureViewerPublicInterface, SaguaroRegionList} from "../../RcsbFvStructure/StructureViewerInterface";
 import {AlignmentManager} from "./AlignmentManager";
 import {Mat4} from "molstar/lib/mol-math/linear-algebra";
@@ -23,6 +23,7 @@ import {
     LoadMolstarInterface
 } from "../../RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager";
 import {ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
+import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
 
 const sequence_101m: string = "MVLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRVKHLKTEAEMKASEDLKKHGVTVLTALGAILKKKGHHEAELKPLAQSHATKHKIPIKYLEFISEAIIHVLHSRHPGNFGADAQGAMNKALELFRKDIAAKYKELGYQG";
 const alignment = [{
@@ -112,9 +113,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
         includeAxis: true
     },
     rowConfig: rowConfig,
-    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
-        selectorManager.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
-        selectorManager.clearSelection("select", {modelId:"101m_model", labelAsymId:"A"});
+    sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
+        stateManager.selectionState.clearSelection("select", {modelId:"1ash_model", labelAsymId:"A"});
+        stateManager.selectionState.clearSelection("select", {modelId:"101m_model", labelAsymId:"A"});
         if(sequenceRegion.length > 0) {
             const regions = sequenceRegion.map(r => ({
                 modelId: "1ash_model",
@@ -125,7 +126,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                 labelAsymId: "A",
                 region: {begin: alignmentManager.getTargetPosition(r.begin), end: alignmentManager.getTargetPosition(r.end ?? r.begin), source: "sequence"} as RegionSelectionInterface
             })));
-            selectorManager.addSelectionFromMultipleRegions(regions, "select");
+            stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
             plugin.select(regions.map(r => ({
                 ...r,
                 begin: r.region.begin,
@@ -139,7 +140,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             plugin.resetCamera();
         }
     },
-    sequenceElementClickCallback: async (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, d: RcsbFvTrackDataElementInterface) => {
+    sequenceElementClickCallback: async (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
         plugin.removeComponent("1ash_component");
         plugin.removeComponent("101m_component");
         if(d.begin === d.end || !d.end){
@@ -147,7 +148,7 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
             await plugin.createComponent("101m_component", "101m_model", "A", alignmentManager.getTargetPosition(d.begin)!, alignmentManager.getTargetPosition(d.begin)!, "ball-and-stick");
         }
     },
-    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, selectorManager: RcsbFvSelectorManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
+    sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
         if (elements == null || elements.length == 0){
             plugin.clearSelection("hover");
         }else {
@@ -167,9 +168,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                 ), "hover", "set");
         }
     },
-    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel_1ash: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "select");
-        const sel_101m: SaguaroRegionList | undefined = selection.getSelectionWithCondition("101m_model", "A", "select");
+    structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel_1ash: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "select");
+        const sel_101m: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("101m_model", "A", "select");
         pfv.clearSelection("select");
         if(sel_1ash == null && sel_101m == null) {
             plugin.resetCamera();
@@ -184,9 +185,9 @@ const fvConfig: FeatureViewInterface<LoadMolstarInterface> = {
                     })), mode: "select"});
         }
     },
-    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, selection: RcsbFvSelectorManager) => {
-        const sel_1ash: SaguaroRegionList | undefined = selection.getSelectionWithCondition("1ash_model", "A", "hover");
-        const sel_101m: SaguaroRegionList | undefined = selection.getSelectionWithCondition("101m_model", "A", "hover");
+    structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
+        const sel_1ash: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1ash_model", "A", "hover");
+        const sel_101m: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("101m_model", "A", "hover");
         if(sel_1ash == null && sel_101m == null)
             pfv.clearSelection("hover");
         else if(sel_1ash)