def _vispy_set_visible(self, visible): if not visible: logger.warning('IPython notebook canvas cannot be hidden.') return if self._widget is None: self._widget = VispyWidget() self._widget.set_canvas(self._vispy_canvas) display(self._widget)
class CanvasBackend(BaseCanvasBackend): # args are for BaseCanvasBackend, kwargs are for us. def __init__(self, *args, **kwargs): BaseCanvasBackend.__init__(self, *args) self._widget = None p = self._process_backend_kwargs(kwargs) self._context = p.context # TODO: do something with context.config # Take the context. p.context.shared.add_ref('webgl', self) if p.context.shared.ref is self: pass # ok else: raise RuntimeError("WebGL doesn't yet support context sharing.") #store a default size before the widget is available. #then we set the default size on the widget and only use the #widget size self._default_size = p.size self._init_glir() def set_widget(self, widget): self._widget = widget self._vispy_canvas.context.shared.parser.set_widget(widget) def _init_glir(self): context = self._vispy_canvas.context context.shared.parser = WebGLGlirParser() def _reinit_widget(self): self._vispy_canvas.set_current() self._vispy_canvas.events.initialize() self._vispy_canvas.events.resize(size=(self._widget.width, self._widget.height)) self._vispy_canvas.events.draw() def _vispy_warmup(self): pass # Uncommenting these makes the backend crash. def _vispy_set_current(self): pass def _vispy_swap_buffers(self): pass def _vispy_set_title(self, title): raise NotImplementedError() def _vispy_get_fullscreen(self): # We don't want error messages to show up when the user presses # F11 to fullscreen the browser. pass def _vispy_set_fullscreen(self, fullscreen): # We don't want error messages to show up when the user presses # F11 to fullscreen the browser. pass def _vispy_get_size(self): if self._widget: return (self._widget.width, self._widget.height) else: return self._default_size def _vispy_set_size(self, w, h): if self._widget: self._widget.width = w self._widget.height = h else: self._default_size = (w, h) def _vispy_get_position(self): raise NotImplementedError() def _vispy_set_position(self, x, y): logger.warning('IPython notebook canvas cannot be repositioned.') def _vispy_set_visible(self, visible): if not visible: logger.warning('IPython notebook canvas cannot be hidden.') return if self._widget is None: self._widget = VispyWidget() self._widget.set_canvas(self._vispy_canvas) display(self._widget) def _vispy_update(self): ioloop = tornado.ioloop.IOLoop.current() ioloop.add_callback(self._draw_event) def _draw_event(self): self._vispy_canvas.set_current() self._vispy_canvas.events.draw() def _vispy_close(self): raise NotImplementedError() def _vispy_mouse_release(self, **kwargs): # HACK: override this method from the base canvas in order to # avoid breaking other backends. kwargs.update(self._vispy_mouse_data) ev = self._vispy_canvas.events.mouse_release(**kwargs) if ev is None: return self._vispy_mouse_data['press_event'] = None # TODO: this is a bit ugly, need to improve mouse button handling in # app ev._button = None self._vispy_mouse_data['buttons'] = [] self._vispy_mouse_data['last_event'] = ev return ev # Generate vispy events according to upcoming JS events _modifiers_map = { 'ctrl': keys.CONTROL, 'shift': keys.SHIFT, 'alt': keys.ALT, } def _gen_event(self, ev): if self._vispy_canvas is None: return event_type = ev['type'] key_code = ev.get('key_code', None) if key_code is None: key, key_text = None, None else: if hasattr(keys, key_code): key = getattr(keys, key_code) else: key = keys.Key(key_code) # Generate the key text to pass to the event handler. if key_code == 'SPACE': key_text = ' ' else: key_text = six.text_type(key_code) # Process modifiers. modifiers = ev.get('modifiers', None) if modifiers: modifiers = tuple([self._modifiers_map[modifier] for modifier in modifiers if modifier in self._modifiers_map]) if event_type == "mouse_move": self._vispy_mouse_move(native=ev, button=ev["button"], pos=ev["pos"], modifiers=modifiers, ) elif event_type == "mouse_press": self._vispy_mouse_press(native=ev, pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "mouse_release": self._vispy_mouse_release(native=ev, pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "mouse_wheel": self._vispy_canvas.events.mouse_wheel(native=ev, delta=ev["delta"], pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "key_press": self._vispy_canvas.events.key_press(native=ev, key=key, text=key_text, modifiers=modifiers, ) elif event_type == "key_release": self._vispy_canvas.events.key_release(native=ev, key=key, text=key_text, modifiers=modifiers, ) elif event_type == "resize": self._vispy_canvas.events.resize(native=ev, size=ev["size"]) elif event_type == "paint": self._vispy_canvas.events.draw()
class CanvasBackend(BaseCanvasBackend): # args are for BaseCanvasBackend, kwargs are for us. def __init__(self, *args, **kwargs): BaseCanvasBackend.__init__(self, *args) self._widget = None p = self._process_backend_kwargs(kwargs) self._context = p.context # TODO: do something with context.config # Take the context. p.context.shared.add_ref('webgl', self) if p.context.shared.ref is self: pass # ok else: raise RuntimeError("WebGL doesn't yet support context sharing.") #store a default size before the widget is available. #then we set the default size on the widget and only use the #widget size self._default_size = p.size self._init_glir() def set_widget(self, widget): self._widget = widget self._vispy_canvas.context.shared.parser.set_widget(widget) def _init_glir(self): context = self._vispy_canvas.context context.shared.parser = WebGLGlirParser() def _reinit_widget(self): self._vispy_canvas.set_current() self._vispy_canvas.events.initialize() self._vispy_canvas.events.resize(size=(self._widget.width, self._widget.height)) self._vispy_canvas.events.draw() def _vispy_warmup(self): pass # Uncommenting these makes the backend crash. def _vispy_set_current(self): pass def _vispy_swap_buffers(self): pass def _vispy_set_title(self, title): raise NotImplementedError() def _vispy_get_fullscreen(self): # We don't want error messages to show up when the user presses # F11 to fullscreen the browser. pass def _vispy_set_fullscreen(self, fullscreen): # We don't want error messages to show up when the user presses # F11 to fullscreen the browser. pass def _vispy_get_size(self): if self._widget: return (self._widget.width, self._widget.height) else: return self._default_size def _vispy_set_size(self, w, h): if self._widget: self._widget.width = w self._widget.height = h else: self._default_size = (w, h) def _vispy_get_position(self): raise NotImplementedError() def _vispy_set_position(self, x, y): logger.warning('IPython notebook canvas cannot be repositioned.') def _vispy_set_visible(self, visible): if not visible: logger.warning('IPython notebook canvas cannot be hidden.') return if self._widget is None: self._widget = VispyWidget() self._widget.set_canvas(self._vispy_canvas) display(self._widget) def _vispy_update(self): ioloop = tornado.ioloop.IOLoop.current() ioloop.add_callback(self._draw_event) def _draw_event(self): self._vispy_canvas.set_current() self._vispy_canvas.events.draw() def _vispy_close(self): raise NotImplementedError() def _vispy_mouse_release(self, **kwargs): # HACK: override this method from the base canvas in order to # avoid breaking other backends. kwargs.update(self._vispy_mouse_data) ev = self._vispy_canvas.events.mouse_release(**kwargs) if ev is None: return self._vispy_mouse_data['press_event'] = None # TODO: this is a bit ugly, need to improve mouse button handling in # app ev._button = None self._vispy_mouse_data['buttons'] = [] self._vispy_mouse_data['last_event'] = ev return ev # Generate vispy events according to upcoming JS events _modifiers_map = { 'ctrl': keys.CONTROL, 'shift': keys.SHIFT, 'alt': keys.ALT, } def _gen_event(self, ev): if self._vispy_canvas is None: return event_type = ev['type'] key_code = ev.get('key_code', None) if key_code is None: key, key_text = None, None else: if hasattr(keys, key_code): key = getattr(keys, key_code) else: key = keys.Key(key_code) # Generate the key text to pass to the event handler. if key_code == 'SPACE': key_text = ' ' else: key_text = six.text_type(key_code) # Process modifiers. modifiers = ev.get('modifiers', None) if modifiers: modifiers = tuple([ self._modifiers_map[modifier] for modifier in modifiers if modifier in self._modifiers_map ]) if event_type == "mouse_move": self._vispy_mouse_move( native=ev, button=ev["button"], pos=ev["pos"], modifiers=modifiers, ) elif event_type == "mouse_press": self._vispy_mouse_press( native=ev, pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "mouse_release": self._vispy_mouse_release( native=ev, pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "mouse_wheel": self._vispy_canvas.events.mouse_wheel( native=ev, delta=ev["delta"], pos=ev["pos"], button=ev["button"], modifiers=modifiers, ) elif event_type == "key_press": self._vispy_canvas.events.key_press( native=ev, key=key, text=key_text, modifiers=modifiers, ) elif event_type == "key_release": self._vispy_canvas.events.key_release( native=ev, key=key, text=key_text, modifiers=modifiers, ) elif event_type == "resize": self._vispy_canvas.events.resize(native=ev, size=ev["size"]) elif event_type == "paint": self._vispy_canvas.events.draw()