USB-Meter / USB Meter / Views / ChargedDevices / Components / ChargedDeviceIdentityViews.swift
Newer Older
83 lines | 2.345kb
Bogdan Timofte authored a month ago
1
//
2
//  ChargedDeviceIdentityViews.swift
3
//  USB Meter
4
//
5
//  Created by Codex on 22/04/2026.
6
//
7

            
8
import SwiftUI
9
import UIKit
10

            
11
struct ChargedDeviceIdentityLabelView: View {
12
    let chargedDevice: ChargedDeviceSummary
13
    var iconPointSize: CGFloat = 15
14

            
15
    var body: some View {
16
        HStack(alignment: .firstTextBaseline, spacing: 8) {
17
            ChargedDeviceTemplateIconView(
18
                icon: chargedDevice.identityIcon,
19
                fallbackSystemName: chargedDevice.fallbackIdentitySymbolName,
20
                pointSize: iconPointSize
21
            )
22
            Text(chargedDevice.name)
23
        }
24
    }
25
}
26

            
27
struct ChargedDeviceTemplateLabelView: View {
28
    let template: ChargedDeviceTemplateDefinition
29
    var iconPointSize: CGFloat = 15
30

            
31
    var body: some View {
32
        HStack(alignment: .firstTextBaseline, spacing: 8) {
33
            ChargedDeviceTemplateIconView(
34
                icon: template.icon,
35
                fallbackSystemName: template.deviceClass.symbolName,
36
                pointSize: iconPointSize
37
            )
38
            Text(template.name)
39
        }
40
    }
41
}
42

            
43
struct ChargedDeviceTemplateIconView: View {
44
    let icon: ChargedDeviceTemplateIcon
45
    let fallbackSystemName: String
46
    var pointSize: CGFloat = 15
47

            
48
    var body: some View {
49
        Group {
50
            if let assetName = resolvedAssetName {
51
                Image(assetName)
52
                    .renderingMode(.template)
53
                    .resizable()
54
                    .scaledToFit()
55
            } else {
56
                Image(systemName: resolvedSystemSymbolName)
57
                    .font(.system(size: pointSize))
58
            }
59
        }
60
        .frame(width: pointSize + 2, height: pointSize + 2)
61
    }
62

            
63
    private var resolvedAssetName: String? {
64
        guard icon.type == .asset, UIImage(named: icon.name) != nil else {
65
            return nil
66
        }
67
        return icon.name
68
    }
69

            
70
    private var resolvedSystemSymbolName: String {
71
        let candidate = icon.resolvedSystemSymbolName(fallbackSystemName: fallbackSystemName)
72
        if UIImage(systemName: candidate) != nil {
73
            return candidate
74
        }
75

            
76
        if let fallbackSystemName = icon.fallbackSystemName,
77
           UIImage(systemName: fallbackSystemName) != nil {
78
            return fallbackSystemName
79
        }
80

            
81
        return fallbackSystemName
82
    }
83
}