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