| 31 return max(state1, state2) |
32 return max(state1, state2) |
| 32 |
33 |
| 33 # Workaround to rumps brokenness; |
34 # Workaround to rumps brokenness; |
| 34 # see https://github.com/jaredks/rumps/issues/59 |
35 # see https://github.com/jaredks/rumps/issues/59 |
| 35 def notification_workaround(title, subtitle, message): |
36 def notification_workaround(title, subtitle, message): |
| 36 NSDictionary = objc.lookUpClass("NSDictionary") |
37 try: |
| 37 d=NSDictionary() |
38 NSDictionary = objc.lookUpClass("NSDictionary") |
| 38 |
39 d=NSDictionary() |
| 39 rumps.notification(title, subtitle, message, data=d) |
40 |
| |
41 rumps.notification(title, subtitle, message, data=d) |
| |
42 except Exception as err: |
| |
43 logger.debug('Unable to display notificaton:%s:%s',err.__class__.__name__, str(err)) |
| 40 |
44 |
| 41 # Based on code snatched from |
45 # Based on code snatched from |
| 42 # https://stackoverflow.com/questions/12523586/python-format-size-application-converting-b-to-kb-mb-gb-tb/37423778 |
46 # https://stackoverflow.com/questions/12523586/python-format-size-application-converting-b-to-kb-mb-gb-tb/37423778 |
| 43 def humanbytes(B): |
47 def humanbytes(B): |
| 44 'Return the given bytes as a human friendly KB, MB, GB, or TB string' |
48 'Return the given bytes as a human friendly KB, MB, GB, or TB string' |
| 128 self.statuses[index]=b.status() |
131 self.statuses[index]=b.status() |
| 129 |
132 |
| 130 menu, state=self.__rebuild_menu() |
133 menu, state=self.__rebuild_menu() |
| 131 |
134 |
| 132 self.refresh_timer=None |
135 self.refresh_timer=None |
| |
136 self.logwindow=None |
| 133 |
137 |
| 134 super().__init__(traynames[state], menu=menu, quit_button=None) |
138 super().__init__(traynames[state], menu=menu, quit_button=None) |
| 135 |
139 |
| 136 def __rebuild_menu(self): |
140 def __rebuild_menu(self): |
| 137 menu=[] |
141 menu=[] |
| 145 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b) |
149 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b) |
| 146 item=rumps.MenuItem(title, callback=cbm) |
150 item=rumps.MenuItem(title, callback=cbm) |
| 147 menu.append(item) |
151 menu.append(item) |
| 148 state=combine_state(state, this_state) |
152 state=combine_state(state, this_state) |
| 149 |
153 |
| |
154 menu_log=rumps.MenuItem("Show log", callback=self.showlog) |
| |
155 menu.append(menu_log) |
| |
156 |
| 150 if not settings['no_quit_menu_entry']: |
157 if not settings['no_quit_menu_entry']: |
| 151 menu_quit=rumps.MenuItem("Quit...", callback=self.my_quit) |
158 menu_quit=rumps.MenuItem("Quit...", callback=self.my_quit) |
| 152 menu.append(menu_quit) |
159 menu.append(menu_quit) |
| 153 |
160 |
| 154 return menu, state |
161 return menu, state |
| 178 msgid=errorlog['msgid'] |
185 msgid=errorlog['msgid'] |
| 179 |
186 |
| 180 logger.debug("Opening notification for error %s '%s'", |
187 logger.debug("Opening notification for error %s '%s'", |
| 181 msgid, errorlog['message']) |
188 msgid, errorlog['message']) |
| 182 |
189 |
| 183 notification_workaround(appname_stylised, |
190 notification_workaround(borgend.appname_stylised, |
| 184 msgid, errorlog['message']) |
191 msgid, errorlog['message']) |
| 185 |
192 |
| 186 def my_quit(self, _): |
193 def my_quit(self, _): |
| |
194 logging.shutdown() |
| 187 rumps.quit_application() |
195 rumps.quit_application() |
| 188 |
196 |
| 189 def __menu_select_backup(self, sender, b): |
197 def __menu_select_backup(self, sender, b): |
| 190 #sender.state=not sender.state |
198 #sender.state=not sender.state |
| 191 logger.debug("Manually backup '%s'", b.name) |
199 logger.debug("Manually backup '%s'", b.name) |
| 192 try: |
200 try: |
| 193 b.create(None) |
201 b.create(None) |
| 194 except Exception as err: |
202 except Exception as err: |
| 195 logger.debug("Opening notification for exception %s '%s'", |
203 logger.debug("Opening notification for exception %s '%s'", |
| 196 err.__class__.__name__, str(err)) |
204 err.__class__.__name__, str(err)) |
| 197 notification_workaround(appname_stylised, |
205 notification_workaround(borgend.appname_stylised, |
| 198 err.__class__.__name__, str(err)) |
206 err.__class__.__name__, str(err)) |
| 199 |
207 |
| 200 @rumps.notifications |
208 @rumps.notifications |
| 201 def notification_center(data): |
209 def notification_center(data): |
| 202 pass |
210 pass |
| 203 |
211 |
| |
212 def showlog(self, _): |
| |
213 try: |
| |
214 if not self.logwindow: |
| |
215 lines=borgend.fifolog.formatAll() |
| |
216 msg="\n".join(lines[0:]) |
| |
217 self.logwindow=rumps.Window(title=borgend.appname_stylised+' log', |
| |
218 default_text=msg, |
| |
219 ok='Close', |
| |
220 dimensions=(640,320)) |
| |
221 self.logwindow.run() |
| |
222 # Does not return until closed |
| |
223 self.logwindow=None |
| |
224 except Exception as err: |
| |
225 logger.critical('%s:%s', err.__class__.__name__, str(err)) |
| |
226 |