Verbessertes Zeichnen mit mehreren Drawing-Areas
This commit is contained in:
		
							parent
							
								
									20882feeca
								
							
						
					
					
						commit
						f3c9ced477
					
				|  | @ -8,3 +8,7 @@ class AppData(): | |||
|     def __init__(self): | ||||
|         self.shutdown = False # Globaler Ausschalter | ||||
|         self.track = Tracker('NONE') | ||||
|         self.frontend = None | ||||
| 
 | ||||
|     def setFrontend(self, frontend): | ||||
|         self.frontend = frontend # Referenz zur GUI | ||||
|  |  | |||
							
								
								
									
										69
									
								
								led.py
								
								
								
								
							
							
						
						
									
										69
									
								
								led.py
								
								
								
								
							|  | @ -39,9 +39,11 @@ class LED(): | |||
|         self._brightness = 0.0 | ||||
|         self._color_off = (0.3725, 0.4275, 0.6078) # RGB(95, 109, 155) | ||||
|         self._pos_x = 30 | ||||
|         self._pos_y = 16 | ||||
|         self._radius = 4 | ||||
|         self._pos_y = 14 | ||||
|         self._radius = 5 | ||||
|         self._flashcounter = 0 | ||||
|         self._flashcolor = (0, 0, 0) | ||||
|         self._enabled = False | ||||
| 
 | ||||
|         # Box oberhalb des Displays | ||||
|         self._da = Gtk.DrawingArea() | ||||
|  | @ -50,11 +52,17 @@ class LED(): | |||
|         self._da.connect("draw", self.on_draw) | ||||
| 
 | ||||
|     def on_draw(self, widget, ctx): | ||||
|         #Debug | ||||
|         # Debug um Zeichenbereich zu sehen | ||||
|         #ctx.set_line_width(1.0) | ||||
|         #ctx.set_source_rgb(1, 0, 0) | ||||
|         #ctx.rectangle(0, 0, 400, 32) | ||||
|         #ctx.rectangle(0.5, 0.5, 400, 32) | ||||
|         #ctx.stroke() | ||||
|         print("LED draw") | ||||
|         ctx.set_line_width(2.0) | ||||
|         if self._brightness == 0: | ||||
|             ctx.set_source_rgb(*self._color_off) | ||||
|         else: | ||||
|             ctx.set_source_rgb(*self._color) | ||||
|         ctx.arc(self._pos_x, self._pos_y, self._radius, 0, 2*math.pi) | ||||
|         ctx.fill_preserve() | ||||
|         ctx.set_source_rgb(0, 0, 0) # Schwarzer Rand | ||||
|  | @ -63,39 +71,46 @@ class LED(): | |||
|         ctx.stroke() | ||||
| 
 | ||||
|     def on_timer(self): | ||||
|         print("Timer") | ||||
|         self.switchOff() | ||||
|         return True | ||||
|         return False | ||||
| 
 | ||||
|     def on_blink(self): | ||||
|         print("Blink-Timer") | ||||
|         return False | ||||
| 
 | ||||
|     def on_flash(self): | ||||
|         # TODO do not wait for drawing event but draw immediately | ||||
|         print("Flash-Timer", self._brightness) | ||||
|         self._da.queue_draw() | ||||
|         if self._brightness == 1: | ||||
|             self._brightness = 0 | ||||
|         else: | ||||
|             self._brightness = 1 | ||||
|         if  self._flashcounter > 0: | ||||
|             if self._brightness == 0: | ||||
|                 self._flashcounter -=1 | ||||
|             print("Flash timer ongoing") | ||||
|             return True | ||||
|         print("Flash finished") | ||||
|         self._brightness = 0 | ||||
|         return False | ||||
| 
 | ||||
|     def switchOn(self, duration=None): | ||||
|         self._brightness = 1.0 | ||||
|         self._ctx.save() | ||||
|         self._ctx.set_source_rgb(*self._color) | ||||
|         self._ctx.arc(self._pos_x, self._pos_y, self._radius, 0, 2*math.pi) | ||||
|         self._ctx.fill_preserve() | ||||
|         self._ctx.set_source_rgb((0, 0, 0)) # Schwarzer Rand | ||||
|         self._ctx.stroke() | ||||
|         self._ctx.restore() | ||||
|         if self._duration: | ||||
|             GLib.timeout_add_seconds(duration, self.on_flash) | ||||
|              | ||||
|         self._da.queue_draw() | ||||
|         if duration: | ||||
|             GLib.timeout_add_seconds(duration, self.on_timer) | ||||
| 
 | ||||
|     def switchOff(self): | ||||
|         self._brightness = 0.0 | ||||
|         self._ctx.save() | ||||
|         self._ctx.set_source_rgb(*self._color_off) | ||||
|         self._ctx.arc(self._pos_x, self._pos_y, self._radius, 0, 2*math.pi) | ||||
|         self._ctx.fill_preserve() | ||||
|         self._ctx.set_source_rgb((0, 0, 0)) # Schwarzer Rand | ||||
|         self._ctx.stroke() | ||||
|         self._ctx.restore() | ||||
|         self._da.queue_draw() | ||||
| 
 | ||||
|     def doBlink(self, duration=None): | ||||
|         pass | ||||
| 
 | ||||
|     def doFlash(self, count=1): | ||||
|         self._cr = self._da.get_window().cairo_create() # Context for immediate drawing | ||||
|         if (self._brightness > 0) or (count < 0): | ||||
|             # Wenn aktiv oder falscher Parameter, dann passiert nichts | ||||
|             return | ||||
|  | @ -104,7 +119,9 @@ class LED(): | |||
|             self._flashcounter = 10 | ||||
|         else: | ||||
|             self._flashcounter = count | ||||
|         GLib.timeout_add_seconds(0.2, self.on_flash) | ||||
|         self._brightness = 1 | ||||
|         self._da.queue_draw() | ||||
|         GLib.timeout_add_seconds(0.5, self.on_flash) | ||||
| 
 | ||||
|     def setColor(self, colorname, brightness=1.0): | ||||
|         #TODO Helligkeit einstellen | ||||
|  | @ -118,8 +135,10 @@ class LED(): | |||
|         return self._color | ||||
| 
 | ||||
|     def getColorAsHex(self): | ||||
|         # TODO | ||||
|         return None | ||||
|         return '#{:02x}{:02x}{:02x}'.format( | ||||
|             int(self._color[0] * 255), | ||||
|             int(self._color[1] * 255), | ||||
|             int(self._color[2] * 255)) | ||||
| 
 | ||||
|     def setBrightness(self, newbrightness): | ||||
|         # 0% bis 100%, ausgehend von der aktuellen Basisfarbe | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ passcode = 123456 | |||
| trace = false | ||||
| 
 | ||||
| [boat] | ||||
| name = MY boat | ||||
| name = My boat | ||||
| sailno = GER 4711 | ||||
| class = One off | ||||
| handicap = 100.0 | ||||
|  |  | |||
							
								
								
									
										27
									
								
								obp60v.py
								
								
								
								
							
							
						
						
									
										27
									
								
								obp60v.py
								
								
								
								
							|  | @ -300,6 +300,7 @@ class Frontend(Gtk.Window): | |||
|     def __init__(self, cfg, appdata, device, boatdata, profile): | ||||
|         super().__init__() | ||||
|         self.appdata = appdata | ||||
|         self.appdata.setFrontend(self) | ||||
|         self.owndev = device | ||||
|         self.boatdata = boatdata | ||||
|         self._config = cfg['_config'] | ||||
|  | @ -364,14 +365,19 @@ class Frontend(Gtk.Window): | |||
|         self.add(self.fixed) | ||||
| 
 | ||||
|         # OBP GUI | ||||
|         # Geräterahmen mit Buttons | ||||
|         self.da_device = Gtk.DrawingArea() | ||||
|         self.fixed.put(self.da_device, 0, 0) | ||||
|         self.da_device.set_size_request(530, 555) # für fixed benötigt | ||||
|         self.da_device.add_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK) | ||||
|         self.da_device.connect("draw", self.da_device_draw) | ||||
|         self.da_device.connect('button-press-event', self.da_button_press) | ||||
|         self.da_device.connect('button-release-event', self.da_button_release) | ||||
|         # Displayfläche | ||||
|         self.da = Gtk.DrawingArea() | ||||
|         self.da.add_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK) | ||||
|         self.fixed.put(self.da, 0, 0) | ||||
|         self.da.set_size_request(530, 555) # für fixed benötigt | ||||
|         self.fixed.put(self.da, 64, 95) | ||||
|         self.da.set_size_request(400, 300) # für fixed benötigt | ||||
|         self.da.connect("draw", self.da_draw) | ||||
|         self.da.connect('button-press-event', self.da_button_press) | ||||
|         self.da.connect('button-release-event', self.da_button_release) | ||||
| 
 | ||||
|         # Flash LED | ||||
|         self.flashled = LED(self.fixed) # Soft Flash-LED | ||||
| 
 | ||||
|  | @ -399,7 +405,7 @@ class Frontend(Gtk.Window): | |||
|         # Tastaturstatus an Seite durchreichen | ||||
|         self.curpage.keylock = self.keylock | ||||
|         # Neuzeichnen | ||||
|         self.queue_draw() | ||||
|         self.da.queue_draw() | ||||
|         return True | ||||
| 
 | ||||
|     def on_draw(self, widget, ctx): | ||||
|  | @ -407,7 +413,7 @@ class Frontend(Gtk.Window): | |||
|         ctx.set_source_rgba(0, 0, 0, 0) | ||||
|         ctx.paint() | ||||
| 
 | ||||
|     def da_draw(self, widget, ctx): | ||||
|     def da_device_draw(self, widget, ctx): | ||||
|         viewport = Rsvg.Rectangle() | ||||
|         viewport.x = 0 | ||||
|         viewport.y = 0 | ||||
|  | @ -418,16 +424,15 @@ class Frontend(Gtk.Window): | |||
|             viewport.width = 530 | ||||
|             viewport.height = 555 | ||||
|         self._svg.render_document(ctx, viewport) | ||||
| 
 | ||||
|     def da_draw(self, widget, ctx): | ||||
|         ctx.set_source_rgb(1.0, 0, 0) | ||||
|         if not self._fullscreen: | ||||
|             ctx.translate(64, 95) # Koordinatenursprung auf virtuellen Displaybereich setzen | ||||
|             ctx.rectangle(0, 0, 400, 300) | ||||
|             ctx.clip() | ||||
|         else: | ||||
|             ctx.scale(1.6, 1.6) | ||||
| 
 | ||||
|         ctx.set_source_rgb(0, 0, 0) # Schwarz auf Weiß | ||||
| 
 | ||||
|         # Heartbeat umschalten | ||||
|         if self.curpage.header: | ||||
|             self.curpage.draw_header(ctx) | ||||
|  |  | |||
|  | @ -40,6 +40,10 @@ class Tracker(Page): | |||
|             else: | ||||
|                 self._appdata.track.set_active(True) | ||||
|                 self.buttonlabel[2] = 'OFF' | ||||
|         elif buttonid == 5: | ||||
|             self._appdata.frontend.flashled.setColor('yellow') | ||||
|             #self._appdata.frontend.flashled.switchOn(4) | ||||
|             self._appdata.frontend.flashled.doFlash(2) | ||||
| 
 | ||||
|     def draw_normal(self, ctx): | ||||
|         # Name | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue