diff --git a/modules/gui/pymod/init_context_menu.py b/modules/gui/pymod/init_context_menu.py index 2807a10bd5915a7720574375231afce46cbd21f2..7a6145ccdbccbaea4b193c84905f42b02d044fe4 100644 --- a/modules/gui/pymod/init_context_menu.py +++ b/modules/gui/pymod/init_context_menu.py @@ -3,7 +3,98 @@ from PyQt4 import QtCore, QtGui from ost import geom, gfx, gui from ost import settings from ost.bindings import tmtools - + +class SelectRefDialog(QtGui.QDialog): + def __init__(self, ent_list, parent=None): + QtGui.QDialog.__init__(self, parent) + self.ent_list_ = ent_list + vb = QtGui.QVBoxLayout() + self.setLayout(vb) + self.setWindowTitle("Select Reference Object") + self.label = QtGui.QLabel("Please Select the Reference Object") + self.list = QtGui.QTableWidget(self) + self.list.setColumnCount(2) + self.list.setColumnWidth(0, 30) + self.list.setColumnWidth(1,220) + self.list.verticalHeader().setVisible(False) + self.list.horizontalHeader().setVisible(False) + self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) + vb.addWidget(self.label) + vb.addWidget(self.list) + hb = QtGui.QHBoxLayout() + hb.setDirection(QtGui.QBoxLayout.LeftToRight) + cancel_btn = QtGui.QPushButton("Cancel", self) + load_btn = QtGui.QPushButton("Select", self) + hb.addStretch(1) + hb.addWidget(cancel_btn) + hb.addWidget(load_btn) + vb.addItem(hb) + load_btn.setDefault(True) + QtCore.QObject.connect(load_btn, QtCore.SIGNAL("clicked()"), self.Select) + QtCore.QObject.connect(cancel_btn, QtCore.SIGNAL("clicked()"), self.reject) + + row = 0 + for ent in self.ent_list_: + variant = QtCore.QVariant(ent) + self.list.insertRow(row) + new_item = QtGui.QTableWidgetItem("%i"%(row+1)) + new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + new_item.setData(QtCore.Qt.UserRole,variant) + self.list.setItem(row, 0, new_item) + new_item = QtGui.QTableWidgetItem(ent.GetName()) + new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + self.list.setItem(row, 1, new_item) + row += 1 + + def Select(self): + items = self.list.selectedItems() + for item in items: + if(item.column()==0): + ent = item.data(QtCore.Qt.UserRole).toPyObject() + self.ent_list_.remove(ent) + self.ent_list_.insert(0,ent) + self.accept() + + def GetEntities(self): + return self.ent_list_ + +class ShowResultDialog(QtGui.QDialog): + def __init__(self, ent_list, res_list, parent=None): + QtGui.QDialog.__init__(self, parent) + self.ent_list_ = ent_list + vb = QtGui.QVBoxLayout() + self.setLayout(vb) + self.setWindowTitle("Alignment result") + self.label = QtGui.QLabel("Alignment results with %s as reference"%ent_list[0].GetName()) + self.list = QtGui.QTableWidget(self) + self.list.setColumnCount(3) + self.list.verticalHeader().setVisible(False) + self.list.setHorizontalHeaderLabels (["Name","RMSD","TMScore"]) + self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + vb.addWidget(self.label) + vb.addWidget(self.list) + hb = QtGui.QHBoxLayout() + hb.setDirection(QtGui.QBoxLayout.LeftToRight) + ok_btn = QtGui.QPushButton("OK", self) + hb.addStretch(1) + hb.addWidget(ok_btn) + vb.addItem(hb) + ok_btn.setDefault(True) + QtCore.QObject.connect(ok_btn, QtCore.SIGNAL("clicked()"), self.accept) + + for i in range(0, len(res_list)): + self.list.insertRow(i) + new_item = QtGui.QTableWidgetItem(ent_list[i+1].GetName()) + new_item.setFlags(QtCore.Qt.ItemIsEnabled) + self.list.setItem(i, 0, new_item) + new_item = QtGui.QTableWidgetItem("%.2f"%res_list[i].rmsd) + new_item.setFlags(QtCore.Qt.ItemIsEnabled) + self.list.setItem(i, 1, new_item) + new_item = QtGui.QTableWidgetItem("%i"%res_list[i].tm_score) + new_item.setFlags(QtCore.Qt.ItemIsEnabled) + self.list.setItem(i, 2, new_item) + class AlignmentContextMenu(QtCore.QObject): def __init__(self, context_menu): try: @@ -12,27 +103,43 @@ class AlignmentContextMenu(QtCore.QObject): self.action = QtGui.QAction("Align", self) QtCore.QObject.connect(self.action,QtCore.SIGNAL("triggered()"), self.Align) - print gui.ContextActionType.ENTITY | gui.ContextActionType.MULTI context_menu.AddAction(self.action, gui.ContextActionType.ENTITY | gui.ContextActionType.MULTI) except settings.FileNotFound: return def Align(self): scene_selection = gui.SceneSelection.Instance() - if scene_selection.GetActiveNodeCount() >= 2: - node = scene_selection.GetActiveNode(0) - if isinstance(node, gfx.Entity): - ref = node.view.handle - for i in range(1,scene_selection.GetActiveNodeCount()): - node = scene_selection.GetActiveNode(i) - if isinstance(node, gfx.Entity): - print tmtools.TMAlign(node.view.handle, ref) - node.UpdatePositions() - - - + ent_list = list() + for i in range(0,scene_selection.GetActiveNodeCount()): + ent_list.append(scene_selection.GetActiveNode(i)) + if len(ent_list) == 2: + self.__Align(ent_list) + elif len(ent_list) > 2: + sd = SelectRefDialog(ent_list) + if(sd.exec_()): + self.__Align(sd.GetEntities()) + + def __Align(self, ent_list): + node = ent_list[0] + res_list = list() + if isinstance(node, gfx.Entity): + ref = node.view.handle + for i in range(1,len(ent_list)): + node = ent_list[i] + if isinstance(node, gfx.Entity): + res_list.append(tmtools.TMAlign(node.view.handle, ref)) + node.UpdatePositions() + self.__ShowScore(ent_list, res_list) + + def __ShowScore(self, ent_list, res_list): + if(len(res_list)==1): + res = res_list[0] + string = "RMSD: %.2f, TMScore: %i"%(res.rmsd, res.tm_score) + gui.GostyApp.Instance().perspective.StatusMessage(string) + elif(len(res_list)>1): + ShowResultDialog(ent_list, res_list).exec_() - + def _InitContextMenu(): cm=gui.GostyApp.Instance().GetSceneWin().GetContextMenu() AlignmentContextMenu(cm) \ No newline at end of file