def __init__(self, parent=None, isChild=False): QWidget.__init__(self, parent) QGridLayout(self) # FIXME: call self.setLayout(layout)? self._readonly = False self.up_down = QFrame() self.up = UpButton() self.down = DownButton() self.add = AddButton() self.rem = RemButton() self.listEditView = ListEditView(isChild, parent=self) self.connect(self.listEditView, SIGNAL('itemAdded'), SIGNAL('itemAdded')) self.connect(self.listEditView, SIGNAL('itemModified'), SIGNAL('itemModified')) self.connect(self.listEditView.model, SIGNAL('dataChanged(QModelIndex,QModelIndex)'), SIGNAL('dataChanged(QModelIndex,QModelIndex)')) self.connect(self.listEditView.model, SIGNAL('rowsRemoved(QModelIndex,int,int)'), SIGNAL('rowsRemoved(QModelIndex,int,int)')) self.connect(self.listEditView.model, SIGNAL('headerDataChanged(Qt::Orientation,int,int)'), SIGNAL('headerDataChanged(Qt::Orientation,int,int)')) self.connect(self.listEditView, SIGNAL('itemDeleted'), SIGNAL('itemDeleted')) self.connect(self.listEditView, SIGNAL('itemSorted'), SIGNAL('itemSorted')) self.connect(self.listEditView.horizontalHeader(), SIGNAL('sectionClicked(int)'), SIGNAL('sectionClicked(int)')) self.connect(self.listEditView, SIGNAL('clicked(QModelIndex)'), SIGNAL('clicked(QModelIndex)')) self.layout().addWidget(self.listEditView, 0, 0) self.buildUpDown() if not isChild: self.buildAddRem() self.setDisplayUpDown(False) self.setReadOnly(False)
class ListEdit(QWidget): def __init__(self, parent=None, isChild=False): QWidget.__init__(self, parent) QGridLayout(self) # FIXME: call self.setLayout(layout)? self._readonly = False self.up_down = QFrame() self.up = UpButton() self.down = DownButton() self.add = AddButton() self.rem = RemButton() self.listEditView = ListEditView(isChild, parent=self) self.connect(self.listEditView, SIGNAL('itemAdded'), SIGNAL('itemAdded')) self.connect(self.listEditView, SIGNAL('itemModified'), SIGNAL('itemModified')) self.connect(self.listEditView.model, SIGNAL('dataChanged(QModelIndex,QModelIndex)'), SIGNAL('dataChanged(QModelIndex,QModelIndex)')) self.connect(self.listEditView.model, SIGNAL('rowsRemoved(QModelIndex,int,int)'), SIGNAL('rowsRemoved(QModelIndex,int,int)')) self.connect(self.listEditView.model, SIGNAL('headerDataChanged(Qt::Orientation,int,int)'), SIGNAL('headerDataChanged(Qt::Orientation,int,int)')) self.connect(self.listEditView, SIGNAL('itemDeleted'), SIGNAL('itemDeleted')) self.connect(self.listEditView, SIGNAL('itemSorted'), SIGNAL('itemSorted')) self.connect(self.listEditView.horizontalHeader(), SIGNAL('sectionClicked(int)'), SIGNAL('sectionClicked(int)')) self.connect(self.listEditView, SIGNAL('clicked(QModelIndex)'), SIGNAL('clicked(QModelIndex)')) self.layout().addWidget(self.listEditView, 0, 0) self.buildUpDown() if not isChild: self.buildAddRem() self.setDisplayUpDown(False) self.setReadOnly(False) # Qt Properties ... def getReadOnly(self): return self._readonly def setReadOnly(self, readonly): self._readonly = readonly self.up.setEnabled(not self.readOnly) self.down.setEnabled(not self.readOnly) self.add.setEnabled(not self.readOnly) self.rem.setEnabled(not self.readOnly) self.listEditView.setReadOnly(self.readOnly) def resetReadOnly(self): self._readonly = False readOnly = pyqtProperty('bool', getReadOnly, setReadOnly, resetReadOnly) def getAcceptDrops(self): return self.listEditView.acceptDrops() def setAcceptDrops(self, mode): self.listEditView.setAcceptDrops(mode) flags = self.listEditView.model.getFlags() if mode: flags |= Qt.ItemIsDropEnabled else: flags &= ~Qt.ItemIsDropEnabled self.listEditView.model.setFlags(flags) def resetAcceptDrops(self): self.setAcceptDrops(False) acceptDrops = pyqtProperty('bool', getAcceptDrops, setAcceptDrops, resetAcceptDrops) def getDragDropMode(self): return self.listEditView.dragDropMode() Q_ENUMS('QAbstractItemView.DragDropMode') def setDragDropMode(self, mode): self.listEditView.setDragDropMode(mode) def resetDragDropMode(self): self.listEditView.setDragDropMode(QAbstractItemView.NoDragDrop) dragDropMode = pyqtProperty('QAbstractItemView::DragDropMode', getDragDropMode, setDragDropMode, resetDragDropMode) def getShowDropIndicator(self): return self.listEditView.showDropIndicator() def setShowDropIndicator(self, mode): self.listEditView.setShowDropIndicator(mode) def resetShowDropIndicator(self): self.listEditView.setShowDropIndicator(False) showDropIndicator = pyqtProperty('bool', getShowDropIndicator, setShowDropIndicator, resetShowDropIndicator) def getDisplayUpDown(self): return self.up_down.isVisible() def setDisplayUpDown(self, displayUpDown): self.up_down.setVisible(displayUpDown) def resetDisplayUpDown(self): self.up_down.setVisible(False) displayUpDown = pyqtProperty('bool', getDisplayUpDown, setDisplayUpDown, resetDisplayUpDown) def getEditBoxDescription(self): return self.listEditView.getEditBoxDescription() def setEditBoxDescription(self, description): self.listEditView.setEditBoxDescription(description) def resetEditBoxDescription(self): self.listEditView.resetEditBoxDescription() editBoxDescription = pyqtProperty('QString', getEditBoxDescription, setEditBoxDescription, resetEditBoxDescription) def getHeaders(self): return self.listEditView.getHeaders() def setHeaders(self, headers): self.listEditView.setHeaders(headers) def resetHeaders(self): self.listEditView.resetHeaders() headers = pyqtProperty('QStringList', getHeaders, setHeaders, resetHeaders) def getEditInPopup(self): return self.listEditView.editInPopup def setEditInPopup(self, in_popup): self.listEditView.editInPopup = in_popup def resetEditInPopup(self): self.listEditView.editInPopup = True editInPopup = pyqtProperty('bool', getEditInPopup, setEditInPopup, resetEditInPopup) def getEditInPlace(self): return self.listEditView.editInPlace def setEditInPlace(self, edit_in_place): self.listEditView.editInPlace = edit_in_place def resetEditInPlace(self): self.listEditView.editInPlace = False editInPlace = pyqtProperty('bool', getEditInPlace, setEditInPlace, resetEditInPlace) # ... Qt Properties def setDropMimeData(self, callback): self.listEditView.model.dropMimeData_cb = callback def setEditBox(self, editBox): """allow to customize edit popup""" # box = editBox([row1, row2, row3], listEditOption, windowTitle) # ret = box.exec_() # if QDialog.Accepted == ret: # newData = box.getData() # # newData : [ modifiedRow1, modifiedRow2, modifiedRow3 ] # box must return QDialog.Accepted if data have been modified / created # then data must be returned by box.getData() self.listEditView.editBox = editBox def setColDelegate(self, callback): """callback prototype: createDelegate(view, column)""" self.listEditView.setColDelegate(callback) def buildUpDown(self): up_down_layout = QVBoxLayout(self.up_down) up_down_layout.addWidget(self.up) up_down_layout.addWidget(self.down) up_down_layout.insertStretch(0) up_down_layout.insertStretch(-1) self.layout().addWidget(self.up_down, 0, 1) self.connect(self.up, SIGNAL('clicked()'), self.listEditView.upItem) self.connect(self.down, SIGNAL('clicked()'), self.listEditView.downItem) def buildAddRem(self): buttons = QFrame() buttons_layout = QHBoxLayout(buttons) buttons_layout.insertStretch(1) self.connect(self.add, SIGNAL('clicked()'), self.listEditView.addItem) self.connect(self.rem, SIGNAL('clicked()'), self.listEditView.removeItem) buttons_layout.addWidget(self.add) buttons_layout.addWidget(self.rem) self.layout().addWidget(buttons, 1, 0) def hideRow(self, row): self.listEditView.verticalHeader().setSectionHidden(row, True) def showRow(self, row): self.listEditView.verticalHeader().setSectionHidden(row, False) def hideColumn(self, col): self.listEditView.horizontalHeader().setSectionHidden(col, True) def showColumn(self, col): self.listEditView.horizontalHeader().setSectionHidden(col, False) def reset(self, data): """ TODO call clean & setData & reset """ self.listEditView.model.newData(data) self.listEditView.model.emit(SIGNAL("modelReset()")) def rawData(self): # TODO use model.data(...) return deepcopy(self.listEditView.model._data)