properties_dialog.py (pymol-v2.1.0.tar.bz2) | : | properties_dialog.py (pymol-open-source-2.2.0) | ||
---|---|---|---|---|
import os | import os | |||
from pymol.Qt import QtGui, QtCore, QtWidgets | from pymol.Qt import QtGui, QtCore, QtWidgets | |||
from pymol.Qt.utils import UpdateLock | from pymol.Qt.utils import UpdateLock, PopupOnException | |||
import pymol | import pymol | |||
class UneditableDelegate(QtWidgets.QStyledItemDelegate): | class UneditableDelegate(QtWidgets.QStyledItemDelegate): | |||
def createEditor(self, parent, option, index): | def createEditor(self, parent, option, index): | |||
return None | return None | |||
class FunctionSuspender: | class FunctionSuspender: | |||
def __init__(self, func): | def __init__(self, func): | |||
self.func = func | self.func = func | |||
def __enter__(self): | def __enter__(self): | |||
skipping to change at line 27 | skipping to change at line 27 | |||
self.func.suspended = False | self.func.suspended = False | |||
def suspendable(func): | def suspendable(func): | |||
def wrapper(*args, **kwargs): | def wrapper(*args, **kwargs): | |||
if not func.suspended: | if not func.suspended: | |||
return func(*args, **kwargs) | return func(*args, **kwargs) | |||
func.suspended = False | func.suspended = False | |||
wrapper.suspend = FunctionSuspender(func) | wrapper.suspend = FunctionSuspender(func) | |||
return wrapper | return wrapper | |||
def get_object_names(_self): | ||||
# was _self.get_names('public_objects') in PyMOL 2.1 | ||||
# but that throws exceptions for groups/isosurfaces/etc. | ||||
names = _self.get_object_list() | ||||
return names | ||||
def props_dialog(parent): #noqa | def props_dialog(parent): #noqa | |||
from pymol.setting import name_dict | from pymol.setting import name_dict | |||
cmd = parent.cmd | cmd = parent.cmd | |||
form = parent.load_form('props', 'floating') | form = parent.load_form('props', 'floating') | |||
parent.addDockWidget(QtCore.Qt.RightDockWidgetArea, form._dialog) | parent.addDockWidget(QtCore.Qt.RightDockWidgetArea, form._dialog) | |||
def make_entry(parent, label): | def make_entry(parent, label): | |||
item = QtWidgets.QTreeWidgetItem(parent) | item = QtWidgets.QTreeWidgetItem(parent) | |||
item.setText(0, str(label)) | item.setText(0, str(label)) | |||
skipping to change at line 78 | skipping to change at line 84 | |||
item_atom_properties = Ellipsis # Incentive PyMOL only | item_atom_properties = Ellipsis # Incentive PyMOL only | |||
item_astate = make_cat(form.treeWidget, "Atom-State-Level") | item_astate = make_cat(form.treeWidget, "Atom-State-Level") | |||
item_astate_builtins = make_cat(item_astate, "Properties (built-in)") | item_astate_builtins = make_cat(item_astate, "Properties (built-in)") | |||
item_astate_settings = Ellipsis # Incentive PyMOL only | item_astate_settings = Ellipsis # Incentive PyMOL only | |||
keys_atom_identifiers = ['model', 'index', 'segi', 'chain', 'resi', | keys_atom_identifiers = ['model', 'index', 'segi', 'chain', 'resi', | |||
'resn', 'name', 'alt', 'ID', 'rank'] | 'resn', 'name', 'alt', 'ID', 'rank'] | |||
keys_atom_builtins = ['elem', 'q', 'b', 'type', 'formal_charge', | keys_atom_builtins = ['elem', 'q', 'b', 'type', 'formal_charge', | |||
'partial_charge', 'numeric_type', 'text_type', | 'partial_charge', 'numeric_type', 'text_type', | |||
'stereo', 'vdw', 'ss', 'color', 'reps', | # avoid stereo auto-assignment errors | |||
# 'stereo', | ||||
'vdw', 'ss', 'color', 'reps', | ||||
'protons', 'geom', 'valence', 'elec_radius'] | 'protons', 'geom', 'valence', 'elec_radius'] | |||
keys_astate_builtins = ['state', 'x', 'y', 'z'] | keys_astate_builtins = ['state', 'x', 'y', 'z'] | |||
items = {} | items = {} | |||
for key in keys_atom_identifiers: | for key in keys_atom_identifiers: | |||
items[key] = make_entry(item_atom_identifiers, key) | items[key] = make_entry(item_atom_identifiers, key) | |||
for key in keys_atom_builtins: | for key in keys_atom_builtins: | |||
items[key] = make_entry(item_atom_builtins, key) | items[key] = make_entry(item_atom_builtins, key) | |||
for key in keys_astate_builtins: | for key in keys_astate_builtins: | |||
items[key] = make_entry(item_astate_builtins, key) | items[key] = make_entry(item_astate_builtins, key) | |||
skipping to change at line 120 | skipping to change at line 128 | |||
try: | try: | |||
if new_value: | if new_value: | |||
result = cmd.set_object_ttt(model, new_value) | result = cmd.set_object_ttt(model, new_value) | |||
except (ValueError, IndexError): | except (ValueError, IndexError): | |||
result = False | result = False | |||
elif item == item_ostate_title: | elif item == item_ostate_title: | |||
result = cmd.set_title(model, state, new_value) | result = cmd.set_title(model, state, new_value) | |||
elif item == item_ostate_matrix: | elif item == item_ostate_matrix: | |||
cmd.matrix_reset(model, state) | cmd.matrix_reset(model, state) | |||
try: | try: | |||
new_value = cmd.safe_eval(new_value) | ||||
result = cmd.transform_object(model, new_value, state) | result = cmd.transform_object(model, new_value, state) | |||
except: # CmdTransformObject-DEBUG: bad matrix | except: # CmdTransformObject-DEBUG: bad matrix | |||
result = False | result = False | |||
elif parent == item_object_settings: | elif parent == item_object_settings: | |||
cmd.set(key, new_value, model, quiet=0) | with PopupOnException(): | |||
cmd.set(key, new_value, model, quiet=0) | ||||
elif parent == item_ostate_settings: | elif parent == item_ostate_settings: | |||
cmd.set(key, new_value, model, state, quiet=0) | with PopupOnException(): | |||
cmd.set(key, new_value, model, state, quiet=0) | ||||
elif parent == item_ostate_properties: | elif parent == item_ostate_properties: | |||
cmd.set_property(key, new_value, model, state, quiet=0) | cmd.set_property(key, new_value, model, state, quiet=0) | |||
else: | else: | |||
is_state = False | is_state = False | |||
if parent == item_atom_properties: | if parent == item_atom_properties: | |||
key = 'p.' + key | key = 'p.' + key | |||
elif parent == item_atom_settings: | elif parent == item_atom_settings: | |||
key = 's.' + key | key = 's.' + key | |||
elif parent == item_astate_settings: | elif parent == item_astate_settings: | |||
skipping to change at line 169 | skipping to change at line 180 | |||
else: | else: | |||
result = cmd.alter(*alter_args) | result = cmd.alter(*alter_args) | |||
if not result: | if not result: | |||
update_treewidget_model() | update_treewidget_model() | |||
item_changed.skip = False | item_changed.skip = False | |||
def update_object_settings(parent, model, state): | def update_object_settings(parent, model, state): | |||
parent.takeChildren() | parent.takeChildren() | |||
for sitem in ( | for sitem in (cmd.get_object_settings(model, state) or []): | |||
pymol.querying.get_object_settings( | ||||
model, | ||||
state, | ||||
_self=cmd) or []): | ||||
key = name_dict.get(sitem[0], sitem[0]) | key = name_dict.get(sitem[0], sitem[0]) | |||
item = make_entry(parent, key) | item = make_entry(parent, key) | |||
item.setText(1, str(sitem[2])) | item.setText(1, str(sitem[2])) | |||
def update_atom_settings(wrapper, parent): | def update_atom_settings(wrapper, parent): | |||
parent.takeChildren() | parent.takeChildren() | |||
for key in wrapper: | for key in wrapper: | |||
item = make_entry(parent, name_dict.get(key, key)) | item = make_entry(parent, name_dict.get(key, key)) | |||
value = wrapper[key] | value = wrapper[key] | |||
item.setText(1, str(value)) | item.setText(1, str(value)) | |||
def update_atom_properties(wrapper, parent): | def update_atom_properties(wrapper, parent): | |||
parent.takeChildren() | parent.takeChildren() | |||
for key in wrapper: | for key in wrapper: | |||
item = make_entry(parent, key) | item = make_entry(parent, key) | |||
value = wrapper[key] | value = wrapper[key] | |||
item.setText(1, str(value)) | item.setText(1, str(value)) | |||
def update_atom_fields(ns): | def update_atom_fields(ns): | |||
for key in keys_atom_identifiers + keys_atom_builtins: | for key in keys_atom_identifiers + keys_atom_builtins: | |||
value = ns[key] | try: | |||
value = ns[key] | ||||
except Exception as e: | ||||
value = 'ERROR: ' + str(e) | ||||
items[key].setText(1, str(value)) | items[key].setText(1, str(value)) | |||
update_atom_settings(ns['s'], item_atom_settings) | update_atom_settings(ns['s'], item_atom_settings) | |||
def update_astate_fields(ns): | def update_astate_fields(ns): | |||
for key in keys_astate_builtins: | for key in keys_astate_builtins: | |||
value = ns[key] | value = ns[key] | |||
items[key].setText(1, str(value)) | items[key].setText(1, str(value)) | |||
space = { | space = { | |||
'update_atom_fields': update_atom_fields, | 'update_atom_fields': update_atom_fields, | |||
skipping to change at line 296 | skipping to change at line 306 | |||
update_treewidget_state() | update_treewidget_state() | |||
item_changed.skip = False | item_changed.skip = False | |||
def update_model_list(*args): | def update_model_list(*args): | |||
if 'pk1' not in cmd.get_names('selections'): | if 'pk1' not in cmd.get_names('selections'): | |||
update_pk1() | update_pk1() | |||
with update_treewidget_model.suspend: | with update_treewidget_model.suspend: | |||
form.input_model.clear() | form.input_model.clear() | |||
form.input_model.addItems(cmd.get_names('public_objects')) | form.input_model.addItems(get_object_names(cmd)) | |||
update_from_pk1() | update_from_pk1() | |||
update_treewidget_model() | update_treewidget_model() | |||
# init input fields | # init input fields | |||
form.input_model.addItems(cmd.get_names('public_objects')) | form.input_model.addItems(get_object_names(cmd)) | |||
form.input_state.setValue(cmd.get_state()) | form.input_state.setValue(cmd.get_state()) | |||
# select pk1 atom if available | # select pk1 atom if available | |||
update_from_pk1() | update_from_pk1() | |||
# hook up events | # hook up events | |||
form.input_model.currentIndexChanged.connect(update_treewidget_model) | form.input_model.currentIndexChanged.connect(update_treewidget_model) | |||
form.input_state.valueChanged.connect(update_treewidget_state) | form.input_state.valueChanged.connect(update_treewidget_state) | |||
form.input_index.valueChanged.connect(update_treewidget) | form.input_index.valueChanged.connect(update_treewidget) | |||
form.button_refresh.clicked.connect(update_model_list) | form.button_refresh.clicked.connect(update_model_list) | |||
End of changes. 10 change blocks. | ||||
12 lines changed or deleted | 22 lines changed or added |