94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
from . import editor
|
|
cmd = __import__("sys").modules["pymol.cmd"]
|
|
from .cmd import DEFAULT_SUCCESS, DEFAULT_ERROR
|
|
|
|
# persistent storage between copy/paste
|
|
class _PersistentEditing:
|
|
|
|
def __init__(self,self_cmd=cmd):
|
|
self._cmd = self_cmd
|
|
self._obj = None
|
|
|
|
def get_clipboard_object(self):
|
|
'''name of the temporary persistent object'''
|
|
return self._obj
|
|
|
|
def create_tmp(self,sel,extract):
|
|
'''copy or cut selection to clipboard'''
|
|
if self._obj:
|
|
self._cmd.delete(self._obj)
|
|
else:
|
|
self._obj = self._cmd.get_unused_name("_persistent_obj")
|
|
|
|
auto_hide_sele = self._cmd.get_setting_boolean("auto_hide_selections")
|
|
self._cmd.set("auto_hide_selections", 0, updates=0)
|
|
|
|
try:
|
|
self._cmd.create(self._obj, sel, extract=extract, zoom=0)
|
|
self._cmd.disable(self._obj)
|
|
finally:
|
|
self._cmd.set("auto_hide_selections", auto_hide_sele, updates=0)
|
|
|
|
# user commands via keyboard
|
|
|
|
_kCopy = 0
|
|
_kPaste = 1
|
|
_kCut = 2
|
|
|
|
def editing_ring(action, *, _self=cmd):
|
|
"""
|
|
DESCRIPTION
|
|
|
|
Helper function for copy/cut/paste of molecular selections.
|
|
|
|
ARGUMENTS
|
|
|
|
action = cut/copy/paste/invert
|
|
"""
|
|
|
|
space = getattr(_self, "_editing_ring_space", None)
|
|
if space is None:
|
|
space = _PersistentEditing(_self)
|
|
_self._editing_ring_space = space
|
|
|
|
# PASTE current hidden object into a new object
|
|
if action in (_kPaste, "paste"):
|
|
clipobj = space.get_clipboard_object()
|
|
if not clipobj:
|
|
print("Nothing on clipboard")
|
|
else:
|
|
_self.copy(_self.get_unused_name("obj"), clipobj, zoom=0)
|
|
return
|
|
|
|
sels = _self.get_names("public_selections", enabled_only=1)
|
|
if not sels:
|
|
print("No active selection")
|
|
return
|
|
|
|
sel = sels[0]
|
|
assert sel
|
|
|
|
# COPY current selection into a new hidden object
|
|
if action in (_kCopy, "copy"):
|
|
space.create_tmp(sel, extract=0)
|
|
|
|
# CUT current selection into a new hidden object
|
|
elif action in (_kCut, "cut"):
|
|
space.create_tmp(sel, extract=1)
|
|
|
|
# INVERT the current selection
|
|
elif action == "invert":
|
|
_self.select(sel, 'not ' + sel)
|
|
|
|
else:
|
|
raise AttributeError(action)
|
|
|
|
|
|
def get_default_keys(_self=cmd):
|
|
from pymol.shortcut_manager import shortcut_dict_ref, ShortcutIndex
|
|
keys = {}
|
|
for key in shortcut_dict_ref:
|
|
keys[key] = shortcut_dict_ref[key][ShortcutIndex.COMMAND]
|
|
|
|
return keys
|