Die Auswahl war nicht flach, weil die Beschriftung gefehlt haette - der volle Pfad stand laengst drin. Sie kam vom Server nach dem BLATTnamen sortiert, und so standen "Garage -> Fach A" und "Keller -> Fach A" irgendwo zwischen allem anderen. Geschwister und Kinder fanden nie zusammen. Neu ist baum() in Baum.swift: bringt eine flache Eltern-Kind-Liste in Baumreihenfolge und rueckt je Ebene ein. Waisen gelten als oberste Ebene, damit nichts lautlos aus der Auswahl faellt. Derselbe Lauf lag bisher dreimal im Projekt (CategoryPicker, TreeMasterView, LocationEditor). Alle drei zeigen jetzt auf den einen - unterm Strich verschwinden mehr Zeilen als dazukommen. Zwei der Kopien waren auch nicht gleichwertig: LocationEditor.pfad hatte den Zyklusschutz von path(in:) nicht und waere bei einer ringfoermigen Elternkette endlos gelaufen. Umgestellt sind neun Auswahlfelder. Die Lagerortzeile beim Kassenzettel zeigte nur den nackten Namen und bekommt den vollen Pfad - dort ist kein Platz zum Einruecken. MARKETING_VERSION stand auf 1.2 in der project.pbxproj, aber auf 1.1 in der project.yml, aus der sie erzeugt wird. Die Quelle nachgezogen, sonst haette das naechste "xcodegen generate" die Anhebung zurueckgedreht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
39 lines
1.4 KiB
Swift
39 lines
1.4 KiB
Swift
import Foundation
|
|
|
|
/// Eine Zeile einer flach ausgelegten Baumliste, mit ihrer Tiefe.
|
|
///
|
|
/// Lagerorte und Kategorien sind Baeume, kommen vom Server aber als flache
|
|
/// Liste nach Namen sortiert. Daraus wird eine Auswahl, in der "Garage → Fach A"
|
|
/// und "Keller → Fach A" irgendwo zwischen allem anderen stehen - Geschwister
|
|
/// und Kinder finden nie zusammen. Diese Reihenfolge stellt das her.
|
|
struct Baumzeile<T: TreeItem>: Identifiable {
|
|
let item: T
|
|
let tiefe: Int
|
|
|
|
var id: T.ID { item.id }
|
|
|
|
/// Name mit Einrueckung je Ebene. Macht die Hierarchie in einer flachen
|
|
/// Auswahl sichtbar, ohne jede Zeile mit dem vollen Pfad zu ueberladen.
|
|
var label: String { String(repeating: " ", count: tiefe) + item.name }
|
|
}
|
|
|
|
/// Bringt eine flache Eltern-Kind-Liste in Baumreihenfolge, mit Tiefe.
|
|
///
|
|
/// Waisen - deren Elternteil weggefiltert oder geloescht ist - gelten als
|
|
/// oberste Ebene. Ohne diese Regel verschwaenden sie lautlos aus der Auswahl.
|
|
func baum<T: TreeItem>(_ liste: [T]) -> [Baumzeile<T>] {
|
|
let ids = Set(liste.map(\.id))
|
|
var ergebnis: [Baumzeile<T>] = []
|
|
|
|
func gehe(_ knoten: T, _ tiefe: Int) {
|
|
ergebnis.append(Baumzeile(item: knoten, tiefe: tiefe))
|
|
for kind in liste.filter({ $0.parentId == knoten.id }) {
|
|
gehe(kind, tiefe + 1)
|
|
}
|
|
}
|
|
for wurzel in liste.filter({ $0.parentId == nil || !ids.contains($0.parentId!) }) {
|
|
gehe(wurzel, 0)
|
|
}
|
|
return ergebnis
|
|
}
|