def setData(self, data): # it could be argued that we should early out here if data is self.getData(), # but we can't right now as we're relying on setData() to update everything # when the data has been modified in place by some external process, or # by self.__removeSelection. if data is not None: if not isinstance(data, list): data = [data] self.__model = _Model(data, self.__tableView, self.getEditable(), self.__headerOverride, self.__columnToolTips, self.__columnEditability) self.__model.dataChanged.connect( Gaffer.WeakMethod(self.__modelDataChanged)) self.__model.rowsInserted.connect( Gaffer.WeakMethod(self.__emitDataChangedSignal)) self.__model.rowsRemoved.connect( Gaffer.WeakMethod(self.__emitDataChangedSignal)) else: self.__model = None self.__tableView.setModel(self.__model) if self.__model: columnIndex = 0 haveResizeableContents = False for accessor in self.__model.vectorDataAccessors(): for i in range(0, accessor.numColumns()): delegate = _Delegate.create(accessor.data()) delegate.setParent(self.__model) self.__tableView.setItemDelegateForColumn( columnIndex, delegate) canStretch = delegate.canStretch() haveResizeableContents = haveResizeableContents or canStretch columnIndex += 1 QtCompat.setSectionResizeMode( self.__tableView.horizontalHeader(), QtWidgets.QHeaderView.ResizeToContents if haveResizeableContents else QtWidgets.QHeaderView.Fixed) self.__tableView.horizontalHeader().setStretchLastSection( canStretch) self.__tableView.setSizePolicy( QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Expanding if canStretch else QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Maximum)) selectionModel = self.__tableView.selectionModel() selectionModel.selectionChanged.connect( Gaffer.WeakMethod(self.__selectionChanged)) self.__updateRemoveButtonEnabled() # Somehow the QTableView can leave its header in a state where updates are disabled. # If we didn't turn them back on, the header would disappear. self.__tableView.verticalHeader().setUpdatesEnabled(True) self.__tableView.updateGeometry()
def __init__(self, parent): super(shortcutsClass, self).__init__(parent) self.setupUi(self) QtCompat.setSectionResizeMode(self.table.horizontalHeader(), QtWidgets.QHeaderView.Stretch) self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(['Action', 'Shortcut']) self.read()
def create(self): self.setSortingEnabled(True) QtCompat.setSectionResizeMode( self.header(), QtWidgets.QHeaderView.ResizeToContents ) self.model = QtWidgets.QFileSystemModel(self) self.model.setFilter(QtCore.QDir.Files) self.setModel(self.model)
def setData( self, data ) : # it could be argued that we should early out here if data is self.getData(), # but we can't right now as we're relying on setData() to update everything # when the data has been modified in place by some external process, or # by self.__removeSelection. if data is not None : if not isinstance( data, list ) : data = [ data ] self.__model = _Model( data, self.__tableView, self.getEditable(), self.__headerOverride, self.__columnToolTips, self.__columnEditability ) self.__model.dataChanged.connect( Gaffer.WeakMethod( self.__modelDataChanged ) ) self.__model.rowsInserted.connect( Gaffer.WeakMethod( self.__emitDataChangedSignal ) ) self.__model.rowsRemoved.connect( Gaffer.WeakMethod( self.__emitDataChangedSignal ) ) else : self.__model = None self.__tableView.setModel( self.__model ) if self.__model : columnIndex = 0 haveResizeableContents = False for accessor in self.__model.vectorDataAccessors() : for i in range( 0, accessor.numColumns() ) : delegate = _Delegate.create( accessor.data() ) delegate.setParent( self.__model ) self.__tableView.setItemDelegateForColumn( columnIndex, delegate ) canStretch = delegate.canStretch() haveResizeableContents = haveResizeableContents or canStretch columnIndex += 1 QtCompat.setSectionResizeMode( self.__tableView.horizontalHeader(), QtWidgets.QHeaderView.ResizeToContents if haveResizeableContents else QtWidgets.QHeaderView.Fixed ) self.__tableView.horizontalHeader().setStretchLastSection( canStretch ) self.__tableView.setSizePolicy( QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Expanding if canStretch else QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Maximum ) ) selectionModel = self.__tableView.selectionModel() selectionModel.selectionChanged.connect( Gaffer.WeakMethod( self.__selectionChanged ) ) self.__updateRemoveButtonEnabled() # Somehow the QTableView can leave its header in a state where updates are disabled. # If we didn't turn them back on, the header would disappear. self.__tableView.verticalHeader().setUpdatesEnabled( True ) self.__tableView.updateGeometry()
def __init__( self, data=None, editable=True, header=False, showIndices=True, minimumVisibleRows=8, columnToolTips=None, sizeEditable=True, columnEditability=None, horizontalScrollMode = GafferUI.ScrollMode.Never, verticalScrollMode = GafferUI.ScrollMode.Automatic, **kw ) : self.__column = GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Vertical ) GafferUI.Widget.__init__( self, self.__column, **kw ) # table view self.__tableView = _TableView( minimumVisibleRows = minimumVisibleRows ) self.__tableView.horizontalHeader().setVisible( bool( header ) ) self.__tableView.horizontalHeader().setMinimumSectionSize( 70 ) self.__tableView.verticalHeader().setVisible( showIndices ) QtCompat.setSectionResizeMode( self.__tableView.verticalHeader(), QtWidgets.QHeaderView.Fixed ) self.__tableView.setHorizontalScrollBarPolicy( GafferUI.ScrollMode._toQt( horizontalScrollMode ) ) self.__tableView.setVerticalScrollBarPolicy( GafferUI.ScrollMode._toQt( verticalScrollMode ) ) self.__tableView.setSelectionBehavior( QtWidgets.QAbstractItemView.SelectItems ) self.__tableView.setCornerButtonEnabled( False ) self.__tableView.setContextMenuPolicy( QtCore.Qt.CustomContextMenu ) self.__tableView.customContextMenuRequested.connect( Gaffer.WeakMethod( self.__contextMenu ) ) self.__tableView.verticalHeader().setDefaultSectionSize( 20 ) self.__tableViewHolder = GafferUI.Widget( self.__tableView ) self.__column.append( self.__tableViewHolder ) # buttons self.__buttonRow = GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) addButton = GafferUI.Button( image="plus.png", hasFrame=False ) addButton.clickedSignal().connect( Gaffer.WeakMethod( self.__addRows ), scoped = False ) self.__buttonRow.append( addButton ) removeButton = GafferUI.Button( image="minus.png", hasFrame=False ) removeButton.clickedSignal().connect( Gaffer.WeakMethod( self.__removeSelection ), scoped = False ) self.__buttonRow.append( removeButton ) self.__buttonRow.append( GafferUI.Spacer( size = imath.V2i( 0 ), maximumSize = imath.V2i( 100000, 1 ) ), expand=1 ) self.__column.append( self.__buttonRow ) # stuff for drag enter/leave and drop self.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ), scoped = False ) addButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ), scoped = False ) removeButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ), scoped = False ) self.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ), scoped = False ) addButton.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ), scoped = False ) removeButton.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ), scoped = False ) self.dropSignal().connect( Gaffer.WeakMethod( self.__drop ), scoped = False ) addButton.dropSignal().connect( Gaffer.WeakMethod( self.__drop ), scoped = False ) removeButton.dropSignal().connect( Gaffer.WeakMethod( self.__drop ), scoped = False ) self.__dragPointer = "values" # stuff for drag begin self.__borrowedButtonPress = None self.__emittingButtonPress = False self.__tableViewHolder.buttonPressSignal().connect( Gaffer.WeakMethod( self.__buttonPress ), scoped = False ) self.__tableViewHolder.buttonReleaseSignal().connect( Gaffer.WeakMethod( self.__buttonRelease ), scoped = False ) self.__tableViewHolder.mouseMoveSignal().connect( Gaffer.WeakMethod( self.__mouseMove ), scoped = False ) self.__tableViewHolder.dragBeginSignal().connect( Gaffer.WeakMethod( self.__dragBegin ), scoped = False ) self.__tableViewHolder.dragEndSignal().connect( Gaffer.WeakMethod( self.__dragEnd ), scoped = False ) # key handling self.__tableViewHolder.keyPressSignal().connect( Gaffer.WeakMethod( self.__keyPress ), scoped = False ) # final setup self.__dataChangedSignal = GafferUI.WidgetSignal() self.__editSignal = Gaffer.Signal3() self.setHeader( header ) self.__toolTips = columnToolTips self.__columnEditability = columnEditability self.__propagatingDataChangesToSelection = False self.__sizeEditable = sizeEditable self.setData( data ) self.setEditable( editable )
def __init__( self, selectionModel, mode, **kw ) : tableView = _NavigableTable() GafferUI.Widget.__init__( self, tableView, **kw ) self.__mode = mode; self.__setupModels( selectionModel ) # Headers and column sizing QtCompat.setSectionResizeMode( tableView.verticalHeader(), QtWidgets.QHeaderView.Fixed ) tableView.verticalHeader().setDefaultSectionSize( 25 ) tableView.verticalHeader().setVisible( False ) self.__horizontalHeader = GafferUI.Widget( QtWidgets.QHeaderView( QtCore.Qt.Horizontal, tableView ) ) self.__horizontalHeader._qtWidget().setDefaultAlignment( QtCore.Qt.AlignLeft ) tableView.setHorizontalHeader( self.__horizontalHeader._qtWidget() ) self.__horizontalHeader.buttonPressSignal().connect( Gaffer.WeakMethod( self.__headerButtonPress ), scoped = False ) if mode in ( self.Mode.Cells, self.Mode.Defaults ) : self.__applyColumnWidthMetadata() self.__applySectionOrderMetadata() tableView.horizontalHeader().setSectionsMovable( True ) tableView.horizontalHeader().sectionResized.connect( Gaffer.WeakMethod( self.__sectionResized ) ) tableView.horizontalHeader().sectionMoved.connect( Gaffer.WeakMethod( self.__sectionMoved ) ) self.__ignoreSectionResized = False self.__callingMoveSection = False else : # RowNames mode tableView.horizontalHeader().resizeSection( 1, 22 ) self.__applyRowNamesWidth() # Style the row enablers as toggles rather than checkboxes. ## \todo Do the same for cells containing NameValuePlugs with enablers. This is tricky # because we need to do it on a per-cell basis, so will need to use `_CellPlugItemDelegate.paint()` # instead. tableView.setProperty( "gafferToggleIndicator", True ) self.__plugMetadataChangedConnection = Gaffer.Metadata.plugValueChangedSignal().connect( Gaffer.WeakMethod( self.__plugMetadataChanged ), scoped = False ) self.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ), scoped = False ) self.dragMoveSignal().connect( Gaffer.WeakMethod( self.__dragMove ), scoped = False ) self.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ), scoped = False ) self.dropSignal().connect( Gaffer.WeakMethod( self.__drop ), scoped = False ) if mode != self.Mode.Defaults : tableView.horizontalHeader().setVisible( False ) # Column visibility self.__visibleSection = None tableView.model().modelReset.connect( Gaffer.WeakMethod( self.__modelReset ) ) # Selection and editing. We disable all edit triggers so that # the QTableView itself won't edit anything, and we then implement # our own editing via PlugValueWidgets in _EditWindow. tableView.setEditTriggers( tableView.NoEditTriggers ) tableView.setSelectionMode( tableView.ExtendedSelection ) tableView.setSelectionBehavior( tableView.SelectItems ) self.buttonPressSignal().connect( Gaffer.WeakMethod( self.__buttonPress ), scoped = False ) self.buttonDoubleClickSignal().connect( Gaffer.WeakMethod( self.__buttonDoubleClick ), scoped = False ) self.keyPressSignal().connect( Gaffer.WeakMethod( self.__keyPress ), scoped = False ) # Drawing tableView.setItemDelegate( _PlugTableDelegate( tableView ) ) # Size and scrolling tableView.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff ) tableView.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff ) tableView.setHorizontalScrollMode( tableView.ScrollPerPixel ) tableView.setSizePolicy( QtWidgets.QSizePolicy.Fixed if mode == self.Mode.RowNames else QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed if mode == self.Mode.Defaults else QtWidgets.QSizePolicy.Maximum, )
def __init__( self, data=None, editable=True, header=False, showIndices=True, minimumVisibleRows=8, columnToolTips=None, sizeEditable=True, columnEditability=None, **kw ) : self.__column = GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Vertical ) GafferUI.Widget.__init__( self, self.__column, **kw ) # table view self.__tableView = _TableView( minimumVisibleRows = minimumVisibleRows ) self.__tableView.horizontalHeader().setVisible( bool( header ) ) self.__tableView.horizontalHeader().setMinimumSectionSize( 70 ) self.__tableView.verticalHeader().setVisible( showIndices ) QtCompat.setSectionResizeMode( self.__tableView.verticalHeader(), QtWidgets.QHeaderView.Fixed ) self.__tableView.verticalHeader().setObjectName( "vectorDataWidgetVerticalHeader" ) self.__tableView.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff ) self.__tableView.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAsNeeded ) self.__tableView.setSelectionBehavior( QtWidgets.QAbstractItemView.SelectItems ) self.__tableView.setCornerButtonEnabled( False ) self.__tableView.setContextMenuPolicy( QtCore.Qt.CustomContextMenu ) self.__tableView.customContextMenuRequested.connect( Gaffer.WeakMethod( self.__contextMenu ) ) self.__tableView.verticalHeader().setDefaultSectionSize( 20 ) self.__tableViewHolder = GafferUI.Widget( self.__tableView ) self.__column.append( self.__tableViewHolder ) # buttons self.__buttonRow = GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) addButton = GafferUI.Button( image="plus.png", hasFrame=False ) self.__addButtonConnection = addButton.clickedSignal().connect( Gaffer.WeakMethod( self.__addRows ) ) self.__buttonRow.append( addButton ) removeButton = GafferUI.Button( image="minus.png", hasFrame=False ) self.__removeButtonConnection = removeButton.clickedSignal().connect( Gaffer.WeakMethod( self.__removeSelection ) ) self.__buttonRow.append( removeButton ) self.__buttonRow.append( GafferUI.Spacer( size = IECore.V2i( 0 ), maximumSize = IECore.V2i( 100000, 1 ) ), expand=1 ) self.__column.append( self.__buttonRow ) # stuff for drag enter/leave and drop self.__dragEnterConnections = [ self.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ) ), addButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ) ), removeButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ) ), ] self.__dragLeaveConnections = [ self.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ) ), addButton.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ) ), removeButton.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ) ), ] self.__dropConnections = [ self.dropSignal().connect( Gaffer.WeakMethod( self.__drop ) ), addButton.dropSignal().connect( Gaffer.WeakMethod( self.__drop ) ), removeButton.dropSignal().connect( Gaffer.WeakMethod( self.__drop ) ), ] self.__dragPointer = "values" # stuff for drag begin self.__borrowedButtonPress = None self.__emittingButtonPress = False self.__buttonPressConnection = self.__tableViewHolder.buttonPressSignal().connect( Gaffer.WeakMethod( self.__buttonPress ) ) self.__buttonReleaseConnection = self.__tableViewHolder.buttonReleaseSignal().connect( Gaffer.WeakMethod( self.__buttonRelease ) ) self.__mouseMoveConnection = self.__tableViewHolder.mouseMoveSignal().connect( Gaffer.WeakMethod( self.__mouseMove ) ) self.__dragBeginConnection = self.__tableViewHolder.dragBeginSignal().connect( Gaffer.WeakMethod( self.__dragBegin ) ) self.__dragEndConnection = self.__tableViewHolder.dragEndSignal().connect( Gaffer.WeakMethod( self.__dragEnd ) ) # final setup self.__dataChangedSignal = GafferUI.WidgetSignal() self.__editSignal = Gaffer.Signal3() if isinstance( header, list ) : self.__headerOverride = header else : self.__headerOverride = None self.__columnToolTips = columnToolTips self.__columnEditability = columnEditability self.__propagatingDataChangesToSelection = False self.__sizeEditable = sizeEditable self.setData( data ) self.setEditable( editable )