diff --git a/Gaze/Models/SettingsSection.swift b/Gaze/Models/SettingsSection.swift index 5e91dec..f5cfd3b 100644 --- a/Gaze/Models/SettingsSection.swift +++ b/Gaze/Models/SettingsSection.swift @@ -13,7 +13,9 @@ enum SettingsSection: Int, CaseIterable, Identifiable { case blink = 2 case posture = 3 case userTimers = 4 - case enforceMode = 5 + #if ENFORCE_READY + case enforceMode = 5 + #endif case smartMode = 6 var id: Int { rawValue } @@ -24,7 +26,9 @@ enum SettingsSection: Int, CaseIterable, Identifiable { case .lookAway: return "Look Away" case .blink: return "Blink" case .posture: return "Posture" - case .enforceMode: return "Enforce Mode" + #if ENFORCE_READY + case .enforceMode: return "Enforce Mode" + #endif case .userTimers: return "User Timers" case .smartMode: return "Smart Mode" } @@ -36,7 +40,9 @@ enum SettingsSection: Int, CaseIterable, Identifiable { case .lookAway: return "eye.fill" case .blink: return "eye.circle.fill" case .posture: return "figure.stand" - case .enforceMode: return "video.fill" + #if ENFORCE_READY + case .enforceMode: return "video.fill" + #endif case .userTimers: return "plus.circle" case .smartMode: return "brain.fill" } diff --git a/Gaze/Views/Containers/AdditionalModifiersView.swift b/Gaze/Views/Containers/AdditionalModifiersView.swift index 6075251..26b0077 100644 --- a/Gaze/Views/Containers/AdditionalModifiersView.swift +++ b/Gaze/Views/Containers/AdditionalModifiersView.swift @@ -39,15 +39,22 @@ struct AdditionalModifiersView: View { .font(isCompact ? .subheadline : .title3) .foregroundStyle(.secondary) .multilineTextAlignment(.center) + #if !ENFORCE_READY + Text("More to come soon") + .font(isCompact ? .subheadline : .title3) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + #endif Spacer() ZStack { - cardView(for: 0, width: cardWidth, height: cardHeight) - .zIndex(zIndex(for: 0)) - .scaleEffect(scale(for: 0)) - .offset(x: xOffset(for: 0), y: yOffset(for: 0)) - + #if ENFORCE_READY + cardView(for: 0, width: cardWidth, height: cardHeight) + .zIndex(zIndex(for: 0)) + .scaleEffect(scale(for: 0)) + .offset(x: xOffset(for: 0), y: yOffset(for: 0)) + #endif cardView(for: 1, width: cardWidth, height: cardHeight) .zIndex(zIndex(for: 1)) .scaleEffect(scale(for: 1)) @@ -58,41 +65,42 @@ struct AdditionalModifiersView: View { Spacer() - // Navigation controls - HStack(spacing: isCompact ? 12 : 20) { - Button(action: { swapCards() }) { - Image(systemName: "chevron.left") - .font(isCompact ? .body : .title2) - .frame(width: isCompact ? 36 : 44, height: isCompact ? 36 : 44) - .contentShape(.rect) - } - .buttonStyle(.plain) - .glassEffectIfAvailable( - GlassStyle.regular.interactive(), in: .rect(cornerRadius: 10) - ) - .opacity(frontCardIndex == 0 ? 0.3 : 1.0) - .disabled(frontCardIndex == 0) + #if ENFORCE_READY + HStack(spacing: isCompact ? 12 : 20) { + Button(action: { swapCards() }) { + Image(systemName: "chevron.left") + .font(isCompact ? .body : .title2) + .frame(width: isCompact ? 36 : 44, height: isCompact ? 36 : 44) + .contentShape(.rect) + } + .buttonStyle(.plain) + .glassEffectIfAvailable( + GlassStyle.regular.interactive(), in: .rect(cornerRadius: 10) + ) + .opacity(frontCardIndex == 0 ? 0.3 : 1.0) + .disabled(frontCardIndex == 0) - // Page indicators with labels - HStack(spacing: isCompact ? 10 : 16) { - cardIndicator(index: 0, icon: "video.fill", label: "Enforce") - cardIndicator(index: 1, icon: "brain.fill", label: "Smart") - }.padding(.all, 20) + // Page indicators with labels + HStack(spacing: isCompact ? 10 : 16) { + cardIndicator(index: 0, icon: "video.fill", label: "Enforce") + cardIndicator(index: 1, icon: "brain.fill", label: "Smart") + }.padding(.all, 20) - Button(action: { swapCards() }) { - Image(systemName: "chevron.right") - .font(isCompact ? .body : .title2) - .frame(width: isCompact ? 36 : 44, height: isCompact ? 36 : 44) - .contentShape(.rect) + Button(action: { swapCards() }) { + Image(systemName: "chevron.right") + .font(isCompact ? .body : .title2) + .frame(width: isCompact ? 36 : 44, height: isCompact ? 36 : 44) + .contentShape(.rect) + } + .buttonStyle(.plain) + .glassEffectIfAvailable( + GlassStyle.regular.interactive(), in: .rect(cornerRadius: 10) + ) + .opacity(frontCardIndex == 1 ? 0.3 : 1.0) + .disabled(frontCardIndex == 1) } - .buttonStyle(.plain) - .glassEffectIfAvailable( - GlassStyle.regular.interactive(), in: .rect(cornerRadius: 10) - ) - .opacity(frontCardIndex == 1 ? 0.3 : 1.0) - .disabled(frontCardIndex == 1) - } - .padding(.bottom, isCompact ? 6 : 10) + .padding(.bottom, isCompact ? 6 : 10) + #endif } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding() @@ -254,20 +262,23 @@ struct AdditionalModifiersView: View { } } Spacer() - Toggle("", isOn: Binding( - get: { - settingsManager.isTimerEnabled(for: .lookAway) || - settingsManager.isTimerEnabled(for: .blink) || - settingsManager.isTimerEnabled(for: .posture) - }, - set: { newValue in - if newValue { - Task { @MainActor in - try await cameraService.requestCameraAccess() + Toggle( + "", + isOn: Binding( + get: { + settingsManager.isTimerEnabled(for: .lookAway) + || settingsManager.isTimerEnabled(for: .blink) + || settingsManager.isTimerEnabled(for: .posture) + }, + set: { newValue in + if newValue { + Task { @MainActor in + try await cameraService.requestCameraAccess() + } } } - } - )) + ) + ) .labelsHidden() .disabled(!cameraService.hasCameraHardware) .controlSize(isCompact ? .small : .regular) @@ -364,13 +375,15 @@ struct AdditionalModifiersView: View { isOn: $settingsManager.settings.smartMode.autoPauseOnIdle ) - smartModeToggle( - icon: "chart.line.uptrend.xyaxis", - iconColor: .green, - title: "Track Usage Statistics", - subtitle: "Monitor active and idle time", - isOn: $settingsManager.settings.smartMode.trackUsage - ) + #if TRACK_READY + smartModeToggle( + icon: "chart.line.uptrend.xyaxis", + iconColor: .green, + title: "Track Usage Statistics", + subtitle: "Monitor active and idle time", + isOn: $settingsManager.settings.smartMode.trackUsage + ) + #endif } Spacer() diff --git a/Gaze/Views/Containers/SettingsWindowView.swift b/Gaze/Views/Containers/SettingsWindowView.swift index 86165e8..1341c6a 100644 --- a/Gaze/Views/Containers/SettingsWindowView.swift +++ b/Gaze/Views/Containers/SettingsWindowView.swift @@ -28,7 +28,7 @@ struct SettingsWindowView: View { settingsContent #if DEBUG - debugFooter(isCompact: isCompact) + debugFooter(isCompact: isCompact) #endif } } @@ -42,7 +42,8 @@ struct SettingsWindowView: View { ) .onReceive(tabSwitchPublisher) { notification in if let tab = notification.object as? Int, - let section = SettingsSection(rawValue: tab) { + let section = SettingsSection(rawValue: tab) + { selectedSection = section } } @@ -78,8 +79,10 @@ struct SettingsWindowView: View { BlinkSetupView(settingsManager: settingsManager) case .posture: PostureSetupView(settingsManager: settingsManager) - case .enforceMode: - EnforceModeSetupView(settingsManager: settingsManager) + #if ENFORCE_READY + case .enforceMode: + EnforceModeSetupView(settingsManager: settingsManager) + #endif case .userTimers: UserTimersView( userTimers: Binding( @@ -99,27 +102,27 @@ struct SettingsWindowView: View { } #if DEBUG - @ViewBuilder - private func debugFooter(isCompact: Bool) -> some View { - Divider() - HStack { - Button("Retrigger Onboarding") { - retriggerOnboarding() + @ViewBuilder + private func debugFooter(isCompact: Bool) -> some View { + Divider() + HStack { + Button("Retrigger Onboarding") { + retriggerOnboarding() + } + .buttonStyle(.bordered) + .controlSize(isCompact ? .small : .regular) + Spacer() } - .buttonStyle(.bordered) - .controlSize(isCompact ? .small : .regular) - Spacer() + .padding(isCompact ? 8 : 16) } - .padding(isCompact ? 8 : 16) - } - private func retriggerOnboarding() { - SettingsWindowPresenter.shared.close() - settingsManager.settings.hasCompletedOnboarding = false - DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { - OnboardingWindowPresenter.shared.show(settingsManager: settingsManager) + private func retriggerOnboarding() { + SettingsWindowPresenter.shared.close() + settingsManager.settings.hasCompletedOnboarding = false + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + OnboardingWindowPresenter.shared.show(settingsManager: settingsManager) + } } - } #endif } diff --git a/Gaze/Views/Setup/SmartModeSetupView.swift b/Gaze/Views/Setup/SmartModeSetupView.swift index f87b8aa..425cb4d 100644 --- a/Gaze/Views/Setup/SmartModeSetupView.swift +++ b/Gaze/Views/Setup/SmartModeSetupView.swift @@ -25,7 +25,9 @@ struct SmartModeSetupView: View { VStack(spacing: 24) { fullscreenSection idleSection - usageTrackingSection + #if TRACK_READY + usageTrackingSection + #endif } .frame(maxWidth: 600)