// // CreateIconView.swift // Feels (iOS) // // Created by Trey Tartt on 2/13/22. // import SwiftUI enum BackGroundOptions: String, CaseIterable { case horrible case bad case average case good case great case random static var selectable: [BackGroundOptions] { return [.great, .good, .average, .bad, .horrible] } } enum Eyes { case left case right } enum EyeOptions: String, CaseIterable { case fire = "fire" case bolt = "bolt2" case dollar = "dollar" case bell = "bell" case btc = "btc" case code = "code" case crown = "crown" case divide = "divide" case exclamation = "exclamation" case fan = "fan" case floppy = "floppy" case x = "x" case skull = "skull" case covid = "covid" case bomb = "bomb" case skull2 = "skull2" case poo = "poo" static public var defaultOption: AnyView { let image = Image(EyeOptions.fire.rawValue, bundle: .main) .resizable() .frame(width: 20, height: 20) return AnyView(image) } } enum MouthOptions: String, CaseIterable { case fire = "fire" case bolt = "bolt2" case dollar = "dollar" case bell = "bell" case btc = "btc" case code = "code" case crown = "crown" case divide = "divide" case exclamation = "exclamation" case fan = "fan" case floppy = "floppy" case x = "x" case skull = "skull" case covid = "covid" case bomb = "bomb" case skull2 = "skull2" case poo = "poo" static public var defaultOption: AnyView { let image = Image(MouthOptions.bomb.rawValue, bundle: .main) .resizable() .frame(width: 20, height: 20) return AnyView(image) } } struct CreateIconView: View { @State private var mouth: AnyView = MouthOptions.defaultOption @StateObject private var customIcon = CustomIcon(leftEye: EyeOptions.defaultOption, rightEye: EyeOptions.defaultOption, mouth: MouthOptions.defaultOption, background: [(AnyView, UUID)](), bgColor: .red, innerColor: .green) private var randomElements: [AnyView] = [ AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue) .resizable() .frame(width: 20, height: 20)), AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue) .resizable() .frame(width: 20, height: 20)), AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue) .resizable() .frame(width: 20, height: 20)), AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue) .resizable() .frame(width: 20, height: 20)) ] func update(eye: Eyes, eyeOption: EyeOptions) { let image = Image(eyeOption.rawValue, bundle: .main) .resizable() .frame(width: 20, height: 20) switch eye { case .left: customIcon.leftEye = AnyView(image) case .right: customIcon.rightEye = AnyView(image) } } func createRandom() { customIcon.bgColor = Color( red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1) ) customIcon.innerColor = Color( red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1) ) update(eye: .left, eyeOption: EyeOptions.allCases.randomElement()!) update(eye: .right, eyeOption: EyeOptions.allCases.randomElement()!) update(mouthOption: MouthOptions.allCases.randomElement()!) update(background: BackGroundOptions.allCases.randomElement()!) } func update(mouthOption: MouthOptions) { let image = AnyView(Image(mouthOption.rawValue, bundle: .main) .resizable() .frame(width: 20, height: 20)) customIcon.mouth = image } func update(background: BackGroundOptions) { customIcon.background.removeAll() if background == .random { for _ in 0...120 { let image = Image(BackGroundOptions.selectable.randomElement()!.rawValue, bundle: .main) let sizedImage = image .resizable() .frame(width: 20, height: 20) customIcon.background.append((AnyView(sizedImage), UUID())) } return } let image = Image(background.rawValue, bundle: .main) let sizedImage = image .resizable() .frame(width: 20, height: 20) for _ in 0...120 { customIcon.background.append((AnyView(sizedImage), UUID())) } } var mixBG: some View { VStack { HStack { randomElements[0] randomElements[1] } HStack { randomElements[2] randomElements[3] } } } var iconView: some View { IconView(customIcon: customIcon) } var body: some View { VStack { iconView .padding() Spacer() VStack { ColorPicker("Set the background color", selection: $customIcon.bgColor) .padding([.leading, .trailing]) ColorPicker("Set the inner color", selection: $customIcon.innerColor) .padding([.leading, .trailing]) } HStack { Spacer() Menu("Left Eye") { ForEach(EyeOptions.allCases, id: \.self) { option in Button(action: { update(eye: .left, eyeOption: option) }, label: { Label(option.rawValue, image: option.rawValue) }) } } Spacer() Menu("Right Eye") { ForEach(EyeOptions.allCases, id: \.self) { option in Button(action: { update(eye: .left, eyeOption: option) }, label: { Label(option.rawValue, image: option.rawValue) }) } } Spacer() Menu("Mouth") { ForEach(MouthOptions.allCases, id: \.self) { option in Button(action: { update(mouthOption: option) }, label: { Label(option.rawValue, image: option.rawValue) }) } } Spacer() } .padding(.top, 10) VStack{ Text("Background") HStack { ForEach(BackGroundOptions.selectable, id: \.self) { bg in Image(bg.rawValue, bundle: .main) .resizable() .frame(width: CGFloat(50), height: CGFloat(50), alignment: .center) .onTapGesture { update(background: bg) } } mixBG .onTapGesture { update(background: .random) } } } .padding(.top, 10) Button(action: { createRandom() }, label: { Text("Random") .font(.title) .fontWeight(.bold) .foregroundColor(Color(UIColor.white)) .frame(minWidth: 0, maxWidth: .infinity) .background(.blue) }) Button(action: { // let icon = icon }, label: { Text("Save") .font(.title) .fontWeight(.bold) .foregroundColor(Color(UIColor.white)) .frame(minWidth: 0, maxWidth: .infinity) .background(.green) }) } } } struct CreateIconView_Previews: PreviewProvider { static var previews: some View { CreateIconView() } }