import wx from mappanel import MapPanel class DraggableMapPanel(MapPanel): def __init__(self, *args, **kwargs): MapPanel.__init__(self, *args, **kwargs) self.Bind(wx.EVT_MOUSE_EVENTS, self.MouseEvent) self.drag = None def MouseEvent(self, evt): # Handle zoom if evt.GetWheelRotation(): tile_w, tile_h = self.tilecache.tilesize mouse_x, mouse_y = evt.GetPosition() # Old map position at the cursor old_x = self.mapx + float(mouse_x) / tile_w old_y = self.mapy + float(mouse_y) / tile_h oldzoom = self.mapzoom self.mapzoom += evt.GetWheelRotation() // evt.GetWheelDelta() zoomratio = 2 ** (self.mapzoom - oldzoom) self.mapx = old_x * zoomratio - float(mouse_x) / tile_w self.mapy = old_y * zoomratio - float(mouse_y) / tile_h self.Reposition() # Handle drag if evt.LeftDown(): self.drag = evt.GetPosition() elif evt.Dragging() or evt.LeftUp() and self.drag: delta = evt.GetPosition() - self.drag tile_w, tile_h = self.tilecache.tilesize self.mapx -= float(delta.x) / tile_w self.mapy -= float(delta.y) / tile_h self.Reposition() self.drag = evt.GetPosition() if evt.LeftUp(): self.drag = None