Enrich states with attributes

This commit is contained in:
Digital Studium 2024-04-10 00:01:04 +03:00
parent 3073d6e9f0
commit ab84511ebc
1 changed files with 60 additions and 29 deletions

89
kls
View File

@ -30,6 +30,7 @@ class Menu:
self.state = state self.state = state
self.name = name # заголовок окна self.name = name # заголовок окна
self.rows = rows # строки окна self.rows = rows # строки окна
self.filtered_rows = rows # фильтрованные строки окна
self.begin_x = begin_x # где начинается окно по х? self.begin_x = begin_x # где начинается окно по х?
self.win = curses.newwin(curses.LINES, curses.COLS // 3, 0, begin_x) # окно с высотой во весь экран, шириной экран / 3, и началом по х в точке begin_x self.win = curses.newwin(curses.LINES, curses.COLS // 3, 0, begin_x) # окно с высотой во весь экран, шириной экран / 3, и началом по х в точке begin_x
self.win.box() # ? self.win.box() # ?
@ -62,6 +63,7 @@ menu3 = Menu("Resources", pods, 0 + curses.COLS // 3 * 2, MenuState.NOT_SELECTED
menus = [menu1, menu2, menu3] menus = [menu1, menu2, menu3]
def run_command(command, current_menu, rows=None): def run_command(command, current_menu, rows=None):
namespace = menu1.rows[menu1.row] namespace = menu1.rows[menu1.row]
api_resource = menu2.rows[menu2.row] api_resource = menu2.rows[menu2.row]
@ -110,70 +112,92 @@ def navigate_vertically(direction, current_menu):
run_command(command, current_menu, rows=resources) run_command(command, current_menu, rows=resources)
def filter_menu1(): def draw_search_box(menu, content):
global menu1 menu.win.addstr(curses.LINES - 2, 2, content) # рисуем контент
menu1.win.clear() menu.win.clrtoeol() # очищаем остальную часть строки
menu1.win.addstr(curses.LINES - 2, 2, f"/{menu1.search_string}") # рисуем её menu.win.box() # рисуем рамку
menu1.win.clrtoeol() # очищаем остальную часть строки menu.win.refresh() # обновляем окно
menu1.win.addstr(1, 2, menu1.name, curses.A_REVERSE | curses.A_ITALIC) # рисуем заголовок
menu1.rows = list(filter(lambda x: (x.startswith(menu1.search_string)), namespaces)) # фильтруем нэймспейсы
for index, row in enumerate(menu1.rows): # рисуем то, что отфильтровали def draw_rows(menu):
menu1.win.addstr(index + 3, 2, row) menu.win.addstr(1, 2, menu.name) # рисуем заголовок
if menu1.rows: filtered_rows = list(filter(lambda x: (x.startswith(menu.search_string)), menu.rows)) # фильтруем строки
menu1.win.addstr(3, 2, menu1.rows[menu1.row], curses.A_REVERSE | curses.A_ITALIC) # выделяем первую строку for index, row in enumerate(filtered_rows): # рисуем то, что отфильтровали
menu1.win.box() menu.win.addstr(index + 3, 2, row)
menu1.win.refresh() if filtered_rows:
menu.win.addstr(3, 2, filtered_rows[0], curses.A_REVERSE | curses.A_ITALIC) # выделяем первую строку
menu.win.box()
menu.win.refresh()
def main(stdscr): def main(stdscr):
search_string = ""
stdscr.refresh() stdscr.refresh()
running = True running = True
menu1.win.addstr(1, 2, menu1.name, curses.A_REVERSE | curses.A_ITALIC) # начальный экран
for menu in menus: for menu in menus:
menu.win.addstr(3, 2, menu.rows[menu.row], curses.A_REVERSE | curses.A_ITALIC) draw_rows(menu) # рисуем строки меню
menu.win.addstr(curses.LINES - 2, 2, "Press / for search") draw_search_box(menu, "Press / for search") # рисуем строку поиска
menu.win.refresh()
while running: while running:
key_pressed = stdscr.getkey()
match menu1.state: match menu1.state:
case MenuState.SELECTED_WITHOUT_SEARCH: case MenuState.SELECTED_WITHOUT_SEARCH:
menu = menu1
menu.win.addstr(1, 2, menu.name, curses.A_REVERSE | curses.A_ITALIC) # выделяем заголовок первого меню
draw_search_box(menu, "Press / for search") # рисуем строку поиска
key_pressed = stdscr.getkey()
match key_pressed: match key_pressed:
case "/": case "/":
menu1.win.addstr(curses.LINES - 2, 2, "/") # рисуем слэш
menu1.win.clrtoeol() # очищаем остальную часть строки
menu1.win.box() # рисуем рамку
menu1.win.refresh()
menu1.state = MenuState.SELECTED_WITH_SEARCH menu1.state = MenuState.SELECTED_WITH_SEARCH
continue continue
case "q": case "q":
running = False running = False
continue continue
case '\t' | "KEY_RIGHT":
menu1.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
menu2.state = MenuState.SELECTED_WITHOUT_SEARCH
continue
# current_menu = navigate_horizontally("right", current_menu)
# case "KEY_BTAB" | "KEY_LEFT":
# current_menu = navigate_horizontally("left", current_menu)
# case "KEY_DOWN":
# navigate_vertically("down", current_menu)
# case "KEY_UP":
# navigate_vertically("up", current_menu)
match menu2.state: match menu2.state:
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
menu = menu2
draw_search_box(menu, "Press / for search") # рисуем строку поиска
match menu3.state: match menu3.state:
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
pass menu = menu3
draw_search_box(menu, "Press / for search") # рисуем строку поиска
menu.win.refresh()
case MenuState.NOT_SELECTED_WITH_SEARCH: case MenuState.NOT_SELECTED_WITH_SEARCH:
pass pass
case MenuState.NOT_SELECTED_WITH_SEARCH: case MenuState.NOT_SELECTED_WITH_SEARCH:
pass pass
case MenuState.SELECTED_WITH_SEARCH: case MenuState.SELECTED_WITH_SEARCH:
menu = menu1
menu.win.addstr(1, 2, menu.name, curses.A_REVERSE | curses.A_ITALIC) # выделяем заголовок первого меню
draw_search_box(menu, f"/{menu.search_string}") # рисуем строку поиска
key_pressed = stdscr.getkey()
match key_pressed: match key_pressed:
case "KEY_BACKSPACE": case "KEY_BACKSPACE":
if menu1.search_string: if menu1.search_string:
menu1.search_string = menu1.search_string[:-1] # удаляем символ из строки поиска menu1.search_string = menu1.search_string[:-1] # удаляем символ из строки поиска
filter_menu1() menu1.win.clear()
draw_search_box(menu1, f"/{menu1.search_string}")
draw_rows(menu1)
else: else:
menu1.win.addstr(curses.LINES - 2, 2, "Press / for search")
menu1.win.box()
menu1.win.refresh()
menu1.state = MenuState.SELECTED_WITHOUT_SEARCH menu1.state = MenuState.SELECTED_WITHOUT_SEARCH
continue continue
case "asdasd":
pass
case _: case _:
if key_pressed.isalpha() or key_pressed == "-": # namespace не может иметь иных символов кроме a-z и - if key_pressed.isalpha() or key_pressed == "-": # namespace не может иметь иных символов кроме a-z и -
menu1.search_string += key_pressed menu1.search_string += key_pressed
filter_menu1() menu1.win.clear()
draw_search_box(menu1, f"/{menu1.search_string}")
draw_rows(menu1)
match menu2.state: match menu2.state:
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
match menu3.state: match menu3.state:
@ -184,6 +208,9 @@ def main(stdscr):
case MenuState.NOT_SELECTED_WITH_SEARCH: case MenuState.NOT_SELECTED_WITH_SEARCH:
pass pass
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
menu = menu1
menu.win.addstr(1, 2, menu.name) # убираем выделение с заголовка первого меню
draw_search_box(menu, "Press / for search") # рисуем строку поиска
match menu2.state: match menu2.state:
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
match menu3.state: match menu3.state:
@ -194,6 +221,10 @@ def main(stdscr):
case MenuState.NOT_SELECTED_WITH_SEARCH: case MenuState.NOT_SELECTED_WITH_SEARCH:
pass pass
case MenuState.SELECTED_WITHOUT_SEARCH: case MenuState.SELECTED_WITHOUT_SEARCH:
menu = menu2
menu.win.addstr(1, 2, menu.name, curses.A_REVERSE | curses.A_ITALIC) # выделяем заголовок второго меню
draw_search_box(menu, "Press / for search") # рисуем строку поиска
key_pressed = stdscr.getkey()
match menu3.state: match menu3.state:
case MenuState.NOT_SELECTED_WITHOUT_SEARCH: case MenuState.NOT_SELECTED_WITHOUT_SEARCH:
pass pass