Example #1
0
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)