Files
terminal-project-management/console-gui.py
2020-08-08 22:09:35 +02:00

110 lines
3.0 KiB
Python

import curses
from curses import wrapper
from curses.textpad import Textbox, rectangle
from enum import Enum
# doc: https://docs.python.org/3/howto/curses.html, https://docs.python.org/3/library/curses.html#module-curses.textpad
CYAN_MAGENTA = 1
RED_BLACK = 2
MAGENTA_CYAN = 3
YELLOW_BLACK = 4
WHITE_BLUE = 5
class Project:
def __init__(self, title: str):
self.title = title
self.tasks = []
def addTask(self, task):
self.tasks.append(task)
def removeTask(self, task):
self.tasks.remove(task)
class Task:
def __init__(self,name: str,desc=""):
self.name = name
self.status = Status.IDLE
class Status(Enum):
DONE = 1
WORKING = 2
IDLE = 3
def get_x_pos_center(text: str):
return curses.COLS // 2 - len(text) // 2
def draw_menu(stdscr, projects: list, idx: int):
menu_width = 20
# draw line
stdscr.vline(0, menu_width, curses.ACS_VLINE, stdscr.getmaxyx()[0] - 1, curses.color_pair(RED_BLACK))
# draw project title
title = "PROJECTS"
title_start = menu_width // 2 - len(title) // 2
stdscr.attron(curses.color_pair(YELLOW_BLACK) | curses.A_REVERSE)
stdscr.addstr(0,0," " * (title_start-1))
stdscr.addstr(0, title_start-1, title)
stdscr.addstr(0, len(title) + title_start - 1, " " * (menu_width - (len(title) + title_start)))
stdscr.attroff(curses.color_pair(YELLOW_BLACK) | curses.A_REVERSE)
# draw projects
y = 1
for i, project in enumerate(projects):
if i == idx:
stdscr.addstr(y, 0, project.title,curses.A_REVERSE)
else:
stdscr.addstr(y, 0, project.title)
y = y + 1
def main(stdscr):
"""
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE
"""
curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_MAGENTA)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_MAGENTA, curses.COLOR_CYAN)
curses.init_pair(4, curses.COLOR_YELLOW, curses.COLOR_BLACK)
curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_GREEN)
k = 0 # input key
i = 0 # projects index
projects = []
test_project = Project("Test")
test_project.addTask(Task("testtask", "testdesc"))
projects.append(test_project)
while (k != ord('q')):
if k == ord('e'):
editing = not editing
elif k == 450: # up key
i = i - 1
if i < 0: i = len(projects) - 1
elif k == 456: # down key
i = i + 1
if i > len(projects) - 1: i = 0
stdscr.clear()
draw_menu(stdscr, projects, i)
# draw botton text
stdscr.addstr(stdscr.getmaxyx()[0]-1,0,"TPM by Sem van der Hoeven",)
k = stdscr.getch()
stdscr.refresh()
curses.endwin()
# wrapper already calls noecho() and cbreak() and stdcr.keypad(True)
# it also resets the settings upon closing or upon error
wrapper(main)