from maya import cmds from maya import mel from maya import OpenMayaUI as omui from PySide import QtGui, QtCore from PySide.QtCore import * from PySide.QtGui import * from shiboken import wrapInstance #import FabricEngine.Core mayaMainWindowPtr = omui.MQtUtil.mainWindow() mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget) #contextID = cmds.FabricCanvasGetContextID() #client = FabricEngine.Core.createClient({'contextID':contextID}) #host = client.DFG.host class CheckableComboBox(QtGui.QComboBox): def __init__(self): super(CheckableComboBox, self).__init__() self.view().pressed.connect(self.handleItemPressed) self.setModel(QtGui.QStandardItemModel(self)) def handleItemPressed(self, index): item = self.model().itemFromIndex(index) if item.checkState() == QtCore.Qt.Checked: item.setCheckState(QtCore.Qt.Unchecked) else: item.setCheckState(QtCore.Qt.Checked) class MetaHeaderView(QtGui.QHeaderView): def __init__(self,orientation,parent=None): super(MetaHeaderView, self).__init__(orientation,parent) self.setMovable(True) self.setClickable(True) # This block sets up the edit line by making setting the parent # to the Headers Viewport. self.line = QtGui.QLineEdit(parent=self.viewport()) #Create self.line.setAlignment(QtCore.Qt.AlignTop) # Set the Alignmnet self.line.setHidden(True) # Hide it till its needed # This is needed because I am having a werid issue that I believe has # to do with it losing focus after editing is done. self.line.blockSignals(True) self.sectionedit = 0 # Connects to double click self.sectionDoubleClicked.connect(self.editHeader) self.line.editingFinished.connect(self.doneEditing) def doneEditing(self): # This block signals needs to happen first otherwise I have lose focus # problems again when there are no rows self.line.blockSignals(True) self.line.setHidden(True) newname = str(self.line.text()) self.model().setHeaderData(self.sectionedit, Qt.Orientation.Vertical, newname) self.line.setText('') self.setCurrentIndex(QtCore.QModelIndex()) def editHeader(self,section): print self.geometry().width() text = self.model().headerData(section, Qt.Orientation.Vertical) # This block sets up the geometry for the line edit edit_geometry = self.line.geometry() edit_geometry.setHeight(self.sectionSize(section)) edit_geometry.setWidth(self.geometry().width()) edit_geometry.moveBottom(self.sectionViewportPosition(section) + self.sectionSize(section)-1) self.line.setGeometry(edit_geometry) #print self.model().headerData(section, Qt.Orientation.Vertical) self.line.setText(text) self.line.setHidden(False) # Make it visiable self.line.blockSignals(False) # Let it send signals self.line.setFocus() self.line.selectAll() self.sectionedit = section class CreateRbfEditor(QWidget): def __init__(self, canvasNodes,*args, **kwargs): super(CreateRbfEditor, self).__init__(*args, **kwargs) self.canvasNodes = canvasNodes #Parent widget under Maya main window self.setParent(mayaMainWindow) self.setWindowFlags(Qt.Window) #Set the object name self.setObjectName('RbfEditor_uniqueId') self.setWindowTitle('RBF Editor') self.actions() self.initUI() self._updateWidgetSize() self.cmd = 'polyCone' def initUI(self): #Create combo box (drop-down menu) and add menu items self.combo = QComboBox(self) if self.canvasNodes is None or len(self.canvasNodes) == 0: self.combo.addItem('no RBF node') else: for i in self.canvasNodes: self.combo.addItem(i) #self.combo.setCurrentIndex(0) #self.combo.move(20, 20) #self.combo.activated[str].connect(self.combo_onActivated) #Create combo box (drop-down menu) and add menu items self.poseAtt = QComboBox(self) self.poseAtt.addItem('Translate') self.poseAtt.addItem('Scaling') self.poseAtt.addItem('Euler') self.poseAtt.addItem('Quaternion') self.poseAtt.setCurrentIndex(0) self.poseAtt.move(20, 45) #self.poseAtt.activated[str].connect(self.driverAtt_onActivated) #Create 'Create' button self.addButton = QPushButton('Add Pose', self) self.addButton.setGeometry(50, 50, 75, 20) self.addButton.move(self._rightPos(self.poseName, 5)[0] , self._rightPos(self.poseName, 5)[1]) self.addButton.clicked.connect(self.addButton_onClicked) self.valuesAtt = QComboBox(self) self.valuesAtt.addItem('Translate') self.valuesAtt.addItem('Scaling') self.valuesAtt.addItem('Euler') self.valuesAtt.addItem('Quaternion') self.valuesAtt.setCurrentIndex(0) self.valuesAtt.move(60, 45) #self.valuesAtt.activated[str].connect(self.driverAtt_onActivated) #Create line edit box self.poseName = QLineEdit(self) self.poseName.move(20, 70) self.ComboBox = CheckableComboBox() self.combo.move(20, 20) for i in range(3): self.ComboBox.addItem("Combobox Item " + str(i)) item = self.ComboBox.model().item(i, 0) item.setCheckState(QtCore.Qt.Unchecked) #Create 'Create' button self.addButton = QPushButton('Add Pose', self) self.addButton.setGeometry(50, 50, 75, 20) self.addButton.move(self._rightPos(self.poseName, 5)[0] , self._rightPos(self.poseName, 5)[1]) self.addButton.clicked.connect(self.addButton_onClicked) #Create 'Delete' button self.delButton = QPushButton('Delete Pose', self) self.delButton.setGeometry(50, 50, 75, 20) self.delButton.move(self._rightPos(self.addButton, 5)[0] , self._rightPos(self.addButton, 5)[1]) self.delButton.clicked.connect(self.delButton_onClicked) #Create a table self.table = QTableWidget(self) vheader = MetaHeaderView(Qt.Orientation.Vertical) self.table.setVerticalHeader(vheader) self.table.vHeader = ['D','E','F'] self.table.setColumnCount(2) self.table.setRowCount(len(self.table.vHeader)) self.table.verticalHeader().setVisible(1) self.table.horizontalHeader().setVisible(0) self.table.setAlternatingRowColors(True) self.table.setVerticalHeaderLabels(self.table.vHeader) self.table.setItem( 0, 0, QTableWidgetItem( 'test' ) ) self.table.itemClicked.connect(self.table_onClicked) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.openMenu) def _rightPos(self, widget, spacing): x = widget.pos().x() + widget.width() + spacing y = widget.pos().y() return [x, y] def _updateWidgetSize(self): self.table.setGeometry(20, 110, self.table.horizontalHeader().length() + 20, self.table.verticalHeader().length() + 25) self.setGeometry(50, 50, self.table.horizontalHeader().length() + 60, self.table.verticalHeader().length() + 100) def floatAsItem(self, value): item = QTableWidgetItem() item.setData(Qt.EditRole, value) return item #Change commmand string when combo box changes def combo_onActivated(self, text): self.cmd = 'poly' + text + '()' #Change commmand string when combo box changes def driverAtt_onActivated(self, text): self.cmd = 'poly' + text + '()' # Add a new position def addButton_onClicked(self): if(len(self.poseName.text()) > 0): rowPosition = self.table.rowCount() self.table.insertRow(rowPosition) self.table.setVerticalHeaderItem(rowPosition, QtGui.QTableWidgetItem(self.poseName.text())) self.poseName.setText('') self.table.setItem(rowPosition , 0, self.floatAsItem(0.5)) self._updateWidgetSize() # Delete selected row def delButton_onClicked(self): selectedRows = self.table.selectionModel().selectedRows() #for item in self.table.selectedRanges(): for item in selectedRows: print "delete row:", item.row() self.table.removeRow(item.row()) #test table is clicked def table_onClicked(self): print 'toto' # setup Menu def openMenu(self, position): indexes = self.table.selectedItems() print indexes[0].row() menu = QMenu() menu.addAction(self.renameAct) menu.addAction(self.deleteAct) menu.exec_(self.table.viewport().mapToGlobal(position)) # setup menu actions def actions(self): self.renameAct = QtGui.QAction("&Rename Pose", self, shortcut=Qt.Key_F2, statusTip="rename the current pose", triggered=self.renamePose) self.deleteAct = QtGui.QAction("&Delete Pose", self, shortcut=QtGui.QKeySequence.Delete, statusTip="delete the current pose", triggered=self.deletePose) # menu actions def renamePose(self): print 'rename' #self.table.verticalHeader(). def deletePose(self): print 'delete' #self.table.verticalHeader(). view = CreateRbfEditor(None) view.show()