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()