8.8 KiB
Spec Delta
ADDED Requirements
Requirement: Курсор в сетке фото
Сетка SHALL хранить курсор — текущую ячейку, отдельную от выделения. Перемещение курсора SHALL не менять выделение и не обновлять правую панель. Курсор SHALL отображаться контуром, отличимым от рамки выделения, SHALL сохраняться при снятии выделения и SHALL устанавливаться на фото при клике по нему мышью.
Scenario: Синхронизация с мышью
- WHEN пользователь кликает по фото в сетке
- THEN фото выделено, а курсор установлен на нём
Scenario: Перемещение не меняет выделение
- WHEN фокус в сетке и пользователь нажимает стрелку
- THEN курсор перемещается, а выделение и правая панель не меняются
Scenario: Курсор переживает снятие выделения
- WHEN выделение снято кликом по пустому месту или клавишей Esc
- THEN курсор остаётся на прежней ячейке
Scenario: Отображение курсора
- WHEN сетка в фокусе и у курсора есть ячейка
- THEN ячейка показывает контур, отличимый от рамки выделения, и он скрывается при уходе фокуса из сетки
Requirement: Клавиши сетки фото
При фокусе в сетке клавиши SHALL управлять курсором и выделением: ←/→ — на соседнее фото с
переходом на соседнюю строку, ↑/↓ — на строку (density.cols) с упором в границы.
Space SHALL переключать выделение ячейки под курсором, Shift+стрелки — двигать курсор и
расширять выделение от якоря, Enter — открывать просмотр, Esc — снимать выделение. Вне
фокуса сетки клавиши SHALL не действовать.
Scenario: Горизонтальное перемещение
- WHEN курсор не в конце строки и нажато
→ - THEN курсор переходит на следующее фото
Scenario: Перенос на соседнюю строку
- WHEN курсор в конце строки и нажато
→ - THEN курсор переходит на первое фото следующей строки
Scenario: Вертикальные границы
- WHEN курсор в верхней или нижней строке и нажато
↑или↓ - THEN курсор остаётся на месте, без переноса
Scenario: Переключение выделения
- WHEN нажато
Space - THEN ячейка под курсором добавляется или убирается из выделения, а правая панель обновляется
Scenario: Расширение выделения
- WHEN нажато
Shiftвместе со стрелкой - THEN курсор двигается, а выделение расширяется от якоря до курсора
Scenario: Открытие просмотра
- WHEN нажато
Enter - THEN открывается просмотр фото под курсором
Scenario: Снятие выделения клавишей
- WHEN нажато
Esc - THEN выделение снимается, а курсор остаётся
Scenario: Прокрутка к курсору
- WHEN курсор перемещается за пределы видимой области сетки
- THEN сетка прокручивается так, чтобы ячейка под курсором стала видимой
Scenario: Догрузка при выходе за загруженные фото
- WHEN курсор на последнем загруженном фото и нажата стрелка в сторону следующих фото
- THEN следующая порция фото догружается, а курсор переходит на следующее фото
Scenario: Вне фокуса сетки
- WHEN фокус находится в поле ввода или диалоге и нажаты стрелки или
Space - THEN курсор и выделение сетки не меняются
Requirement: Снятие выделения кликом по пустому месту
Клик по области сетки и её отступам, не по фото и не по органам управления тулбара, рейла и панелей, SHALL снимать выделение и возвращать в правой панели свойства альбома. Фокус SHALL оставаться в сетке, чтобы клавиши продолжали действовать.
Scenario: Клик по пустому месту
- WHEN есть выделение и пользователь кликает по пустому месту сетки или её отступам
- THEN выделение снято, а правая панель показывает свойства альбома
Scenario: Мультивыделение
- WHEN выделено несколько фото и пользователь кликает по пустому месту
- THEN выделение снимается полностью
Scenario: Клик по фото
- WHEN пользователь кликает по фото
- THEN выделение устанавливается на фото, а не снимается
Scenario: Клик по органам управления
- WHEN пользователь кликает по кнопке тулбара, элементу рейла или панели
- THEN выделение не снимается
Scenario: Фокус остаётся в сетке
- WHEN выделение снято кликом по пустому месту
- THEN стрелки продолжают двигать курсор без дополнительного Tab
Requirement: Возврат фокуса из просмотра
При возврате в альбом из просмотра сетка SHALL выделить последнее просмотренное фото (одиночное), поставить на него курсор, вернуть фокус в сетку и прокрутить к ячейке. Если фото нет среди загруженных, сетка SHALL догружать страницы, пока оно не появится. Восстановление SHALL применяться только к тому альбому, из которого был открыт просмотр.
Scenario: Возврат из просмотра
- WHEN пользователь открыл фото и закрыл просмотр
- THEN в сетке это фото выделено, курсор на нём, фокус в сетке, а ячейка прокручена в видимую область
Scenario: Последнее просмотренное фото
- WHEN пользователь пролистал несколько фото в просмотре и закрыл его
- THEN восстанавливается последнее просмотренное фото
Scenario: Фото вне первой страницы
- WHEN просмотренное фото отсутствует в первой загруженной странице
- THEN сетка догружает страницы, пока фото не появится, и только затем ставит на него курсор
Scenario: Возврат в другой альбом
- WHEN после просмотра пользователь открывает другой альбом
- THEN восстановление не применяется, выборка пуста
Scenario: Клавиатура после возврата
- WHEN фокус восстановлен после просмотра
- THEN стрелки сразу двигают курсор без дополнительного Tab