def __init__(self, stdscr): self.screen = stdscr globals.Y,globals.X = self.screen.getmaxyx() X,Y = globals.X,globals.Y globals.interface = self globals.database.load_config() config.init() globals.messageboard = Messageboard() mb = globals.messageboard mb.create() self.width = 81 self.size = [ X, Y ] if self.size[0] < 81: self.size[0] = 81 self.switch_window = None self.windows = { "Timer":Window(),"Weekview":Window(),"Settings":Window() } self.window_list = [ "Timer", "Weekview", "Settings" ] # create banner self.banner = Banner() self.banner.name = "Banner" self.banner.create() self.banner.set_focus(True) self.banner.set_window_list(self.window_list) # build setting window window = self.windows["Settings"] window.name = "Settings" frame = Configeditor() frame.name = "config_frame" frame.set_position(4,4) frame.init() window.add_frame(frame.name,frame) mb.message("[ENTER]: Edit",window.name) window.add_frame(mb.name,mb) window.create() self.patch_settings(window) # build weekview window window = self.windows["Weekview"] window.name = "Weekview" frame = Weekswitcher() frame.name = "weekswitcher_frame" frame.set_position(32,4) window.add_frame(frame.name,frame) frame = Weekview() frame.name = "weekview_frame" frame.set_size(80,9) frame.set_position(4,10) frame.reload() window.add_frame(frame.name,frame) frame = Weeklegend() frame.name = "weeklegend_frame" frame.set_size(80,10) frame.set_position(6,21) window.add_frame(frame.name,frame) frame = Taskswitcher() frame.name = "taskswitcher_frame" frame.set_position(5,21) frame.set_manual_focus(False) frame.disable() window.add_frame(frame.name,frame) mb.message("[ENTER]: Edit",window.name) window.add_frame(mb.name,mb) window.create() self.patch_weekview(window) # build Timer window window = self.windows["Timer"] window.name = "Timer" frame = Taskswitcher() frame.name = "taskswitcher_frame" x = int((self.width - frame.size[0]) / 2) frame.set_position(x,14) window.add_frame(frame.name,frame) frame = Overtime() frame.name = "overtime_frame" frame.set_position(x,6+5) window.add_frame(frame.name,frame) frame = Timer() frame.name = "timer_frame" frame.set_position(x,6) window.add_frame(frame.name,frame) frame = Frame() frame.name = "color_frame" frame.set_size(36,1) frame.set_position(x,4) def update_patch(target): taskswitcher = globals.interface.windows["Timer"].frames["taskswitcher_frame"] target.erase() width = 14 start = int((target.size[0] - width) / 2)-1 target.addstr(start,0,"\u25D6") target.addstr(start+width-1,0,"\u25D7") target.addstr(start+1,0,"\u25A0"*(width-2),curses.color_pair(taskswitcher.get_color())) frame.update = types.MethodType(update_patch,frame) window.add_frame(frame.name,frame) mb.message("[SPACE]: Start, [ENTER]: Edit, [b]: Break",window.name) window.add_frame(mb.name,mb) frame = Clock() frame.name = "clock_frame" frame.set_position(x+29,11) window.add_frame(frame.name,frame) window.create() clockthread = threading.Thread(target=frame.run,name="Clock") clockthread.setDaemon(True) clockthread.start() self.patch_timer(window)
class Interface: def __init__(self, stdscr): self.screen = stdscr globals.Y,globals.X = self.screen.getmaxyx() X,Y = globals.X,globals.Y globals.interface = self globals.database.load_config() config.init() globals.messageboard = Messageboard() mb = globals.messageboard mb.create() self.width = 81 self.size = [ X, Y ] if self.size[0] < 81: self.size[0] = 81 self.switch_window = None self.windows = { "Timer":Window(),"Weekview":Window(),"Settings":Window() } self.window_list = [ "Timer", "Weekview", "Settings" ] # create banner self.banner = Banner() self.banner.name = "Banner" self.banner.create() self.banner.set_focus(True) self.banner.set_window_list(self.window_list) # build setting window window = self.windows["Settings"] window.name = "Settings" frame = Configeditor() frame.name = "config_frame" frame.set_position(4,4) frame.init() window.add_frame(frame.name,frame) mb.message("[ENTER]: Edit",window.name) window.add_frame(mb.name,mb) window.create() self.patch_settings(window) # build weekview window window = self.windows["Weekview"] window.name = "Weekview" frame = Weekswitcher() frame.name = "weekswitcher_frame" frame.set_position(32,4) window.add_frame(frame.name,frame) frame = Weekview() frame.name = "weekview_frame" frame.set_size(80,9) frame.set_position(4,10) frame.reload() window.add_frame(frame.name,frame) frame = Weeklegend() frame.name = "weeklegend_frame" frame.set_size(80,10) frame.set_position(6,21) window.add_frame(frame.name,frame) frame = Taskswitcher() frame.name = "taskswitcher_frame" frame.set_position(5,21) frame.set_manual_focus(False) frame.disable() window.add_frame(frame.name,frame) mb.message("[ENTER]: Edit",window.name) window.add_frame(mb.name,mb) window.create() self.patch_weekview(window) # build Timer window window = self.windows["Timer"] window.name = "Timer" frame = Taskswitcher() frame.name = "taskswitcher_frame" x = int((self.width - frame.size[0]) / 2) frame.set_position(x,14) window.add_frame(frame.name,frame) frame = Overtime() frame.name = "overtime_frame" frame.set_position(x,6+5) window.add_frame(frame.name,frame) frame = Timer() frame.name = "timer_frame" frame.set_position(x,6) window.add_frame(frame.name,frame) frame = Frame() frame.name = "color_frame" frame.set_size(36,1) frame.set_position(x,4) def update_patch(target): taskswitcher = globals.interface.windows["Timer"].frames["taskswitcher_frame"] target.erase() width = 14 start = int((target.size[0] - width) / 2)-1 target.addstr(start,0,"\u25D6") target.addstr(start+width-1,0,"\u25D7") target.addstr(start+1,0,"\u25A0"*(width-2),curses.color_pair(taskswitcher.get_color())) frame.update = types.MethodType(update_patch,frame) window.add_frame(frame.name,frame) mb.message("[SPACE]: Start, [ENTER]: Edit, [b]: Break",window.name) window.add_frame(mb.name,mb) frame = Clock() frame.name = "clock_frame" frame.set_position(x+29,11) window.add_frame(frame.name,frame) window.create() clockthread = threading.Thread(target=frame.run,name="Clock") clockthread.setDaemon(True) clockthread.start() self.patch_timer(window) def resize(self,key): if key == "KEY_RESIZE": globals.Y,globals.X = self.screen.getmaxyx() self.size = [globals.X+1,globals.Y] self.destroy() self.create() self.banner.set_focus(True) window = self.get_window() window.set_focus(True) self.screen.erase() self.screen.refresh() self.banner.update() self.banner.refresh() mb = globals.messageboard mb.destroy() mb.create() window.update() window.refresh() mb.update() mb.refresh() return True return False def destroy(self): self.banner.destroy() for window_name,window in self.windows.items(): window.destroy() def create(self): X = globals.X Y = globals.Y self.size = [ X , Y ] self.banner.create() for window_name,window in self.windows.items(): window.create() def select_window(self,window_name): self.current_window = window_name self.banner.select(self.current_window) self.get_window().set_focus(True) def is_number(self,s): try: int(s) return True except ValueError: return False def alert(self): def run(self): X = globals.X Y = globals.Y frame = Frame() frame.set_focus(True) frame.set_size(X+1,Y) frame.set_position(0,0) frame.create() def update_patch(target): for y in range(Y): frame.addstr(0,y,' '*X,curses.A_REVERSE) frame.update = types.MethodType(update_patch,frame) timer = self.windows["Timer"].frames["timer_frame"] for i in range(3): frame.update() frame.refresh() time.sleep(0.2) self.screen.erase() self.screen.refresh() window = self.get_window() timer.update() window.update() window.refresh() self.banner.update() self.banner.refresh() time.sleep(0.2) del frame thread = threading.Thread(target=run,name="alert",args = (self,)) thread.setDaemon(True) thread.start() def switch_focus(self,key): if self.current_window != "Timer" and (key == 'T' or key == 't'): log.debug("switching to window 'Timer'") self.switch_window = "Timer" return True elif self.current_window != "Weekview" and (key == 'W' or key == 'w'): log.debug("switching to window 'Weekview'") self.switch_window = "Weekview" return True elif self.current_window != "Settings" and (key == 'S' or key == 's'): log.debug("switching to window 'Settings'") self.switch_window = "Settings" return True return False def patch_settings(self,target): def handle_input(target): interface = globals.interface window = interface.get_window() conf = window.frames["config_frame"] screen = interface.screen timer = interface.windows["Timer"].frames["timer_frame"] mb = globals.messageboard if timer.get_phase() == 0: conf.select() else: conf.select(-1) window.update() window.refresh() while True: key = screen.getkey() if interface.switch_focus(key): break elif interface.resize(key): pass elif key == 'q': sys.exit(0) elif timer.get_phase() == 0: if key == "KEY_RIGHT" or key == "l": conf.right() conf.update() conf.refresh() elif key == "KEY_LEFT" or key == "h": conf.left() conf.update() conf.refresh() elif key == "KEY_UP" or key == "k": conf.up() conf.update() conf.refresh() elif key == "KEY_DOWN" or key == "j": conf.down() conf.update() conf.refresh() elif len(key) == 1 and ord(key) == 13: conf.handle_input() else: log.debug("unregistered key: '"+str(key)+"'") else: log.debug("unregistered key: '"+str(key)+"'") target.handle_input = types.MethodType(handle_input,target) def patch_weekview(self,target): def handle_input(target): interface = globals.interface window = interface.get_window() screen = interface.screen weekswitcher = window.frames["weekswitcher_frame"] weekview = window.frames["weekview_frame"] weeklegend = window.frames["weeklegend_frame"] taskswitcher = window.frames["taskswitcher_frame"] database = globals.database timer = interface.windows["Timer"].frames["timer_frame"] mb = globals.messageboard while True: key = screen.getkey() if interface.resize(key): pass elif key == 'q': sys.exit(0) elif weekview.edit == 0: if interface.switch_focus(key): break elif key == "KEY_RIGHT" or key == "l": weekswitcher.right() weekswitcher.update() weekswitcher.refresh() weekview.reload() weekview.update() weekview.refresh() weeklegend.update() weeklegend.refresh() elif key == "KEY_LEFT" or key == "h": weekswitcher.left() weekswitcher.update() weekswitcher.refresh() weekview.reload() weekview.update() weekview.refresh() weeklegend.update() weeklegend.refresh() elif key == "KEY_UP" or key == "k": weekswitcher.up() weekswitcher.update() weekswitcher.refresh() elif key == "KEY_DOWN" or key == "j": weekswitcher.down() weekswitcher.update() weekswitcher.refresh() elif len(key) == 1 and ord(key) == 13: if timer.get_phase() == 0: database.savepoint() weekview.set_edit(1) weekview.update_edit() weekview.refresh() weekswitcher.disable() weekswitcher.update() weekswitcher.refresh() weeklegend.erase() weeklegend.refresh() weeklegend.set_manual_focus(False) taskswitcher.set_manual_focus(True) taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() mb.message("[ENTER]: Save, [ESC]: Cancel, [e]: Edit, [d]: Delete") else: mb.alert("Cannot edit while timer is running..") else: log.debug("unregistered key: '"+str(key)+"'") elif weekview.edit == 1: if key == "KEY_RIGHT" or key == "l": weekview.right() weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() elif key == "KEY_LEFT" or key == "h": weekview.left() weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() elif key == "KEY_UP" or key == "k": weekview.up() weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() elif key == "KEY_DOWN" or key == "j": weekview.down() weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() elif key == "e": weekview.set_edit(2) t = weekview.get_task() taskswitcher.enable() taskswitcher.set_task(t) taskswitcher.update() taskswitcher.refresh() weekview.set_task(taskswitcher.get_task()) weekview.update() weekview.update_edit() weekview.refresh() mb.message("[ENTER]: Save, [ESC]: Cancel") elif len(key) == 1 and ( ord(key) == 27 or ord(key) == 13 ): if ord(key) == 27: database.rollback() weekview.empty_backorder() else: weekview.flush_backorder() database.release() database.commit() taskswitcher.erase() taskswitcher.refresh() taskswitcher.set_manual_focus(False) weekview.set_edit(0) weekview.reload() weekview.update() weekview.refresh() weekswitcher.enable() weekswitcher.update() weekswitcher.refresh() weeklegend.set_manual_focus(True) weeklegend.update() weeklegend.refresh() mb.pop() elif key == 'd': weekview.delete_task() weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() mb.refresh() else: log.debug("unregistered key: '"+str(key)+"'") elif weekview.edit == 2: if key == "KEY_RIGHT" or key == "l": taskswitcher.right() taskswitcher.update() taskswitcher.refresh() weekview.set_task(taskswitcher.get_task()) weekview.update() weekview.refresh() elif key == "KEY_LEFT" or key == "h": taskswitcher.left() taskswitcher.update() taskswitcher.refresh() weekview.set_task(taskswitcher.get_task()) weekview.update() weekview.refresh() elif key == "KEY_UP" or key == "k": taskswitcher.up() taskswitcher.update() taskswitcher.refresh() elif key == "KEY_DOWN" or key == "j": taskswitcher.down() taskswitcher.update() taskswitcher.refresh() elif len(key) == 1 and ord(key) == 13: taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() weekview.update_database() weekview.set_edit(1) weekview.update() weekview.update_edit() weekview.refresh() mb.pop() elif len(key) == 1 and ord(key) == 27: weekview.cancel() weekview.set_edit(1) weekview.update() weekview.refresh() taskswitcher.set_task(weekview.get_task()) taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() mb.pop() else: log.debug("unregistered key: '"+str(key)+"'") target.handle_input = types.MethodType(handle_input,target) def patch_timer(self,target): def handle_input(target): interface = globals.interface window = interface.get_window() screen = interface.screen timer = window.frames["timer_frame"] color = window.frames["color_frame"] taskswitcher = window.frames["taskswitcher_frame"] weekview = interface.windows["Weekview"].frames["weekview_frame"] mb = globals.messageboard while True: key = screen.getkey() if interface.switch_focus(key): break elif interface.resize(key): pass elif key == 'q': sys.exit(0) elif key == 'f': self.alert() elif timer.edit_timer: if self.is_number(key): timer.edit_time(int(key)) elif len(key) == 1 and ord(key) == 27: timer.edit_cancel() elif len(key) == 1 and ord(key) == 13: timer.edit_next() if not timer.edit_timer: mb.pop() timer.update() timer.refresh() taskswitcher.update() taskswitcher.refresh() elif timer.get_phase() == 2: if key == ' ': mb.pop() timer.shift() taskswitcher.enable() taskswitcher.update() taskswitcher.refresh() elif len(key) == 1 and ord(key) == 13: overtime = timer.overtime.current_time if timer.current_time == 0: timer.current_time = config.TIME_POMODORO_SEC timertime = timer.current_time if overtime > timertime: timer.current_time = 0 timer.overtime.current_time = overtime - timertime globals.database.add_pomodoro_now(taskswitcher.get_task()) weekview.reload() weekview.update_week() weekview.refresh() else: timer.current_time = timertime - overtime timer.overtime.current_time = 0 timer.shift() mb.pop() timer.shift() mb.message("[SPACE]: Stop, [b]: Break") timer.overtime.update() timer.overtime.refresh() timer.update() timer.refresh() elif timer.get_phase() == 1: if key == ' ': mb.pop() timer.shift() timer.update() timer.refresh() taskswitcher.enable() taskswitcher.update() taskswitcher.refresh() elif key == "b": mb.pop() mb.message("[SPACE]: Stop/Reset, [ENTER]: Deduct break time") timer.start_overtime() elif timer.get_phase() == 0: if key == "b": mb.message("[SPACE]: Stop/Reset, [ENTER]: Deduct break time") taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() timer.start_overtime() elif key == "KEY_RIGHT" or key == "l": taskswitcher.right() taskswitcher.update() taskswitcher.refresh() color.update() color.refresh() elif key == "KEY_LEFT" or key == "h": taskswitcher.left() taskswitcher.update() taskswitcher.refresh() color.update() color.refresh() elif key == "KEY_UP" or key == "k": taskswitcher.up() taskswitcher.update() taskswitcher.refresh() color.update() color.refresh() elif key == "KEY_DOWN" or key == "j": taskswitcher.down() taskswitcher.update() taskswitcher.refresh() color.update() color.refresh() elif len(key) == 1 and ord(key) == 13: mb.message("[ENTER]: Next, [ESC]: Cancel") timer.edit_enable() timer.update() timer.refresh() taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() elif key == ' ': timer.shift() if timer.get_running(): mb.message("[SPACE]: Stop, [b]: Break") taskswitcher.disable() taskswitcher.update() taskswitcher.refresh() else: log.debug("unregistered key: '"+str(key)+"'") else: log.debug("unregistered key: '"+str(key)+"'") target.handle_input = types.MethodType(handle_input,target) def get_window(self, index = None): if index == None: try: return self.windows[self.current_window] except: return None return self.windows[index] def main(self): self.create() self.select_window("Timer") self.screen.notimeout(0) screen = self.screen screen.refresh() banner = self.banner window = self.get_window() while True: window.update() window.refresh() banner.update() banner.refresh() window.handle_input() if self.switch_window != None: window.set_focus(False) self.current_window = self.switch_window self.switch_window = None window = self.get_window() window.set_focus(True) screen.erase() window.update() banner.select(window.name) screen.refresh()