Show return distance on station rows
This commit is contained in:
@@ -1844,11 +1844,11 @@ struct StationRow: View {
|
|||||||
let distance = FuelStore.stationDistanceDisplay(
|
let distance = FuelStore.stationDistanceDisplay(
|
||||||
station: station, userLat: location.lat, userLng: location.lng
|
station: station, userLat: location.lat, userLng: location.lng
|
||||||
)
|
)
|
||||||
Text(distance.label(unit: distanceUnit))
|
Text(distance.labelWithReturn(unit: distanceUnit))
|
||||||
.font(.caption2)
|
.font(.caption2)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
.monospacedDigit()
|
.monospacedDigit()
|
||||||
.accessibilityLabel(distance.spokenLabel(unit: distanceUnit))
|
.accessibilityLabel(distance.spokenLabelWithReturn(unit: distanceUnit))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ struct StationDetailView: View {
|
|||||||
let distance = FuelStore.stationDistanceDisplay(
|
let distance = FuelStore.stationDistanceDisplay(
|
||||||
station: station, userLat: location.lat, userLng: location.lng
|
station: station, userLat: location.lat, userLng: location.lng
|
||||||
)
|
)
|
||||||
LabeledContent("Distance", value: distance.label(unit: distanceUnit))
|
LabeledContent("Distance", value: distance.labelWithReturn(unit: distanceUnit))
|
||||||
.monospacedDigit()
|
.monospacedDigit()
|
||||||
}
|
}
|
||||||
ForEach(StationNotice.notices(for: station)) { notice in
|
ForEach(StationNotice.notices(for: station)) { notice in
|
||||||
|
|||||||
@@ -783,15 +783,22 @@ final class RoadDistanceCacheTests: XCTestCase {
|
|||||||
XCTAssertFalse(confirmed.isApproximate, "a cached road distance is not an approximation")
|
XCTAssertFalse(confirmed.isApproximate, "a cached road distance is not an approximation")
|
||||||
XCTAssertEqual(confirmed.km, 3.2, accuracy: 0.0001)
|
XCTAssertEqual(confirmed.km, 3.2, accuracy: 0.0001)
|
||||||
XCTAssertEqual(confirmed.label(unit: .miles), "2.0 mi")
|
XCTAssertEqual(confirmed.label(unit: .miles), "2.0 mi")
|
||||||
|
XCTAssertEqual(confirmed.labelWithReturn(unit: .miles), "2.0 mi (4.0 mi return)")
|
||||||
|
XCTAssertEqual(confirmed.labelWithReturn(unit: .kilometers), "3.2 km (6.4 km return)")
|
||||||
XCTAssertEqual(confirmed.spokenLabel(unit: .miles), "2.0 miles")
|
XCTAssertEqual(confirmed.spokenLabel(unit: .miles), "2.0 miles")
|
||||||
|
XCTAssertEqual(confirmed.spokenLabelWithReturn(unit: .miles), "2.0 miles, 4.0 miles return")
|
||||||
|
|
||||||
let approximate = FuelStore.stationDistanceDisplay(station: unrouted, userLat: 51.6, userLng: -0.1)
|
let approximate = FuelStore.stationDistanceDisplay(station: unrouted, userLat: 51.6, userLng: -0.1)
|
||||||
XCTAssertTrue(approximate.isApproximate, "the straight-line fallback must be identified as one")
|
XCTAssertTrue(approximate.isApproximate, "the straight-line fallback must be identified as one")
|
||||||
XCTAssertEqual(approximate.km, unrouted.distanceKM(to: 51.6, lng2: -0.1), accuracy: 0.0001)
|
XCTAssertEqual(approximate.km, unrouted.distanceKM(to: 51.6, lng2: -0.1), accuracy: 0.0001)
|
||||||
XCTAssertEqual(approximate.label(unit: .miles),
|
XCTAssertEqual(approximate.label(unit: .miles),
|
||||||
"Approx. " + DistanceUnit.miles.format(approximate.km))
|
"Approx. " + DistanceUnit.miles.format(approximate.km))
|
||||||
|
XCTAssertEqual(approximate.labelWithReturn(unit: .miles),
|
||||||
|
"Approx. \(DistanceUnit.miles.format(approximate.km)) (\(DistanceUnit.miles.format(approximate.km * 2)) return)")
|
||||||
XCTAssertEqual(approximate.spokenLabel(unit: .kilometers),
|
XCTAssertEqual(approximate.spokenLabel(unit: .kilometers),
|
||||||
"Approximately " + DistanceUnit.kilometers.spoken(approximate.km))
|
"Approximately " + DistanceUnit.kilometers.spoken(approximate.km))
|
||||||
|
XCTAssertEqual(approximate.spokenLabelWithReturn(unit: .kilometers),
|
||||||
|
"Approximately \(DistanceUnit.kilometers.spoken(approximate.km)), \(DistanceUnit.kilometers.spoken(approximate.km * 2)) return")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The marker tracks the cache on its own: same station, bare figure once its
|
/// The marker tracks the cache on its own: same station, bare figure once its
|
||||||
|
|||||||
@@ -1722,11 +1722,23 @@ struct StationDistanceDisplay: Equatable {
|
|||||||
return isApproximate ? "Approx. \(text)" : text
|
return isApproximate ? "Approx. \(text)" : text
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Row/sheet label that keeps the one-way station distance primary, then
|
||||||
|
/// adds the out-and-back distance in brackets. This matches Best Value's
|
||||||
|
/// "extra return travel" basis without changing the actual distance model.
|
||||||
|
func labelWithReturn(unit: DistanceUnit) -> String {
|
||||||
|
"\(label(unit: unit)) (\(unit.format(km * 2)) return)"
|
||||||
|
}
|
||||||
|
|
||||||
/// VoiceOver form of `label(unit:)`.
|
/// VoiceOver form of `label(unit:)`.
|
||||||
func spokenLabel(unit: DistanceUnit) -> String {
|
func spokenLabel(unit: DistanceUnit) -> String {
|
||||||
let text = unit.spoken(km)
|
let text = unit.spoken(km)
|
||||||
return isApproximate ? "Approximately \(text)" : text
|
return isApproximate ? "Approximately \(text)" : text
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// VoiceOver form of `labelWithReturn(unit:)`.
|
||||||
|
func spokenLabelWithReturn(unit: DistanceUnit) -> String {
|
||||||
|
"\(spokenLabel(unit: unit)), \(unit.spoken(km * 2)) return"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cached Apple-Maps road distances for nearby stations (see
|
/// Cached Apple-Maps road distances for nearby stations (see
|
||||||
|
|||||||
Reference in New Issue
Block a user