279 |
# if the mouse is outside the window. |
# if the mouse is outside the window. |
280 |
self.current_position = None |
self.current_position = None |
281 |
|
|
|
# If true, OnIdle will call do_redraw to do the actual |
|
|
# redrawing. Set by OnPaint to avoid some unnecessary redraws. |
|
|
# To force a redraw call full_redraw(). |
|
|
self.redraw_on_idle = 0 |
|
|
|
|
282 |
# the bitmap serving as backing store |
# the bitmap serving as backing store |
283 |
self.bitmap = None |
self.bitmap = None |
284 |
|
|
298 |
EVT_MOTION(self, self.OnMotion) |
EVT_MOTION(self, self.OnMotion) |
299 |
EVT_LEAVE_WINDOW(self, self.OnLeaveWindow) |
EVT_LEAVE_WINDOW(self, self.OnLeaveWindow) |
300 |
wx.EVT_SIZE(self, self.OnSize) |
wx.EVT_SIZE(self, self.OnSize) |
|
wx.EVT_IDLE(self, self.OnIdle) |
|
301 |
|
|
302 |
def __del__(self): |
def __del__(self): |
303 |
wxWindow.__del__(self) |
wxWindow.__del__(self) |
306 |
def OnPaint(self, event): |
def OnPaint(self, event): |
307 |
dc = wxPaintDC(self) |
dc = wxPaintDC(self) |
308 |
if self.map is not None and self.map.HasLayers(): |
if self.map is not None and self.map.HasLayers(): |
309 |
# We have a non-empty map. Redraw it in idle time |
self.do_redraw() |
|
self.redraw_on_idle = 1 |
|
310 |
else: |
else: |
311 |
# If we've got no map or if the map is empty, simply clear |
# If we've got no map or if the map is empty, simply clear |
312 |
# the screen. |
# the screen. |
576 |
def OnLeaveWindow(self, event): |
def OnLeaveWindow(self, event): |
577 |
self.set_current_position(None) |
self.set_current_position(None) |
578 |
|
|
|
def OnIdle(self, event): |
|
|
if self.redraw_on_idle: |
|
|
self.do_redraw() |
|
|
self.redraw_on_idle = 0 |
|
|
|
|
579 |
def OnSize(self, event): |
def OnSize(self, event): |
580 |
# the window's size has changed. We have to get a new bitmap. If |
# the window's size has changed. We have to get a new bitmap. If |
581 |
# we want to be clever we could try to get by without throwing |
# we want to be clever we could try to get by without throwing |
606 |
self.last_selected_layer = layer |
self.last_selected_layer = layer |
607 |
self.last_selected_shape = shape |
self.last_selected_shape = shape |
608 |
|
|
609 |
def unprojected_rect_around_point(self, x, y): |
def unprojected_rect_around_point(self, x, y, dist): |
610 |
"""return a rect a few pixels around (x, y) in unprojected corrdinates |
"""return a rect dist pixels around (x, y) in unprojected corrdinates |
611 |
|
|
612 |
The return value is a tuple (minx, miny, maxx, maxy) suitable a |
The return value is a tuple (minx, miny, maxx, maxy) suitable a |
613 |
parameter to a layer's ShapesInRegion method. |
parameter to a layer's ShapesInRegion method. |
621 |
xs = [] |
xs = [] |
622 |
ys = [] |
ys = [] |
623 |
for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)): |
for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)): |
624 |
px, py = self.win_to_proj(x + dx, y + dy) |
px, py = self.win_to_proj(x + dist * dx, y + dist * dy) |
625 |
if inverse: |
if inverse: |
626 |
px, py = inverse(px, py) |
px, py = inverse(px, py) |
627 |
xs.append(px) |
xs.append(px) |
650 |
scale = self.scale |
scale = self.scale |
651 |
offx, offy = self.offset |
offx, offy = self.offset |
652 |
|
|
|
box = self.unprojected_rect_around_point(px, py) |
|
|
|
|
653 |
if select_labels: |
if select_labels: |
654 |
labels = self.map.LabelLayer().Labels() |
labels = self.map.LabelLayer().Labels() |
655 |
|
|
709 |
|
|
710 |
select_shape = -1 |
select_shape = -1 |
711 |
|
|
712 |
|
# Determine the ids of the shapes that overlap a tiny area |
713 |
|
# around the point. For layers containing points we have to |
714 |
|
# choose a larger size of the box we're testing agains so |
715 |
|
# that we take the size of the markers into account |
716 |
|
# FIXME: Once the markers are more flexible this part has to |
717 |
|
# become more flexible too, of course |
718 |
|
if shapetype == SHAPETYPE_POINT: |
719 |
|
box = self.unprojected_rect_around_point(px, py, 5) |
720 |
|
else: |
721 |
|
box = self.unprojected_rect_around_point(px, py, 1) |
722 |
shape_ids = layer.ShapesInRegion(box) |
shape_ids = layer.ShapesInRegion(box) |
723 |
shape_ids.reverse() |
shape_ids.reverse() |
724 |
|
|