Enrich states with attributes
This commit is contained in:
parent
3073d6e9f0
commit
ab84511ebc
89
kls
89
kls
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue