From 2aad798a56e359b5e3fa576c87ed9b5505df3ce6 Mon Sep 17 00:00:00 2001 From: Justin Oros Date: Mon, 5 May 2025 17:44:04 -0700 Subject: [PATCH] Added Minimal View. Tap the eye icon to toggle Minimal view. --- Speedo/ContentView.swift | 82 +++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/Speedo/ContentView.swift b/Speedo/ContentView.swift index 2c0d0e9..46981d3 100644 --- a/Speedo/ContentView.swift +++ b/Speedo/ContentView.swift @@ -9,27 +9,41 @@ import SwiftUI import CoreLocation struct ContentView: View { + // Location manager to track speed and position @StateObject private var locationManager = LocationManager() + + // Unit toggle (true = MPH, false = KPH) @State private var isMPH = true + + // For tracking total trip distance @State private var previousLocation: CLLocation? @State private var tripDistanceMeters: Double = 0.0 - @State private var isDarkMode = true // 🌗 Track current theme + + // Dark mode toggle + @State private var isDarkMode = true + + // Controls whether only speed is shown (minimal view) + @State private var isMinimalView = false + // Computed speed based on selected unit var currentSpeed: Int { let multiplier = isMPH ? 1.0 : 1.60934 return Int(Double(locationManager.speed) * multiplier) } + // Label for speed unit var unitLabel: String { isMPH ? "mph" : "kph" } + // Distance label (formatted with appropriate unit) var distanceLabel: String { let distance = isMPH ? tripDistanceMeters * 0.000621371 : tripDistanceMeters / 1000 let roundedDistance = Int(distance.rounded()) return "\(roundedDistance) \(isMPH ? "miles" : "km")" } + // Color indicating GPS accuracy var accuracyColor: Color { switch locationManager.accuracy { case ..<10: @@ -41,6 +55,7 @@ struct ContentView: View { } } + // Text and background colors based on theme var foregroundColor: Color { isDarkMode ? .white : .black } @@ -55,11 +70,14 @@ struct ContentView: View { var body: some View { ZStack { + // Full-screen background color backgroundColor.ignoresSafeArea() + // Main vertical layout VStack(spacing: 30) { Spacer() + // Speed display with unit HStack(alignment: .bottom, spacing: 4) { Text("\(currentSpeed)") .font(.system(size: 140, weight: .bold, design: .rounded)) @@ -69,39 +87,58 @@ struct ContentView: View { .font(.title2) .foregroundColor(secondaryTextColor) .onTapGesture { - isMPH.toggle() + isMPH.toggle() // Toggle between mph and kph } } - Text("Trip: \(distanceLabel)") - .font(.title2) - .foregroundColor(secondaryTextColor) + // Show trip info and controls only if not in minimal view + if !isMinimalView { + // Trip distance + Text("Trip: \(distanceLabel)") + .font(.title2) + .foregroundColor(secondaryTextColor) - Text(String(format: "GPS Accuracy: ±%.0f meters", locationManager.accuracy)) - .font(.headline) - .foregroundColor(accuracyColor) - - Button(action: { - tripDistanceMeters = 0 - previousLocation = nil - }) { - Text("Reset Trip") + // GPS accuracy + Text(String(format: "GPS Accuracy: ±%.0f meters", locationManager.accuracy)) .font(.headline) - .padding(.horizontal, 20) - .padding(.vertical, 10) - .background(secondaryTextColor) - .foregroundColor(backgroundColor) - .cornerRadius(12) + .foregroundColor(accuracyColor) + + // Reset trip button + Button(action: { + tripDistanceMeters = 0 + previousLocation = nil + }) { + Text("Reset Trip") + .font(.headline) + .padding(.horizontal, 20) + .padding(.vertical, 10) + .background(secondaryTextColor) + .foregroundColor(backgroundColor) + .cornerRadius(12) + } } Spacer() } .padding() + // Overlay controls (bottom corners) VStack { Spacer() HStack { + // 👁 Eye icon to toggle minimal view (bottom-left) + Button(action: { + isMinimalView.toggle() + }) { + Image(systemName: isMinimalView ? "eye.slash.fill" : "eye.fill") + .font(.title2) + .foregroundColor(foregroundColor) + .padding() + } + Spacer() + + // ⚙️ Gear icon to open app settings (bottom-right) Button(action: { if let url = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(url) @@ -112,15 +149,15 @@ struct ContentView: View { .foregroundColor(foregroundColor) .padding() } - .padding(.bottom, 10) } - .padding(.trailing) + .padding([.leading, .trailing, .bottom], 10) } } .onTapGesture { - isDarkMode.toggle() // Toggle between black/white background + isDarkMode.toggle() // Toggle between light and dark mode } .alert(isPresented: $locationManager.showAlert) { + // Show alert if location services are unavailable Alert( title: Text("Location Services"), message: Text(locationManager.alertMessage), @@ -131,6 +168,7 @@ struct ContentView: View { } ) } + // Track location updates and calculate distance .onReceive(locationManager.$location) { location in if let newLocation = location { if let oldLocation = previousLocation {