Ejemplo n.º 1
0
    def setModel(self, model: QtCore.QAbstractItemModel) -> None:
        super(TreeView, self).setModel(model)
        self.model().layoutAboutToBeChanged.connect(self.saveAppearance)
        self.model().layoutChanged.connect(self.restoreAppearance)
        self.model().itemChanged.connect(self.onModelItemChanged)
        self.setSelectionModel(QtCore.QItemSelectionModel(self.model()))
        self.sel.setSelectionModel(self.selectionModel())
        self.selectionModel().currentChanged.connect(self.onCurrentChanged)

        for i in (self.model().layoutChanged, self.model().itemChanged,
                  self.model().dataChanged):
            i.connect(self.onTreeChanged)
Ejemplo n.º 2
0
 def dropEvent(self, event):
     """
     drop event handler : moving layer
     @param event:
     @type event: Qevent
     """
     if event.source() is not self:
         return
     # get selected rows and layers
     rows = set([mi.row() for mi in self.selectedIndexes()])
     rStack = self.img.layersStack[::-1]
     layers = [rStack[i] for i in rows]
     # get target row and layer
     targetRow = self.indexAt(event.pos()).row()
     targetLayer = rStack[targetRow]
     # remove target from selection
     if targetRow in rows:
         rows.discard(targetRow)
     rows = sorted(rows)
     if not rows:
         return
     # if target is below last row insert at the last position
     if targetRow == -1:
         targetRow = self.model().rowCount()
     # mapping of src (row) indices to target indices
     rowMapping = dict()
     for idx, row in enumerate(rows):
         if row < targetRow:
             rowMapping[row] = targetRow + idx
         else:
             rowMapping[row + len(rows)] = targetRow + idx
     # update layerStack using rowMapping
     # insert None items
     for _ in range(len(rows)):
         rStack.insert(targetRow, None)
     # copy moved items to their final place
     for srcRow, tgtRow in sorted(
             rowMapping.items()):  # python 3 iteritems->items
         rStack[tgtRow] = rStack[srcRow]
     # remove moved items from their initial place
     for row in reversed(sorted(
             rowMapping.keys())):  # python 3 iterkeys -> keys
         rStack.pop(row)
     self.img.layersStack = rStack[::-1]
     # update model
     # insert empty rows
     for _ in range(len(rows)):
         result = self.model().insertRow(targetRow, QModelIndex())
     # copy moved rows to their final place
     colCount = self.model().columnCount()
     for srcRow, tgtRow in sorted(
             rowMapping.items()):  # python 3 iteritems->items
         for col in range(0, colCount):
             # CAUTION : setItem calls the data changed event handler (cf. setLayers above)
             self.model().setItem(tgtRow, col,
                                  self.model().takeItem(srcRow, col))
     # remove moved rows from their initial place and keep track of moved items
     movedDict = rowMapping.copy()
     for row in reversed(sorted(
             rowMapping.keys())):  # python 3 iterkeys -> keys
         self.model().removeRow(row)
         for s, t in rowMapping.items():
             if t > row:
                 movedDict[s] -= 1
     ######################################### sanity check
     for r in range(self.model().rowCount()):
         id = self.model().index(r, 1)
         if id.data() != rStack[r].name:
             raise ValueError('Drop Error')
     ########################################
     # reselect moved rows
     sel = sorted(movedDict.values())
     selectionModel = QtCore.QItemSelectionModel(self.model())
     self.setSelectionModel(selectionModel)
     index1 = self.model().index(sel[0], 1)
     index2 = self.model().index(sel[-1], 1)
     itemSelection = QtCore.QItemSelection(index1, index2)
     self.selectionModel().select(
         itemSelection, QtCore.QItemSelectionModel.Rows
         | QtCore.QItemSelectionModel.Select)
     # multiple selection : display no window
     if len(sel) > 1:
         self.currentWin.hide()
         self.currentWin = None
     elif len(sel) == 1:
         self.img.setActiveLayer(len(self.img.layersStack) - sel[0] - 1)
     # update stack
     self.img.layersStack[0].applyToStack()
     self.img.onImageChanged()