ui.py

changeset 27
a347387868be
parent 21
c36e549a7f12
child 28
a7c56424e867
equal deleted inserted replaced
26:814937cbe9db 27:a347387868be
4 4
5 import rumps 5 import rumps
6 import time 6 import time
7 import datetime 7 import datetime
8 import logging 8 import logging
9 from threading import Lock 9 from threading import Lock, Timer
10 import objc 10 import objc
11 11
12 INACTIVE=0 12 INACTIVE=0
13 ACTIVE=1 13 ACTIVE=1
14 OFFLINE=2 14 OFFLINE=2
18 INACTIVE: 'B.', 18 INACTIVE: 'B.',
19 ACTIVE: 'B!', 19 ACTIVE: 'B!',
20 OFFLINE: 'B⦙', 20 OFFLINE: 'B⦙',
21 ERRORS: 'B?' 21 ERRORS: 'B?'
22 } 22 }
23
24 # Refresh the menu at most once a second to reduce flicker
25 refresh_interval=1.0
23 26
24 def combine_state(state1, state2): 27 def combine_state(state1, state2):
25 return max(state1, state2) 28 return max(state1, state2)
26 29
27 # Based on code snatched from 30 # Based on code snatched from
113 b.set_status_update_callback(cb) 116 b.set_status_update_callback(cb)
114 self.statuses[index]=b.status() 117 self.statuses[index]=b.status()
115 118
116 menu, state=self.__rebuild_menu() 119 menu, state=self.__rebuild_menu()
117 120
121 self.refresh_timer=None
122
118 super().__init__(traynames[state], menu=menu, quit_button=None) 123 super().__init__(traynames[state], menu=menu, quit_button=None)
119 124
120 def __rebuild_menu(self): 125 def __rebuild_menu(self):
121 menu=[] 126 menu=[]
122 state=INACTIVE 127 state=INACTIVE
143 def __menu_select_backup(self, sender, b): 148 def __menu_select_backup(self, sender, b):
144 #sender.state=not sender.state 149 #sender.state=not sender.state
145 logging.debug("Manually backup '%s'", b.name) 150 logging.debug("Manually backup '%s'", b.name)
146 b.create(None) 151 b.create(None)
147 152
153
154 def refresh_ui(self):
155 with self.lock:
156 self.refresh_timer=None
157 logging.debug('Rebuilding menu')
158 self.menu.clear()
159 menu, active=self.__rebuild_menu()
160 self.menu.update(menu)
161 self.title=traynames[active]
162
148 def __status_callback(self, obj, index, status, errorlog): 163 def __status_callback(self, obj, index, status, errorlog):
149 logging.debug('Status callbackup %s' % str(status)) 164 logging.debug('Status callbackup %s' % str(status))
150 165
151 with self.lock: 166 with self.lock:
152 self.statuses[index]=status 167 self.statuses[index]=status
153 logging.debug('Rebuilding menu') 168 if self.refresh_timer==None:
154 self.menu.clear() 169 self.refresh_timer=Timer(refresh_interval, self.refresh_ui)
155 menu, active=self.__rebuild_menu() 170 self.refresh_timer.start()
156 self.menu.update(menu)
157 self.title=traynames[active]
158 171
159 if errorlog: 172 if errorlog:
160 if 'msgid' not in errorlog or not isinstance(errorlog['msgid'], str): 173 if 'msgid' not in errorlog or not isinstance(errorlog['msgid'], str):
161 msgid='UnknownError' 174 msgid='UnknownError'
162 else: 175 else:

mercurial