Beispiel #1
0
    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)
Beispiel #2
0
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)