From 27e3ec9ffd095aa247c89d73dc64c88e380fda48 Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Fri, 14 Nov 2025 00:49:00 +0530 Subject: [PATCH] Updated Battery Icon to Macbook Icon --- DynamicIsland/Localizable.xcstrings | 3 +++ .../LockScreen/LockScreenWeatherWidget.swift | 3 ++- .../components/Settings/SettingsView.swift | 10 ++++++++++ .../managers/LockScreenWeatherManager.swift | 19 ++++++++++++++----- DynamicIsland/models/Constants.swift | 1 + 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index e7e7c42..6208fff 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -10888,6 +10888,9 @@ }, "Mac battery at %d percent" : { "comment" : "Mac battery gauge accessibility label" + }, + "MacBook icon is available in the circular layout." : { + }, "Made ❤️ by Ebullioscopic" : { diff --git a/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift b/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift index 4500058..5d486b0 100644 --- a/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift +++ b/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift @@ -158,12 +158,13 @@ struct LockScreenWeatherWidget: View { private func circularBatterySegment(for info: LockScreenWeatherSnapshot.BatteryInfo) -> some View { let level = clampedBatteryLevel(info.batteryLevel) + let symbolName = info.usesLaptopSymbol ? "laptopcomputer" : batteryIconName(for: level) return VStack(spacing: 6) { Gauge(value: Double(level), in: 0...100) { EmptyView() } currentValueLabel: { - Image(systemName: batteryIconName(for: level)) + Image(systemName: symbolName) .font(.system(size: 20, weight: .semibold)) .foregroundStyle(Color.white) } minimumValueLabel: { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 61d8e4c..726a0d4 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -191,6 +191,7 @@ struct GeneralSettings: View { @Default(.lockScreenWeatherAQIScale) var lockScreenWeatherAQIScale @Default(.lockScreenWeatherUsesGaugeTint) var lockScreenWeatherUsesGaugeTint @Default(.lockScreenWeatherProviderSource) var lockScreenWeatherProviderSource + @Default(.lockScreenWeatherBatteryUsesLaptopSymbol) var lockScreenWeatherBatteryUsesLaptopSymbol var body: some View { Form { @@ -403,6 +404,15 @@ struct GeneralSettings: View { Defaults.Toggle("Show charging percentage", key: .lockScreenWeatherShowsChargingPercentage) } Defaults.Toggle("Show battery indicator", key: .lockScreenWeatherShowsBatteryGauge) + if lockScreenWeatherShowsBatteryGauge { + Defaults.Toggle("Use MacBook icon when on battery", key: .lockScreenWeatherBatteryUsesLaptopSymbol) + .disabled(lockScreenWeatherWidgetStyle != .circular) + if lockScreenWeatherWidgetStyle != .circular { + Text("MacBook icon is available in the circular layout.") + .font(.caption) + .foregroundStyle(.secondary) + } + } Defaults.Toggle("Show Bluetooth battery", key: .lockScreenWeatherShowsBluetooth) Defaults.Toggle("Show AQI widget", key: .lockScreenWeatherShowsAQI) .disabled(!lockScreenWeatherProviderSource.supportsAirQuality) diff --git a/DynamicIsland/managers/LockScreenWeatherManager.swift b/DynamicIsland/managers/LockScreenWeatherManager.swift index 6312279..7127580 100644 --- a/DynamicIsland/managers/LockScreenWeatherManager.swift +++ b/DynamicIsland/managers/LockScreenWeatherManager.swift @@ -105,7 +105,8 @@ final class LockScreenWeatherManager: ObservableObject { let showsCharging = Defaults[.lockScreenWeatherShowsCharging] let chargingInfo = showsCharging ? makeChargingInfo() : nil let showsBatteryGauge = Defaults[.lockScreenWeatherShowsBatteryGauge] - let batteryInfo = showsBatteryGauge ? makeBatteryGaugeInfo(isCharging: chargingInfo != nil) : nil + let widgetStyle = Defaults[.lockScreenWeatherWidgetStyle] + let batteryInfo = showsBatteryGauge ? makeBatteryGaugeInfo(isCharging: chargingInfo != nil, widgetStyle: widgetStyle) : nil let fallback = LockScreenWeatherSnapshot( temperatureText: snapshot?.temperatureText ?? "--", symbolName: snapshot?.symbolName ?? "cloud.fill", @@ -116,7 +117,7 @@ final class LockScreenWeatherManager: ObservableObject { battery: batteryInfo, showsLocation: snapshot?.showsLocation ?? false, airQuality: (providerSource.supportsAirQuality && Defaults[.lockScreenWeatherShowsAQI]) ? snapshot?.airQuality : nil, - widgetStyle: Defaults[.lockScreenWeatherWidgetStyle], + widgetStyle: widgetStyle, showsChargingPercentage: Defaults[.lockScreenWeatherShowsChargingPercentage], temperatureInfo: snapshot?.temperatureInfo, usesGaugeTint: Defaults[.lockScreenWeatherUsesGaugeTint] @@ -189,6 +190,8 @@ final class LockScreenWeatherManager: ObservableObject { .map { _ in () }.eraseToAnyPublisher(), Defaults.publisher(.lockScreenWeatherShowsBatteryGauge, options: []) .map { _ in () }.eraseToAnyPublisher(), + Defaults.publisher(.lockScreenWeatherBatteryUsesLaptopSymbol, options: []) + .map { _ in () }.eraseToAnyPublisher(), Defaults.publisher(.lockScreenWeatherWidgetStyle, options: []) .map { _ in () }.eraseToAnyPublisher(), Defaults.publisher(.lockScreenWeatherTemperatureUnit, options: []) @@ -289,7 +292,7 @@ final class LockScreenWeatherManager: ObservableObject { let showsChargingPercentage = Defaults[.lockScreenWeatherShowsChargingPercentage] let providerSource = Defaults[.lockScreenWeatherProviderSource] let airQualityInfo = (Defaults[.lockScreenWeatherShowsAQI] && providerSource.supportsAirQuality) ? payload.airQuality : nil - let batteryInfo = Defaults[.lockScreenWeatherShowsBatteryGauge] ? makeBatteryGaugeInfo(isCharging: chargingInfo != nil) : nil + let batteryInfo = Defaults[.lockScreenWeatherShowsBatteryGauge] ? makeBatteryGaugeInfo(isCharging: chargingInfo != nil, widgetStyle: widgetStyle) : nil let usesGaugeTint = Defaults[.lockScreenWeatherUsesGaugeTint] return LockScreenWeatherSnapshot( @@ -334,7 +337,7 @@ final class LockScreenWeatherManager: ObservableObject { ) } - private func makeBatteryGaugeInfo(isCharging: Bool) -> LockScreenWeatherSnapshot.BatteryInfo? { + private func makeBatteryGaugeInfo(isCharging: Bool, widgetStyle: LockScreenWeatherWidgetStyle) -> LockScreenWeatherSnapshot.BatteryInfo? { guard !isCharging else { return nil } let battery = BatteryStatusViewModel.shared @@ -343,7 +346,12 @@ final class LockScreenWeatherManager: ObservableObject { guard clampedLevel >= 0 else { return nil } - return LockScreenWeatherSnapshot.BatteryInfo(batteryLevel: clampedLevel) + let usesLaptopSymbol = widgetStyle == .circular && Defaults[.lockScreenWeatherBatteryUsesLaptopSymbol] + + return LockScreenWeatherSnapshot.BatteryInfo( + batteryLevel: clampedLevel, + usesLaptopSymbol: usesLaptopSymbol + ) } private func makeBluetoothInfo() -> LockScreenWeatherSnapshot.BluetoothInfo? { @@ -427,6 +435,7 @@ struct LockScreenWeatherSnapshot: Equatable { struct BatteryInfo: Equatable { let batteryLevel: Int + let usesLaptopSymbol: Bool } struct AirQualityInfo: Equatable { diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index 90a5242..1564258 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -382,6 +382,7 @@ extension Defaults.Keys { static let lockScreenWeatherShowsChargingPercentage = Key("lockScreenWeatherShowsChargingPercentage", default: true) static let lockScreenWeatherShowsBluetooth = Key("lockScreenWeatherShowsBluetooth", default: true) static let lockScreenWeatherShowsBatteryGauge = Key("lockScreenWeatherShowsBatteryGauge", default: true) + static let lockScreenWeatherBatteryUsesLaptopSymbol = Key("lockScreenWeatherBatteryUsesLaptopSymbol", default: false) static let lockScreenWeatherWidgetStyle = Key("lockScreenWeatherWidgetStyle", default: .circular) static let lockScreenWeatherTemperatureUnit = Key("lockScreenWeatherTemperatureUnit", default: .celsius) static let lockScreenWeatherShowsAQI = Key("lockScreenWeatherShowsAQI", default: false)