Генеалогические деревья: Какая логика расчета directLineFocusId используется для режима отображения «Pedigree» (Родословная)?
В режиме отображения «Pedigree» (Родословная) генеалогическое дерево строится по принципу восходящей линии: от пробанда (центрального лица) вверх к его предкам. Именно этот принцип определяет логику расчёта `directLineFocusId`.
## Что такое directLineFocusId
`directLineFocusId` — это идентификатор узла, который в данный момент является «фокусным» для прямой линии (direct line) в дереве. Прямая линия в контексте Pedigree — это цепочка предков, идущая строго по одной ветви: например, пробанд → отец → дед → прадед и т.д.
## Логика расчёта
1. **Определение пробанда.** Исходной точкой всегда служит корневой узел дерева — пробанд. Его `id` является начальным значением для вычисления `directLineFocusId`.
2. **Выбор приоритетной ветви.** В режиме Pedigree по умолчанию приоритет отдаётся патрилинейной (отцовской) ветви. Если пользователь явно не задал направление, алгоритм ищет родителя мужского пола текущего фокусного узла.
3. **Рекурсивный обход.** Алгоритм итеративно поднимается по дереву: на каждом шаге `directLineFocusId` обновляется до `id` найденного родителя. Процесс продолжается до тех пор, пока не будет достигнут узел без родителей (корень ветви) или не будет выполнено заданное ограничение по числу поколений.
4. **Учёт пользовательского выбора.** Если пользователь кликает на конкретного предка или переключает ветвь (например, с отцовской на материнскую), `directLineFocusId` пересчитывается: новым фокусным узлом становится выбранный предок, и от него снова запускается обход вверх.
5. **Обработка отсутствующих данных.** Если у текущего фокусного узла нет данных об одном из родителей, алгоритм либо останавливается, либо переключается на доступную ветвь — в зависимости от настроек приложения.
6. **Возврат к пробанду.** При сбросе фокуса `directLineFocusId` возвращается к `id` пробанда.
## Практическое значение
Знание этой логики важно при разработке и отладке генеалогических приложений: корректный `directLineFocusId` обеспечивает правильную подсветку прямой линии, навигацию по дереву и экспорт данных в форматах GEDCOM или PDF. Ошибки в расчёте приводят к тому, что неверная ветвь выделяется как «прямая», что вводит пользователя в заблуждение.
