2012-01-28 10 views
6

muszę wyświetlać praktycznie nieskończoną listę scrollabe interaktywnych widgetów i dodać/usunąć je za konieczne, gdy nowe dane są dodawane lub użytkownik przewija się przestrzenią niebuforowanych.GTK: Nieskończony leniwy lista widżetów

TreeView (as asked about here) nie jest rozwiązaniem, ponieważ muszę pełne widżety jak przedmioty (w skład standardowych widżetów z wieloma działaniami etc, ale CellRenderer nie jest do tego)

Co gorsza, nie wiem wysokość moich widżetów z góry (nie jest to zbyt duża wariancja), więc użycie VBoxa może spowodować przeskok.

Korzystanie z paska przewijania nadal powinno wyglądać tak, jakby lista była skończona (tj. Zaktualizowana dopiero po zakończeniu przewijania, aby przycisk przewijania nie odskoczył od myszy) oraz po zmianie rozmiaru okna i układu okien , pozycja przewijania nie powinna się zbytnio zmieniać (skupiony widżet powinien pozostać tam, gdzie jest, chyba że skupiony widget został przewinięty ...).

Jaki jest najlepszy sposób na zrobienie tego? Może nawet biblioteka, która wysyła mi sygnały, kiedy trzeba dodać nowy widget?

Albo ListView być zmuszany do zrobienia to w niezbyt paskudny sposób? (tj. narysuj na buforze poza ekranem, skopiuj go do komórki za pomocą CellRenderer, przekazuj zdarzenia myszy/klawiatury do rzeczywistego widżetu?)

+0

Co masz na myśli przez "nerwowość"? Na czym polega problem z VBox? – lethalman

+0

jeśli użytkownik przewija w górę, średnia wysokość widget jest 200px (tzn mam kilka pustych komórek 200px wysoki z widokiem na których mogę wymienić z rzeczywistymi widżetów jak jest to konieczne), ale dodam taki, który jest 250 pikseli na górze pojawi wszystko zeskoczyć w dół o 50 pikseli. Sądzę więc, że VBox musiałby zostać umieszczony w Fixed i przesunięty w górę o 50 pikseli, aby temu zapobiec, ale wtedy nie będzie już rozciągany do rozmiaru ScrollWindow ... – pascal

+0

Możesz spróbować ręcznie przewinąć do bieżącego widżetu. – lethalman

Odpowiedz

1

Jeśli jest to lista nieskończona, to nie powinieneś próbować niczego osiągnąć za pomocą paska przewijania - jest to przeznaczone tylko dla list skończonych.

Moja sugestia jest użycie nakładki z 2 przyciskami

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

Na liście między przyciskami, prawdopodobnie będzie musiał wdrożyć własny pojemnik widget siebie. Proponuję z wyprzedzeniem buforować n (> = 2) widżetów/przedmiotów w każdym kierunku.

naprawdę nie związane z niestandardowymi pojemnikach, ale niestandardowe widgety - punkt wyjścia

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