class multiViewPanel:
    def __init__(self, view, controller):
        self.view = view
        self.controller = controller
        self.scene = QGraphicsScene()
        self.view.setScene(self.scene)
        
        self.variables = {}
        self.variableOrder = []
        self.currentX = None
        self.currentY = None
    
    def addVariable(self, var):
        if not var in self.variables.iterkeys():
            p = parametricPulseGraph(self,var,var,self.controller.getVectors(var,var))
            self.scene.addItem(p)
            varGraphs = {var:p}    # stick in a placeholder for the diagonal
            for v,graphs in self.variables.iteritems():
                x = parametricPulseGraph(self,var,v,self.controller.getVectors(var,v))
                y = parametricPulseGraph(self,v,var,self.controller.getVectors(v,var))
                self.scene.addItem(x)
                self.scene.addItem(y)
                varGraphs[v] = x
                graphs[var] = y
            self.variables[var] = varGraphs
            self.variableOrder.append(var)
        self.updateView()
    
    def removeVariable(self, var):
        self.variableOrder.remove(var)
        for v in self.variables[var].itervalues():
            self.scene.removeItem(v)
        del self.variables[var]
        for v in self.variableOrder:
            self.scene.removeItem(self.variables[v][var])
            del self.variables[v][var]
        if self.currentX == var or self.currentY == var:
            self.noTarget()
        else:
            self.updateView()
    
    def noTarget(self):
        self.currentX = None
        self.currentY = None
        self.updateView()
    
    def setTarget(self, x, y):
        if self.currentX == x and self.currentY == y:
            self.noTarget()
        else:
            self.currentX = x
            self.currentY = y
            self.updateView()
    
    def updateView(self):
        padding = (parametricPulseGraph.FULL_SIZE-parametricPulseGraph.SMALL_SIZE)/2
        xPos = 0
        for i,x in enumerate(self.variableOrder):
            if x == self.currentX:
                xPos += padding
            
            yPos = 0
            for j,y in enumerate(self.variableOrder):
                self.variables[x][y].isLeft = i == 0
                self.variables[x][y].isTop = j == 0
                self.variables[x][y].isRight = i == len(self.variableOrder)-1
                self.variables[x][y].isBottom = j == len(self.variableOrder)-1
                
                if x == self.currentX and y == self.currentY:
                    self.variables[x][y].setPos(xPos-padding,yPos)
                    self.variables[x][y].width = parametricPulseGraph.FULL_SIZE
                    self.variables[x][y].height = parametricPulseGraph.FULL_SIZE
                    yPos += parametricPulseGraph.FULL_SIZE
                else:
                    if y == self.currentY:
                        yPos += padding
                    self.variables[x][y].setPos(xPos,yPos)
                    self.variables[x][y].width = parametricPulseGraph.SMALL_SIZE
                    self.variables[x][y].height = parametricPulseGraph.SMALL_SIZE
                    yPos += parametricPulseGraph.SMALL_SIZE
                    if y == self.currentY:
                        yPos += padding
            
            xPos += parametricPulseGraph.SMALL_SIZE
            if x == self.currentX:
                xPos += padding
        self.scene.update()