def previewpoly(self, mouseevent): if mouseevent.type() != mouseevent.Type.MouseMove: return mousepos = (mouseevent.pos().x(), mouseevent.pos().y()) # Check if we are updating a preview poly if mousepos != self.prevmousepos: cmd = console.get_cmd() nargs = len(console.get_args()) if cmd in [ 'AREA', 'BOX', 'POLY', 'POLYLINE', 'POLYALT', 'POLYGON', 'CIRCLE', 'LINE' ] and nargs >= 2: self.prevmousepos = mousepos try: # get the largest even number of points start = 0 if cmd == 'AREA' else 3 if cmd == 'POLYALT' else 1 end = ((nargs - start) // 2) * 2 + start data = [float(v) for v in console.get_args()[start:end]] data += self.glsurface.pixelCoordsToLatLon(*mousepos) self.glsurface.makeCurrent() if cmd is None: self.polyprev.set_vertex_count(0) return if cmd in ['BOX', 'AREA']: # For a box (an area is a box) we need to add two additional corners polydata = np.zeros(8, dtype=np.float32) polydata[0:2] = data[0:2] polydata[2:4] = data[2], data[1] polydata[4:6] = data[2:4] polydata[6:8] = data[0], data[3] else: polydata = np.array(data, dtype=np.float32) if cmd[-4:] == 'LINE': self.polyprev.set_primitive_type(glh.gl.GL_LINE_STRIP) else: self.polyprev.set_primitive_type(glh.gl.GL_LINE_LOOP) self.polyprev.update(vertex=polydata) except ValueError: pass
def event(self, event): ''' Event handling for input events. ''' if event.type() == QEvent.Wheel: # For mice we zoom with control/command and the scrolwheel if event.modifiers() & Qt.ControlModifier: origin = (event.pos().x(), event.pos().y()) zoom = 1.0 try: if event.pixelDelta(): # High resolution scroll zoom *= (1.0 + 0.01 * event.pixelDelta().y()) else: # Low resolution scroll zoom *= (1.0 + 0.001 * event.angleDelta().y()) except AttributeError: zoom *= (1.0 + 0.001 * event.delta()) self.panzoomchanged = True return self.panzoom(zoom=zoom, origin=origin) # For touchpad scroll (2D) is used for panning else: try: dlat = 0.01 * event.pixelDelta().y() / (self.zoom * self.ar) dlon = -0.01 * event.pixelDelta().x() / (self.zoom * self.flat_earth) self.panzoomchanged = True return self.panzoom(pan=(dlat, dlon)) except AttributeError: pass # For touchpad, pinch gesture is used for zoom elif event.type() == QEvent.Gesture: pan = zoom = None dlat = dlon = 0.0 for g in event.gestures(): if g.gestureType() == Qt.PinchGesture: zoom = g.scaleFactor() * (zoom or 1.0) if CORRECT_PINCH: zoom /= g.lastScaleFactor() elif g.gestureType() == Qt.PanGesture: if abs(g.delta().y() + g.delta().x()) > 1e-1: dlat += 0.005 * g.delta().y() / (self.zoom * self.ar) dlon -= 0.005 * g.delta().x() / (self.zoom * self.flat_earth) pan = (dlat, dlon) if pan is not None or zoom is not None: self.panzoomchanged = True return self.panzoom(pan, zoom, self.mousepos) elif event.type( ) == QEvent.MouseButtonPress and event.button() & Qt.LeftButton: self.mousedragged = False # For mice we pan with control/command and mouse movement. # Mouse button press marks the beginning of a pan self.prevmousepos = (event.x(), event.y()) elif event.type() == QEvent.MouseButtonRelease and \ event.button() & Qt.LeftButton and not self.mousedragged: lat, lon = self.pixelCoordsToLatLon(event.x(), event.y()) # TODO: acdata en routedata tostack, tocmdline = radarclick(console.get_cmdline(), lat, lon, self.acdata, self.routedata) if '\n' not in tocmdline: console.append_cmdline(tocmdline) if tostack: console.stack(tostack) elif event.type() == QEvent.MouseMove: self.mousedragged = True self.mousepos = (event.x(), event.y()) if event.buttons() & Qt.LeftButton: dlat = 0.003 * (event.y() - self.prevmousepos[1]) / (self.zoom * self.ar) dlon = 0.003 * (self.prevmousepos[0] - event.x()) / (self.zoom * self.flat_earth) self.prevmousepos = (event.x(), event.y()) self.panzoomchanged = True return self.panzoom(pan=(dlat, dlon)) # Update pan/zoom to simulation thread only when the pan/zoom gesture is finished elif (event.type() == QEvent.MouseButtonRelease or event.type() == QEvent.TouchEnd) and self.panzoomchanged: self.panzoomchanged = False bs.net.send_event( b'PANZOOM', dict(pan=(self.panlat, self.panlon), zoom=self.zoom, ar=self.ar, absolute=True)) # If this is a mouse move event, check if we are updating a preview poly if self.mousepos != self.prevmousepos: cmd = console.get_cmd() nargs = len(console.get_args()) if cmd in [ 'AREA', 'BOX', 'POLY', 'POLYLINE', 'POLYALT', 'POLYGON', 'CIRCLE', 'LINE' ] and nargs >= 2: self.prevmousepos = self.mousepos try: # get the largest even number of points start = 0 if cmd == 'AREA' else 3 if cmd == 'POLYALT' else 1 end = ((nargs - start) // 2) * 2 + start data = [float(v) for v in console.get_args()[start:end]] data += self.pixelCoordsToLatLon(*self.mousepos) self.previewpoly(cmd, data) except ValueError: pass # For all other events call base class event handling return super(RadarWidget, self).event(event)
def event(self, event): ''' Event handling for input events. ''' if event.type() == QEvent.Wheel: # For mice we zoom with control/command and the scrolwheel if event.modifiers() & Qt.ControlModifier: origin = (event.pos().x(), event.pos().y()) zoom = 1.0 try: if event.pixelDelta(): # High resolution scroll zoom *= (1.0 + 0.01 * event.pixelDelta().y()) else: # Low resolution scroll zoom *= (1.0 + 0.001 * event.angleDelta().y()) except AttributeError: zoom *= (1.0 + 0.001 * event.delta()) self.panzoomchanged = True return self.panzoom(zoom=zoom, origin=origin) # For touchpad scroll (2D) is used for panning else: try: dlat = 0.01 * event.pixelDelta().y() / (self.zoom * self.ar) dlon = -0.01 * event.pixelDelta().x() / (self.zoom * self.flat_earth) self.panzoomchanged = True return self.panzoom(pan=(dlat, dlon)) except AttributeError: pass # For touchpad, pinch gesture is used for zoom elif event.type() == QEvent.Gesture: pan = zoom = None dlat = dlon = 0.0 for g in event.gestures(): if g.gestureType() == Qt.PinchGesture: zoom = g.scaleFactor() * (zoom or 1.0) if CORRECT_PINCH: zoom /= g.lastScaleFactor() elif g.gestureType() == Qt.PanGesture: if abs(g.delta().y() + g.delta().x()) > 1e-1: dlat += 0.005 * g.delta().y() / (self.zoom * self.ar) dlon -= 0.005 * g.delta().x() / (self.zoom * self.flat_earth) pan = (dlat, dlon) if pan is not None or zoom is not None: self.panzoomchanged = True return self.panzoom(pan, zoom, self.mousepos) elif event.type() == QEvent.MouseButtonPress and event.button() & Qt.LeftButton: self.mousedragged = False # For mice we pan with control/command and mouse movement. # Mouse button press marks the beginning of a pan self.prevmousepos = (event.x(), event.y()) elif event.type() == QEvent.MouseButtonRelease and \ event.button() & Qt.LeftButton and not self.mousedragged: lat, lon = self.pixelCoordsToLatLon(event.x(), event.y()) # TODO: acdata en routedata tostack, tocmdline = radarclick(console.get_cmdline(), lat, lon, self.acdata, self.routedata) if '\n' not in tocmdline: console.append_cmdline(tocmdline) if tostack: console.stack(tostack) elif event.type() == QEvent.MouseMove: self.mousedragged = True self.mousepos = (event.x(), event.y()) if event.buttons() & Qt.LeftButton: dlat = 0.003 * (event.y() - self.prevmousepos[1]) / (self.zoom * self.ar) dlon = 0.003 * (self.prevmousepos[0] - event.x()) / (self.zoom * self.flat_earth) self.prevmousepos = (event.x(), event.y()) self.panzoomchanged = True return self.panzoom(pan=(dlat, dlon)) # Update pan/zoom to simulation thread only when the pan/zoom gesture is finished elif (event.type() == QEvent.MouseButtonRelease or event.type() == QEvent.TouchEnd) and self.panzoomchanged: self.panzoomchanged = False bs.net.send_event(b'PANZOOM', dict(pan=(self.panlat, self.panlon), zoom=self.zoom, ar=self.ar, absolute=True)) # If this is a mouse move event, check if we are updating a preview poly if self.mousepos != self.prevmousepos: cmd = console.get_cmd() nargs = len(console.get_args()) if cmd in ['AREA', 'BOX', 'POLY','POLYLINE', 'POLYALT', 'POLYGON', 'CIRCLE', 'LINE'] and nargs >= 2: self.prevmousepos = self.mousepos try: # get the largest even number of points start = 0 if cmd == 'AREA' else 3 if cmd == 'POLYALT' else 1 end = ((nargs - start) // 2) * 2 + start data = [float(v) for v in console.get_args()[start:end]] data += self.pixelCoordsToLatLon(*self.mousepos) self.previewpoly(cmd, data) except ValueError: pass # For all other events call base class event handling return super(RadarWidget, self).event(event)