示例#1
0
    def dropEvent(self, e):
        if self.is_external():
            data = PyMimeData.coerce(e.mimeData()).instance()
            if not hasattr(data, '__iter__'):
                return

            df = self.drop_factory
            if not df:
                df = lambda x: x

            row = self.rowAt(e.pos().y())
            n = len(self._editor.value)
            if row == -1:
                row = n

            model = self._editor.model
            if self._dragging:
                rows = [ri for ri, _ in data]
                model.moveRows(rows, row)
            else:
                with no_update(self._editor.object):
                    for i, di in enumerate(reversed(data)):
                        if isinstance(di, tuple):
                            di = di[1]
                        model.insertRow(row=row, obj=df(di))

            e.accept()
            self._dragging = None

        else:
            super(_TableView, self).dropEvent(e)
示例#2
0
    def dropEvent(self, e):
        if self.is_external():
            data = PyMimeData.coerce(e.mimeData()).instance()
            if not hasattr(data, '__iter__'):
                return

            df = self.drop_factory
            if not df:
                df = lambda x: x

            row = self.rowAt(e.pos().y())
            n = len(self._editor.value)
            if row == -1:
                row = n

            model = self._editor.model
            if self._dragging:
                rows = [ri for ri, _ in data]
                model.moveRows(rows, row)
            else:
                data = [di for _, di in data]
                with no_update(self._editor.object):
                    for i, di in enumerate(reversed(data)):
                        if isinstance(di, tuple):
                            di = di[1]
                        model.insertRow(row=row, obj=df(di))

                    for i, di in enumerate(reversed(df(data))):
                        model.insertRow(row=row, obj=di)

            e.accept()
            self._dragging = None

        else:
            super(_TableView, self).dropEvent(e)
示例#3
0
    def startDrag(self, actions):
        if self._editor.factory.drag_external:
            idxs = self.selectedIndexes()
            rows = sorted(list(set([idx.row() for idx in idxs])))
            drag_object = [(ri, self._editor.value[ri]) for ri in rows]

            md = PyMimeData.coerce(drag_object)

            self._dragging = self.currentIndex()
            drag = QtGui.QDrag(self)
            drag.setMimeData(md)
            drag.exec_(actions)
        else:
            super(_TableView, self).startDrag(actions)
示例#4
0
    def startDrag(self, actions):
        if self._editor.factory.drag_external:
            idxs = self.selectedIndexes()
            rows = sorted(list(set([idx.row() for idx in idxs])))
            drag_object = [(ri, self._editor.value[ri]) for ri in rows]

            md = PyMimeData.coerce(drag_object)

            self._dragging = self.currentIndex()
            drag = QtGui.QDrag(self)
            drag.setMimeData(md)
            drag.exec_(actions)
        else:
            super(_TableView, self).startDrag(actions)
示例#5
0
    def dragEnterEvent(self, e):
        if self.is_external():
            # Assume the drag is invalid.
            e.ignore()

            # Check what is being dragged.
            md = PyMimeData.coerce(e.mimeData())
            if md is None:
                return

            # We might be able to handle it (but it depends on what the final
            # target is).
            e.acceptProposedAction()
        else:
            super(_myTableView, self).dragEnterEvent(e)
示例#6
0
    def dragEnterEvent(self, e):
        if self.is_external():
            # Assume the drag is invalid.
            e.ignore()

            # Check what is being dragged.
            ed = e.mimeData()
            md = PyMimeData.coerce(ed)
            if md is None:
                return
            elif not hasattr(ed.instance(), '__iter__'):
                return

            # We might be able to handle it (but it depends on what the final
            # target is).
            e.acceptProposedAction()
        else:
            super(_TableView, self).dragEnterEvent(e)
示例#7
0
    def dropEvent(self, e):
        if self.is_external():
            data = PyMimeData.coerce(e.mimeData()).instance()
            df = self.drop_factory
            if not df:
                df = lambda x: x

            row = self.rowAt(e.pos().y())
            n = len(self._editor.value)
            if row == -1:
                row = n

            model = self._editor.model
            if self._dragging:
                rows = [ri for ri, _ in data]
                model.moveRows(rows, row)
            else:
#                self._editor._no_update = True
#                parent = QtCore.QModelIndex()
#                model.beginInsertRows(parent, row, row)
#                editor = self._editor
#                 self._editor.object._no_update = True

                with no_update(self._editor.object):
                    for i, (_, di) in enumerate(reversed(data)):
    #                    print 'insert'
    #                    obj = paste_func1(di)
    #                    editor.callx(editor.adapter.insert, editor.object, editor.name, row + i, obj)
                        model.insertRow(row=row, obj=df(di))

    #                 model.insertRow(row=row, obj=paste_func(data[0][1]))
#                 self._editor.object._no_update = False


#                model.endInsertRows()
#                self._editor._no_update = False

            e.accept()
            self._dragging = None

        else:

            super(_myTableView, self).dropEvent(e)
示例#8
0
    def dragEnterEvent(self, e):
        if self.is_external():
            # Assume the drag is invalid.
            e.ignore()

            # Check what is being dragged.
            ed = e.mimeData()
            md = PyMimeData.coerce(ed)
            if md is None:
                return
            else:
                try:
                    if not hasattr(ed.instance(), '__iter__'):
                        return
                except AttributeError:
                    return

            # We might be able to handle it (but it depends on what the final
            # target is).
            e.acceptProposedAction()
        else:
            super(_TableView, self).dragEnterEvent(e)
示例#9
0
    def dropMimeData(self, mime_data, action, row, column, parent):
        if action == QtCore.Qt.IgnoreAction:
            return False

        # this is a drag from a tabular model
        data = mime_data.data(tabular_mime_type)
        if not data.isNull() and action == QtCore.Qt.MoveAction:
            id_and_rows = [int(di) for di in data.split(' ')]
            table_id = id_and_rows[0]
            # is it from ourself?
            if table_id == id(self):
                current_rows = id_and_rows[1:]
                self.moveRows(current_rows, parent.row())
                return True

        # this is an external drag
        data = PyMimeData.coerce(mime_data).instance()
        if data is not None:
            if not isinstance(data, list):
                data = [data]
            editor = self._editor
            object = editor.object
            name = editor.name
            adapter = editor.adapter
            if row == -1 and parent.isValid():
                # find correct row number
                row = parent.row()
            if row == -1 and adapter.len(object, name) == 0:
                # if empty list, target is after end of list
                row = 0
            if all(adapter.get_can_drop(object, name, row, item)
                   for item in data):
                for item in reversed(data):
                    self.dropItem(item, row)
                return True
        return False
示例#10
0
    def dropMimeData(self, mime_data, action, row, column, parent):
        if action == QtCore.Qt.IgnoreAction:
            return False

        # this is a drag from a tabular model
        data = mime_data.data(tabular_mime_type)
        if not data.isNull() and action == QtCore.Qt.MoveAction:
            id_and_rows = [int(di) for di in data.split(' ')]
            table_id = id_and_rows[0]
            # is it from ourself?
            if table_id == id(self):
                current_rows = id_and_rows[1:]
                self.moveRows(current_rows, parent.row())
                return True

        # this is an external drag
        data = PyMimeData.coerce(mime_data).instance()
        if data is not None:
            if not isinstance(data, list):
                data = [data]
            editor = self._editor
            object = editor.object
            name = editor.name
            adapter = editor.adapter
            if row == -1 and parent.isValid():
                # find correct row number
                row = parent.row()
            if row == -1 and adapter.len(object, name) == 0:
                # if empty list, target is after end of list
                row = 0
            if all(adapter.get_can_drop(object, name, row, item)
                   for item in data):
                for item in reversed(data):
                    self.dropItem(item, row)
                return True
        return False