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