X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FPymolBindingModel.java;h=fc957bb6e4f55520c07706802d29a2c7a7812965;hb=d85a2741994c169e1b81db8f9166f5214ff1f561;hp=af4afb0d31a281d4a2aa8a906709e345a4eab607;hpb=42f4227ed213d422a87d3b22fc9e85d14ffaf53f;p=jalview.git diff --git a/src/jalview/gui/PymolBindingModel.java b/src/jalview/gui/PymolBindingModel.java index af4afb0..fc957bb 100644 --- a/src/jalview/gui/PymolBindingModel.java +++ b/src/jalview/gui/PymolBindingModel.java @@ -1,5 +1,10 @@ package jalview.gui; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import jalview.api.AlignmentViewPanel; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; @@ -7,17 +12,20 @@ import jalview.ext.pymol.PymolCommands; import jalview.ext.pymol.PymolManager; import jalview.gui.StructureViewer.ViewerType; import jalview.structure.AtomSpec; +import jalview.structure.StructureCommand; import jalview.structure.StructureCommandI; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class PymolBindingModel extends AAStructureBindingModel { + /* + * format for labels shown on structures when mousing over sequence; + * see https://pymolwiki.org/index.php/Label#examples + * left not final so customisable e.g. with a Groovy script + */ + private static String LABEL_FORMAT = "\"%s %s\" % (resn,resi)"; + private PymolManager pymolManager; private Thread pymolMonitor; @@ -32,6 +40,8 @@ public class PymolBindingModel extends AAStructureBindingModel */ Map pymolObjects = new HashMap<>(); + private String lastLabelSpec; + /** * Constructor * @@ -59,6 +69,37 @@ public class PymolBindingModel extends AAStructureBindingModel @Override public void highlightAtoms(List atoms) { + /* + * https://pymolwiki.org/index.php/Label#examples + */ + StringBuilder sb = new StringBuilder(); + for (AtomSpec atom : atoms) + { + // todo promote to StructureCommandsI.showLabel() + // todo handle CA|P correctly + String modelId = getModelIdForFile(atom.getPdbFile()); + sb.append(String.format(" %s//%s/%d/CA", modelId, + atom.getChain(), + atom.getPdbResNum())); + } + String labelSpec = sb.toString(); + if (labelSpec.equals(lastLabelSpec)) + { + return; + } + StructureCommandI command = new StructureCommand("label", labelSpec, LABEL_FORMAT); + executeCommand(command, false); + + /* + * and remove the label(s) previously shown + */ + if (lastLabelSpec != null) + { + command = new StructureCommand("label", lastLabelSpec, ""); + executeCommand(command, false); + } + + lastLabelSpec = labelSpec; } @Override @@ -72,7 +113,7 @@ public class PymolBindingModel extends AAStructureBindingModel protected List executeCommand(StructureCommandI command, boolean getReply) { - System.out.println(command.toString()); // debug + // System.out.println(command.toString()); // debug return pymolManager.sendCommand(command, getReply); } @@ -88,30 +129,26 @@ public class PymolBindingModel extends AAStructureBindingModel return ViewerType.PYMOL; } - public boolean isPymolRunning() + @Override + public boolean isViewerRunning() { return pymolManager.isPymolLaunched(); } + @Override public void closeViewer(boolean closePymol) { - getSsm().removeStructureViewerListener(this, this.getStructureFiles()); + super.closeViewer(closePymol); if (closePymol) { pymolManager.exitPymol(); } - // if (this.pymolListener != null) - // { - // pymolListener.shutdown(); - // pymolListener = null; - // } pymolManager = null; if (pymolMonitor != null) { pymolMonitor.interrupt(); } - releaseUIResources(); } public boolean openSession(String pymolSessionFile) @@ -173,4 +210,16 @@ public class PymolBindingModel extends AAStructureBindingModel return file; } + /** + * Returns the file extension to use for a saved viewer session file (.pse) + * + * @return + * @see https://pymolwiki.org/index.php/Save + */ + @Override + public String getSessionFileExtension() + { + return ".pse"; + } + }