@@ -13,6 +13,8 @@ struct GraphSettingsView: View {
1313 @ObservedObject private var show90MinLine = Storage . shared. show90MinLine
1414 @ObservedObject private var showMidnightLines = Storage . shared. showMidnightLines
1515 @ObservedObject private var smallGraphTreatments = Storage . shared. smallGraphTreatments
16+ @ObservedObject private var graphTimeZoneEnabled = Storage . shared. graphTimeZoneEnabled
17+ @ObservedObject private var graphTimeZoneIdentifier = Storage . shared. graphTimeZoneIdentifier
1618
1719 @ObservedObject private var smallGraphHeight = Storage . shared. smallGraphHeight
1820 @ObservedObject private var predictionToLoad = Storage . shared. predictionToLoad
@@ -48,6 +50,18 @@ struct GraphSettingsView: View {
4850
4951 Toggle ( " Show Midnight Lines " , isOn: $showMidnightLines. value)
5052 . onChange ( of: showMidnightLines. value) { _ in markDirty ( ) }
53+
54+ Toggle ( " Time Zone Override " , isOn: $graphTimeZoneEnabled. value)
55+ . onChange ( of: graphTimeZoneEnabled. value) { _ in markDirty ( ) }
56+
57+ if graphTimeZoneEnabled. value {
58+ Picker ( " Time Zone " , selection: $graphTimeZoneIdentifier. value) {
59+ ForEach ( Self . sortedTimeZones, id: \. identifier) { tz in
60+ Text ( Self . timeZoneLabel ( tz) ) . tag ( tz. identifier)
61+ }
62+ }
63+ . onChange ( of: graphTimeZoneIdentifier. value) { _ in markDirty ( ) }
64+ }
5165 }
5266
5367 // ── Treatments ───────────────────────────────────────────────
@@ -140,4 +154,17 @@ struct GraphSettingsView: View {
140154 private func markDirty( ) {
141155 Observable . shared. chartSettingsChanged. value = true
142156 }
157+
158+ // MARK: - Time Zone Helpers
159+
160+ private static let sortedTimeZones : [ TimeZone ] = TimeZone . knownTimeZoneIdentifiers
161+ . compactMap { TimeZone ( identifier: $0) }
162+ . sorted { $0. secondsFromGMT ( ) < $1. secondsFromGMT ( ) }
163+
164+ private static func timeZoneLabel( _ tz: TimeZone ) -> String {
165+ let offsetMinutes = tz. secondsFromGMT ( ) / 60
166+ let sign = offsetMinutes >= 0 ? " + " : " - "
167+ let offsetString = String ( format: " UTC%@%02d:%02d " , sign, abs ( offsetMinutes) / 60 , abs ( offsetMinutes) % 60 )
168+ return " ( \( offsetString) ) \( tz. identifier) "
169+ }
143170}
0 commit comments