def insert_unload_reload(ar: rumps.MenuItem, j: launchd.LaunchdJob): print(j.plistfilename) ar.add( rumps.MenuItem("Unload", callback=lambda x: launchd.unload(j.plistfilename))) ar.add( rumps.MenuItem("Reload", callback=lambda x: launchd.unload(j.plistfilename) and launchd.load(j.plistfilename)))
def insert_log_menu_items(ar: rumps.MenuItem, ag): log = ag['StandardOutPath'] log_cb = lambda x: subprocess.call(["open", "-a", "Console", log]) err = ag['StandardErrorPath'] err_cb = lambda x: subprocess.call(["open", "-a", "Console", err]) ar.add(rumps.separator) ar.add(rumps.MenuItem("View Log", callback=log_cb if log else None)) ar.add(rumps.MenuItem("View Error Log", callback=err_cb if err else None)) ar.add(rumps.separator)
class ClockApp(App): def __init__(self): super(ClockApp, self).__init__("Clock", quit_button=None) self.init_menu() self.clocks = Clocks(times_to_flip=INTVLS_MAP.get(DEFAULT_INTVL_STR)) self.load_clocks_data() self.load_intvl_data() def load_clocks_data(self): clocks_tz = [] filepath = application_support(APP_NAME) + '/' + SUPPORT_CLOCKS_FILENAME if os.path.exists(filepath): f = open(filepath, 'r') for e in pickle.load(f): if isinstance(e, str): clocks_tz.append(e) if len(clocks_tz) > 0: for tz in clocks_tz: self.add_clock(tz) else: self.add_local_clock() return def dump_clocks_data(self): filepath = application_support(APP_NAME) + '/' + SUPPORT_CLOCKS_FILENAME f = open(filepath, 'wb') pickle.dump(self.clocks.clock_keys, f) return def load_intvl_data(self): filepath = application_support(APP_NAME) + '/' + SUPPORT_INTVL_FILENAME if os.path.exists(filepath): f = open(filepath, 'r') intvl = pickle.load(f) self.clocks.set_times_to_flip(intvl) for s, i in INTVLS_MAP.items(): self.interval_menu[s].state = 1 if i == intvl else 0 def dump_intvl_data(self): filepath = application_support(APP_NAME) + '/' + SUPPORT_INTVL_FILENAME f = open(filepath, 'wb') pickle.dump(self.clocks.times_to_flip, f) return def init_menu(self): # add timezones menu self.timezones_menu = MenuItem('Time Zones') for tz in TIMEZONES: self.timezones_menu.add(MenuItem(tz, callback=self.switch_clock_callback)) # recently added menu self.recent_menu = MenuItem('Add Recent') # add interval menu self.interval_menu = MenuItem('Update Time') for secs in INTVLS: item = MenuItem(secs, callback=self.update_interval) if secs == DEFAULT_INTVL_STR: item.state = 1 self.interval_menu.add(item) self.about_btn = MenuItem('About', callback=self.open_about) self.quit_btn = MenuItem('Quit', callback=self.quit_app) self.menu = [self.timezones_menu, self.recent_menu, self.interval_menu, self.about_btn, self.quit_btn] @timer(1) def update(self, _): self.title = self.clocks.get_clock_time_str() self.update_clocks_menu() def update_interval(self, sender): for item in self.interval_menu.values(): item.state = 0 sender.state = 1 self.clocks.set_times_to_flip(INTVLS_MAP.get(sender.title, 5)) def add_clock(self, tz_name): if self.clocks.add_clock(tz_name): self.update_clocks_menu() self.timezones_menu[tz_name].state = 1 def remove_clock(self, tz_name): if self.clocks.remove_clock(tz_name): self.update_clocks_menu() self.timezones_menu[tz_name].state = 0 def update_clocks_menu(self): # reconstruct clocks menu items = [] items.extend(self.clocks.get_all_clock_time_str()) items.append(separator) items.append(self.timezones_menu) if len(self.recent_menu.keys()) > 0: self.recent_menu.clear() for c in self.clocks.get_history_clocks(): self.recent_menu.add( MenuItem(c, callback=self.add_clock_from_recent_callback)) items.append(self.recent_menu) items.append(self.interval_menu) items.append(self.about_btn) items.append(self.quit_btn) self.menu.clear() self.menu.update(items) def switch_clock_callback(self, sender): tz_name = str(sender.title) if sender.state == 0: self.add_clock(tz_name) else: self.remove_clock(tz_name) def add_clock_from_recent_callback(self, sender): tz_name = str(sender.title) self.add_clock(tz_name) self.timezones_menu[tz_name].state = 1 def add_local_clock(self): # add local zone by default local_zone = get_localzone().zone self.add_clock(local_zone) if self.timezones_menu.has_key(local_zone): self.timezones_menu[local_zone].state = 1 else: item = MenuItem(local_zone, callback=self.switch_clock_callback) item.state = 1 self.timezones_menu.add(item) def open_about(self, sender): import webbrowser # new = 2 for opening in the tab if possible webbrowser.open(ABOUT_URL, new=2) return def quit_app(self, sender): self.dump_clocks_data() self.dump_intvl_data() quit_application(sender)