Complete navigation without search

This commit is contained in:
Digital Studium 2024-04-10 15:47:57 +03:00
parent 6ee3d0b75c
commit f5c483f82f
1 changed files with 38 additions and 30 deletions

68
kls
View File

@ -92,28 +92,30 @@ menus = [menu1, menu2, menu3]
# return current_menu # return current_menu
def update_menu3(menu): def update_menu3(menu):
if menu != menu3: # если изменился выбор нэймспейса или апи ресурса то обновляем третье меню namespace = menu1.filtered_rows[menu1.row]
namespace = menu1.rows[menu1.row] api_resource = menu2.filtered_rows[menu2.row]
api_resource = menu2.rows[menu2.row] command = "f'kubectl get {api_resource} -n {namespace} --no-headers -o template=\"{{{{range .items}}}}{{{{.metadata.name}}}} {{{{end}}}}\"'"
command = "f'kubectl get {api_resource} -n {namespace} --no-headers -o template=\"{{{{range .items}}}}{{{{.metadata.name}}}} {{{{end}}}}\"'" bytes_list = subprocess.check_output(eval(command), shell=True).split()
bytes_list = subprocess.check_output(eval(command), shell=True).split() resources = [bytes_list[i].decode('utf-8') for i in range(len(bytes_list))]
resources = [bytes_list[i].decode('utf-8') for i in range(len(bytes_list))] if not resources:
if not resources: resources = [f"No resources found in {namespace} namespace.",]
resources = [f"No resources found in {namespace} namespace.",] menu3.rows = resources
menu3.rows = resources menu3.filtered_rows = resources
menu3.win.clear() menu3.win.clear()
draw_rows(menu3) draw_rows(menu3)
# run_command(command, menu, rows=resources) # run_command(command, menu, rows=resources)
def navigate_vertically(direction, menu): def navigate_vertically(direction, menu):
increment = {"down": 1, "up": -1} increment = {"down": 1, "up": -1}
if menu.rows[menu.row].startswith("No resources"): # это касается только третьего меню if not menu.filtered_rows:
return return
menu.win.addstr(menu.row + 3, 2, menu.rows[menu.row]) # удаляем выделение с текущей строки if menu.filtered_rows[menu.row].startswith("No resources"): # это касается только третьего меню
menu.row = (menu.row + increment[direction]) % len(menu.rows) # переходим к предыдущей/следующей строке return
menu.win.addstr(menu.row + 3, 2, menu.rows[menu.row], curses.A_REVERSE | curses.A_ITALIC) # и выделяем её menu.win.addstr(menu.row + 3, 2, menu.filtered_rows[menu.row]) # удаляем выделение с текущей строки
menu.row = (menu.row + increment[direction]) % len(menu.filtered_rows) # переходим к предыдущей/следующей строке
menu.win.addstr(menu.row + 3, 2, menu.filtered_rows[menu.row], curses.A_REVERSE | curses.A_ITALIC) # и выделяем её
def draw_search_box(menu, content): def draw_search_box(menu, content):
@ -133,11 +135,11 @@ def draw_header(menu, selected=False):
def draw_rows(menu): def draw_rows(menu):
menu.win.addstr(1, 2, menu.name) # рисуем заголовок menu.win.addstr(1, 2, menu.name) # рисуем заголовок
filtered_rows = list(filter(lambda x: (x.startswith(menu.search_string)), menu.rows)) # фильтруем строки menu.filtered_rows = list(filter(lambda x: (x.startswith(menu.search_string)), menu.rows)) # фильтруем строки
for index, row in enumerate(filtered_rows): # рисуем то, что отфильтровали for index, row in enumerate(menu.filtered_rows): # рисуем то, что отфильтровали
menu.win.addstr(index + 3, 2, row) menu.win.addstr(index + 3, 2, row)
if filtered_rows: if menu.filtered_rows:
menu.win.addstr(3, 2, filtered_rows[0], curses.A_REVERSE | curses.A_ITALIC) # выделяем первую строку menu.win.addstr(3, 2, menu.filtered_rows[0], curses.A_REVERSE | curses.A_ITALIC) # выделяем первую строку
menu.win.box() menu.win.box()
menu.win.refresh() menu.win.refresh()
@ -160,25 +162,21 @@ def main(stdscr):
match key_pressed: match key_pressed:
case "/": case "/":
menu.state = MenuState.SELECTED_WITH_SEARCH menu.state = MenuState.SELECTED_WITH_SEARCH
continue
case "q": case "q":
running = False running = False
continue continue
case '\t' | "KEY_RIGHT": case '\t' | "KEY_RIGHT":
menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
menu2.state = MenuState.SELECTED_WITHOUT_SEARCH menu2.state = MenuState.SELECTED_WITHOUT_SEARCH
continue case "KEY_BTAB" | "KEY_LEFT":
menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
menu3.state = MenuState.SELECTED_WITHOUT_SEARCH
case "KEY_DOWN": case "KEY_DOWN":
navigate_vertically("down", menu) navigate_vertically("down", menu)
#update_menu3(menu)
case "KEY_UP": case "KEY_UP":
navigate_vertically("up", menu) navigate_vertically("up", menu)
# current_menu = navigate_horizontally("right", current_menu) #update_menu3(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 menu = menu2
@ -210,8 +208,10 @@ def main(stdscr):
continue continue
case "KEY_DOWN": case "KEY_DOWN":
navigate_vertically("down", menu) navigate_vertically("down", menu)
#update_menu3(menu)
case "KEY_UP": case "KEY_UP":
navigate_vertically("up", menu) navigate_vertically("up", menu)
#update_menu3(menu)
case _: case _:
if key_pressed.isalpha() or key_pressed == "-": # namespace не может иметь иных символов кроме a-z и - if key_pressed.isalpha() or key_pressed == "-": # namespace не может иметь иных символов кроме a-z и -
menu.search_string += key_pressed menu.search_string += key_pressed
@ -257,6 +257,10 @@ def main(stdscr):
draw_header(menu) draw_header(menu)
menu1.state = MenuState.SELECTED_WITHOUT_SEARCH menu1.state = MenuState.SELECTED_WITHOUT_SEARCH
continue continue
case "KEY_BTAB" | "KEY_LEFT":
menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
draw_header(menu)
menu2.state = MenuState.SELECTED_WITHOUT_SEARCH
case "KEY_DOWN": case "KEY_DOWN":
navigate_vertically("down", menu) navigate_vertically("down", menu)
case "KEY_UP": case "KEY_UP":
@ -281,6 +285,10 @@ def main(stdscr):
menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
menu3.state = MenuState.SELECTED_WITHOUT_SEARCH menu3.state = MenuState.SELECTED_WITHOUT_SEARCH
continue continue
case "KEY_BTAB" | "KEY_LEFT":
menu.state = MenuState.NOT_SELECTED_WITHOUT_SEARCH
draw_header(menu)
menu1.state = MenuState.SELECTED_WITHOUT_SEARCH
case "KEY_DOWN": case "KEY_DOWN":
navigate_vertically("down", menu) navigate_vertically("down", menu)
case "KEY_UP": case "KEY_UP":