WWindowSpan
Рабочая среда с ИИ для кода

Границы области с фиксированными строками

Прокручиваемому списку нужен точный расчёт видимых строк. WindowSpan даёт этой задаче среду Windows с подключением совместимой модели и предлагаемыми правками, которые можно проверить на граничных примерах.

● ● ●WindowSpan●
Конкретная отправная точка · Границы области с фиксированными строками ×
from math import isfinite, ceil

def row_window(count, row_height, offset, viewport, overscan=1):
    if type(count) is not int or count < 0 or type(overscan) is not int or overscan < 0:
        raise ValueError("rows.count")
    if not all(type(x) in (int, float) and isfinite(x) for x in (row_height, offset, viewport)) or row_height <= 0 or viewport < 0:
        raise ValueError("rows.geometry")
    start_units = max(0, offset) / row_height
    first = count if start_units >= count else int(start_units)
    if first == count or viewport == 0:
        return first, first
    span = viewport / row_height
    end = count if span >= count - start_units else min(count, ceil(start_units + span) + overscan)
    return max(0, first - overscan), end
✳Границы области с фиксированными строками
✓ ИзмененияПроверьте перед применением ↗
Иллюстрация рабочей среды
Подключение
Базовый URL, учётные данные и доступный сервер.
Проект
Проверьте отрицательную прокрутку, выход за конец и нулевую высоту области, ограничивая индексы числом элементов и отклоняя неверную высоту строки.
Проверьте перед применением
Сравните фактическое поведение с ожидаемым. Если проверка не проходит, разберитесь в причине перед следующими изменениями.
Сценарии

Границы области с фиксированными строками

Сценарии ↗
Конкретная отправная точка
from math import isfinite, ceil

def row_window(count, row_height, offset, viewport, overscan=1):
    if type(count) is not int or count < 0 or type(overscan) is not int or overscan < 0:
        raise ValueError("rows.count")
    if not all(type(x) in (int, float) and isfinite(x) for x in (row_height, offset, viewport)) or row_height <= 0 or viewport < 0:
        raise ValueError("rows.geometry")
    start_units = max(0, offset) / row_height
    first = count if start_units >= count else int(start_units)
    if first == count or viewport == 0:
        return first, first
    span = viewport / row_height
    end = count if span >= count - start_units else min(count, ceil(start_units + span) + overscan)
    return max(0, first - overscan), end
Рабочая среда с ИИ для кода

Здесь начинается ваше следующее изменение.

Скачать для Windows ↗