コード例 #1
0
    def dropMimeData(
        self,
        data: QtCore.QMimeData,
        action: Qt.DropAction,
        row: int,
        column: int,
        parent: QModelIndex,
    ) -> bool:

        if action == Qt.IgnoreAction:
            return True

        if not data.hasFormat("application/json/table") and not data.hasFormat(
                "application/json/list"):
            return False

        if row != -1:
            begin_row = row
        elif parent.isValid():
            begin_row = parent.row()
        else:
            begin_row = len(self._data)

        if data.hasFormat("application/json/list"):
            data_json = data.data("application/json/list").data().decode()
        else:
            data_json = data.data("application/json/table").data().decode()
        new_data = json.loads(data_json)

        if len(new_data) == 0 or len(new_data[0]) != 4:
            return False

        self.insertEntries(begin_row, new_data)

        return True
コード例 #2
0
ファイル: frame.py プロジェクト: ostr00000/grid-widget
    def setDataFromMime(self, mime: QMimeData) -> None:
        super().setDataFromMime(mime)

        if d := mime.data(self.DRAG_POSITION):
            data: DragFrameMime = pickle.loads(d)
            if data.swap and data.index != -1:
                if pl := self.findParentLayout():
                    try:
                        widget = pl.itemAt(data.index).widget()
                        widget = cast(DragFrame, widget)
                        widget._setColor(self.color)
                    except AttributeError as err:
                        logger.error(err)
コード例 #3
0
    def dropMimeData(
        self,
        data: QtCore.QMimeData,
        action: Qt.DropAction,
        row: int,
        column: int,
        parent: QModelIndex,
    ) -> bool:
        if action == Qt.IgnoreAction:
            return True

        if not data.hasFormat("application/json/list"):
            return False

        data_json = data.data("application/json/list").data().decode()
        new_data = json.loads(data_json)

        if len(new_data) == 0 or len(new_data[0]) != 4:
            return False

        for d in new_data:
            self._selected[d[0]] = False

        self.dataChanged.emit(
            self.index(0, 0), self.index(len(self._data), len(self._data))
        )

        return True
コード例 #4
0
    def dropMimeData(self, data: QtCore.QMimeData, action: QtCore.Qt.DropAction, row: int, column: int, parent: QtCore.QModelIndex) -> bool:
        q = str(data.data("vocabularies"), encoding='utf-8')
        if q == self.type:
            return False

        self.migration_function()
        return False
コード例 #5
0
    def dropMimeData(
            self,
            data: QMimeData,
            action: Qt.DropAction,
            row: int = -1,
            col: int = -1,
            parent: QModelIndex = QModelIndex(),
    ):
        if action == Qt.IgnoreAction or not data or not data.hasFormat(
                DEFAULT_MIME_FORMAT):
            return True

        if row < 0 or row > len(self._selected):
            position = len(self._selected)
        else:
            position = self._plugins[row].pluginOrder

        encoded = data.data(DEFAULT_MIME_FORMAT)
        stream = QDataStream(encoded, QIODevice.ReadOnly)

        indexes = []
        while not stream.atEnd():
            srcRow = stream.readInt32()
            stream.readInt32()  # src column
            mapItems = stream.readInt32()  # role data map
            for i in range(mapItems):
                stream.readInt32()  # map role ID
                stream.readQVariant()  # map role value
            indexes.append(self.index(srcRow, 0))

        self.setPluginsOrder(indexes, position)
        return False
コード例 #6
0
ファイル: DragDrop.py プロジェクト: lihaochen910/Candy
    def getCustomData(self, type):
        """ Get custom data.

			Args:
				type: str

			Returns:
				QByteArray
	    """
        return QMimeData.data(self.getMimeFormatForType(type))
コード例 #7
0
ファイル: layer_tree.py プロジェクト: ssec/sift
    def dropMimeData(self, mime: QMimeData, action, row: int, column: int,
                     parent: QModelIndex):
        LOG.debug('dropMimeData at row {}'.format(row))
        if action == Qt.IgnoreAction:
            return True

        if mime.hasFormat('text/uri-list'):
            if mime.hasUrls():
                LOG.debug('found urls in drop!')
                paths = [
                    qurl.path() for qurl in mime.urls() if qurl.isLocalFile()
                ]
                self.doc.import_files(paths)  # FIXME: replace with a signal
                return True
        elif mime.hasFormat(self._mimetype):
            # unpickle the presentation information and re-insert it
            # b = base64.decodebytes(mime.text())
            b = mime.data(self._mimetype)
            layer_set_len, insertion_info = pkl.loads(b)
            LOG.debug('dropped: {0!r:s}'.format(insertion_info))
            count = len(insertion_info)
            if row == -1:
                row = len(self.doc)  # append
                # FIXME: row=col=-1 implies drop-on-parent
                #  which may mean replace or may mean append for composite layers
            # self.insertRows(row, count)
            # for i, presentation in enumerate(l):
            #     self.setData(self.index(row+i, 0), presentation)
            order = list(range(layer_set_len))
            inserted_row_numbers = []
            # inserted_presentations = []
            # delete_these_rows = []
            insertion_point = row
            uuids = []
            for old_row, presentation in reversed(sorted(insertion_info)):
                del order[old_row]
                if old_row < insertion_point:
                    insertion_point -= 1
                inserted_row_numbers.insert(0, old_row)
                uuids.append(presentation.uuid)
                # delete_these_rows.append(old_row if old_row<row else old_row+count)
                # inserted_presentations.append(presentation)
            order = order[:insertion_point] + inserted_row_numbers + order[
                insertion_point:]
            LOG.debug('new order after drop {0!r:s}'.format(order))
            self.select([])
            self.doc.reorder_by_indices(order)
            # self.doc.insert_layer_prez(row, inserted_presentations)
            # LOG.debug('after insertion removing rows {0!r:s}'.format(delete_these_rows))
            # for exrow in delete_these_rows:
            #     self.doc.remove_layer_prez(exrow)
            # self.doc.didReorderLayers.emit(order)  # FUTURE: not our business to be emitting on behalf of the document
            assert (count == len(insertion_info))
            return True
        return False
コード例 #8
0
    def start_drag(self, info_id):
        _logger.info( "started dragging" )
        mimeData = QMimeData()
        mimeData.data =("/" + info_id.partition("/")[2].partition("/")[0], moose.element(info_id))
        mimeData.setText(info_id)
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        pixmap = QPixmap("")

        drag.setPixmap(pixmap)
        # drag.setHotSpot(e.pos() - self.rect().topLeft())
        dropAction = drag.start(QtCore.Qt.MoveAction)
        print((" => ", dropAction))
        self.select_info.set_event_type(0)
        self._timer.start(0)
        return
コード例 #9
0
    def start_drag(self, info_id):
        # pixmap = QPixmap()
        # painter = QPainter( pixmap )
        # painter.setFont( QFont("Arial") );
        # painter.drawText( QPoint(100, 100), info_id );
        mimeData = QMimeData()
        mimeData.data = ("/" + info_id.partition("/")[2].partition("/")[0],
                         moose.element(info_id))
        mimeData.setText(info_id)
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        pixmap = QPixmap("")

        drag.setPixmap(pixmap)
        # drag.setHotSpot(e.pos() - self.rect().topLeft())
        dropAction = drag.start(QtCore.Qt.MoveAction)
        print(" => ", dropAction)
        self.select_info.set_event_type(0)
        self._timer.start(0)
        return
コード例 #10
0
ファイル: data_editor_model.py プロジェクト: mnowiasz/qisit
    def dropMimeData(self, mimedata: QtCore.QMimeData,
                     action: QtCore.Qt.DropAction, row: int, column: int,
                     parent: QtCore.QModelIndex) -> bool:

        index_list = pickle.loads(mimedata.data(self.mime_type))
        target_row = parent.row()
        target_column = parent.internalId()

        # The affected recipes
        recipes_ids = set()

        # Merge vs append
        merged = False
        cached = {}

        # This is needed because of the rows that will be removed - the indexes aren't valid after that, so
        # this is to conserve (temporarily) the status quo ante
        for (index_row, index_column) in index_list:
            cached[(
                target_column,
                target_row)] = self._item_lists[target_column][target_row][0]
            if index_column == target_column:
                cached[(
                    target_column,
                    index_row)] = self._item_lists[target_column][index_row][0]
            else:
                cached[(index_column,
                        index_row)] = self._item_lists[index_column][index_row]

        for (index_row, index_column) in index_list:
            if index_column == target_column:
                # Merge operation
                merged = True

                source_item = cached[(target_column, index_row)]
                target_item = cached[(target_column, target_row)]

                # Merging an item with itself is useless
                if source_item == target_item:
                    return False

                self.changed.emit()

                recipes_ids = recipes_ids.union(
                    [recipe.id for recipe in source_item.recipes])
                self.beginRemoveRows(
                    self.createIndex(self.root_row, 0, self.Columns.ROOT),
                    index_row, index_row)

                the_table = None
                if self.root_row in (self.RootItems.AUTHOR,
                                     self.RootItems.CUISINE,
                                     self.RootItems.YIELD_UNITS):
                    the_query = self._session.query(data.Recipe)
                    if self.root_row == self.RootItems.AUTHOR:
                        the_query.filter(
                            data.Recipe.author_id == source_item.id).update(
                                {data.Recipe.author_id: target_item.id},
                                synchronize_session='evaluate')
                    elif self.root_row == self.RootItems.CUISINE:
                        the_query.filter(
                            data.Recipe.cuisine_id == source_item.id).update(
                                {data.Recipe.cuisine_id: target_item.id},
                                synchronize_session='evaluate')
                    elif self.root_row == self.RootItems.YIELD_UNITS:
                        the_query.filter(
                            data.Recipe.yield_unit_id ==
                            source_item.id).update(
                                {data.Recipe.yield_unit_id: target_item.id},
                                synchronize_session='evaluate')

                elif self.root_row == self.RootItems.CATEGORIES:
                    # Categories are special. TODO: Maybe construct a (rather complicated, probably) Query instead
                    # of this

                    # Need to copy the list recipes - because making changes will alter the original recipes
                    recipes = [recipe for recipe in source_item.recipes]
                    for recipe in recipes:
                        if target_item not in recipe.categories:
                            recipe.categories.append(target_item)
                        recipe.categories.remove(source_item)
                        self._session.merge(recipe)
                elif self.root_row in (self.RootItems.INGREDIENTGROUPS,
                                       self.RootItems.INGREDIENTS):
                    self._session.query(data.IngredientListEntry).filter(
                        data.IngredientListEntry.ingredient_id ==
                        source_item.id).update(
                            {
                                data.IngredientListEntry.ingredient_id:
                                target_item.id
                            },
                            synchronize_session='evaluate')
                elif self.root_row == self.RootItems.INGREDIENTUNITS:
                    self._session.query(data.IngredientListEntry).filter(
                        data.IngredientListEntry.unit_id ==
                        source_item.id).update(
                            {data.IngredientListEntry.unit_id: target_item.id},
                            synchronize_session='evaluate')
                self._session.expire_all()
                self._session.delete(source_item)
            else:
                # Append operation. Only allowed on Cuisine or Ingredients
                self.changed.emit()
                # target_item = self._item_lists[target_column][target_row][0]
                target_item = cached[(target_column, target_row)]
                parent_index = self._parent_row[target_column]
                self.beginRemoveRows(
                    self.createIndex(parent_index, 0, self.Columns.ITEMS),
                    index_row, index_row)
                if self.root_row == self.RootItems.CUISINE:
                    recipe = cached[(index_column, index_row)]
                    recipe.cuisine = target_item

                elif self.root_row == self.RootItems.INGREDIENTS:
                    ingredient_list_entry = cached[(index_column, index_row)]
                    ingredient_list_entry.ingredient = target_item
                self._session.refresh(target_item)

            self.endRemoveRows()

        if merged:
            self.changeSelection.emit(parent)

        return True