示例#1
0
文件: screen.py 项目: vosvos/foxycad
 def __init__(self):
     self._canvas = GisCanvas()
     self._canvas.load("dump")
     self._device_area = None # keiciant programos lango dydi reikia perpaisyti naujus gabalus, tai cia isssaugosime ankstesni view dydi.
     # nededame jo i init, nes padarius clear - sitas dydis turi islikti
     self.init()
示例#2
0
文件: screen.py 项目: vosvos/foxycad
class Screen(object):
    """
    Bazine ekrano klase primityviai realizuojanti visas pagrindines funkcijas, bet nebutinai efektyviausiu metodu
    Nenaudoja bufferiu ir expose metu visada perpaiso pilna ekrana, todel yra leta
    draw_invalid_regions - niekad nera kveciamas kdangi perpaisoma viskas
    """
    def __init__(self):
        self._canvas = GisCanvas()
        self._canvas.load("dump")
        self._device_area = None # keiciant programos lango dydi reikia perpaisyti naujus gabalus, tai cia isssaugosime ankstesni view dydi.
        # nededame jo i init, nes padarius clear - sitas dydis turi islikti
        self.init()

    def init(self):
        #print "init screen"
        self._drag_start = False # pagal tai nuspresime ka perpaisyti ir ka pastumti
        self._offset = Point(0, 0) # kiek paslinkti pradzios taska nuo praejusio karto
        self._screen_overlays = [] # statiniai ekrano elementai (SceenOverlay), liniuotes, copyright ir pan
        
    def clear(self):
        #print "screen clear..."
        self._canvas.clear()
        self.init()
    
    def get_area(self):
        return self._device_area
    
    def get_canvas(self):
        return self._canvas

    def ui_redraw(self): # user interface specific redraw - subclasses must implement
        pass

    def ui_open_file(self): # dialog
        pass

    def open_file(self, file_path):
        #self._surface_buffer = None
        
        extension = os.path.splitext(file_path)[1]
        if extension == ".shp":
            self._canvas.load_shape_file(file_path)
        elif extension == ".ocd":
            self._canvas.load_ocad_file(file_path)
        else:
            print "Unknown file format: %s" % extension
        self.redraw()
        
    def mouse_move(self, point): # jeigu yra state - tai reikia kad paspaustas peles klavisas ar kazkas panasaus
        #if self._canvas.get_context(): # no bitmask like: gtk.gdk.BUTTON3_MASK:
        user = self._canvas.device_to_user(point)
        map = self._canvas.get_projection().user_to_map(user)
        return "Device: (%i, %i) User: (%i, %i) Map: (%f, %f) " % (point.x, point.y, user.x, user.y, map.x, map.y)

        
    def draw_screen_overlays(self, context):
        #context.set_antialias(cairo.ANTIALIAS_GRAY) 
        #context.save()
        #context.set_antialias(cairo.ANTIALIAS_NONE)
        #context.set_operator(23) # difference

        for overlay in self._screen_overlays:
            if overlay:
                overlay.draw(context, self)
        #context.restore()


        
    def expose(self, ctx, area):
        """
        pats primityviausias ir patikimiausias expose - kuris visada perpaiso viska...
        """
        self.ctx = ctx
        self._canvas.drag2(self._offset) #jeigu pradetas draginimas tai reikia pastumti ir canvas'a - darome tai cia kadangi kartais ivyksta keli "tusti" motion_notify
        self._offset = Point(0, 0) # reikia cia nunulinti - kadangi kartais vyksta keli motion_notify()

        ctx.save() # del sito dabar blogai veiks zoom'inimas (nes tures klaidinga ctx'a), DragSWcreen sitos bedos neturi kadangi piesiama i ImageSurface
        self._canvas.draw(ctx, area)
        ctx.restore()
        self.draw_screen_overlays(ctx)
      
        
    def drag_start(self, point):
        self._drag_start = point
        #self._offset = Point(0, 0)
        
    def drag_end(self, point):
        #print "drag end!"
        self._drag_start = False
        self._offset = Point(0, 0)

        
    def drag(self, point):
        if self._drag_start:
            offset = Point(point.x - self._drag_start.x,  point.y - self._drag_start.y)
            self._offset = Point(self._offset.x + offset.x, self._offset.y + offset.y) 
            """kartais ivyksta keli "motion_notify" o redraw tarp ju neivyksta, 
                todel reikia saugoti sena self._offset.x ir ji nunulinti kai ivyksta update_drag_regions()
            """
            self._drag_start = point
            self.ui_redraw()
            #self.draw_area.queue_draw()

    def resize(self, area):
        self._device_area = area
        self._canvas.set_device_area(area)
        #print "resize"

    # turetu grazinti indexa pagal kuri galeciau pasalinti
    def add(self, screen_overlay):
        self._screen_overlays.append(screen_overlay)
        self.ui_redraw()
        return len(self._screen_overlays) - 1

    def remove(self, overlay_index):
        self._screen_overlays[overlay_index] = None
        self.ui_redraw()
        
    def replace(self, overlay_index, screen_overlay):
        self._screen_overlays[overlay_index] = screen_overlay
        self.ui_redraw()

    def redraw(self, regions=False):
        self.ui_redraw()

    def zoom(self, direction):
        if self._canvas.zoom(direction):
            self.redraw()

            
    def is_control(self, control, point):
        dcontrol = self._canvas.user_to_device(control)
        dpoint = self._canvas.user_to_device(point)
    
        draw_point(self.ctx, dcontrol.x, dcontrol.y, 1, stroke=False)
        rvalue = self.ctx.in_stroke(dpoint.x, dpoint.y) or self.ctx.in_fill(dpoint.x, dpoint.y)
        #print "iscontrol?", control, point, rvalue
        self.ctx.new_path()
        return rvalue
        
    #def find_objects_at_position(self, point):
    #    #point = Point(point.x + 0.5, point.y + 0.5)
    #    #upoint = self._canvas.device_to_user(point)
    #    #upoint = Point(upoint.x + 0.5, upoint.y + 0.5)
    #   #print "find_objects_at_position: ", point, upoint
    #    
    #    return self._canvas.find_objects_at_position(point)


    def add_shape(self, shape):
        id = self._canvas.add(shape)
        self.redraw(self._canvas.get_shape_redraw_area(id))
        return id
        
    def remove_shape(self, id):
        #shape = self._canvas.get_shape_by_id(id)
        area = self._canvas.get_shape_redraw_area(id)
        self._canvas.remove(id)
        self.redraw(area)
        
    def replace_shape(self, id, shape):
        old_area = self._canvas.get_shape_redraw_area(id)
        self._canvas.replace(id, shape)
        
        update_area = [self._canvas.get_shape_redraw_area(id)]
        if old_area: # jeigu tai buvo seniau istryntas, None objektas
            update_area.append(old_area)
        self.redraw(update_area)
        
        
    def move_shape(self, id, offset):
        old_area = self._canvas.get_shape_redraw_area(id)
        #print "old area: ", old_area
        #print "move offset: ", offset
        shape = self._canvas.get_shape_by_id(id)
        shape.move(self._canvas, offset)
        self._canvas.replace(id, shape)
        #new_id = self._canvas.add(shape)
        
        
        new_area = Area(old_area.x + offset[0], old_area.y + offset[1], old_area.width, old_area.height)
        #new_area = self._canvas.get_shape_redraw_area(new_id)
        #print "new area: ", new_area

        self.redraw([old_area, new_area])