GTK: бесконечный ленивый список виджетов

Мне нужно отображать практически бесконечный список прокручиваемых интерактивных виджетов и добавлять/удалять их по мере необходимости, когда добавляются новые данные или пользователь прокручивает в некешированную область.

TreeView (как спрашивалось здесь) не вариант, потому что мне нужно полные виджеты в виде элементов (состоящие из стандартных виджетов с несколькими действиями и т. д., но CellRenderer не для этого)

Хуже того, я не знаю заранее высоту своих виджетов (хотя и не сильно отличается), поэтому использование VBox может вызвать нервозность.

Использование полосы прокрутки должно по-прежнему ощущаться, как если бы список был конечным (т. е. обновлялся только после завершения прокрутки, поэтому кнопка прокрутки не отскакивала от мыши), а при изменении размера окна и макета окон обновлялась позиция прокрутки. не должен слишком сильно меняться (виджет в фокусе должен оставаться там, где он есть, если, конечно, виджет в фокусе не был прокручен…).

Как лучше всего это сделать? Может быть, даже библиотека, которая просто посылает мне сигналы, когда нужно добавить новый виджет?

Или можно заставить ListView сделать это не слишком неприятным способом? (т.е. рисовать внеэкранный буфер, копировать его в ячейку с помощью CellRenderer, передавать события мыши/клавиатуры фактическому виджету?)


person pascal    schedule 28.01.2012    source источник
comment
Что вы имеете в виду под прыгучестью? В чем проблема с VBox?   -  person lethalman    schedule 28.01.2012
comment
если пользователь прокручивает вверх, средняя высота виджета составляет 200 пикселей (т. е. у меня есть несколько пустых ячеек высотой 200 пикселей вне поля зрения, которые я заменяю фактическими виджетами по мере необходимости), но я добавляю один размером 250 пикселей вверху, все будет отображаться прыгнуть вниз на 50 пикселей. Поэтому я предполагаю, что VBox должен быть помещен в Fixed и перемещен вверх на 50 пикселей, чтобы предотвратить это, но тогда он больше не будет растягиваться до размера ScrollWindow…   -  person pascal    schedule 28.01.2012
comment
Вы можете попробовать прокрутить вручную до текущего виджета.   -  person lethalman    schedule 28.01.2012
comment
Да, но я думаю, что это будет противоречить взаимодействию с пользователем: когда полоса прокрутки захватывается и толкается вверх (чтобы добавить новые виджеты), было бы странно, если бы она внезапно прыгнула вниз. Так что мне придется сместить контейнер виджета. Или создайте адаптер регулировки, который может иметь скрытое смещение. Может, вообще не использовать полосы прокрутки, а что-то вроде поворотного переключателя, как это сделал Google Wave? (уже есть хороший виджет для этого?)   -  person pascal    schedule 29.01.2012
comment
Если вы хотите расширить список только вниз, вы можете просто добавить новые виджеты, когда пользователь остановит прокрутку достаточно близко к нижней части. Требования довольно сложные: вы не хотите, чтобы полоса прокрутки прыгала, когда пользователь перетаскивает ее вниз, но если пользователь удерживает полосу прокрутки в ожидании загрузки данных, она должна загружаться. Если вы хотите добавить данные сверху и снизу, я не вижу, чтобы полоса прокрутки работала хорошо. Может стилизованные стрелки вверху и внизу списка? (убедитесь, что события колеса мыши обрабатываются в любом случае)   -  person tjollans    schedule 19.08.2012
comment
вы правы, это был бы лучший способ, возня с jog-dail не будет хорошо работать с полосой прокрутки overlay и выделяться как неродной элемент управления…   -  person pascal    schedule 19.08.2012
comment
Спустя годы и годы после того, как Android и другие получили просмотры переработчиков, у нас все еще нет ничего полезного? Действительно?   -  person Lothar    schedule 01.05.2021


Ответы (1)


Если это бесконечный список, то вам не следует пытаться добиться чего-либо с помощью полосы прокрутки — это предназначено только для конечных списков.

Мое предложение - использовать наложение с 2 кнопками

+------------+
| UP ARROW   |
+------------+
| ITEM  N    |
| ITEM  N+1  |
| ITEM  N+2  |
+------------+
| DOWN ARROW |
+------------+

Для списка между кнопками вам, вероятно, придется самостоятельно реализовать собственный виджет-контейнер. Я предлагаю заранее буферизовать n (>=2) виджетов/элементов в каждом направлении.

Не совсем связано с кастомными контейнерами, но кастомные виджеты - отправная точка

http://zetcode.com/tutorials/cairographicstutorial/customgtkwidget/

http://gnomejournal.org/article/34/writing-a-widget-using-cairo-and-gtk28

http://old.nabble.com/Custom-container-%2B-Child-type-with-interface-td26863728.html

person drahnr    schedule 15.09.2012