Exemplo n.º 1
0
 def addLasso(self, pos):
     self._lasso = Lasso(self._view, pos)
     self._view.scene().addItem(self._lasso)
Exemplo n.º 2
0
 def addLasso(self, pos):
     self._lasso = Lasso(self._view, pos)
     self._view.scene().addItem(self._lasso)
Exemplo n.º 3
0
class SelectMode():
    def __init__(self, view, transient=False):
        self._view = view
        self._optionPanel = None
        self._actions = set()
        self._mousePressedPos = None
        self._mousePressedButton = QtCore.Qt.NoButton
        self.installActions()
        self._lasso = None
        self._transient = transient

        self._optionPanel = SelectToolOptions()
        self._selection = Selection()
        self._toBeSelected = None
        self._preSelected = None
        self._modifiers = None
        self._pos = None
        self._timer = QtCore.QTimer()
        self._timer.setSingleShot(True)
        self._timer.setInterval(50)
        self._view.connect(self._timer, QtCore.SIGNAL("timeout()"),
                           self.updatePreSelected)

    def setup(self, pos=None):
        self._pos = pos

    def view(self):
        return self._view

    def exitMode(self):
        if self._preSelected:
            self._preSelected.preSelected = False
        self.removeLasso()
        self.uninstallActions()

    def installActions(self):
        for a in self.actions():
            self._view.addAction(a)

    def uninstallActions(self):
        for a in self.actions():
            self._view.removeAction(a)

    def actions(self):
        return self._actions

    def transient(self):
        return self._transient

    def setMousePressedPos(self, pos):
        self._mousePressedPos = pos

    def mousePressedPos(self):
        return self._mousePressedPos

    def addLasso(self, pos):
        self._lasso = Lasso(self._view, pos)
        self._view.scene().addItem(self._lasso)

    def stretchLasso(self, pos):
        if not self._lasso:
            self.addLasso(self._mousePressedPos)
        self._lasso.stretchTo(pos)

    def lassoRect(self):
        return self._lasso and self._lasso.rect()

    def removeLasso(self):
        if self._lasso:
            scene = self._view.scene()
            scene.removeItem(self._lasso)
            scene.setSceneRect(scene.itemsBoundingRect())
            self._lasso = None

    def findItems(self, pos, modifiers=None):
        items = self._view.scene().items(pos)
        items = filter(lambda i: not (i.parentItem()), items)
        items = filter(lambda i: not (isinstance(i, Lasso)), items)
        #items = map(lambda i: i.model, items)
        items = set(items)
        if self.addMode(modifiers):
            return ItemBuffer(items - self._selection, pos)
        elif self.subtractMode(modifiers):
            return ItemBuffer(items & self._selection, pos)
        else:
            itemsBuf = ItemBuffer(items, pos)
            itemsBuf.setPointerToUnique(self._selection)
            #print '->' + str(self._selection)
            #print '->' + str(itemsBuf) + str(itemsBuf.pointer())
            return itemsBuf

    def currentItem(self):
        item = None
        if self._toBeSelected:
            item = self._toBeSelected.current()
        return item

    def nextItem(self):
        if self._toBeSelected:
            self._toBeSelected.next()

    def addMode(self, modifiers):
        return modifiers & QtCore.Qt.ShiftModifier

    def subtractMode(self, modifiers):
        return modifiers & QtCore.Qt.ControlModifier

    def mousePressEvent(self, event, pos=None):
        if pos:
            self._mousePressedPos = pos

    def mouseReleaseEvent(self, event, pos=None):
        if pos and event.button() == QtCore.Qt.LeftButton:
            #print "released", pos
            if self.lassoRect():
                items = self._view.scene().items(self.lassoRect(),
                                                 QtCore.Qt.ContainsItemShape)
                items = filter(lambda i: not (i.parentItem()), items)
                #items = map(lambda i: i.model, items)
                if self.addMode(event.modifiers()):
                    self._selection |= items
                elif self.subtractMode(event.modifiers()):
                    self._selection -= items
                else:
                    self._selection = Selection(items)
                self._toBeSelected = None
                self.removeLasso()
                self.updatePreSelected()
            else:
                if not self._toBeSelected or self._toBeSelected.pos() != pos:
                    self._toBeSelected = self.findItems(pos, event.modifiers())
                item = self.currentItem()
                if not self.addMode(
                        event.modifiers()) and not self.subtractMode(
                            event.modifiers()):
                    self._selection = None
                    self._selection = Selection()
                if item:
                    if self.subtractMode(event.modifiers()):
                        self._selection.remove(item)
                    else:
                        self._selection.add(item)
                self.nextItem()
                item = self.currentItem()
                self.updatePreSelected()

    def mouseMoveEvent(self, event, pos=None):
        if pos:
            self._pos = pos
            self._modifiers = event.modifiers()
            self._timer.start()

    def mouseDragEvent(self, event, pos=None):
        if pos and (event.buttons() & QtCore.Qt.LeftButton):
            #print "dragged", pos
            self.stretchLasso(pos)
        elif pos and (event.buttons() & QtCore.Qt.RightButton):
            mode = ZoomInMode(self._view, True)
            mode.setMousePressedPos(self._mousePressedPos)
            mode.mouseDragEvent(event, pos)
            self._view.modeStack.push(mode)

    def updatePreSelected(self):
        items = []
        #items = self.findItems(pos, event.modifiers())
        if self._pos:
            items = self.findItems(self._pos, self._modifiers)
        #item = self.currentItem()
        item = None
        if len(items) > 0:
            item = items[0]

        if item != self._preSelected:
            if self._preSelected:
                self._preSelected.preSelected = False
                self._preSelected.update()
            if item:
                self._preSelected = item
                item.preSelected = True
                item.update()

    def name(self):
        return "Select"
Exemplo n.º 4
0
class SelectMode():
    def __init__(self, view, transient=False):
        self._view = view
        self._optionPanel = None
        self._actions = set()
        self._mousePressedPos = None
        self._mousePressedButton = QtCore.Qt.NoButton
        self.installActions()
        self._lasso = None
        self._transient = transient

        self._optionPanel = SelectToolOptions()
        self._selection = Selection()
        self._toBeSelected = None
        self._preSelected = None
        self._modifiers = None
        self._pos = None
        self._timer = QtCore.QTimer()
        self._timer.setSingleShot(True)
        self._timer.setInterval(50)
        self._view.connect(self._timer, QtCore.SIGNAL("timeout()"), self.updatePreSelected)

    def setup(self, pos=None):
        self._pos = pos
        
    def view(self):
        return self._view

    def exitMode(self):
        if self._preSelected:
            self._preSelected.setPreSelected(False)
        self.removeLasso()
        self.uninstallActions()

    def installActions(self):
        for a in self.actions():
            self._view.addAction(a)

    def uninstallActions(self):
        for a in self.actions():
            self._view.removeAction(a)

    def actions(self):
        return self._actions

    def transient(self):
        return self._transient

    def setMousePressedPos(self, pos):
        self._mousePressedPos = pos
    
    def mousePressedPos(self):
        return self._mousePressedPos
    
    def addLasso(self, pos):
        self._lasso = Lasso(self._view, pos)
        self._view.scene().addItem(self._lasso)
        
    def stretchLasso(self, pos):
        if not self._lasso:
            self.addLasso(self._mousePressedPos)
        self._lasso.stretchTo(pos)
    
    def lassoRect(self):
        return self._lasso and self._lasso.rect()
    
    def removeLasso(self):
        if self._lasso:
            scene = self._view.scene()
            scene.removeItem(self._lasso)
            scene.setSceneRect(scene.itemsBoundingRect())
            self._lasso = None

    def findItems(self, pos, modifiers=None):
        items = self._view.scene().items(pos)
        items = filter(lambda i: not(i.parentItem()), items)
        items = filter(lambda i: not(isinstance(i, Lasso)), items)
        #items = map(lambda i: i.model, items)
        items = set(items)
        if self.addMode(modifiers):
            return ItemBuffer(items - self._selection, pos)
        elif self.subtractMode(modifiers):
            return ItemBuffer(items & self._selection, pos)
        else:
            itemsBuf = ItemBuffer(items, pos)
            itemsBuf.setPointerToUnique(self._selection)
            #print '->' + str(self._selection)
            #print '->' + str(itemsBuf) + str(itemsBuf.pointer())
            return itemsBuf
            
    def currentItem(self):
        item = None
        if self._toBeSelected:
            item = self._toBeSelected.current()
        return item

    def nextItem(self):
        if self._toBeSelected:
            self._toBeSelected.next()

    def addMode(self, modifiers):
        return modifiers & QtCore.Qt.ShiftModifier
            
    def subtractMode(self, modifiers):
        return modifiers & QtCore.Qt.ControlModifier
            
    def mousePressEvent(self, event, pos = None):
        if pos:
            self._mousePressedPos = pos

    def mouseReleaseEvent(self, event, pos = None):
        if pos and event.button() == QtCore.Qt.LeftButton:
            #print "released", pos
            if self.lassoRect():
                items = self._view.scene().items(self.lassoRect(), QtCore.Qt.ContainsItemShape)
                items = filter(lambda i: not(i.parentItem()), items)
                #items = map(lambda i: i.model, items)
                if self.addMode(event.modifiers()):
                    self._selection |= items
                elif self.subtractMode(event.modifiers()):
                    self._selection -= items
                else:
                    self._selection = Selection(items)
                self._toBeSelected = None
                self.removeLasso()
                self.updatePreSelected()
            else:
                if not self._toBeSelected or self._toBeSelected.pos() != pos:
                    self._toBeSelected = self.findItems(pos, event.modifiers())
                item = self.currentItem()
                if not self.addMode(event.modifiers()) and not self.subtractMode(event.modifiers()):
                    self._selection = None
                    self._selection = Selection()
                if item:
                    if self.subtractMode(event.modifiers()):
                        self._selection.remove(item)
                    else:
                        self._selection.add(item)
                self.nextItem()
                item = self.currentItem()
                self.updatePreSelected()

    def mouseMoveEvent(self, event, pos = None):
        if pos:
            self._pos = pos
            self._modifiers = event.modifiers()
            self._timer.start()

    def mouseDragEvent(self, event, pos = None):
        if pos and (event.buttons() & QtCore.Qt.LeftButton):
            #print "dragged", pos
            self.stretchLasso(pos)
        elif pos and (event.buttons() & QtCore.Qt.RightButton):
            mode = ZoomInMode(self._view, True)
            mode.setMousePressedPos(self._mousePressedPos)
            mode.mouseDragEvent(event, pos)
            self._view.modeStack.push(mode)

    def updatePreSelected(self):
        items = []
        #items = self.findItems(pos, event.modifiers())
        if self._pos:
            items = self.findItems(self._pos, self._modifiers)
        #item = self.currentItem()
        item = None
        if len(items) > 0:
            item = items[0]
        #print item, self._preSelected
        
        if item != self._preSelected:
            if self._preSelected:
                self._preSelected.setPreSelected(False)
                self._preSelected.update()
            if item:
                self._preSelected = item
                item.setPreSelected(True)
                item.update()
            
    def name(self):
        return "Select"