You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyQRCode/MyQrCode/Views/BarcodeCharacterHintView.swift

97 lines
3.5 KiB

import SwiftUI
// MARK: -
struct BarcodeCharacterHintView: View {
@EnvironmentObject var languageManager: LanguageManager
let barcodeType: BarcodeType
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text("character_type".localized)
.font(.caption)
.foregroundColor(.secondary)
LazyVGrid(columns: [
GridItem(.adaptive(minimum: 80), spacing: 8)
], spacing: 6) {
ForEach(getCharacterTypes(), id: \.self) { charType in
HStack(spacing: 4) {
Image(systemName: charType.icon)
.font(.caption2)
.foregroundColor(charType.color)
Text(charType.name)
.font(.caption2)
.foregroundColor(charType.color)
}
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(
RoundedRectangle(cornerRadius: 6)
.fill(charType.color.opacity(0.1))
)
}
}
}
}
private func getCharacterTypes() -> [CharacterType] {
switch barcodeType {
case .ean13, .ean8, .upce, .itf14:
return [
CharacterType(name: "numbers".localized, icon: "number", color: .blue)
]
case .code39:
return [
CharacterType(name: "letters".localized, icon: "character", color: .green),
CharacterType(name: "numbers".localized, icon: "number", color: .blue),
CharacterType(name: "special_characters".localized, icon: "textformat", color: .orange)
]
case .code128:
return [
CharacterType(name: "letters".localized, icon: "character", color: .green),
CharacterType(name: "numbers".localized, icon: "number", color: .blue),
CharacterType(name: "symbols".localized, icon: "textformat", color: .purple),
CharacterType(name: "control_characters".localized, icon: "command", color: .red)
]
case .pdf417:
return [
CharacterType(name: "letters".localized, icon: "character", color: .green),
CharacterType(name: "numbers".localized, icon: "number", color: .blue),
CharacterType(name: "symbols".localized, icon: "textformat", color: .purple),
CharacterType(name: "all_ascii".localized, icon: "globe", color: .indigo)
]
}
}
}
// MARK: -
struct CharacterType: Hashable {
let name: String
let icon: String
let color: Color
// Hashable
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(icon)
}
static func == (lhs: CharacterType, rhs: CharacterType) -> Bool {
return lhs.name == rhs.name && lhs.icon == rhs.icon
}
}
#Preview {
VStack(spacing: 20) {
BarcodeCharacterHintView(barcodeType: .ean13)
BarcodeCharacterHintView(barcodeType: .code39)
BarcodeCharacterHintView(barcodeType: .code128)
BarcodeCharacterHintView(barcodeType: .pdf417)
}
.padding()
.environmentObject(LanguageManager.shared)
}