Skip to content

Commit 170bd17

Browse files
authored
Graphical interface for get_view and set_view (Pymol-Scripts#105)
What was tried: * QtQuick interface would be ugly because of opaque background on top of widget. Couldn't mimic scene buttons. * Manage scenes because I couldn't get `_cmd.get_scene_order(cmd)` working.
1 parent 492a1b3 commit 170bd17

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

plugins/views.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
"""
2+
Manage views and scenes.
3+
4+
Pedro Sousa Lacerda <pslacerda@gmail.com>
5+
LaBiMM / UFBA: Laboratório de Bioinformática e Modelagem Molecular
6+
7+
Open it with the "Manage views" and "Manage scenes" options on the "Scene"
8+
menu. Double-click to rename a entry. Erase it's name to delete it.
9+
10+
"""
11+
12+
import pymol
13+
import pymol.gui
14+
from pymol import cmd
15+
from pymol import _cmd
16+
from pymol.Qt import QtWidgets, QtCore, QtGui
17+
18+
19+
class ViewManager:
20+
21+
@staticmethod
22+
def recall(key):
23+
cmd.view(key, 'recall')
24+
25+
@staticmethod
26+
def store(key):
27+
cmd.view(key, 'store')
28+
29+
@staticmethod
30+
def rename(old_key, new_key):
31+
curr_view = cmd.get_view()
32+
cmd.view(old_key, 'recall', False)
33+
cmd.view(old_key, 'clear')
34+
cmd.view(new_key, 'store')
35+
cmd.set_view(curr_view)
36+
37+
@staticmethod
38+
def clear(key):
39+
cmd.view(key, 'clear')
40+
41+
@staticmethod
42+
def get_keys():
43+
return list(pymol._view_dict)
44+
45+
@staticmethod
46+
def next_key():
47+
count = len(ViewManager.get_keys())
48+
return f'view{count}'
49+
50+
51+
def new_manager_widget(manager, title):
52+
dockWidget = QtWidgets.QDockWidget()
53+
dockWidget.setWindowTitle(title)
54+
55+
widget = QtWidgets.QWidget()
56+
layout = QtWidgets.QVBoxLayout(widget)
57+
dockWidget.setWidget(widget)
58+
widget.setLayout(layout)
59+
60+
model = QtGui.QStandardItemModel(0, 1, widget)
61+
62+
tree = QtWidgets.QTreeView(widget)
63+
tree.setModel(model)
64+
tree.setHeaderHidden(True)
65+
66+
current_key = None
67+
68+
def update_treeview():
69+
model.clear()
70+
for key in manager.get_keys():
71+
item = QtGui.QStandardItem()
72+
item.setText(key)
73+
model.blockSignals(True)
74+
model.appendRow(item)
75+
model.blockSignals(False)
76+
77+
@model.rowsInserted.connect
78+
def onRowsInserted(index):
79+
key = model.itemFromIndex(index).text()
80+
store_view(key)
81+
update_treeview()
82+
83+
@model.dataChanged.connect
84+
def onDataChanged(index):
85+
new_key = model.itemFromIndex(index).text()
86+
if new_key == "":
87+
manager.clear(current_key)
88+
else:
89+
manager.rename(current_key, new_key)
90+
update_treeview()
91+
92+
@dockWidget.visibilityChanged.connect
93+
def onVisibilityChanged(visible):
94+
if not visible:
95+
return
96+
update_treeview()
97+
98+
@tree.clicked.connect
99+
def onClicked(index):
100+
nonlocal current_key
101+
102+
key = model.itemFromIndex(index).text()
103+
current_key = key
104+
105+
manager.recall(key)
106+
107+
storeBtn = QtWidgets.QPushButton("Store", widget)
108+
@storeBtn.clicked.connect
109+
def onClicked():
110+
count = len(manager.get_keys())
111+
manager.store(f"view{count}")
112+
update_treeview()
113+
114+
layout.addWidget(tree)
115+
layout.addWidget(storeBtn)
116+
return dockWidget
117+
118+
119+
def __init_plugin__(app=None):
120+
window = pymol.gui.get_qtwindow()
121+
menu = window.menudict['Scene']
122+
menu.addSeparator()
123+
124+
action = menu.addAction("Manage views")
125+
widget = new_manager_widget(ViewManager, "Views")
126+
window.addDockWidget(
127+
QtCore.Qt.LeftDockWidgetArea,
128+
widget
129+
)
130+
widget.hide()
131+
@action.triggered.connect
132+
def toggle():
133+
widget.show()
134+
135+
136+
__init_plugin__()

0 commit comments

Comments
 (0)