Im Treeview mit Mausrad blättern

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Ich möchte in einem Treeview mit dem Mausrad von einem Eintrag zum nächsten scrollen können. Damit meine ich kein Scrollen im üblichen Sinn, sondern so wie mit den Cursor-UP/DOWN Tasten. Zeile für Zeile soll den Fokus bekommen. Ich weiss einfach nicht, wie ich im Treeview die nächste oder vorige Reihe selektiere.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

gtk.Treeview.get_cursor()
gtk.Treeview.set_cursor()
http://www.pygtk.org/docs/pygtk/class-g ... set-cursor

Ich denke, dass der Select mit dem Cursor mitgeht, musst halt mal testen.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Das Setzen des Cursors ist nicht das Problem. Ich weiss jedoch nicht welchen Cursor ich setzen soll. Angenommen der Cursor n ist selektiert, dann soll ein Mousewheelscroll entweder zum Cursor n+1 oder n-1 gehen. Woher aber weiss ich, welches die n+1'ste sichtbare Reihe im Treeview ist?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das kannst du über das TreeModel.

Code: Alles auswählen

path, col =  TreeView.get_cursor()
iter = TreeModel.get_iter(path)
iter = TreeModel.iter_next(iter)
path = TreeModel.get_path(iter)
TreeView.set_cursor(path)

Müsste so funktionieren. Die Klassennamen musst natürlich durch die entsprechenden Referenzen ersetzen.

Um den letzten zu bekommen musst dir mal die Referenzen anschauen, wahrscheinlich musst selber einen Algorithmus schreiben (z.B. das ganze Model in einer Schleife durchlaufen und immer den letzten iter speichern, wenn dann der aktuelle iter der iter vom path ist, dann ist der gespeicherte letzte iter der Gesuchte)

Das ganze funktioniert nur auf einer Ebene. Falls du Ebenen hast, muss das ganze noch auf Eltern und Kinder erweitert werden. Zuerst musst schauen, ob der aktuelle Iter ein Kind hat. Wenn ja, gehst zu dem Kind, ansonsten next_iter. Wenn die next_iter None liefert, musst eine Ebene hoch und dann next_iter. Wenn die wieder None, wieder eins hoch. Wenn du ganz oben bist und die next_iter None liefert, ist dein cursor ganz unten. Rückwärts musst den ganzen Schritt halt von anfang an durchlaufen, bis du deinen Iter gefunden hast.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Alternativ könntest du auch direkt mit dem Pfad arbeiten.
Angenommen du hast Pfad (a,b,c)
Dann versuchst Pfad (a,b,c,0)
Wenn das nicht geht Pfad(a,b,c+1)
Wenn das nicht: Pfad (a,b+1)
Wenn auch nicht: Pfad (a+1)

Ist vielleicht eleganter zu lösen. Ich hab auch mal gedacht, dass es eine Funktion gibt, um abzufragen, ob es ein gültiger Pfad ist, hab die aber gerade nicht gefunden. Ansonsten musst halt Exceptions abfangen.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Danke für die Hinweise. Das habe ich mir fast gedacht, dass es keine einfache Möglichkeit gibt über die sichtbaren Treeview Elemente zu iterieren. Dann verzichte ich auf die Funktionalität und scrolle mit dem Wheel nur auf die gewohnte Weise (Scrollbar) und verwende die UP/DOWN Keys zum Element-weise scrollen.
Antworten