_Ziens_

Навигация по списку 2

May 2nd, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. // В обработчике нажатий:
  2.  case KEY_DOWN:
  3.      selectionPosition++;
  4.      break;
  5.  case KEY_UP:
  6.      selectionPosition--;
  7.  
  8. // -----------------------------------------
  9. // top - координата Y, сдвиг от верха окна
  10. // maxHeight - высота таблицы, кол-во строк, отведённых под таблицу
  11. // list - глобальный указатель на список
  12. // selectionPosition - глобальная переменная, хранит сдвиг от отображаемой верхушки
  13. // topItem - глобальная переменная, хранит указатель на текущий отображаемый верх. по умолчанию указывает на начало списка
  14. // selectedItem - указатель на текущий выбранный элемент
  15.  
  16. void drawTableEntries(int top, int maxHeight) {
  17.     maxHeight = maxHeight / 2 + 1; // Один элемент занимает 2 строки (запись + разделительная черта)
  18.  
  19.     // Если верхний элемент не определён или удалён - берём первый из списка
  20.     if (!topItem) topItem = list->head;
  21.  
  22.     if (selectionPosition >= maxHeight) {
  23.         // Выделение достигло ниже нижнего элемента, скролим вниз
  24.         if (topItem->next)
  25.             topItem = topItem->next;
  26.         selectionPosition = maxHeight - 1;
  27.     } else if (selectionPosition < 0) {
  28.         // Выделение достигло выше верхнего элемента, скролим вверх
  29.         if (topItem->prev)
  30.             topItem = topItem->prev;
  31.         selectionPosition = 0;
  32.     }
  33.  
  34.     int i = 0;
  35. // i < maxHeight - проходит не более maxHeight элементов
  36.     for (struct ListItem *item = topItem; item && i < maxHeight; item = item->next, i++) {
  37.         // Если следующего эл-та нет, ограничиваем выделенный эл-т текущим
  38.         if (!item->next && selectionPosition > i) selectionPosition = i;
  39.  
  40.         bool isSelected = selectionPosition == i; // TRUE если данный элемент выделен
  41.         if (isSelected) selectedItem = item; // Обновляем указатель на выделенный элемент
  42.  
  43.         Employee *e = &item->employee;
  44. // Рисуем элемент
  45.         wprintMB(stdscr, top + i * 2, 1, isSelected ? A_REVERSE : A_NORMAL, TABLE_ENTRIES_FORMAT,
  46.                  e->depNumber, e->employeeId, e->topicId, e->workDurationInMonth,
  47.                  e->positionCode, e->salaryAmount, e->lastName);
  48.  
  49.         // Если не последний, рисуем разделительную линию
  50.         if (i != maxHeight - 1)drawSeparator(stdscr, top + i * 2 + 1, 0, COLS);
  51.     }
  52. }
Add Comment
Please, Sign In to add comment