def __init__(self, state): wx.Frame.__init__(self, None, wx.ID_ANY, state.title) try: self.SetIcon(icon.SimpleIcon("MAP").get_ico()) except Exception: pass self.state = state state.frame = self state.grid = True state.follow = True state.download = True state.popup_object = None state.popup_latlon = None state.popup_started = False state.default_popup = None state.panel = MPSlipMapPanel(self, state) self.last_layout_send = time.time() self.Bind(wx.EVT_IDLE, self.on_idle) self.Bind(wx.EVT_SIZE, state.panel.on_size) self.legend_checkbox_menuitem_added = False # create the View menu self.menu = MPMenuTop([ MPMenuSubMenu('View', items=[ MPMenuCheckbox('Follow\tCtrl+F', 'Follow Aircraft', 'toggleFollow', checked=state.follow), MPMenuCheckbox('Grid\tCtrl+G', 'Enable Grid', 'toggleGrid', checked=state.grid), MPMenuItem('Goto\tCtrl+P', 'Goto Position', 'gotoPosition'), MPMenuItem('Brightness +\tCtrl+B', 'Increase Brightness', 'increaseBrightness'), MPMenuItem('Brightness -\tCtrl+Shift+B', 'Decrease Brightness', 'decreaseBrightness'), MPMenuItem('Zoom +\t+', 'Zoom In', 'zoomIn'), MPMenuItem('Zoom -\t-', 'Zoom Out', 'zoomOut'), MPMenuCheckbox('Download Tiles\tCtrl+D', 'Enable Tile Download', 'toggleDownload', checked=state.download), MPMenuRadio('Service', 'Select map service', returnkey='setService', selected=state.mt.get_service(), items=state.mt.get_service_list()) ]) ]) self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu)
def __init__(self, state): wx.Frame.__init__(self, None, wx.ID_ANY, state.title) self.state = state state.frame = self state.grid = True state.follow = True state.download = True state.popup_object = None state.popup_latlon = None state.popup_started = False state.default_popup = None state.panel = MPSlipMapPanel(self, state) self.last_layout_send = time.time() self.Bind(wx.EVT_IDLE, self.on_idle) self.Bind(wx.EVT_SIZE, state.panel.on_size) self.legend_checkbox_menuitem_added = False # create the View menu self.menu = MPMenuTop([ MPMenuSubMenu('View', items=[ MPMenuCheckbox('Follow\tCtrl+F', 'Follow Aircraft', 'toggleFollow', checked=state.follow), MPMenuCheckbox('Grid\tCtrl+G', 'Enable Grid', 'toggleGrid', checked=state.grid), MPMenuItem('Goto\tCtrl+P', 'Goto Position', 'gotoPosition'), MPMenuItem('Brightness +\tCtrl+B', 'Increase Brightness', 'increaseBrightness'), MPMenuItem('Brightness -\tCtrl+Shift+B', 'Decrease Brightness', 'decreaseBrightness'), MPMenuCheckbox('Download Tiles\tCtrl+D', 'Enable Tile Download', 'toggleDownload', checked=state.download), MPMenuRadio('Service', 'Select map service', returnkey='setService', selected=state.mt.get_service(), items=state.mt.get_service_list())])]) self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu)
class MPSlipMapFrame(wx.Frame): """ The main frame of the viewer """ def __init__(self, state): wx.Frame.__init__(self, None, wx.ID_ANY, state.title) self.state = state state.frame = self state.grid = True state.follow = True state.download = True state.popup_object = None state.popup_latlon = None state.popup_started = False state.default_popup = None state.panel = MPSlipMapPanel(self, state) self.last_layout_send = time.time() self.Bind(wx.EVT_IDLE, self.on_idle) self.Bind(wx.EVT_SIZE, state.panel.on_size) self.legend_checkbox_menuitem_added = False # create the View menu self.menu = MPMenuTop([ MPMenuSubMenu('View', items=[ MPMenuCheckbox('Follow\tCtrl+F', 'Follow Aircraft', 'toggleFollow', checked=state.follow), MPMenuCheckbox('Grid\tCtrl+G', 'Enable Grid', 'toggleGrid', checked=state.grid), MPMenuItem('Goto\tCtrl+P', 'Goto Position', 'gotoPosition'), MPMenuItem('Brightness +\tCtrl+B', 'Increase Brightness', 'increaseBrightness'), MPMenuItem('Brightness -\tCtrl+Shift+B', 'Decrease Brightness', 'decreaseBrightness'), MPMenuCheckbox('Download Tiles\tCtrl+D', 'Enable Tile Download', 'toggleDownload', checked=state.download), MPMenuRadio('Service', 'Select map service', returnkey='setService', selected=state.mt.get_service(), items=state.mt.get_service_list()) ]) ]) self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu) def on_menu(self, event): '''handle menu selection''' state = self.state # see if it is a popup menu if state.popup_object is not None: obj = state.popup_object ret = obj.popup_menu.find_selected(event) if ret is not None: ret.call_handler() state.event_queue.put( SlipMenuEvent(state.popup_latlon, event, [ SlipObjectSelection(obj.key, 0, obj.layer, obj.selection_info()) ], ret)) state.popup_object = None state.popup_latlon = None if state.default_popup is not None: ret = state.default_popup.popup.find_selected(event) if ret is not None: ret.call_handler() state.event_queue.put( SlipMenuEvent(state.popup_latlon, event, [], ret)) # otherwise a normal menu ret = self.menu.find_selected(event) if ret is None: return ret.call_handler() if ret.returnkey == 'toggleGrid': state.grid = ret.IsChecked() elif ret.returnkey == 'toggleLegend': state.legend = ret.IsChecked() elif ret.returnkey == 'toggleFollow': state.follow = ret.IsChecked() elif ret.returnkey == 'toggleDownload': state.download = ret.IsChecked() elif ret.returnkey == 'setService': state.mt.set_service(ret.get_choice()) elif ret.returnkey == 'gotoPosition': state.panel.enter_position() elif ret.returnkey == 'increaseBrightness': state.brightness += 20 if state.brightness > 255: state.brightness = 255 elif ret.returnkey == 'decreaseBrightness': state.brightness -= 20 if state.brightness < -255: state.brightness = -255 state.need_redraw = True def find_object(self, key, layers): '''find an object to be modified''' state = self.state if layers is None or layers == '': layers = state.layers.keys() for layer in layers: if key in state.layers[layer]: return state.layers[layer][key] return None def follow(self, object): '''follow an object on the map''' state = self.state (px, py) = state.panel.pixmapper(object.latlon) ratio = 0.25 if (px > ratio * state.width and px < (1.0 - ratio) * state.width and py > ratio * state.height and py < (1.0 - ratio) * state.height): # we're in the mid part of the map already, don't move return if not state.follow: # the user has disabled following return (lat, lon) = object.latlon state.panel.re_center(state.width / 2, state.height / 2, lat, lon) def add_legend_checkbox_menuitem(self): self.menu.add_to_submenu(['View'], [ MPMenuCheckbox('Legend\tCtrl+L', 'Enable Legend', 'toggleLegend', checked=self.state.legend) ]) def add_object(self, obj): '''add an object to a layer''' state = self.state if not obj.layer in state.layers: # its a new layer state.layers[obj.layer] = {} state.layers[obj.layer][obj.key] = obj state.need_redraw = True if (not self.legend_checkbox_menuitem_added and isinstance(obj, SlipFlightModeLegend)): self.add_legend_checkbox_menuitem() self.legend_checkbox_menuitem_added = True self.SetMenuBar(self.menu.wx_menu()) def remove_object(self, key): '''remove an object by key from all layers''' state = self.state for layer in state.layers: state.layers[layer].pop(key, None) state.need_redraw = True def on_idle(self, event): '''prevent the main loop spinning too fast''' state = self.state if state.close_window.acquire(False): self.state.app.ExitMainLoop() now = time.time() if now - self.last_layout_send > 1: self.last_layout_send = now state.event_queue.put(win_layout.get_wx_window_layout(self)) # receive any display objects from the parent obj = None while not state.object_queue.empty(): obj = state.object_queue.get() if isinstance(obj, win_layout.WinLayout): win_layout.set_wx_window_layout(self, obj) if isinstance(obj, SlipObject): self.add_object(obj) if isinstance(obj, SlipPosition): # move an object object = self.find_object(obj.key, obj.layer) if object is not None: object.update_position(obj) if getattr(object, 'follow', False): self.follow(object) if obj.label is not None: object.label = obj.label if obj.colour is not None: object.colour = obj.colour state.need_redraw = True if isinstance(obj, SlipDefaultPopup): state.default_popup = obj if isinstance(obj, SlipInformation): # see if its a existing one or a new one if obj.key in state.info: # print('update %s' % str(obj.key)) state.info[obj.key].update(obj) else: # print('add %s' % str(obj.key)) state.info[obj.key] = obj state.need_redraw = True if isinstance(obj, SlipCenter): # move center (lat, lon) = obj.latlon state.panel.re_center(state.width / 2, state.height / 2, lat, lon) state.need_redraw = True if isinstance(obj, SlipZoom): # change zoom state.panel.set_ground_width(obj.ground_width) state.need_redraw = True if isinstance(obj, SlipFollow): # enable/disable follow state.follow = obj.enable if isinstance(obj, SlipFollowObject): # enable/disable follow on an object for layer in state.layers: if obj.key in state.layers[layer]: if hasattr(state.layers[layer][obj.key], 'follow'): state.layers[layer][obj.key].follow = obj.enable if isinstance(obj, SlipBrightness): # set map brightness state.brightness = obj.brightness state.need_redraw = True if isinstance(obj, SlipClearLayer): # remove all objects from a layer if obj.layer in state.layers: state.layers.pop(obj.layer) state.need_redraw = True if isinstance(obj, SlipRemoveObject): # remove an object by key for layer in state.layers: if obj.key in state.layers[layer]: state.layers[layer].pop(obj.key) state.need_redraw = True if isinstance(obj, SlipHideObject): # hide an object by key for layer in state.layers: if obj.key in state.layers[layer]: state.layers[layer][obj.key].set_hidden(obj.hide) state.need_redraw = True if state.timelim_pipe is not None: while state.timelim_pipe[1].poll(): try: obj = state.timelim_pipe[1].recv() except Exception: state.timelim_pipe = None break for layer in state.layers: for key in state.layers[layer].keys(): state.layers[layer][key].set_time_range(obj) state.need_redraw = True if obj is None: time.sleep(0.05)
class MPSlipMapFrame(wx.Frame): """ The main frame of the viewer """ def __init__(self, state): wx.Frame.__init__(self, None, wx.ID_ANY, state.title) self.state = state state.frame = self state.grid = True state.follow = True state.download = True state.popup_object = None state.popup_latlon = None state.popup_started = False state.default_popup = None state.panel = MPSlipMapPanel(self, state) self.last_layout_send = time.time() self.Bind(wx.EVT_IDLE, self.on_idle) self.Bind(wx.EVT_SIZE, state.panel.on_size) self.legend_checkbox_menuitem_added = False # create the View menu self.menu = MPMenuTop([ MPMenuSubMenu('View', items=[ MPMenuCheckbox('Follow\tCtrl+F', 'Follow Aircraft', 'toggleFollow', checked=state.follow), MPMenuCheckbox('Grid\tCtrl+G', 'Enable Grid', 'toggleGrid', checked=state.grid), MPMenuItem('Goto\tCtrl+P', 'Goto Position', 'gotoPosition'), MPMenuItem('Brightness +\tCtrl+B', 'Increase Brightness', 'increaseBrightness'), MPMenuItem('Brightness -\tCtrl+Shift+B', 'Decrease Brightness', 'decreaseBrightness'), MPMenuCheckbox('Download Tiles\tCtrl+D', 'Enable Tile Download', 'toggleDownload', checked=state.download), MPMenuRadio('Service', 'Select map service', returnkey='setService', selected=state.mt.get_service(), items=state.mt.get_service_list())])]) self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu) def on_menu(self, event): '''handle menu selection''' state = self.state # see if it is a popup menu if state.popup_object is not None: obj = state.popup_object ret = obj.popup_menu.find_selected(event) if ret is not None: ret.call_handler() state.event_queue.put(SlipMenuEvent(state.popup_latlon, event, [SlipObjectSelection(obj.key, 0, obj.layer, obj.selection_info())], ret)) state.popup_object = None state.popup_latlon = None if state.default_popup is not None: ret = state.default_popup.popup.find_selected(event) if ret is not None: ret.call_handler() state.event_queue.put(SlipMenuEvent(state.popup_latlon, event, [], ret)) # otherwise a normal menu ret = self.menu.find_selected(event) if ret is None: return ret.call_handler() if ret.returnkey == 'toggleGrid': state.grid = ret.IsChecked() elif ret.returnkey == 'toggleLegend': state.legend = ret.IsChecked() elif ret.returnkey == 'toggleFollow': state.follow = ret.IsChecked() elif ret.returnkey == 'toggleDownload': state.download = ret.IsChecked() elif ret.returnkey == 'setService': state.mt.set_service(ret.get_choice()) elif ret.returnkey == 'gotoPosition': state.panel.enter_position() elif ret.returnkey == 'increaseBrightness': state.brightness += 20 if state.brightness > 255: state.brightness = 255 elif ret.returnkey == 'decreaseBrightness': state.brightness -= 20 if state.brightness < -255: state.brightness = -255 state.need_redraw = True def find_object(self, key, layers): '''find an object to be modified''' state = self.state if layers is None or layers == '': layers = state.layers.keys() for layer in layers: if key in state.layers[layer]: return state.layers[layer][key] return None def follow(self, object): '''follow an object on the map''' state = self.state (px,py) = state.panel.pixmapper(object.latlon) ratio = 0.25 if (px > ratio*state.width and px < (1.0-ratio)*state.width and py > ratio*state.height and py < (1.0-ratio)*state.height): # we're in the mid part of the map already, don't move return if not state.follow: # the user has disabled following return (lat, lon) = object.latlon state.panel.re_center(state.width/2, state.height/2, lat, lon) def add_legend_checkbox_menuitem(self): self.menu.add_to_submenu(['View'], [MPMenuCheckbox('Legend\tCtrl+L', 'Enable Legend', 'toggleLegend', checked=self.state.legend) ]) def add_object(self, obj): '''add an object to a layer''' state = self.state if not obj.layer in state.layers: # its a new layer state.layers[obj.layer] = {} state.layers[obj.layer][obj.key] = obj state.need_redraw = True if (not self.legend_checkbox_menuitem_added and isinstance(obj, SlipFlightModeLegend)): self.add_legend_checkbox_menuitem() self.legend_checkbox_menuitem_added = True self.SetMenuBar(self.menu.wx_menu()) def remove_object(self, key): '''remove an object by key from all layers''' state = self.state for layer in state.layers: state.layers[layer].pop(key, None) state.need_redraw = True def on_idle(self, event): '''prevent the main loop spinning too fast''' state = self.state if state.close_window.acquire(False): self.state.app.ExitMainLoop() now = time.time() if now - self.last_layout_send > 1: self.last_layout_send = now state.event_queue.put(win_layout.get_wx_window_layout(self)) # receive any display objects from the parent obj = None while not state.object_queue.empty(): obj = state.object_queue.get() if isinstance(obj, win_layout.WinLayout): win_layout.set_wx_window_layout(self, obj) if isinstance(obj, SlipObject): self.add_object(obj) if isinstance(obj, SlipPosition): # move an object object = self.find_object(obj.key, obj.layer) if object is not None: object.update_position(obj) if getattr(object, 'follow', False): self.follow(object) if obj.label is not None: object.label = obj.label if obj.colour is not None: object.colour = obj.colour state.need_redraw = True if isinstance(obj, SlipDefaultPopup): state.default_popup = obj if isinstance(obj, SlipInformation): # see if its a existing one or a new one if obj.key in state.info: # print('update %s' % str(obj.key)) state.info[obj.key].update(obj) else: # print('add %s' % str(obj.key)) state.info[obj.key] = obj state.need_redraw = True if isinstance(obj, SlipCenter): # move center (lat,lon) = obj.latlon state.panel.re_center(state.width/2, state.height/2, lat, lon) state.need_redraw = True if isinstance(obj, SlipZoom): # change zoom state.panel.set_ground_width(obj.ground_width) state.need_redraw = True if isinstance(obj, SlipFollow): # enable/disable follow state.follow = obj.enable if isinstance(obj, SlipFollowObject): # enable/disable follow on an object for layer in state.layers: if obj.key in state.layers[layer]: if hasattr(state.layers[layer][obj.key], 'follow'): state.layers[layer][obj.key].follow = obj.enable if isinstance(obj, SlipBrightness): # set map brightness state.brightness = obj.brightness state.need_redraw = True if isinstance(obj, SlipClearLayer): # remove all objects from a layer if obj.layer in state.layers: state.layers.pop(obj.layer) state.need_redraw = True if isinstance(obj, SlipRemoveObject): # remove an object by key for layer in state.layers: if obj.key in state.layers[layer]: state.layers[layer].pop(obj.key) state.need_redraw = True if isinstance(obj, SlipHideObject): # hide an object by key for layer in state.layers: if obj.key in state.layers[layer]: state.layers[layer][obj.key].set_hidden(obj.hide) state.need_redraw = True if obj is None: time.sleep(0.05)