USB-Meter / USB Meter / Views / ChargedDevices / Components / ChargedDeviceIdentityViews.swift
1 contributor
83 lines | 2.345kb
//
//  ChargedDeviceIdentityViews.swift
//  USB Meter
//
//  Created by Codex on 22/04/2026.
//

import SwiftUI
import UIKit

struct ChargedDeviceIdentityLabelView: View {
    let chargedDevice: ChargedDeviceSummary
    var iconPointSize: CGFloat = 15

    var body: some View {
        HStack(alignment: .firstTextBaseline, spacing: 8) {
            ChargedDeviceTemplateIconView(
                icon: chargedDevice.identityIcon,
                fallbackSystemName: chargedDevice.fallbackIdentitySymbolName,
                pointSize: iconPointSize
            )
            Text(chargedDevice.name)
        }
    }
}

struct ChargedDeviceTemplateLabelView: View {
    let template: ChargedDeviceTemplateDefinition
    var iconPointSize: CGFloat = 15

    var body: some View {
        HStack(alignment: .firstTextBaseline, spacing: 8) {
            ChargedDeviceTemplateIconView(
                icon: template.icon,
                fallbackSystemName: template.deviceClass.symbolName,
                pointSize: iconPointSize
            )
            Text(template.name)
        }
    }
}

struct ChargedDeviceTemplateIconView: View {
    let icon: ChargedDeviceTemplateIcon
    let fallbackSystemName: String
    var pointSize: CGFloat = 15

    var body: some View {
        Group {
            if let assetName = resolvedAssetName {
                Image(assetName)
                    .renderingMode(.template)
                    .resizable()
                    .scaledToFit()
            } else {
                Image(systemName: resolvedSystemSymbolName)
                    .font(.system(size: pointSize))
            }
        }
        .frame(width: pointSize + 2, height: pointSize + 2)
    }

    private var resolvedAssetName: String? {
        guard icon.type == .asset, UIImage(named: icon.name) != nil else {
            return nil
        }
        return icon.name
    }

    private var resolvedSystemSymbolName: String {
        let candidate = icon.resolvedSystemSymbolName(fallbackSystemName: fallbackSystemName)
        if UIImage(systemName: candidate) != nil {
            return candidate
        }

        if let fallbackSystemName = icon.fallbackSystemName,
           UIImage(systemName: fallbackSystemName) != nil {
            return fallbackSystemName
        }

        return fallbackSystemName
    }
}