From d8375e1a149ef69b2725ca54e0c1df878106b982 Mon Sep 17 00:00:00 2001 From: Mirza-Samad-Ahmed-Baig Date: Thu, 24 Jul 2025 23:58:05 +0500 Subject: [PATCH] changes --- TrackWeight/ScaleView.swift | 74 +++++++++++++++++++++----------- TrackWeight/ScaleViewModel.swift | 19 +++++++- 2 files changed, 66 insertions(+), 27 deletions(-) diff --git a/TrackWeight/ScaleView.swift b/TrackWeight/ScaleView.swift index 7d2239c..e02c820 100644 --- a/TrackWeight/ScaleView.swift +++ b/TrackWeight/ScaleView.swift @@ -77,33 +77,57 @@ struct ScaleView: View { .foregroundStyle(.gray) } - Button(action: { - viewModel.zeroScale() - }) { - HStack(spacing: 8) { - Image(systemName: "arrow.clockwise") - .font(.system(size: min(max(geometry.size.width * 0.02, 14), 18), weight: .semibold)) - Text("Zero Scale") - .font(.system(size: min(max(geometry.size.width * 0.02, 14), 18), weight: .semibold)) - } - .foregroundStyle(.white) - .frame(width: min(max(geometry.size.width * 0.2, 140), 180), - height: min(max(geometry.size.height * 0.08, 40), 55)) - .background( - RoundedRectangle(cornerRadius: 25) - .fill( - LinearGradient( - colors: [.blue, .teal], - startPoint: .leading, - endPoint: .trailing + HStack(spacing: 10) { + Button(action: { + viewModel.zeroScale() + }) { + HStack(spacing: 8) { + Image(systemName: "arrow.clockwise") + .font(.system(size: min(max(geometry.size.width * 0.02, 14), 18), weight: .semibold)) + Text("Zero Scale") + .font(.system(size: min(max(geometry.size.width * 0.02, 14), 18), weight: .semibold)) + } + .foregroundStyle(.white) + .frame(width: min(max(geometry.size.width * 0.2, 140), 180), + height: min(max(geometry.size.height * 0.08, 40), 55)) + .background( + RoundedRectangle(cornerRadius: 25) + .fill( + LinearGradient( + colors: [.blue, .teal], + startPoint: .leading, + endPoint: .trailing + ) ) - ) - ) + ) + } + .buttonStyle(.plain) + .opacity(viewModel.hasTouch ? 1 : 0) + .scaleEffect(viewModel.hasTouch ? 1 : 0.8) + .animation(.spring(response: 0.4, dampingFraction: 0.8), value: viewModel.hasTouch) + + // Reset calibration button - always visible + Button(action: { + viewModel.resetCalibration() + }) { + HStack(spacing: 6) { + Image(systemName: "xmark.circle") + .font(.system(size: min(max(geometry.size.width * 0.018, 12), 16), weight: .medium)) + Text("Reset") + .font(.system(size: min(max(geometry.size.width * 0.018, 12), 16), weight: .medium)) + } + .foregroundStyle(.red) + .frame(width: min(max(geometry.size.width * 0.12, 80), 100), + height: min(max(geometry.size.height * 0.06, 30), 40)) + .background( + RoundedRectangle(cornerRadius: 20) + .stroke(.red.opacity(0.5), lineWidth: 1.5) + ) + } + .buttonStyle(.plain) + .opacity(viewModel.zeroOffset != 0 ? 0.7 : 0.3) + .disabled(viewModel.zeroOffset == 0) } - .buttonStyle(.plain) - .opacity(viewModel.hasTouch ? 1 : 0) - .scaleEffect(viewModel.hasTouch ? 1 : 0.8) - .animation(.spring(response: 0.4, dampingFraction: 0.8), value: viewModel.hasTouch) } .frame(height: min(max(geometry.size.height * 0.15, 80), 100)) // Fixed space for button + instruction .frame(maxWidth: .infinity) // Ensure full width for centering diff --git a/TrackWeight/ScaleViewModel.swift b/TrackWeight/ScaleViewModel.swift index a3f4f75..4b6ef38 100644 --- a/TrackWeight/ScaleViewModel.swift +++ b/TrackWeight/ScaleViewModel.swift @@ -10,13 +10,23 @@ import Combine @MainActor final class ScaleViewModel: ObservableObject { @Published var currentWeight: Float = 0.0 - @Published var zeroOffset: Float = 0.0 + @Published var zeroOffset: Float = 0.0 { + didSet { + // Persist zero offset to UserDefaults when it changes + UserDefaults.standard.set(zeroOffset, forKey: "TrackWeight.zeroOffset") + } + } @Published var isListening = false @Published var hasTouch = false private let manager = OMSManager.shared private var task: Task? + init() { + // Restore saved zero offset from UserDefaults + self.zeroOffset = UserDefaults.standard.float(forKey: "TrackWeight.zeroOffset") + } + func startListening() { if manager.startListening() { isListening = true @@ -46,11 +56,16 @@ final class ScaleViewModel: ObservableObject { } } + func resetCalibration() { + zeroOffset = 0.0 + // This will automatically persist to UserDefaults via the didSet observer + } + private func processTouchData(_ touchData: [OMSTouchData]) { if touchData.isEmpty { hasTouch = false currentWeight = 0.0 - zeroOffset = 0.0 // Reset zero when finger is lifted + // Do not reset zeroOffset when finger is lifted - preserve calibration } else { hasTouch = true let rawWeight = touchData.first?.pressure ?? 0.0