Прокрутка и обрезка — RC18
float ui::scroll(const string &in id,float offset,float content_height,
float x,float y,float width,float height);
void render::push_clip(float x,float y,float width,float height);
void render::pop_clip();
Вызывайте в on_frame с разрешением render. scroll задаёт область для колёсика,
возвращает смещение, но не рисует фон, ползунок или дочерние элементы.
Сохраните результат в переменную. Смещение ограничивается диапазоном
0…max(0, content_height-height), включая уменьшение высоты содержимого.
Прокрутка: 36 логических пикселей на 120 единиц колёсика, дробные события
применяются пропорционально. Это собственный коэффициент, не системная
настройка числа строк. Горизонтальная прокрутка и drag-scrollbar не реализованы.
Порядок: scroll → фон → push_clip → элементы с y-offset → pop_clip.
Пример: sdk/templates/scroll-panel. Стек пересекает вложенные прямоугольники,
до восьми уровней, и должен быть закрыт в каждом кадре. Обрезка действует
на все команды рисования и на выбор кликаемых виджетов. Координаты не
переносятся автоматически; смещение применяет сам автор скрипта.
Размер clip: 1–4096, координаты конечные ±100000. Размер scroll: 24–2048,
content_height: 0–100000, ID уникальный в кадре, как у остальных виджетов.
Все команды входят в общий лимит 256. Непарный pop, незакрытый стек,
превышение глубины и недопустимая геометрия останавливают пакет с диагностикой.
Колёсико принимает только собственное preview-окно, в координатах с учётом DPI.
Из перекрывающихся областей выбирается последняя видимая scroll-область.
Дочерние виджеты внутри clip не препятствуют прокрутке. Виджет popup,
нарисованный поверх вне clip, блокирует колёсико нижней панели.
Вложенные области требуют последовательного размещения внутри clip родителя.
Автоматической передачи прокрутки родителю при достижении края нет.
События ui.wheel:id:delta объединяются по ID, ограничиваются ±1200 и входят
в существующую очередь из 12 событий. Runtime применяет последнее корректное
значение один раз; скрытые области не сохраняют ввод на следующий кадр.
Полностью обрезанные textbox/ползунок отменяют недоставленный ввод/перетаскивание.
Ввод относится к последнему показанному кадру; IDs должны оставаться стабильными.
Синтетический stream-host должен соблюдать те же правила, что native host.
Нет глобальных хуков, взаимодействия с игрой или интерактивности click-through
overlay. Это ограниченный механизм панели, а не полноценный GUI layout engine.