Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // В обработчике нажатий:
- case KEY_DOWN:
- selectionPosition++;
- break;
- case KEY_UP:
- selectionPosition--;
- // -----------------------------------------
- // top - координата Y, сдвиг от верха окна
- // maxHeight - высота таблицы, кол-во строк, отведённых под таблицу
- // list - глобальный указатель на список
- // selectionPosition - глобальная переменная, хранит сдвиг от отображаемой верхушки
- // topItem - глобальная переменная, хранит указатель на текущий отображаемый верх. по умолчанию указывает на начало списка
- // selectedItem - указатель на текущий выбранный элемент
- void drawTableEntries(int top, int maxHeight) {
- maxHeight = maxHeight / 2 + 1; // Один элемент занимает 2 строки (запись + разделительная черта)
- // Если верхний элемент не определён или удалён - берём первый из списка
- if (!topItem) topItem = list->head;
- if (selectionPosition >= maxHeight) {
- // Выделение достигло ниже нижнего элемента, скролим вниз
- if (topItem->next)
- topItem = topItem->next;
- selectionPosition = maxHeight - 1;
- } else if (selectionPosition < 0) {
- // Выделение достигло выше верхнего элемента, скролим вверх
- if (topItem->prev)
- topItem = topItem->prev;
- selectionPosition = 0;
- }
- int i = 0;
- // i < maxHeight - проходит не более maxHeight элементов
- for (struct ListItem *item = topItem; item && i < maxHeight; item = item->next, i++) {
- // Если следующего эл-та нет, ограничиваем выделенный эл-т текущим
- if (!item->next && selectionPosition > i) selectionPosition = i;
- bool isSelected = selectionPosition == i; // TRUE если данный элемент выделен
- if (isSelected) selectedItem = item; // Обновляем указатель на выделенный элемент
- Employee *e = &item->employee;
- // Рисуем элемент
- wprintMB(stdscr, top + i * 2, 1, isSelected ? A_REVERSE : A_NORMAL, TABLE_ENTRIES_FORMAT,
- e->depNumber, e->employeeId, e->topicId, e->workDurationInMonth,
- e->positionCode, e->salaryAmount, e->lastName);
- // Если не последний, рисуем разделительную линию
- if (i != maxHeight - 1)drawSeparator(stdscr, top + i * 2 + 1, 0, COLS);
- }
- }
Add Comment
Please, Sign In to add comment