| 27 twhen=time.localtime(when+30) |
30 twhen=time.localtime(when+30) |
| 28 whenstr='at %02d:%02d' % (twhen.tm_hour, twhen.tm_min) |
31 whenstr='at %02d:%02d' % (twhen.tm_hour, twhen.tm_min) |
| 29 detail='' |
32 detail='' |
| 30 if 'detail' in status and status['detail']: |
33 if 'detail' in status and status['detail']: |
| 31 detail=status['detail']+' ' |
34 detail=status['detail']+' ' |
| 32 return "%s (%s%s %s)" % (status['name'], detail, status['operation'], whenstr) |
35 title="%s (%s%s %s)" % (status['name'], detail, status['operation'], whenstr) |
| 33 elif status['type']=='current': |
36 elif status['type']=='current': |
| 34 # Operation running |
37 # Operation running |
| 35 return "%s (running: %s)" % (status['name'], status['operation']) |
38 title="%s (running: %s)" % (status['name'], status['operation']) |
| |
39 active=True |
| 36 else: # status['type']=='nothing': |
40 else: # status['type']=='nothing': |
| 37 # Should be unscheduled, nothing running |
41 # Should be unscheduled, nothing running |
| 38 return status['name'] |
42 title=status['name'] |
| |
43 |
| |
44 return title, active |
| 39 |
45 |
| 40 |
46 |
| 41 class BorgendTray(rumps.App): |
47 class BorgendTray(rumps.App): |
| 42 def __init__(self, name, backups): |
48 def __init__(self, name, backups): |
| 43 self.lock=Lock() |
49 self.lock=Lock() |
| 58 cb=(lambda obj, status, _index=index: |
64 cb=(lambda obj, status, _index=index: |
| 59 self.__status_callback(obj, _index, status)) |
65 self.__status_callback(obj, _index, status)) |
| 60 b.set_status_update_callback(cb) |
66 b.set_status_update_callback(cb) |
| 61 self.statuses[index]=b.status() |
67 self.statuses[index]=b.status() |
| 62 |
68 |
| 63 menu=self.__rebuild_menu() |
69 menu, active=self.__rebuild_menu() |
| 64 |
70 |
| 65 super().__init__(name, menu=menu, quit_button=None) |
71 super().__init__(traynames[active], menu=menu, quit_button=None) |
| 66 |
72 |
| 67 def __rebuild_menu(self): |
73 def __rebuild_menu(self): |
| 68 menu=[] |
74 menu=[] |
| |
75 active=False |
| 69 for index in range(len(self.backups)): |
76 for index in range(len(self.backups)): |
| 70 b=self.backups[index] |
77 b=self.backups[index] |
| 71 title=make_title(self.statuses[index]) |
78 title, this_active=make_title(self.statuses[index]) |
| 72 logging.info('TITLE: %s' % title) |
79 logging.info('TITLE: %s' % title) |
| 73 # Python closures suck dog's balls... |
80 # Python closures suck dog's balls... |
| 74 # first and the last program I write in Python until somebody |
81 # first and the last program I write in Python until somebody |
| 75 # fixes this brain damage |
82 # fixes this brain damage |
| 76 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b) |
83 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b) |
| 77 item=rumps.MenuItem(title, callback=cbm) |
84 item=rumps.MenuItem(title, callback=cbm) |
| 78 menu.append(item) |
85 menu.append(item) |
| |
86 active=active or this_active |
| 79 |
87 |
| 80 menu_quit=rumps.MenuItem("Quit...", callback=self.my_quit) |
88 menu_quit=rumps.MenuItem("Quit...", callback=self.my_quit) |
| 81 menu.append(menu_quit) |
89 menu.append(menu_quit) |
| 82 |
90 |
| 83 return menu |
91 return menu, active |
| 84 |
92 |
| 85 |
93 |
| 86 def my_quit(self, _): |
94 def my_quit(self, _): |
| 87 rumps.quit_application() |
95 rumps.quit_application() |
| 88 |
96 |
| 95 logging.debug('Status callbackup %s' % str(status)) |
103 logging.debug('Status callbackup %s' % str(status)) |
| 96 with self.lock: |
104 with self.lock: |
| 97 self.statuses[index]=status |
105 self.statuses[index]=status |
| 98 logging.debug('Rebuilding menu') |
106 logging.debug('Rebuilding menu') |
| 99 self.menu.clear() |
107 self.menu.clear() |
| 100 self.menu.update(self.__rebuild_menu()) |
108 menu, active=self.__rebuild_menu() |
| |
109 print(active) |
| |
110 self.menu.update(menu) |
| |
111 self.title=traynames[active] |
| 101 |
112 |
| 102 |
113 |
| 103 |
114 |