import Foundation /// Wann nachgeladen wird. /// /// **Nicht „die letzten fünf".** So stand es bisher, und zwei Dinge daran /// gehen schief. Erstens ist das auf einem Raster aus sechs Spalten nicht /// einmal eine Zeile: wer dort ankommt, wartet trotzdem. Zweitens — und das /// ist der eigentliche Fehler — hing es am **Erscheinen** der Kachel. Beim /// ersten Zeichnen erscheinen alle sechzig gleichzeitig, auch die letzten /// fünf; das Nachladen lief also sofort los statt beim Scrollen. /// /// Gemessen wird deshalb in **Zeilen**, und der Auslöser ist auf dem /// Fernseher der Fokus statt des Erscheinens. Auf einem breiten Raster ist /// das nicht Feinschliff: dort sind sechs Kacheln eine Zeile, und mit der /// alten Regel wäre schon die erste Bildschirmseite „fast am Ende". public struct PagingWindow: Sendable, Equatable { /// Wie viele Kacheln nebeneinander stehen. public let columns: Int /// Wie viele Zeilen Vorlauf gewünscht sind. public let rowsAhead: Int public init(columns: Int, rowsAhead: Int = 2) { self.columns = columns self.rowsAhead = rowsAhead } /// - Parameter focusedIndex: Wo der Fokus gerade steht. /// - Parameter loaded: Wie viele Einträge schon dastehen. /// - Parameter total: Wie viele der Server insgesamt meldet. public func shouldLoad(focusedIndex: Int, loaded: Int, total: Int) -> Bool { // `columns <= 0` ist keine sinnvolle Frage, aber eine mögliche: ein // Raster kennt seine Spaltenzahl erst nach dem ersten Zeichnen. Null // zurückzugeben ist richtiger, als durch null zu teilen. guard columns > 0, loaded > 0, loaded < total else { return false } return focusedIndex >= loaded - columns * rowsAhead } }