Anker-Konfigurationsseite, erste Versuche mit Menü
This commit is contained in:
		
							parent
							
								
									664d6c7d49
								
							
						
					
					
						commit
						986d222a98
					
				|  | @ -0,0 +1,48 @@ | ||||||
|  | """ | ||||||
|  | Menüsystem für Konfiguration(en) | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | class MenuItem(): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, itmname): | ||||||
|  |         self.name = itmname | ||||||
|  |         self.label = None | ||||||
|  |         self.value = None | ||||||
|  |         self.steps = (1,) | ||||||
|  | 
 | ||||||
|  |     def setValue(self, val): | ||||||
|  |         self.value = val | ||||||
|  | 
 | ||||||
|  | class Menu(): | ||||||
|  | 
 | ||||||
|  |     def __init__(self): | ||||||
|  |         title = None | ||||||
|  |         x = 0 | ||||||
|  |         y = 0 | ||||||
|  |         w = 100 | ||||||
|  |         h = 20 | ||||||
|  |         items = [] | ||||||
|  |         itm_active = -1 # nothing activated | ||||||
|  |         self._index = -1 | ||||||
|  | 
 | ||||||
|  |     def addItem(self, label): | ||||||
|  |         itm = MenuItem(label) | ||||||
|  |         items.append(itm) | ||||||
|  | 
 | ||||||
|  | class MenuIter(): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, menu): | ||||||
|  |         self._items = menu.items | ||||||
|  |         self._class_size = len(self._items) | ||||||
|  |         self._index = 0 | ||||||
|  | 
 | ||||||
|  |     def __iter__(self): | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def __next__(self): | ||||||
|  |         if self._index < self._class_size: | ||||||
|  |             itm = items[self._index] | ||||||
|  |             self._index += 1 | ||||||
|  |             return itm | ||||||
|  |         raise StopIteration  | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 135 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 138 B | 
|  | @ -409,7 +409,7 @@ class Frontend(Gtk.Window): | ||||||
|             self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) |             self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) | ||||||
| 
 | 
 | ||||||
|     def run(self): |     def run(self): | ||||||
|         GLib.timeout_add_seconds(2, self.on_timer) |         GLib.timeout_add_seconds(1, self.on_timer) | ||||||
|         self.show_all() |         self.show_all() | ||||||
|         Gtk.main() |         Gtk.main() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										134
									
								
								pages/anchor.py
								
								
								
								
							
							
						
						
									
										134
									
								
								pages/anchor.py
								
								
								
								
							|  | @ -17,7 +17,7 @@ Daten | ||||||
|   - Zeitpunkt des Ankeraus |   - Zeitpunkt des Ankeraus | ||||||
| 
 | 
 | ||||||
| Darstellung: | Darstellung: | ||||||
|   - Modi:  |   - Modi: Normal / Konfiguration | ||||||
|   - Anker oben / unten |   - Anker oben / unten | ||||||
|   - Nord ist oben  |   - Nord ist oben  | ||||||
| 
 | 
 | ||||||
|  | @ -31,6 +31,7 @@ import os | ||||||
| import cairo | import cairo | ||||||
| import math | import math | ||||||
| import time | import time | ||||||
|  | from cfgmenu import Menu | ||||||
| from .page import Page | from .page import Page | ||||||
| 
 | 
 | ||||||
| class Anchor(Page): | class Anchor(Page): | ||||||
|  | @ -67,43 +68,86 @@ class Anchor(Page): | ||||||
|         self.alarm = False # Alarm ist ausgelöst und aktiv |         self.alarm = False # Alarm ist ausgelöst und aktiv | ||||||
|         self.wind_angle = -1 |         self.wind_angle = -1 | ||||||
| 
 | 
 | ||||||
|  |         # Menüsteuerung für Konfiguration | ||||||
|  |         self._mnu = { | ||||||
|  |             # Lfd. Name, curr unit steps type: numeric, on/off | ||||||
|  |             # TODO Das sollte eine Klasse werden! | ||||||
|  |             'chain': [1, "Chain out", 0, "m", (1, 5, 10), (0, 200)], | ||||||
|  |             'chainmax': [2, "Chain max", 0, "m", (1, 5, 10), (0, 200)], | ||||||
|  |             'zoom': [3, "Zoom", 50, "", (1,), (1, 8)], | ||||||
|  |             'range': [4, "Alarm range", 35, "m", (1, 5, 10), (0, 200)] | ||||||
|  |         } | ||||||
|  |         self._mnu_title = "Options" | ||||||
|  |         self._mnu_x = 20 | ||||||
|  |         self._mnu_y = 80 | ||||||
|  |         self._mnu_w = 120 | ||||||
|  |         self._mnu_h = 20 | ||||||
|  |         self._mnu_sel = 1 | ||||||
|  |         self.mnu_step = 1 | ||||||
|  | 
 | ||||||
|     def handle_key(self, buttonid): |     def handle_key(self, buttonid): | ||||||
|         if buttonid == 1: |         if buttonid == 1: | ||||||
|             if self.mode == 'N': |             if self.mode == 'N': | ||||||
|                 self.mode = 'C' |                 self.mode = 'C' | ||||||
|  |                 self.buttonlabel[2] = '#UP' | ||||||
|  |                 self.buttonlabel[3] = '#DOWN' | ||||||
|  |                 self.buttonlabel[4] = '[ - ]' | ||||||
|  |                 self.buttonlabel[5] = '[ + ]' | ||||||
|  |                 self.buttonlabel[6] = 'STEP' | ||||||
|             else: |             else: | ||||||
|                 self.mode = 'N' |                 self.mode = 'N' | ||||||
|  |                 self.buttonlabel[2] = 'RISE' if self.anchor_set else 'DROP' | ||||||
|  |                 self.buttonlabel[3] = '#PREV' | ||||||
|  |                 self.buttonlabel[4] = '#NEXT' | ||||||
|  |                 self.buttonlabel[5] = 'ALARM' if not self.alarm_enabled else 'OFF' | ||||||
|  |             return True | ||||||
|  |         if self.mode == 'N': | ||||||
|  |             # Normal | ||||||
|  |             if buttonid == 2: | ||||||
|  |                 if not self.anchor_set: | ||||||
|  |                     self.anchor_lat = self._bd.lat | ||||||
|  |                     self.anchor_lon = self._bd.lon | ||||||
|  |                     self.anchor_set = True | ||||||
|  |                     self.anchor_ts = time.time() | ||||||
|  |                     self.buttonlabel[2] = 'RISE' | ||||||
|  |                     self.buttonlabel[5] = 'ALARM' | ||||||
|  |                 else: | ||||||
|  |                     self.anchor_set = False | ||||||
|  |                     self.alarm = False | ||||||
|  |                     self.alarm_enabled = False | ||||||
|  |                     self.anchor_ts = None | ||||||
|  |                     self.buttonlabel[2] = 'DROP' | ||||||
|  |                     self.buttonlabel[5] = '' | ||||||
|  |                 return True | ||||||
|  |             elif buttonid == 5: | ||||||
|  |                 # Bei aktivem Alarm kann mit dieser Taste der Alarm zurückgesetzt | ||||||
|  |                 # werden. Die Tastenbeschriftung wechselt zwischen ALARM und OFF. | ||||||
|  |                 if self.alarm: | ||||||
|  |                     self.alarm = False | ||||||
|  |                     self.buttonlabel[5] = 'ALARM' | ||||||
|  |                 if self.alarm_enabled: | ||||||
|  |                     self.alarm_enabled = False | ||||||
|  |                     self.buttonlabel[5] = 'ALARM' | ||||||
|  |                 else: | ||||||
|  |                     self.alarm_enabled = True | ||||||
|  |                     self.buttonlabel[5] = 'OFF' | ||||||
|  |                 return True | ||||||
|  |         else: | ||||||
|  |             # Konfiguration | ||||||
|  |             if buttonid == 2: | ||||||
|  |                 if self._mnu_sel == 1: | ||||||
|  |                     self._mnu_sel = len(self._mnu) | ||||||
|  |                 else: | ||||||
|  |                     self._mnu_sel -= 1 | ||||||
|  |             elif buttonid == 3: | ||||||
|  |                 if self._mnu_sel == len(self._mnu): | ||||||
|  |                     self._mnu_sel = 1 | ||||||
|  |                 else: | ||||||
|  |                     self._mnu_sel += 1 | ||||||
|             return True |             return True | ||||||
|         if buttonid == 2: |  | ||||||
|             if not self.anchor_set: |  | ||||||
|                 self.anchor_lat = self._bd.lat |  | ||||||
|                 self.anchor_lon = self._bd.lon |  | ||||||
|                 self.anchor_set = True |  | ||||||
|                 self.anchor_ts = time.time() |  | ||||||
|                 self.buttonlabel[2] = 'RISE' |  | ||||||
|                 self.buttonlabel[5] = 'ALARM' |  | ||||||
|             else: |  | ||||||
|                 self.anchor_set = False |  | ||||||
|                 self.alarm = False |  | ||||||
|                 self.alarm_enabled = False |  | ||||||
|                 self.anchor_ts = None |  | ||||||
|                 self.buttonlabel[2] = 'DROP' |  | ||||||
|                 self.buttonlabel[5] = '' |  | ||||||
|         if buttonid == 5: |  | ||||||
|             # Bei aktivem Alarm kann mit dieser Taste der Alarm zurückgesetzt |  | ||||||
|             # werden. Die Tastenbeschriftung wechselt zwischen ALARM und OFF. |  | ||||||
|             if self.alarm: |  | ||||||
|                 self.alarm = False |  | ||||||
|                 self.buttonlabel[5] = 'ALARM' |  | ||||||
|             if self.alarm_enabled: |  | ||||||
|                 self.alarm_enabled = False |  | ||||||
|                 self.buttonlabel[5] = 'ALARM' |  | ||||||
|             else: |  | ||||||
|                 self.alarm_enabled = True |  | ||||||
|                 self.buttonlabel[5] = 'OFF' |  | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|     def draw(self, ctx): |     def draw_normal(self, ctx): | ||||||
| 
 | 
 | ||||||
|         """ |         """ | ||||||
|         value1 = LAT |         value1 = LAT | ||||||
|  | @ -208,3 +252,35 @@ class Anchor(Page): | ||||||
|             for point in wind[1:]: |             for point in wind[1:]: | ||||||
|                 ctx.line_to(*point) |                 ctx.line_to(*point) | ||||||
|             ctx.fill() |             ctx.fill() | ||||||
|  | 
 | ||||||
|  |     def draw_config(self, ctx): | ||||||
|  |         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||||
|  |         ctx.set_font_size(20) | ||||||
|  | 
 | ||||||
|  |         ctx.move_to(2, 50) | ||||||
|  |         ctx.show_text("Anchor configuration") | ||||||
|  | 
 | ||||||
|  |         # Menüwerte initialisieren | ||||||
|  |         self._mnu["chain"][2] = self.chain | ||||||
|  |         self._mnu["chainmax"][2] = self.chain_length | ||||||
|  | 
 | ||||||
|  |         # Menü zeichnen | ||||||
|  |         ctx.save() | ||||||
|  |         ctx.set_font_size(16) | ||||||
|  |         #ctx.rectangle(100, 100, 50, 50) | ||||||
|  |         #ctx.clip() | ||||||
|  |         for m in self._mnu.items(): | ||||||
|  |             #ctx.move_to(self._mnu_x, self._mnu_y + 24 + m[1][0] * 16) | ||||||
|  |             #ctx.show_text(m[1][1]) | ||||||
|  |             inverted = (m[1][0] == self._mnu_sel) | ||||||
|  |             self.draw_text_boxed(ctx, self._mnu_x, self._mnu_y + self._mnu_h * (m[1][0] - 1), self._mnu_w, self._mnu_h, m[1][1], inverted) | ||||||
|  |             ctx.move_to(self._mnu_x + self._mnu_w + 20 , self._mnu_y + self._mnu_h * (m[1][0] - 1)) | ||||||
|  |             ctx.show_text(str(m[1][2]) + m[1][3]) | ||||||
|  |         ctx.stroke() | ||||||
|  |         ctx.restore() | ||||||
|  | 
 | ||||||
|  |     def draw(self, ctx): | ||||||
|  |         if self.mode == 'N': | ||||||
|  |             self.draw_normal(ctx) | ||||||
|  |         else: | ||||||
|  |             self.draw_config(ctx) | ||||||
|  |  | ||||||
|  | @ -77,6 +77,8 @@ class Page(): | ||||||
|         self.icon = {} |         self.icon = {} | ||||||
|         self.icon['PREV'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_l1.png")) |         self.icon['PREV'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_l1.png")) | ||||||
|         self.icon['NEXT'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_r1.png")) |         self.icon['NEXT'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_r1.png")) | ||||||
|  |         self.icon['UP'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_up.png")) | ||||||
|  |         self.icon['DOWN'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "arrow_dn.png")) | ||||||
|         self.icon['ILUM'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lighton.png")) |         self.icon['ILUM'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lighton.png")) | ||||||
|         self.sym_lock = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lock.png")) |         self.sym_lock = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lock.png")) | ||||||
|         self.sym_swipe = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "swipe3.png")) |         self.sym_swipe = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "swipe3.png")) | ||||||
|  | @ -276,3 +278,22 @@ class Page(): | ||||||
|         ctx.move_to(x - w, y) |         ctx.move_to(x - w, y) | ||||||
|         ctx.show_text(content) |         ctx.show_text(content) | ||||||
|         ctx.stroke() |         ctx.stroke() | ||||||
|  | 
 | ||||||
|  |     def draw_text_boxed(self, ctx, x, y, w, h, content, inverted=False): | ||||||
|  |         ctx.set_line_width(1) | ||||||
|  |         if inverted: | ||||||
|  |             ctx.set_source_rgb(*self.fgcolor) | ||||||
|  |             ctx.rectangle(x, y + 0.5, w, h) | ||||||
|  |             ctx.fill() | ||||||
|  |         else: | ||||||
|  |             ctx.set_source_rgb(*self.bgcolor) | ||||||
|  |             ctx.rectangle(x, y + 0.5, w, h) | ||||||
|  |             ctx.stroke() | ||||||
|  | 
 | ||||||
|  |         if inverted: | ||||||
|  |             ctx.set_source_rgb(*self.bgcolor) | ||||||
|  |         else: | ||||||
|  |             ctx.set_source_rgb(*self.fgcolor) | ||||||
|  |         ctx.move_to(x + 4, y + h - 5 + 0.5) | ||||||
|  |         ctx.show_text(content) | ||||||
|  |         ctx.stroke() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue