Add vertical arrow scrolling
This commit is contained in:
parent
3bc1b5294b
commit
a2dd21d11b
27
kls
27
kls
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue