Add vertical arrow scrolling

This commit is contained in:
Digital Studium 2024-04-13 18:36:44 +03:00
parent 3bc1b5294b
commit a2dd21d11b
1 changed files with 16 additions and 11 deletions

27
kls
View File

@ -32,11 +32,11 @@ class Menu:
def __init__(self, name, rows, begin_x, width, state): def __init__(self, name, rows, begin_x, width, state):
self.state = state self.state = state
self.name = name # заголовок окна self.name = name # заголовок окна
self.rows = rows # строки окна self.rows = rows # строки меню
self.selected_row = 0 # выбранная строка меню
self.begin_x = begin_x # где начинается окно по х? self.begin_x = begin_x # где начинается окно по х?
self.win = curses.newwin(curses.LINES, width, 0, self.win = curses.newwin(curses.LINES, width, 0, begin_x) # окно с высотой во весь экран, шириной width, и началом по х в точке begin_x
begin_x) # окно с высотой во весь экран, шириной width, и началом по х в точке begin_x self.rows_number = curses.LINES - 10 # максимальное число строк меню видимое в окне, начиная с 0
self.selected_row = 0 # выбранная строка
self.filter = "" # фильтр строк для вывода self.filter = "" # фильтр строк для вывода
@ -104,10 +104,19 @@ def draw_rows(menu):
# если строк нет, рисовать их не нужно # если строк нет, рисовать их не нужно
if not filtered_rows: if not filtered_rows:
return return
# ограничиваем число отфильтрованных строк высотой окна + выбираем, от какой cтроки меню будет начинаться меню
if menu.selected_row < menu.rows_number:
first_row_index = 0
else:
first_row_index = (menu.selected_row % menu.rows_number) + (menu.selected_row // menu.rows_number)
last_row_index = first_row_index + menu.rows_number
filtered_rows = filtered_rows[first_row_index:last_row_index]
# индекс выбранной строки в отфильтрованных строках
selected_row_in_window = menu.selected_row - first_row_index
for index, row in enumerate(filtered_rows): # рисуем то, что отфильтровали for index, row in enumerate(filtered_rows): # рисуем то, что отфильтровали
menu.win.addstr(index + 3, 2, row) menu.win.addstr(index + 3, 2, row)
# выделяем выбранную строку # выделяем выбранную строку
menu.win.addstr(3 + menu.selected_row, 2, filtered_rows[menu.selected_row], curses.A_REVERSE | curses.A_ITALIC) menu.win.addstr(selected_row_in_window + 3, 2, filtered_rows[selected_row_in_window], curses.A_REVERSE | curses.A_ITALIC)
menu.win.box() menu.win.box()
menu.win.refresh() menu.win.refresh()
@ -217,10 +226,8 @@ def navigate_vertically(direction, menu):
if not filtered_rows or len(filtered_rows) == 1: if not filtered_rows or len(filtered_rows) == 1:
return return
increment = {"down": 1, "up": -1} increment = {"down": 1, "up": -1}
menu.win.addstr(menu.selected_row + 3, 2, filtered_rows[menu.selected_row]) # удаляем выделение с текущей строки menu.selected_row = (menu.selected_row + increment[direction]) % len(filtered_rows) # выбираем строку учитывая сколько строк в меню
menu.selected_row = (menu.selected_row + increment[direction]) % len(filtered_rows) # переходим к предыдущей/следующей строке draw_menu(menu) # перерисовываем меню
menu.win.addstr(menu.selected_row + 3, 2, filtered_rows[menu.selected_row], curses.A_REVERSE | curses.A_ITALIC) # и выделяем её
menu.win.refresh()
def main(screen): def main(screen):
@ -239,9 +246,7 @@ def main(screen):
elif menu3.state in [1, 2]: elif menu3.state in [1, 2]:
catch_input(menu3) # перехватываем нажатия клавиш третьего меню catch_input(menu3) # перехватываем нажатия клавиш третьего меню
main(screen) main(screen)
# curses.wrapper(main)
curses.nocbreak() curses.nocbreak()
screen.keypad(False) screen.keypad(False)