Нарисовать table
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.07.23 16:20
Оценка:
Здравствуйте!

Есть таблица, в смысле — структура данных — таблица. Типа HTMLной. Есть rowspan/colspan у её ячеек. У текста в ячейках есть выравнивание — лево/право/по центру/по ширине. Ширина колонок не задаётся (auto), или задаётся в процентах от общего поля вывода. В ячейках лежат абзацы списком.

Есть ширина канваса для рисования. Есть возможность вычислить реальную длину выводимой строки в юнитах канваса.

Вопрос: где бы стыбрить/подсмотреть реализацию рисования такой таблицы? Или даже не реализацию, а просто мудрые мысли, как такую таблицу нарисовать? Ну, под рисованием я конечно же понимаю прежде всего вычисление размеров и положений отображаемых блоков с учетом их содержимого

Сам сделаю конечно, но как обычно на говне, а хочется красиво и халявки

Взять готовый HTML движок — не надо предлагать, бо как раз пилю рендеринг своего недоHTML Не спрашивайте зачем

ЗЫ Чтобы зайти на этот форум, заглянул на главную страницу. Божечки, как же похорошела Россияглавная страница RSDN при Путене
Маньяк Робокряк колесит по городу
Re: Нарисовать table
От: B0FEE664  
Дата: 07.07.23 16:18
Оценка:
Здравствуйте, Marty, Вы писали:

M>Есть таблица, в смысле — структура данных — таблица. Типа HTMLной. Есть rowspan/colspan у её ячеек. У текста в ячейках есть выравнивание — лево/право/по центру/по ширине. Ширина колонок не задаётся (auto), или задаётся в процентах от общего поля вывода. В ячейках лежат абзацы списком.

M>Есть ширина канваса для рисования. Есть возможность вычислить реальную длину выводимой строки в юнитах канваса.
M>Вопрос: где бы стыбрить/подсмотреть реализацию рисования такой таблицы? Или даже не реализацию, а просто мудрые мысли, как такую таблицу нарисовать? Ну, под рисованием я конечно же понимаю прежде всего вычисление размеров и положений отображаемых блоков с учетом их содержимого

Я лет двадцать назад писал такое и хочу сказать, что в общем виде на больших таблицах (> 1 000 000 000 строк) при нефиксированной ширине (или высоте) ячейки за приемлемое время подсчитать положение не получится.

Смотрите: раз у вас в ячейке многострочный текст, то его высота зависит от ширины ячейки в предположении, что слова переносятся, а не обрезаются.
Допустим
— у нас всего три колонки с фиксированными размерами (по ширине)
— в первой колонке выравнивание по центру по вертикали
— первая колонка — это одна ячейка
— в таблице миллиард строк


------------------------
| | |2a |
| |------|----|
| |aaaa | |
| |bbbbb | |
| |ccc | |
| this |------|----|
| |x |aaa |
| | |bbb |
| |------|----|
........................
| |------|----|
| | |aa |
| | cc|aaa |
------------------------

Тогда, если высота строки не фиксированная, то, чтобы найти центр по вертикали для первого столбца, придётся подсчитать общую высоту таблицы, а для этого придётся подсчитать высоту для каждой ячейки, но из-за слияния по вертикали этого не достаточно: ещё придётся расчитывать высоту исходя из взаимного расположения ячеек, так, например, если объединить первую и вторую ячейку во втором столбце и вторую и третью ячейки в третьем столбце, то общая высота изменится:

------------------------
| |aaaa | а |
| |bbbbb |----|
| |ccc |aaa |
| this |------|bbb |
| |x | |
| |------|----|
........................
| |------|----|
| | |aa |
| | cc|aaa |
------------------------

Задача усложняется, если для текста используются разные шрифты
Задача усложняется, если ширина колонки должна подбираться автоматически

В результате, если количество ячеек обозримо, то задача решается в три-четыре прохода:
1) расчёт ширины для каждой колонки
2) расчёт минимальной высоты для каждой ячейки
3) расчёт координат (с вертикальными размерами) для каждой ячейки
4) отрисовка видимых ячеек с заданным выравниванием текста.

Алгоритма, который не рассчитывает всю таблицу целиком, а только видимую её часть для строк с автоматическим (исходя из текста) расчётом высоты строк я придумать не смог. Основная проблема — это скроллирование по вертикали.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.