class Editor: def __init__(self, main): #Current editing process self.process = None self.step = 0 self.preview = None #Interaction modes self.snapModes = ['grid', 'subdivision', 'projection'] self.snapSet = [Line, Circle] self.selectSet = [Line, Circle] #Subjects of interaction. self.snapX = 0.0 self.snapY = 0.0 self.snapped = None #a Plan self.hovered = None #a Block self.selection = [] #a Block #Event handling #main.bind('event', callback) def getHoveredPlan(self): hits = list(block for block \ in self.level.quadTree.hit(pygame.Rect(pos[0]-2, pos[1]-2, 4, 4)) \ if (type(block) in self.selectSet)) if hits: candidate = hits[0] if candidate.hit(*pos): #mousepos self.hovered = candidate else: self.hovered = None else: self.hovered = None def processPlanLine(self): if self.step == 0: self.preview = Line(self.mx, self.my, self.mx, self.my) self.step = 1 elif self.step == 1: self.preview.finalize() self.editor.level.plans.add(self.preview) self.editor.level.planTree.insert(self.preview) self.preview = None self.step = 0 def processPlanCircle(self): if self.step == 0: self.preview = Circle(self.mx, self.my) self.step = 1 elif self.step == 1: self.preview.finalize() self.editor.level.plans.add(self.preview) self.editor.level.planTree.insert(self.preview) self.preview = None self.step = 0 def edit(self, mx, my): if self.preview: if self.mode == PLAN_TYPE_LINE: self.preview.x1 = mx self.preview.y1 = my elif self.mode == PLAN_TYPE_CIRCLE: self.preview.direction = getDirection(self.preview.x, self.preview.y, mx, my) self.preview.refresh() def remove(self, mx, my): if self.step == 0: hits = self.editor.level.planTree.hit(pygame.Rect(mx-1, my-1, 2, 2)) for plan in hits: if plan.hit(mx, my): self.editor.level.plans.remove(plan) self.editor.level.planTree.remove(plan) break else: self.preview = None self.step = 0 def onMouseMotion(self, mx, my): self.mx = mx self.my = my def onMouseButtonDown(self, pos, button): if button == 1: self.place() elif button == 2: pass elif button == 3: self.deleteSelection() elif button == 4: pass elif button == 5: pass def processPlaceRect(self): #UNWORKING if self.editor.hoveredPlanTouched: s = self.selection x, y = self.mx, self.my cx, cy = self.editor.hoveredPlan.center direction = self.editor.hoveredPlan.direction s.append(self.editor.hoveredPlanTouched) if len(self.selection) == 2: if self.mode == PLACE_TYPE_RECTANGLE: block = blocks.Rectangle() elif self.mode == PLACE_TYPE_CIRCLE: pass elif self.mode == PLACE_TYPE_ARC: pass def deleteSelection(self): if self.selection: self.level.blocks.remove(self.selection) self.level.quadTree.remove(self.selection)